@datagrok/helm 2.1.5 → 2.1.7
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/README.md +13 -10
- package/dist/package-test.js +2 -735
- package/dist/package-test.js.map +1 -0
- package/dist/package.js +2 -2498
- package/dist/package.js.map +1 -0
- package/package.json +3 -3
- package/src/package.ts +32 -65
- package/tsconfig.json +1 -1
- package/webpack.config.js +1 -1
package/dist/package.js
CHANGED
|
@@ -1,2498 +1,2 @@
|
|
|
1
|
-
var helm;
|
|
2
|
-
|
|
3
|
-
/******/ "use strict";
|
|
4
|
-
/******/ var __webpack_modules__ = ({
|
|
5
|
-
|
|
6
|
-
/***/ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/random.js":
|
|
7
|
-
/*!***************************************************************************************************!*\
|
|
8
|
-
!*** ./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/random.js ***!
|
|
9
|
-
\***************************************************************************************************/
|
|
10
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
11
|
-
|
|
12
|
-
__webpack_require__.r(__webpack_exports__);
|
|
13
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
14
|
-
/* harmony export */ "randomFloat": () => (/* binding */ randomFloat),
|
|
15
|
-
/* harmony export */ "randomInt": () => (/* binding */ randomInt)
|
|
16
|
-
/* harmony export */ });
|
|
17
|
-
/**
|
|
18
|
-
* Generates single random float from 0 to range.
|
|
19
|
-
*
|
|
20
|
-
* @export
|
|
21
|
-
* @param {number} range Max generating value.
|
|
22
|
-
* @return {number} A random float generated.
|
|
23
|
-
*/
|
|
24
|
-
function randomFloat(range) {
|
|
25
|
-
return Math.random() * range;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Generates single random integer from 0 to range.
|
|
29
|
-
*
|
|
30
|
-
* @export
|
|
31
|
-
* @param {number} range Max generating value.
|
|
32
|
-
* @return {number} A random integer generated.
|
|
33
|
-
*/
|
|
34
|
-
function randomInt(range) {
|
|
35
|
-
return Math.floor(randomFloat(range));
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==
|
|
38
|
-
|
|
39
|
-
/***/ }),
|
|
40
|
-
|
|
41
|
-
/***/ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js":
|
|
42
|
-
/*!**************************************************************************************************************!*\
|
|
43
|
-
!*** ./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js ***!
|
|
44
|
-
\**************************************************************************************************************/
|
|
45
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
46
|
-
|
|
47
|
-
__webpack_require__.r(__webpack_exports__);
|
|
48
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
49
|
-
/* harmony export */ "Coordinates": () => (/* binding */ Coordinates),
|
|
50
|
-
/* harmony export */ "Matrix": () => (/* binding */ Matrix),
|
|
51
|
-
/* harmony export */ "Vector": () => (/* binding */ Vector),
|
|
52
|
-
/* harmony export */ "Vectors": () => (/* binding */ Vectors)
|
|
53
|
-
/* harmony export */ });
|
|
54
|
-
/**
|
|
55
|
-
* Denotes a vector of floating poit values.
|
|
56
|
-
*
|
|
57
|
-
* @export
|
|
58
|
-
* @class Vector
|
|
59
|
-
* @extends {Float32Array}
|
|
60
|
-
*/
|
|
61
|
-
class Vector extends Float32Array {
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Denotes a two-dimensional matrix.
|
|
65
|
-
*
|
|
66
|
-
* @export
|
|
67
|
-
* @class Matrix
|
|
68
|
-
* @extends {Array<Vector>}
|
|
69
|
-
*/
|
|
70
|
-
class Matrix extends Array {
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Denotes cartesian coordinates.
|
|
74
|
-
*
|
|
75
|
-
* @export
|
|
76
|
-
* @class Coordinates
|
|
77
|
-
* @extends {Matrix}
|
|
78
|
-
*/
|
|
79
|
-
class Coordinates extends Matrix {
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Denotes an array of arbitrary-typed vectors.
|
|
83
|
-
*
|
|
84
|
-
* @export
|
|
85
|
-
* @class Vectors
|
|
86
|
-
* @extends {Array<any>}
|
|
87
|
-
*/
|
|
88
|
-
class Vectors extends Array {
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==
|
|
91
|
-
|
|
92
|
-
/***/ }),
|
|
93
|
-
|
|
94
|
-
/***/ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js":
|
|
95
|
-
/*!**************************************************************************************************************!*\
|
|
96
|
-
!*** ./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js ***!
|
|
97
|
-
\**************************************************************************************************************/
|
|
98
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
99
|
-
|
|
100
|
-
__webpack_require__.r(__webpack_exports__);
|
|
101
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
102
|
-
/* harmony export */ "argSort": () => (/* binding */ argSort),
|
|
103
|
-
/* harmony export */ "assert": () => (/* binding */ assert),
|
|
104
|
-
/* harmony export */ "calcDistanceMatrix": () => (/* binding */ calcDistanceMatrix),
|
|
105
|
-
/* harmony export */ "calculateEuclideanDistance": () => (/* binding */ calculateEuclideanDistance),
|
|
106
|
-
/* harmony export */ "fillRandomMatrix": () => (/* binding */ fillRandomMatrix),
|
|
107
|
-
/* harmony export */ "genRange": () => (/* binding */ genRange),
|
|
108
|
-
/* harmony export */ "getDiverseSubset": () => (/* binding */ getDiverseSubset),
|
|
109
|
-
/* harmony export */ "normalize": () => (/* binding */ normalize),
|
|
110
|
-
/* harmony export */ "setDifference": () => (/* binding */ setDifference),
|
|
111
|
-
/* harmony export */ "transposeMatrix": () => (/* binding */ transposeMatrix),
|
|
112
|
-
/* harmony export */ "vectorAdd": () => (/* binding */ vectorAdd),
|
|
113
|
-
/* harmony export */ "vectorDotProduct": () => (/* binding */ vectorDotProduct),
|
|
114
|
-
/* harmony export */ "vectorLength": () => (/* binding */ vectorLength)
|
|
115
|
-
/* harmony export */ });
|
|
116
|
-
/* harmony import */ var _type_declarations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./type-declarations */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js");
|
|
117
|
-
/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./random */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/random.js");
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Asserts a condition by throwing an Error.
|
|
122
|
-
*
|
|
123
|
-
* @export
|
|
124
|
-
* @param {boolean} [condition=false] Condition to assert.
|
|
125
|
-
* @param {string} [message='Assertion error.'] Message to output.
|
|
126
|
-
* @throws {Error}
|
|
127
|
-
*/
|
|
128
|
-
function assert(condition = false, message = 'Assertion error.') {
|
|
129
|
-
if (!condition)
|
|
130
|
-
throw new Error(message);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Creates new two-dimensional array and fills it with the value given.
|
|
134
|
-
*
|
|
135
|
-
* @param {number} dimension1 The first dimension of the coordinates (number of rows).
|
|
136
|
-
* @param {number} dimension2 The second dimension of the coordinates (number of columns).
|
|
137
|
-
* @param {number} [fill=0] A value to fill the coordinates with.
|
|
138
|
-
* @return {Coordinates} A two-dimensional filled with the value given.
|
|
139
|
-
* @todo Might be slow since used Array.map. Probably needs performance revision.
|
|
140
|
-
*/
|
|
141
|
-
function initCoordinates(dimension1, dimension2, fill = 0) {
|
|
142
|
-
return new Array(dimension1).fill(fill).map(() => (new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(dimension2).fill(fill)));
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Transpose matrix.
|
|
146
|
-
*
|
|
147
|
-
* @export
|
|
148
|
-
* @param {Matrix} matrix The matrix to be transposed.
|
|
149
|
-
* @return {Matrix} Transposed matrix.
|
|
150
|
-
* @todo Might be slow since used Array.map. Probably needs performance revision.
|
|
151
|
-
*/
|
|
152
|
-
function transposeMatrix(matrix) {
|
|
153
|
-
return new Array(matrix[0].length).fill(0)
|
|
154
|
-
.map((_, i) => (new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Adds two vectors with the second one to be multiplied by the given ratio.
|
|
158
|
-
*
|
|
159
|
-
* @export
|
|
160
|
-
* @param {Vector} p The first vector to add.
|
|
161
|
-
* @param {Vector} q The second vector to add.
|
|
162
|
-
* @param {number} [multiplier=1] A multiplier to be used before the second vector is added.
|
|
163
|
-
* @return {Vector} New vector contained the result of operation p+multiplier*q.
|
|
164
|
-
*/
|
|
165
|
-
function vectorAdd(p, q, multiplier = 1) {
|
|
166
|
-
const nItems = p.length;
|
|
167
|
-
assert(nItems == q.length, 'Vector lengths do not match.');
|
|
168
|
-
const total = new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(nItems);
|
|
169
|
-
for (let i = 0; i < p.length; ++i)
|
|
170
|
-
total[i] = p[i] + multiplier * q[i];
|
|
171
|
-
return total;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Sums the vector's items.
|
|
175
|
-
*
|
|
176
|
-
* @param {Vector} v The vector to be summed.
|
|
177
|
-
* @return {number} The vector's items sum.
|
|
178
|
-
*/
|
|
179
|
-
function itemsSum(v) {
|
|
180
|
-
let total = 0;
|
|
181
|
-
for (let i = 0; i < v.length; ++i)
|
|
182
|
-
total += v[i];
|
|
183
|
-
return total;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Suqares the vector's items.
|
|
187
|
-
*
|
|
188
|
-
* @param {Vector} v The vector to square.
|
|
189
|
-
* @return {Vector} A new vector containing the original's items squared.
|
|
190
|
-
*/
|
|
191
|
-
function vectorSquare(v) {
|
|
192
|
-
const nItems = v.length;
|
|
193
|
-
const total = new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(nItems);
|
|
194
|
-
for (let i = 0; i < v.length; ++i)
|
|
195
|
-
total[i] = v[i] * v[i];
|
|
196
|
-
return total;
|
|
197
|
-
}
|
|
198
|
-
function vectorLength(v) {
|
|
199
|
-
let sqrSum = 0;
|
|
200
|
-
for (let i = 0; i < v.length; i++)
|
|
201
|
-
sqrSum += v[i] * v[i];
|
|
202
|
-
return Math.sqrt(sqrSum);
|
|
203
|
-
}
|
|
204
|
-
function vectorDotProduct(v1, v2) {
|
|
205
|
-
if (v1.length != v2.length)
|
|
206
|
-
throw new Error('The dimensionality of the vectors must match');
|
|
207
|
-
let prod = 0;
|
|
208
|
-
for (let i = 0; i < v1.length; i++)
|
|
209
|
-
prod += v1[i] * v2[i];
|
|
210
|
-
return prod;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Creates a matrix filled with random floating point values.
|
|
214
|
-
*
|
|
215
|
-
* @export
|
|
216
|
-
* @param {number} dimension1 The first dimension of the matrix.
|
|
217
|
-
* @param {number} dimension2 The second dimension of the matrix.
|
|
218
|
-
* @param {number} [scale=1.] Max value given by random generator.
|
|
219
|
-
* @return {Matrix} A new matrix filled with random floating point values.
|
|
220
|
-
*/
|
|
221
|
-
function fillRandomMatrix(dimension1, dimension2, scale = 1.) {
|
|
222
|
-
const matrix = initCoordinates(dimension1, dimension2);
|
|
223
|
-
for (let i = 0; i < dimension1; ++i) {
|
|
224
|
-
for (let j = 0; j < dimension2; ++j)
|
|
225
|
-
matrix[i][j] = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomFloat)(scale);
|
|
226
|
-
}
|
|
227
|
-
return matrix;
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Calculates Euclidean distance between two vectors.
|
|
231
|
-
*
|
|
232
|
-
* @export
|
|
233
|
-
* @param {Vector} p The first vector.
|
|
234
|
-
* @param {Vector} q The second vector.
|
|
235
|
-
* @return {number} Euclidean distance between the given vectors.
|
|
236
|
-
*/
|
|
237
|
-
function calculateEuclideanDistance(p, q) {
|
|
238
|
-
const diff = vectorAdd(p, q, -1);
|
|
239
|
-
const sqdiff = vectorSquare(diff);
|
|
240
|
-
const sqdiffSumm = itemsSum(sqdiff);
|
|
241
|
-
return Math.sqrt(sqdiffSumm);
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Creates a distance matrix using a custom distance function.
|
|
245
|
-
*
|
|
246
|
-
* @export
|
|
247
|
-
* @param {Vectors} data Input vectors to calculate distances.
|
|
248
|
-
* @param {DistanceMetric} distance Custom distance function.
|
|
249
|
-
* @return {Matrix} Calculated custom distance matrix.
|
|
250
|
-
*/
|
|
251
|
-
function calcDistanceMatrix(data, distance) {
|
|
252
|
-
const nItems = data.length;
|
|
253
|
-
const matrix = initCoordinates(nItems, nItems, 0);
|
|
254
|
-
for (let i = 0; i < nItems; ++i) {
|
|
255
|
-
for (let j = i + 1; j < nItems; ++j) {
|
|
256
|
-
const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);
|
|
257
|
-
matrix[i][j] = matrix[j][i] = d;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return matrix;
|
|
261
|
-
}
|
|
262
|
-
/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/
|
|
263
|
-
function genRange(begin, end, endExclusive = false) {
|
|
264
|
-
const nItems = end - begin + (endExclusive ? 0 : 1);
|
|
265
|
-
const series = new Int32Array(nItems);
|
|
266
|
-
for (let i = 0; i < nItems; ++i)
|
|
267
|
-
series[i] = begin + i;
|
|
268
|
-
return series;
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Returns order of values as if they are sorted.
|
|
272
|
-
*
|
|
273
|
-
* @export
|
|
274
|
-
* @param {any[]} values Input array.
|
|
275
|
-
* @param {boolean} [reverse=false] Whether to return reversed order.
|
|
276
|
-
* @return {number[]} The order computed.
|
|
277
|
-
*/
|
|
278
|
-
function argSort(values, reverse = false) {
|
|
279
|
-
const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);
|
|
280
|
-
const decor = (v, i) => [v, i]; // set index to value
|
|
281
|
-
const undecor = (a) => a[1]; // leave only index
|
|
282
|
-
const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);
|
|
283
|
-
return _argsort(values);
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Returns the indexes of the most diverse objects according to the dist function
|
|
287
|
-
* @param {number} length total number of objects
|
|
288
|
-
* @param {number} n number of diverse elements to find
|
|
289
|
-
* @param {(i1: number, i2: number) => number} dist a function which calculates distance between
|
|
290
|
-
* two objects using their indexes
|
|
291
|
-
* @returns {number[]} The indexes of the most diverse objects
|
|
292
|
-
*/
|
|
293
|
-
function getDiverseSubset(length, n, dist) {
|
|
294
|
-
function maxBy(values, orderBy) {
|
|
295
|
-
let maxValue = null;
|
|
296
|
-
let maxOrderBy = null;
|
|
297
|
-
for (const element of values) {
|
|
298
|
-
const elementOrderBy = orderBy(element);
|
|
299
|
-
if (maxOrderBy == null || elementOrderBy > maxOrderBy) {
|
|
300
|
-
maxValue = element;
|
|
301
|
-
maxOrderBy = elementOrderBy;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return maxValue;
|
|
305
|
-
}
|
|
306
|
-
const subset = [(0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInt)(length - 1)];
|
|
307
|
-
const complement = new Set();
|
|
308
|
-
for (let i = 0; i < length; ++i) {
|
|
309
|
-
if (!subset.includes(i))
|
|
310
|
-
complement.add(i);
|
|
311
|
-
}
|
|
312
|
-
while (subset.length < n) {
|
|
313
|
-
const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {
|
|
314
|
-
return dist(i, val);
|
|
315
|
-
})));
|
|
316
|
-
if (idx) {
|
|
317
|
-
subset.push(idx);
|
|
318
|
-
complement.delete(idx);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
return subset;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Returns normalized vector
|
|
325
|
-
* @param {Vector} data numerical array
|
|
326
|
-
*/
|
|
327
|
-
function normalize(data) {
|
|
328
|
-
let mean = 0;
|
|
329
|
-
let std = 0;
|
|
330
|
-
for (let i = 0; i < data.length; ++i)
|
|
331
|
-
mean += data[i];
|
|
332
|
-
mean /= data.length;
|
|
333
|
-
for (let i = 0; i < data.length; ++i)
|
|
334
|
-
std += (data[i] - mean) * (data[i] - mean);
|
|
335
|
-
std = Math.sqrt(std / data.length);
|
|
336
|
-
for (let i = 0; i < data.length; ++i)
|
|
337
|
-
data[i] = (data[i] - mean) / std;
|
|
338
|
-
return data;
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Finds set difference between two lists.
|
|
342
|
-
* @param {any[]} a The first list.
|
|
343
|
-
* @param {any[]} b The second list.
|
|
344
|
-
* @return {any[]}
|
|
345
|
-
*/
|
|
346
|
-
function setDifference(a, b) {
|
|
347
|
-
const bSet = new Set(b);
|
|
348
|
-
return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());
|
|
349
|
-
}
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxhQUFxQixDQUFDO0lBQ3BFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFeEIsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFFM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV0QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsUUFBUSxDQUFDLENBQVM7SUFDekIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRWQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxDQUFTO0lBQzdCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNwQyxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7SUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEVBQVUsRUFBRSxFQUFVO0lBQ3JELElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsTUFBTTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDbEUsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO0lBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUN4QyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxVQUFrQixFQUFFLFVBQWtCLEVBQUUsUUFBZ0IsRUFBRTtJQUN6RixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNyQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLENBQVMsRUFBRSxDQUFTO0lBQzdELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBYSxFQUFFLFFBQXdCO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLENBQUMsR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFGLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pDO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxZQUFZLEdBQUcsS0FBSztJQUN2RSxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRXhCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFhLEVBQUUsT0FBTyxHQUFHLEtBQUs7SUFDcEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsRUFBRSxDQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsRUFBRSxDQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7SUFDbEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtJQUN2RCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxDQUFTLEVBQUUsSUFBd0M7SUFDbEcsU0FBUyxLQUFLLENBQUMsTUFBZ0MsRUFBRSxPQUE4QjtRQUM3RSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXRCLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxFQUFFO1lBQzVCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksY0FBYyxHQUFHLFVBQVUsRUFBRTtnQkFDckQsUUFBUSxHQUFHLE9BQU8sQ0FBQztnQkFDbkIsVUFBVSxHQUFHLGNBQWMsQ0FBQzthQUM3QjtTQUNGO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFFN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDckIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyQjtJQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUNmLFVBQVUsQ0FBQyxNQUFNLEVBQThCLEVBQy9DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFTLEdBQUcsRUFBRSxLQUFLO1lBQ3hELE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN4QjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsSUFBWTtJQUNwQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFFWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQixJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUVwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==
|
|
351
|
-
|
|
352
|
-
/***/ }),
|
|
353
|
-
|
|
354
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/aminoacids.js":
|
|
355
|
-
/*!****************************************************************!*\
|
|
356
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/aminoacids.js ***!
|
|
357
|
-
\****************************************************************/
|
|
358
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
359
|
-
|
|
360
|
-
__webpack_require__.r(__webpack_exports__);
|
|
361
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
362
|
-
/* harmony export */ "Aminoacids": () => (/* binding */ Aminoacids),
|
|
363
|
-
/* harmony export */ "AminoacidsPalettes": () => (/* binding */ AminoacidsPalettes)
|
|
364
|
-
/* harmony export */ });
|
|
365
|
-
/* harmony import */ var _seq_palettes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seq-palettes */ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js");
|
|
366
|
-
|
|
367
|
-
class AminoacidsPalettes extends _seq_palettes__WEBPACK_IMPORTED_MODULE_0__.SeqPaletteBase {
|
|
368
|
-
static get Lesk() {
|
|
369
|
-
if (this.lesk === void 0) {
|
|
370
|
-
this.lesk = this.makePalette([
|
|
371
|
-
[['G', 'A', 'S', 'T'], 'orange'],
|
|
372
|
-
[['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],
|
|
373
|
-
[['N', 'Q', 'H'], 'magenta'],
|
|
374
|
-
[['D', 'E'], 'red'],
|
|
375
|
-
[['K', 'R'], 'all_blue'],
|
|
376
|
-
], false, AminoacidsPalettes);
|
|
377
|
-
}
|
|
378
|
-
return this.lesk;
|
|
379
|
-
}
|
|
380
|
-
static get GrokGroups() {
|
|
381
|
-
if (this.grokGroups === void 0) {
|
|
382
|
-
this.grokGroups = this.makePalette([
|
|
383
|
-
[['C', 'U'], 'yellow'],
|
|
384
|
-
[['G', 'P'], 'red'],
|
|
385
|
-
[['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],
|
|
386
|
-
[['R', 'H', 'K'], 'light_blue'],
|
|
387
|
-
[['D', 'E'], 'dark_blue'],
|
|
388
|
-
[['S', 'T', 'N', 'Q'], 'orange'],
|
|
389
|
-
], false, AminoacidsPalettes);
|
|
390
|
-
}
|
|
391
|
-
return this.grokGroups;
|
|
392
|
-
}
|
|
393
|
-
static get RasMol() {
|
|
394
|
-
if (this.rasMol === void 0) {
|
|
395
|
-
this.rasMol = new AminoacidsPalettes({
|
|
396
|
-
// http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm
|
|
397
|
-
'D': '#E60A0A',
|
|
398
|
-
'E': '#E60A0A',
|
|
399
|
-
'C': '#E6E600',
|
|
400
|
-
'M': '#E6E600',
|
|
401
|
-
'K': '#145AFF',
|
|
402
|
-
'R': '#145AFF',
|
|
403
|
-
'S': '#FA9600',
|
|
404
|
-
'T': '#FA9600',
|
|
405
|
-
'F': '#3232AA',
|
|
406
|
-
'Y': '#3232AA',
|
|
407
|
-
'N': '#00DCDC',
|
|
408
|
-
'Q': '#00DCDC',
|
|
409
|
-
'G': '#EBEBEB',
|
|
410
|
-
'L': '#0F820F',
|
|
411
|
-
'V': '#0F820F',
|
|
412
|
-
'I': '#0F820F',
|
|
413
|
-
'A': '#C8C8C8',
|
|
414
|
-
'W': '#B45AB4',
|
|
415
|
-
'H': '#8282D2',
|
|
416
|
-
'P': '#DC9682',
|
|
417
|
-
'others': '#BEA06E',
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
return this.rasMol;
|
|
421
|
-
}
|
|
422
|
-
get(m) {
|
|
423
|
-
const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;
|
|
424
|
-
const res = super.get(resM);
|
|
425
|
-
return res;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */
|
|
429
|
-
AminoacidsPalettes.aaSynonyms = {
|
|
430
|
-
'MeNle': 'L',
|
|
431
|
-
'MeA': 'A',
|
|
432
|
-
'MeG': 'G',
|
|
433
|
-
'MeF': 'F',
|
|
434
|
-
};
|
|
435
|
-
class Aminoacids {
|
|
436
|
-
static getPalette(scheme = 'grok') {
|
|
437
|
-
switch (scheme) {
|
|
438
|
-
case 'grok':
|
|
439
|
-
return AminoacidsPalettes.GrokGroups;
|
|
440
|
-
case 'lesk':
|
|
441
|
-
return AminoacidsPalettes.Lesk;
|
|
442
|
-
default:
|
|
443
|
-
throw new Error(`ChemPalette: scheme \`${scheme}\` does not exist`);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
/**
|
|
447
|
-
* Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
|
|
448
|
-
*
|
|
449
|
-
* @param {string} c raw amino
|
|
450
|
-
* @return {[string, string]} outer and inner content
|
|
451
|
-
*/
|
|
452
|
-
static getInnerOuter(c) {
|
|
453
|
-
let isInner = 0;
|
|
454
|
-
let inner = '';
|
|
455
|
-
let outer = '';
|
|
456
|
-
for (const char of c) {
|
|
457
|
-
if (char == '(')
|
|
458
|
-
isInner++;
|
|
459
|
-
else if (char == ')')
|
|
460
|
-
isInner--;
|
|
461
|
-
else if (isInner)
|
|
462
|
-
inner += char;
|
|
463
|
-
else
|
|
464
|
-
outer += char;
|
|
465
|
-
}
|
|
466
|
-
return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];
|
|
467
|
-
}
|
|
468
|
-
static getColorAAPivot(monomer = '', scheme = 'grok') {
|
|
469
|
-
var _a, _b, _c;
|
|
470
|
-
//const chemPaletteInstance = AAPalettes.GrokGroups();
|
|
471
|
-
const chemPaletteInstance = this.getPalette(scheme);
|
|
472
|
-
let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);
|
|
473
|
-
outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);
|
|
474
|
-
innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);
|
|
475
|
-
if (monomer.length == 1 || monomer[1] == '(') {
|
|
476
|
-
const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
|
|
477
|
-
return amino in chemPaletteInstance ?
|
|
478
|
-
[chemPaletteInstance.get(amino), amino, innerMonomer, 1] :
|
|
479
|
-
[this.undefinedColor, outerMonomer, innerMonomer, 1];
|
|
480
|
-
}
|
|
481
|
-
if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {
|
|
482
|
-
if (monomer.length == 2 || monomer[2] == '(') {
|
|
483
|
-
const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();
|
|
484
|
-
return amino in chemPaletteInstance ?
|
|
485
|
-
[chemPaletteInstance.get(amino), amino, innerMonomer, 2] :
|
|
486
|
-
[this.undefinedColor, outerMonomer, innerMonomer, 2];
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
if (monomer.substring(0, 3) in this.AAFullNames) {
|
|
490
|
-
if (monomer.length == 3 || monomer[3] == '(') {
|
|
491
|
-
const amino = this.AAFullNames[monomer.substring(0, 3)];
|
|
492
|
-
return amino in chemPaletteInstance ?
|
|
493
|
-
[chemPaletteInstance.get(amino), amino, innerMonomer, 3] :
|
|
494
|
-
[this.undefinedColor, outerMonomer, innerMonomer, 3];
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {
|
|
498
|
-
if (monomer.substring(1, 3) in this.AAFullNames) {
|
|
499
|
-
if (monomer.length == 4 || monomer[4] == '(') {
|
|
500
|
-
const amino = this.AAFullNames[monomer.substring(1, 3)];
|
|
501
|
-
return amino in chemPaletteInstance ?
|
|
502
|
-
[chemPaletteInstance.get(amino), amino, innerMonomer, 4] :
|
|
503
|
-
[this.undefinedColor, outerMonomer, innerMonomer, 4];
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
return [this.undefinedColor, outerMonomer, innerMonomer, 0];
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
Aminoacids.SemType = 'Aminoacids';
|
|
511
|
-
Aminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';
|
|
512
|
-
Aminoacids.undefinedColor = 'rgb(100,100,100)';
|
|
513
|
-
Aminoacids.Names = {
|
|
514
|
-
'G': 'Glycine',
|
|
515
|
-
'L': 'Leucine',
|
|
516
|
-
'Y': 'Tyrosine',
|
|
517
|
-
'S': 'Serine',
|
|
518
|
-
'E': 'Glutamic acid',
|
|
519
|
-
'Q': 'Glutamine',
|
|
520
|
-
'D': 'Aspartic acid',
|
|
521
|
-
'N': 'Asparagine',
|
|
522
|
-
'F': 'Phenylalanine',
|
|
523
|
-
'A': 'Alanine',
|
|
524
|
-
'K': 'Lysine',
|
|
525
|
-
'R': 'Arginine',
|
|
526
|
-
'H': 'Histidine',
|
|
527
|
-
'C': 'Cysteine',
|
|
528
|
-
'V': 'Valine',
|
|
529
|
-
'P': 'Proline',
|
|
530
|
-
'W': 'Tryptophan',
|
|
531
|
-
'I': 'Isoleucine',
|
|
532
|
-
'M': 'Methionine',
|
|
533
|
-
'T': 'Threonine',
|
|
534
|
-
};
|
|
535
|
-
Aminoacids.AASmiles = {
|
|
536
|
-
'G': 'NCC(=O)O',
|
|
537
|
-
'L': 'N[C@H](CC(C)C)C(=O)O',
|
|
538
|
-
'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',
|
|
539
|
-
'S': 'NC(CO)C(=O)O',
|
|
540
|
-
'E': 'N[C@@H](CCC(O)=O)C(=O)O',
|
|
541
|
-
'Q': 'N[C@@H](CCC(N)=O)C(=O)O',
|
|
542
|
-
'D': 'N[C@@H](CC(O)=O)C(=O)O',
|
|
543
|
-
'N': 'N[C@@H](CC(N)=O)C(=O)O',
|
|
544
|
-
'F': 'NC(CC1=CC=CC=C1)C(=O)O',
|
|
545
|
-
'A': 'N[C@H](C)C(=O)O',
|
|
546
|
-
'K': 'NC(CCCCN)C(=O)O',
|
|
547
|
-
'R': 'N[C@H](CCCNC(=N)C)C(=O)O',
|
|
548
|
-
'H': 'NC(CC1=CN=C[N]1)C(=O)O',
|
|
549
|
-
'C': 'N[C@@H](CS)C(=O)O',
|
|
550
|
-
'V': 'NC(C(C)C)C(=O)O',
|
|
551
|
-
'P': 'N(CCC1)C1C(=O)O',
|
|
552
|
-
'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',
|
|
553
|
-
'I': 'N[C@H]([C@H](C)CC)C(=O)O',
|
|
554
|
-
'M': 'NC(CCSC)C(=O)O',
|
|
555
|
-
'T': 'NC(C(O)C)C(=O)O',
|
|
556
|
-
};
|
|
557
|
-
Aminoacids.AASmilesTruncated = {
|
|
558
|
-
'G': '*C*',
|
|
559
|
-
'L': 'CC(C)C[C@H](*)*',
|
|
560
|
-
'Y': 'C1=CC(=CC=C1CC(*)*)O',
|
|
561
|
-
'S': 'OCC(*)C*',
|
|
562
|
-
'E': '*[C@@H](CCC(O)=O)*',
|
|
563
|
-
'Q': '*N[C@@H](CCC(N)=O)*',
|
|
564
|
-
'D': '*[C@@H](CC(O)=O)*',
|
|
565
|
-
'N': '*[C@@H](CC(N)=O)*',
|
|
566
|
-
'F': 'C1=CC=C(C=C1)CC(*)*',
|
|
567
|
-
'A': 'C[C@H](*)*',
|
|
568
|
-
'K': 'C(CCN)CC(*)*',
|
|
569
|
-
'R': '*[C@H](CCCNC(=N)C)*',
|
|
570
|
-
'H': 'C1=C(NC=N1)CC(*)*',
|
|
571
|
-
'C': 'C([C@@H](*)*)S',
|
|
572
|
-
'V': 'CC(C)C(*)*',
|
|
573
|
-
'P': 'C1CCN(*)C1*',
|
|
574
|
-
'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',
|
|
575
|
-
'I': 'CC[C@H](C)[C@H](*)*',
|
|
576
|
-
'M': 'CSCCC(*)*',
|
|
577
|
-
'T': 'CC(O)C(*)*',
|
|
578
|
-
};
|
|
579
|
-
/** TODO: Full?
|
|
580
|
-
*/
|
|
581
|
-
Aminoacids.AAFullNames = {
|
|
582
|
-
'Ala': 'A',
|
|
583
|
-
'Arg': 'R',
|
|
584
|
-
'Asn': 'N',
|
|
585
|
-
'Asp': 'D',
|
|
586
|
-
'Cys': 'C',
|
|
587
|
-
'Gln': 'Q',
|
|
588
|
-
'Glu': 'E',
|
|
589
|
-
'Gly': 'G',
|
|
590
|
-
'His': 'H',
|
|
591
|
-
'Ile': 'I',
|
|
592
|
-
'Leu': 'L',
|
|
593
|
-
'Lys': 'K',
|
|
594
|
-
'Met': 'M',
|
|
595
|
-
'Phe': 'F',
|
|
596
|
-
'Pro': 'P',
|
|
597
|
-
'Ser': 'S',
|
|
598
|
-
'Thr': 'T',
|
|
599
|
-
'Trp': 'W',
|
|
600
|
-
'Tyr': 'Y',
|
|
601
|
-
'Val': 'V',
|
|
602
|
-
};
|
|
603
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBSU0sTUFBTSxLQUFLLFVBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7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QUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0sIGZhbHNlLCBBbWlub2FjaWRzUGFsZXR0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSwgZmFsc2UsIEFtaW5vYWNpZHNQYWxldHRlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IG5ldyBBbWlub2FjaWRzUGFsZXR0ZXMoe1xuICAgICAgICAvLyBodHRwOi8vYWNjZXMuZW5zLWx5b24uZnIvYmlvdGljL3Jhc3RvcC9oZWxwL2NvbG91ci5odG1cbiAgICAgICAgJ0QnOiAnI0U2MEEwQScsIC8vIGFzcCwgYXNwYXJ0aWMgYWNpZCwgYXNwXG4gICAgICAgICdFJzogJyNFNjBBMEEnLCAvLyBnbHUsIGdsdXRhbWljIGFjaWRcbiAgICAgICAgJ0MnOiAnI0U2RTYwMCcsIC8vIGN5cywgY3lzdGVpbmVcbiAgICAgICAgJ00nOiAnI0U2RTYwMCcsIC8vIG1ldCwgbWV0aGlvbmluZVxuICAgICAgICAnSyc6ICcjMTQ1QUZGJywgLy8gbHlzLCBseXNpbmVcbiAgICAgICAgJ1InOiAnIzE0NUFGRicsIC8vIGFyZywgYXJnaW5pbmVcbiAgICAgICAgJ1MnOiAnI0ZBOTYwMCcsIC8vIHNlciwgc2VyaW5lXG4gICAgICAgICdUJzogJyNGQTk2MDAnLCAvLyB0aHIsIHRocmVvbmluZVxuICAgICAgICAnRic6ICcjMzIzMkFBJywgLy8gcGhlLCBwaGVueWxhbGFuaW5lXG4gICAgICAgICdZJzogJyMzMjMyQUEnLCAvLyB0eXIsIHR5cm9zaW5lXG4gICAgICAgICdOJzogJyMwMERDREMnLCAvLyBhc24sIGFzcGFyYWdpbmVcbiAgICAgICAgJ1EnOiAnIzAwRENEQycsIC8vIGdsbiwgZ2x1dGFtaW5lXG4gICAgICAgICdHJzogJyNFQkVCRUInLCAvLyBnbHksIGdseWNpbmVcbiAgICAgICAgJ0wnOiAnIzBGODIwRicsIC8vIGxldSwgbGV1Y2luZVxuICAgICAgICAnVic6ICcjMEY4MjBGJywgLy8gdmFsLCB2YWxpbmVcbiAgICAgICAgJ0knOiAnIzBGODIwRicsIC8vIGlsZSwgaXNvbGV1Y2luZVxuICAgICAgICAnQSc6ICcjQzhDOEM4JywgLy8gYWxhLCBhbGFuaW5lXG4gICAgICAgICdXJzogJyNCNDVBQjQnLCAvLyB0cnAsIHRyeXB0b3BoYW5cbiAgICAgICAgJ0gnOiAnIzgyODJEMicsIC8vIGhpcywgaGlzdGlkaW5lXG4gICAgICAgICdQJzogJyNEQzk2ODInLCAvLyBwcm8sIHByb2xpbmVcbiAgICAgICAgJ290aGVycyc6ICcjQkVBMDZFJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0KG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzTSA9IG0gaW4gQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXMgPyBBbWlub2FjaWRzUGFsZXR0ZXMuYWFTeW5vbnltc1ttXSA6IG07XG4gICAgY29uc3QgcmVzID0gc3VwZXIuZ2V0KHJlc00pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdNZU5sZSc6ICdMJywgLy8gTmxlIC0gbm9ybGV1Y2luZVxuICAgICdNZUEnOiAnQScsXG4gICAgJ01lRyc6ICdHJyxcbiAgICAnTWVGJzogJ0YnLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQW1pbm9hY2lkcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnQW1pbm9hY2lkcyc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDogc3RyaW5nID0gJ0FtaW5vYWNpZHNNdWx0aXBsZUFsaWdubWVudCc7XG5cbiAgc3RhdGljIHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIHB1YmxpYyBzdGF0aWMgTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnR2x5Y2luZScsXG4gICAgJ0wnOiAnTGV1Y2luZScsXG4gICAgJ1knOiAnVHlyb3NpbmUnLFxuICAgICdTJzogJ1NlcmluZScsXG4gICAgJ0UnOiAnR2x1dGFtaWMgYWNpZCcsXG4gICAgJ1EnOiAnR2x1dGFtaW5lJyxcbiAgICAnRCc6ICdBc3BhcnRpYyBhY2lkJyxcbiAgICAnTic6ICdBc3BhcmFnaW5lJyxcbiAgICAnRic6ICdQaGVueWxhbGFuaW5lJyxcbiAgICAnQSc6ICdBbGFuaW5lJyxcbiAgICAnSyc6ICdMeXNpbmUnLFxuICAgICdSJzogJ0FyZ2luaW5lJyxcbiAgICAnSCc6ICdIaXN0aWRpbmUnLFxuICAgICdDJzogJ0N5c3RlaW5lJyxcbiAgICAnVic6ICdWYWxpbmUnLFxuICAgICdQJzogJ1Byb2xpbmUnLFxuICAgICdXJzogJ1RyeXB0b3BoYW4nLFxuICAgICdJJzogJ0lzb2xldWNpbmUnLFxuICAgICdNJzogJ01ldGhpb25pbmUnLFxuICAgICdUJzogJ1RocmVvbmluZScsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlczogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICdOQ0MoPU8pTycsXG4gICAgJ0wnOiAnTltDQEhdKENDKEMpQylDKD1PKU8nLFxuICAgICdZJzogJ05DKENDMT1DQz1DKE8pQz1DMSlDKD1PKU8nLFxuICAgICdTJzogJ05DKENPKUMoPU8pTycsXG4gICAgJ0UnOiAnTltDQEBIXShDQ0MoTyk9TylDKD1PKU8nLFxuICAgICdRJzogJ05bQ0BASF0oQ0NDKE4pPU8pQyg9TylPJyxcbiAgICAnRCc6ICdOW0NAQEhdKENDKE8pPU8pQyg9TylPJyxcbiAgICAnTic6ICdOW0NAQEhdKENDKE4pPU8pQyg9TylPJyxcbiAgICAnRic6ICdOQyhDQzE9Q0M9Q0M9QzEpQyg9TylPJyxcbiAgICAnQSc6ICdOW0NASF0oQylDKD1PKU8nLFxuICAgICdLJzogJ05DKENDQ0NOKUMoPU8pTycsXG4gICAgJ1InOiAnTltDQEhdKENDQ05DKD1OKUMpQyg9TylPJyxcbiAgICAnSCc6ICdOQyhDQzE9Q049Q1tOXTEpQyg9TylPJyxcbiAgICAnQyc6ICdOW0NAQEhdKENTKUMoPU8pTycsXG4gICAgJ1YnOiAnTkMoQyhDKUMpQyg9TylPJyxcbiAgICAnUCc6ICdOKENDQzEpQzFDKD1PKU8nLFxuICAgICdXJzogJ05bQ0BASF0oQ2MxYzJjY2NjYzJuKFtIXSljMSlDKD1PKU8nLFxuICAgICdJJzogJ05bQ0BIXShbQ0BIXShDKUNDKUMoPU8pTycsXG4gICAgJ00nOiAnTkMoQ0NTQylDKD1PKU8nLFxuICAgICdUJzogJ05DKEMoTylDKUMoPU8pTycsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlc1RydW5jYXRlZDogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICcqQyonLFxuICAgICdMJzogJ0NDKEMpQ1tDQEhdKCopKicsXG4gICAgJ1knOiAnQzE9Q0MoPUNDPUMxQ0MoKikqKU8nLFxuICAgICdTJzogJ09DQygqKUMqJyxcbiAgICAnRSc6ICcqW0NAQEhdKENDQyhPKT1PKSonLFxuICAgICdRJzogJypOW0NAQEhdKENDQyhOKT1PKSonLFxuICAgICdEJzogJypbQ0BASF0oQ0MoTyk9TykqJyxcbiAgICAnTic6ICcqW0NAQEhdKENDKE4pPU8pKicsXG4gICAgJ0YnOiAnQzE9Q0M9QyhDPUMxKUNDKCopKicsXG4gICAgJ0EnOiAnQ1tDQEhdKCopKicsXG4gICAgJ0snOiAnQyhDQ04pQ0MoKikqJyxcbiAgICAnUic6ICcqW0NASF0oQ0NDTkMoPU4pQykqJyxcbiAgICAnSCc6ICdDMT1DKE5DPU4xKUNDKCopKicsXG4gICAgJ0MnOiAnQyhbQ0BASF0oKikqKVMnLFxuICAgICdWJzogJ0NDKEMpQygqKSonLFxuICAgICdQJzogJ0MxQ0NOKCopQzEqJyxcbiAgICAnVyc6ICcqW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpKicsXG4gICAgJ0knOiAnQ0NbQ0BIXShDKVtDQEhdKCopKicsXG4gICAgJ00nOiAnQ1NDQ0MoKikqJyxcbiAgICAnVCc6ICdDQyhPKUMoKikqJyxcbiAgfTtcblxuICAvKiogVE9ETzogRnVsbD9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgQUFGdWxsTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0FsYSc6ICdBJyxcbiAgICAnQXJnJzogJ1InLFxuICAgICdBc24nOiAnTicsXG4gICAgJ0FzcCc6ICdEJyxcbiAgICAnQ3lzJzogJ0MnLFxuICAgICdHbG4nOiAnUScsXG4gICAgJ0dsdSc6ICdFJyxcbiAgICAnR2x5JzogJ0cnLFxuICAgICdIaXMnOiAnSCcsXG4gICAgJ0lsZSc6ICdJJyxcbiAgICAnTGV1JzogJ0wnLFxuICAgICdMeXMnOiAnSycsXG4gICAgJ01ldCc6ICdNJyxcbiAgICAnUGhlJzogJ0YnLFxuICAgICdQcm8nOiAnUCcsXG4gICAgJ1Nlcic6ICdTJyxcbiAgICAnVGhyJzogJ1QnLFxuICAgICdUcnAnOiAnVycsXG4gICAgJ1R5cic6ICdZJyxcbiAgICAnVmFsJzogJ1YnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGFsZXR0ZShzY2hlbWU6IHN0cmluZyA9ICdncm9rJyk6IFNlcVBhbGV0dGUge1xuICAgIHN3aXRjaCAoc2NoZW1lKSB7XG4gICAgY2FzZSAnZ3Jvayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgY2FzZSAnbGVzayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkxlc2s7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlbVBhbGV0dGU6IHNjaGVtZSBcXGAke3NjaGVtZX1cXGAgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkaXZpZGVkIGFtaW5vIGFjaWQgd2l0aCBpdHMgY29udGVudCBpbiB0aGUgYnJhY2tldCwgaWYgdGhlIGNvbnRlbnQgaXMgbnVtYmVyLCB0aGVuIGl0cyBvbWl0dGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjIHJhdyBhbWlub1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nLCBzdHJpbmddfSBvdXRlciBhbmQgaW5uZXIgY29udGVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbm5lck91dGVyKGM6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGxldCBpc0lubmVyID0gMDtcbiAgICBsZXQgaW5uZXIgPSAnJztcbiAgICBsZXQgb3V0ZXIgPSAnJztcblxuICAgIGZvciAoY29uc3QgY2hhciBvZiBjKSB7XG4gICAgICBpZiAoY2hhciA9PSAnKCcpXG4gICAgICAgIGlzSW5uZXIrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyknKVxuICAgICAgICBpc0lubmVyLS07XG4gICAgICBlbHNlIGlmIChpc0lubmVyKVxuICAgICAgICBpbm5lciArPSBjaGFyO1xuICAgICAgZWxzZVxuICAgICAgICBvdXRlciArPSBjaGFyO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoaW5uZXIpKSA/IFtvdXRlciwgJyddIDogW291dGVyLCBpbm5lcl07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldENvbG9yQUFQaXZvdChtb25vbWVyOiBzdHJpbmcgPSAnJywgc2NoZW1lOiAnZ3JvaycgPSAnZ3JvaycpOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgbnVtYmVyXSB7XG4gICAgLy9jb25zdCBjaGVtUGFsZXR0ZUluc3RhbmNlID0gQUFQYWxldHRlcy5Hcm9rR3JvdXBzKCk7XG4gICAgY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IHRoaXMuZ2V0UGFsZXR0ZShzY2hlbWUpO1xuICAgIGxldCBbb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXJdID0gdGhpcy5nZXRJbm5lck91dGVyKG1vbm9tZXIpO1xuICAgIG91dGVyTW9ub21lciA9IChvdXRlck1vbm9tZXIubGVuZ3RoID4gNiA/IGAke291dGVyTW9ub21lci5zbGljZSgwLCAzKX0uLi5gIDogb3V0ZXJNb25vbWVyKTtcbiAgICBpbm5lck1vbm9tZXIgPSAoaW5uZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtpbm5lck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IGlubmVyTW9ub21lcik7XG5cbiAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMSB8fCBtb25vbWVyWzFdID09ICcoJykge1xuICAgICAgY29uc3QgYW1pbm8gPSBtb25vbWVyWzBdPy50b1VwcGVyQ2FzZSgpITtcbiAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMl0gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDAsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgIGlmIChtb25vbWVyLmxlbmd0aCA9PSAzIHx8IG1vbm9tZXJbM10gPT0gJygnKSB7XG4gICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygwLCAzKV07XG4gICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCAzXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAzXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lclswXT8udG9Mb3dlckNhc2UoKSA9PSBtb25vbWVyWzBdKSB7XG4gICAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMSwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gNCB8fCBtb25vbWVyWzRdID09ICcoJykge1xuICAgICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygxLCAzKV07XG4gICAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=
|
|
604
|
-
|
|
605
|
-
/***/ }),
|
|
606
|
-
|
|
607
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/nucleotides.js":
|
|
608
|
-
/*!*****************************************************************!*\
|
|
609
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/nucleotides.js ***!
|
|
610
|
-
\*****************************************************************/
|
|
611
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
612
|
-
|
|
613
|
-
__webpack_require__.r(__webpack_exports__);
|
|
614
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
615
|
-
/* harmony export */ "Nucleotides": () => (/* binding */ Nucleotides),
|
|
616
|
-
/* harmony export */ "NucleotidesPalettes": () => (/* binding */ NucleotidesPalettes)
|
|
617
|
-
/* harmony export */ });
|
|
618
|
-
/* harmony import */ var _seq_palettes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seq-palettes */ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js");
|
|
619
|
-
|
|
620
|
-
class NucleotidesPalettes extends _seq_palettes__WEBPACK_IMPORTED_MODULE_0__.SeqPaletteBase {
|
|
621
|
-
static get Chromatogram() {
|
|
622
|
-
if (this.chromatogram === void 0) {
|
|
623
|
-
this.chromatogram = new NucleotidesPalettes({
|
|
624
|
-
'A': 'green',
|
|
625
|
-
'C': 'blue',
|
|
626
|
-
'G': 'black',
|
|
627
|
-
'T': 'red',
|
|
628
|
-
'U': 'red',
|
|
629
|
-
'others': 'gray',
|
|
630
|
-
});
|
|
631
|
-
}
|
|
632
|
-
return this.chromatogram;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
class Nucleotides {
|
|
636
|
-
}
|
|
637
|
-
Nucleotides.SemType = 'Nucleotides';
|
|
638
|
-
Nucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';
|
|
639
|
-
Nucleotides.Names = {
|
|
640
|
-
'A': 'Adenine',
|
|
641
|
-
'C': 'Cytosine',
|
|
642
|
-
'G': 'Guanine',
|
|
643
|
-
'T': 'Thymine',
|
|
644
|
-
'U': 'Uracil',
|
|
645
|
-
};
|
|
646
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztnQkFDMUMsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLE1BQU07Z0JBQ1gsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFdBQVc7O0FBQ04sbUJBQU8sR0FBVyxhQUFhLENBQUM7QUFFaEMsb0NBQXdCLEdBQVcsOEJBQThCLENBQUM7QUFFcEUsaUJBQUssR0FBcUI7SUFDdEMsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsUUFBUTtDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIE51Y2xlb3RpZGVzUGFsZXR0ZXMgZXh0ZW5kcyBTZXFQYWxldHRlQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGNocm9tYXRvZ3JhbTogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBDaHJvbWF0b2dyYW0oKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuY2hyb21hdG9ncmFtID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY2hyb21hdG9ncmFtID0gbmV3IE51Y2xlb3RpZGVzUGFsZXR0ZXMoe1xuICAgICAgICAnQSc6ICdncmVlbicsXG4gICAgICAgICdDJzogJ2JsdWUnLFxuICAgICAgICAnRyc6ICdibGFjaycsIC8vIG9yYW5nZSA/XG4gICAgICAgICdUJzogJ3JlZCcsXG4gICAgICAgICdVJzogJ3JlZCcsXG4gICAgICAgICdvdGhlcnMnOiAnZ3JheScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTnVjbGVvdGlkZXMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19
|
|
647
|
-
|
|
648
|
-
/***/ }),
|
|
649
|
-
|
|
650
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js":
|
|
651
|
-
/*!******************************************************************!*\
|
|
652
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/seq-palettes.js ***!
|
|
653
|
-
\******************************************************************/
|
|
654
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
655
|
-
|
|
656
|
-
__webpack_require__.r(__webpack_exports__);
|
|
657
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
658
|
-
/* harmony export */ "SeqPaletteBase": () => (/* binding */ SeqPaletteBase)
|
|
659
|
-
/* harmony export */ });
|
|
660
|
-
class SeqPaletteBase {
|
|
661
|
-
static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {
|
|
662
|
-
const palette = {};
|
|
663
|
-
dt.forEach((cp) => {
|
|
664
|
-
const objList = cp[0];
|
|
665
|
-
const colour = cp[1];
|
|
666
|
-
objList.forEach((obj, ind) => {
|
|
667
|
-
palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];
|
|
668
|
-
});
|
|
669
|
-
});
|
|
670
|
-
return new PaletteType(palette);
|
|
671
|
-
}
|
|
672
|
-
constructor(palette) {
|
|
673
|
-
this._palette = palette;
|
|
674
|
-
}
|
|
675
|
-
get(m) {
|
|
676
|
-
return this._palette[m];
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
SeqPaletteBase.undefinedColor = 'rgb(100,100,100)';
|
|
680
|
-
/** Palette with shades of primary colors */
|
|
681
|
-
SeqPaletteBase.colourPalette = {
|
|
682
|
-
'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],
|
|
683
|
-
'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',
|
|
684
|
-
'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
|
|
685
|
-
'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',
|
|
686
|
-
'rgb(31, 120, 150)'],
|
|
687
|
-
'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],
|
|
688
|
-
'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],
|
|
689
|
-
'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],
|
|
690
|
-
'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],
|
|
691
|
-
'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],
|
|
692
|
-
'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],
|
|
693
|
-
'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],
|
|
694
|
-
'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],
|
|
695
|
-
'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
|
|
696
|
-
'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],
|
|
697
|
-
'pink': ['rgb(247,182,210)'],
|
|
698
|
-
'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],
|
|
699
|
-
'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],
|
|
700
|
-
'yellow': ['rgb(188,189,34)'],
|
|
701
|
-
'white': ['rgb(230,230,230)'],
|
|
702
|
-
};
|
|
703
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxNQUFNLE9BQU8sY0FBYztJQTJCZixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQXdCLEVBQ25ELFVBQVUsR0FBRyxLQUFLLEVBQUUsY0FBcUMsY0FBYztRQUV2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBSUQsWUFBWSxPQUFnQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7O0FBaERhLDZCQUFjLEdBQUcsa0JBQWtCLENBQUM7QUFFbEQsNENBQTRDO0FBQzlCLDRCQUFhLEdBQWdDO0lBQ3pELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8vIFRoZXJlIGFyZSB0b28gbXVjaCBwcm9ibGVtIHdpdGggaW5kZXhlciBwcm9wZXJ0eSBpbiB0eXBlc2NyaXB0LlxuICAvLyAvKipcbiAgLy8gICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lciBjaGFyYWN0ZXJcbiAgLy8gICogQHJldHVybiB7c3RyaW5nfSBDb2xvclxuICAvLyAgKi9cbiAgLy8gW206IHN0cmluZ106IHN0cmluZztcbiAgLyoqIE1vbm9tZXIgY29sb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lclxuICAgKi9cbiAgZ2V0KG06IHN0cmluZyk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcVBhbGV0dGVCYXNlIGltcGxlbWVudHMgU2VxUGFsZXR0ZSB7XG4gIHB1YmxpYyBzdGF0aWMgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5cbiAgLyoqIFBhbGV0dGUgd2l0aCBzaGFkZXMgb2YgcHJpbWFyeSBjb2xvcnMgKi9cbiAgcHVibGljIHN0YXRpYyBjb2xvdXJQYWxldHRlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG4gICAgJ29yYW5nZSc6IFsncmdiKDI1NSwxODcsMTIwKScsICdyZ2IoMjQ1LDE2NywxMDApJywgJ3JnYigyMzUsMTM3LDcwKScsICdyZ2IoMjA1LCAxMTEsIDcxKSddLFxuICAgICdhbGxfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJywgJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJyxcbiAgICAgICdyZ2IoMjQsMTEwLDc5KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnYWxsX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDEyMiwgMTAyLCAxODkpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDE0MSwgMTI0LCAyMTcpJyxcbiAgICAgICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdtYWdlbnRhJzogWydyZ2IoMTYyLDEwNiwxOTIpJywgJ3JnYigxOTcsMTY1LDIyNCknLCAncmdiKDIwOCwxMTMsMjE4KSddLFxuICAgICdyZWQnOiBbJ3JnYigyMTQsMzksNDApJywgJ3JnYigyNTUsMTUyLDE1MCknXSxcbiAgICAnc3RfYmx1ZSc6IFsncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDMxLDExOSwxODApJ10sXG4gICAgJ2RhcmtfYmx1ZSc6IFsncmdiKDMxLDExOSwxODApJywgJ3JnYigzMSwgMTIwLCAxNTApJ10sXG4gICAgJ2xpZ2h0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxMDgsIDIxOCwgMjI5KScsICdyZ2IoMjMsMTkwLDIyNyknXSxcbiAgICAnbGlsYWNfYmx1ZSc6IFsncmdiKDEyNCwxMDIsMjExKScsICdyZ2IoMTQ5LDEzNCwyMTcpJywgJ3JnYig5NywgODEsIDE1MCknXSxcbiAgICAnZGFya19ncmVlbic6IFsncmdiKDIzLDEwMyw1NyknLCAncmdiKDMwLDExMCw5NiknLCAncmdiKDYwLDEzMSw5NSknLCAncmdiKDI0LDExMCw3OSknXSxcbiAgICAnZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJ10sXG4gICAgJ2xpZ2h0X2dyZWVuJzogWydyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnc3RfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYigxNTIsMjIzLDEzOCknLCAncmdiKDM5LCAxNzQsIDk2KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdwaW5rJzogWydyZ2IoMjQ3LDE4MiwyMTApJ10sXG4gICAgJ2Jyb3duJzogWydyZ2IoMTQwLDg2LDc1KScsICdyZ2IoMTAyLCA2MiwgNTQpJ10sXG4gICAgJ2dyYXknOiBbJ3JnYigxMjcsMTI3LDEyNyknLCAncmdiKDE5OSwxOTksMTk5KScsICdyZ2IoMTk2LDE1NiwxNDgpJywgJ3JnYigyMjIsIDIyMiwgMTgwKSddLFxuICAgICd5ZWxsb3cnOiBbJ3JnYigxODgsMTg5LDM0KSddLFxuICAgICd3aGl0ZSc6IFsncmdiKDIzMCwyMzAsMjMwKSddLFxuICB9O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbWFrZVBhbGV0dGUoZHQ6IFtzdHJpbmdbXSwgc3RyaW5nXVtdLFxuICAgIHNpbXBsaWZpZWQgPSBmYWxzZSwgUGFsZXR0ZVR5cGU6IHR5cGVvZiBTZXFQYWxldHRlQmFzZSA9IFNlcVBhbGV0dGVCYXNlXG4gICkge1xuICAgIGNvbnN0IHBhbGV0dGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBkdC5mb3JFYWNoKChjcCkgPT4ge1xuICAgICAgY29uc3Qgb2JqTGlzdCA9IGNwWzBdO1xuICAgICAgY29uc3QgY29sb3VyID0gY3BbMV07XG4gICAgICBvYmpMaXN0LmZvckVhY2goKG9iaiwgaW5kKSA9PiB7XG4gICAgICAgIHBhbGV0dGVbb2JqXSA9IHRoaXMuY29sb3VyUGFsZXR0ZVtjb2xvdXJdW3NpbXBsaWZpZWQgPyAwIDogaW5kXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgUGFsZXR0ZVR5cGUocGFsZXR0ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihwYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX3BhbGV0dGUgPSBwYWxldHRlO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYWxldHRlW21dO1xuICB9XG59XG4iXX0=
|
|
704
|
-
|
|
705
|
-
/***/ }),
|
|
706
|
-
|
|
707
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/unknown.js":
|
|
708
|
-
/*!*************************************************************!*\
|
|
709
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/unknown.js ***!
|
|
710
|
-
\*************************************************************/
|
|
711
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
712
|
-
|
|
713
|
-
__webpack_require__.r(__webpack_exports__);
|
|
714
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
715
|
-
/* harmony export */ "GrayAllPalette": () => (/* binding */ GrayAllPalette),
|
|
716
|
-
/* harmony export */ "StringUtils": () => (/* binding */ StringUtils),
|
|
717
|
-
/* harmony export */ "UnknownColorPalette": () => (/* binding */ UnknownColorPalette),
|
|
718
|
-
/* harmony export */ "UnknownSeqPalette": () => (/* binding */ UnknownSeqPalette),
|
|
719
|
-
/* harmony export */ "UnknownSeqPalettes": () => (/* binding */ UnknownSeqPalettes)
|
|
720
|
-
/* harmony export */ });
|
|
721
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
722
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
723
|
-
/* harmony import */ var _seq_palettes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seq-palettes */ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js");
|
|
724
|
-
|
|
725
|
-
/** makes the color less white, makes the transparency effect always perceptible
|
|
726
|
-
* @param {string} color x coordinate.
|
|
727
|
-
* */
|
|
728
|
-
function correctColor(color) {
|
|
729
|
-
if (color == null)
|
|
730
|
-
return 'rgb(100,100,100)';
|
|
731
|
-
const dgColor = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.fromHtml(color);
|
|
732
|
-
const g = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.g(dgColor);
|
|
733
|
-
const r = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.r(dgColor);
|
|
734
|
-
const b = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.b(dgColor);
|
|
735
|
-
// calculate euclidean distance to white
|
|
736
|
-
const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));
|
|
737
|
-
// normalize vector r g b
|
|
738
|
-
const normR = r / distToBlack;
|
|
739
|
-
const normG = g / distToBlack;
|
|
740
|
-
const normB = b / distToBlack;
|
|
741
|
-
if (distToBlack > 210) {
|
|
742
|
-
return `rgb(${normR * 210},${normG * 210},${normB * 210})`;
|
|
743
|
-
}
|
|
744
|
-
return datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.toRgb(dgColor);
|
|
745
|
-
}
|
|
746
|
-
class StringUtils {
|
|
747
|
-
static hashCode(s) {
|
|
748
|
-
let hash = 0;
|
|
749
|
-
if (s.length === 0)
|
|
750
|
-
return hash;
|
|
751
|
-
for (let i = 0; i < s.length; i++) {
|
|
752
|
-
const chr = s.charCodeAt(i);
|
|
753
|
-
hash = ((hash << 5) - hash) + chr;
|
|
754
|
-
hash |= 0; // Convert to 32bit integer
|
|
755
|
-
}
|
|
756
|
-
return hash;
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
class UnknownSeqPalette {
|
|
761
|
-
}
|
|
762
|
-
class GrayAllPalette extends UnknownSeqPalette {
|
|
763
|
-
get(m) {
|
|
764
|
-
return '#666666';
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
class UnknownColorPalette extends UnknownSeqPalette {
|
|
768
|
-
static buildPalette() {
|
|
769
|
-
const res = [].concat(...Object.values(_seq_palettes__WEBPACK_IMPORTED_MODULE_1__.SeqPaletteBase.colourPalette));
|
|
770
|
-
return res;
|
|
771
|
-
}
|
|
772
|
-
get(m) {
|
|
773
|
-
const hash = StringUtils.hashCode(m);
|
|
774
|
-
const pI = hash % UnknownColorPalette.palette.length;
|
|
775
|
-
return correctColor(UnknownColorPalette.palette[pI]);
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
UnknownColorPalette.palette = UnknownColorPalette.buildPalette();
|
|
779
|
-
class UnknownSeqPalettes extends _seq_palettes__WEBPACK_IMPORTED_MODULE_1__.SeqPaletteBase {
|
|
780
|
-
static get Gray() {
|
|
781
|
-
if (this.gray === void 0)
|
|
782
|
-
this.gray = new GrayAllPalette();
|
|
783
|
-
return this.gray;
|
|
784
|
-
}
|
|
785
|
-
static get Color() {
|
|
786
|
-
if (this.color === void 0)
|
|
787
|
-
this.color = new UnknownColorPalette();
|
|
788
|
-
return this.color;
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5rbm93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVua25vd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0Qzs7S0FFSztBQUNMLFNBQVMsWUFBWSxDQUFDLEtBQW9CO0lBQ3hDLElBQUksS0FBSyxJQUFJLElBQUk7UUFDZixPQUFPLGtCQUFrQixDQUFDO0lBRTVCLE1BQU0sT0FBTyxHQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLHdDQUF3QztJQUN4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUYseUJBQXlCO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQzlCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRTtRQUNyQixPQUFPLE9BQU8sS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUM1RDtJQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFTO1FBQzlCLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxHQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE9BQU8sRUFBYSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRCxNQUFNLE9BQWdCLGlCQUFpQjtDQUV0QztBQUVELE1BQU0sT0FBTyxjQUFlLFNBQVEsaUJBQWlCO0lBQzVDLEdBQUcsQ0FBQyxDQUFTO1FBQ2xCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFHaEQsTUFBTSxDQUFDLFlBQVk7UUFDekIsTUFBTSxHQUFHLEdBQUksRUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEYsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsTUFBTSxJQUFJLEdBQVcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQVhhLDJCQUFPLEdBQWEsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7QUFjdkUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGNBQWM7SUFHN0MsTUFBTSxLQUFLLElBQUk7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFJTSxNQUFNLEtBQUssS0FBSztRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG4vKiogbWFrZXMgdGhlIGNvbG9yIGxlc3Mgd2hpdGUsIG1ha2VzIHRoZSB0cmFuc3BhcmVuY3kgZWZmZWN0IGFsd2F5cyBwZXJjZXB0aWJsZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIHggY29vcmRpbmF0ZS5cbiAqICovXG5mdW5jdGlvbiBjb3JyZWN0Q29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoY29sb3IgPT0gbnVsbClcbiAgICByZXR1cm4gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIGNvbnN0IGRnQ29sb3I6IG51bWJlciA9IERHLkNvbG9yLmZyb21IdG1sKGNvbG9yKTtcbiAgY29uc3QgZyA9IERHLkNvbG9yLmcoZGdDb2xvcik7XG4gIGNvbnN0IHIgPSBERy5Db2xvci5yKGRnQ29sb3IpO1xuICBjb25zdCBiID0gREcuQ29sb3IuYihkZ0NvbG9yKTtcbiAgLy8gY2FsY3VsYXRlIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byB3aGl0ZVxuICBjb25zdCBkaXN0VG9CbGFjayA9IE1hdGguc3FydChNYXRoLnBvdygwIC0gciwgMikgKyBNYXRoLnBvdygwIC0gZywgMikgKyBNYXRoLnBvdygwIC0gYiwgMikpO1xuICAvLyBub3JtYWxpemUgdmVjdG9yIHIgZyBiXG4gIGNvbnN0IG5vcm1SID0gciAvIGRpc3RUb0JsYWNrO1xuICBjb25zdCBub3JtRyA9IGcgLyBkaXN0VG9CbGFjaztcbiAgY29uc3Qgbm9ybUIgPSBiIC8gZGlzdFRvQmxhY2s7XG4gIGlmIChkaXN0VG9CbGFjayA+IDIxMCkge1xuICAgIHJldHVybiBgcmdiKCR7bm9ybVIgKiAyMTB9LCR7bm9ybUcgKiAyMTB9LCR7bm9ybUIgKiAyMTB9KWA7XG4gIH1cbiAgcmV0dXJuIERHLkNvbG9yLnRvUmdiKGRnQ29sb3IpO1xufVxuXG5leHBvcnQgY2xhc3MgU3RyaW5nVXRpbHMge1xuICBwdWJsaWMgc3RhdGljIGhhc2hDb2RlKHM6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGhhc2g6IG51bWJlciA9IDA7XG4gICAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGhhc2g7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNocjogbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG4gIH1cbn1cblxuaW1wb3J0IHtTZXFQYWxldHRlLCBTZXFQYWxldHRlQmFzZX0gZnJvbSAnLi9zZXEtcGFsZXR0ZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVW5rbm93blNlcVBhbGV0dGUgaW1wbGVtZW50cyBTZXFQYWxldHRlIHtcbiAgcHVibGljIGFic3RyYWN0IGdldChtOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmF5QWxsUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIzY2NjY2Nic7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbG9yUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIHN0YXRpYyBwYWxldHRlOiBzdHJpbmdbXSA9IFVua25vd25Db2xvclBhbGV0dGUuYnVpbGRQYWxldHRlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRQYWxldHRlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXMgPSAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKFNlcVBhbGV0dGVCYXNlLmNvbG91clBhbGV0dGUpKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2g6IG51bWJlciA9IFN0cmluZ1V0aWxzLmhhc2hDb2RlKG0pO1xuICAgIGNvbnN0IHBJID0gaGFzaCAlIFVua25vd25Db2xvclBhbGV0dGUucGFsZXR0ZS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvcnJlY3RDb2xvcihVbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGVbcEldKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93blNlcVBhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBncmF5OiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEdyYXkoKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuZ3JheSA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5ncmF5ID0gbmV3IEdyYXlBbGxQYWxldHRlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3JheTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbG9yOiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IENvbG9yKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNvbG9yID09PSB2b2lkIDApXG4gICAgICB0aGlzLmNvbG9yID0gbmV3IFVua25vd25Db2xvclBhbGV0dGUoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgfVxufVxuIl19
|
|
792
|
-
|
|
793
|
-
/***/ }),
|
|
794
|
-
|
|
795
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js":
|
|
796
|
-
/*!*************************************************************************!*\
|
|
797
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js ***!
|
|
798
|
-
\*************************************************************************/
|
|
799
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
800
|
-
|
|
801
|
-
__webpack_require__.r(__webpack_exports__);
|
|
802
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
803
|
-
/* harmony export */ "DrawStyle": () => (/* binding */ DrawStyle),
|
|
804
|
-
/* harmony export */ "printLeftOrCentered": () => (/* binding */ printLeftOrCentered)
|
|
805
|
-
/* harmony export */ });
|
|
806
|
-
/* harmony import */ var _macromolecule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./macromolecule */ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js");
|
|
807
|
-
|
|
808
|
-
const undefinedColor = 'rgb(100,100,100)';
|
|
809
|
-
const grayColor = '#808080';
|
|
810
|
-
const blackColor = 'rgb(0,0,0)';
|
|
811
|
-
const monomerToShortFunction = _macromolecule__WEBPACK_IMPORTED_MODULE_0__.monomerToShort;
|
|
812
|
-
var DrawStyle;
|
|
813
|
-
(function (DrawStyle) {
|
|
814
|
-
DrawStyle["MSA"] = "MSA";
|
|
815
|
-
DrawStyle["classic"] = "classic";
|
|
816
|
-
})(DrawStyle || (DrawStyle = {}));
|
|
817
|
-
/**
|
|
818
|
-
* A function that prints a string aligned to left or centered.
|
|
819
|
-
*
|
|
820
|
-
* @param {number} x x coordinate.
|
|
821
|
-
* @param {number} y y coordinate.
|
|
822
|
-
* @param {number} w Width.
|
|
823
|
-
* @param {number} h Height.
|
|
824
|
-
* @param {CanvasRenderingContext2D} g Canvas rendering context.
|
|
825
|
-
* @param {string} s String to print.
|
|
826
|
-
* @param {string} [color=undefinedColor] String color.
|
|
827
|
-
* @param {number} [pivot=0] Pirvot.
|
|
828
|
-
* @param {boolean} [left=false] Is left aligned.
|
|
829
|
-
* @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent
|
|
830
|
-
* @param {string} [separator=''] Is separator for sequence.
|
|
831
|
-
* @param {boolean} [last=false] Is checker if element last or not.
|
|
832
|
-
* @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.
|
|
833
|
-
* @param maxWord Is array of max words for each line.
|
|
834
|
-
* @param wordIdx Is index of word we currently draw.
|
|
835
|
-
* @param gridCell Is grid cell.
|
|
836
|
-
* @param referenceSequence Is reference sequence for diff mode.
|
|
837
|
-
* @param maxLengthOfMonomer Is max length of monomer.
|
|
838
|
-
* @return {number} x coordinate to start printing at.
|
|
839
|
-
*/
|
|
840
|
-
const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {
|
|
841
|
-
var _a, _b, _c;
|
|
842
|
-
g.textAlign = 'start';
|
|
843
|
-
let colorPart = s.substring(0);
|
|
844
|
-
let grayPart = last ? '' : separator;
|
|
845
|
-
if (drawStyle === DrawStyle.MSA) {
|
|
846
|
-
grayPart = '';
|
|
847
|
-
}
|
|
848
|
-
let colorCode = true;
|
|
849
|
-
let compareWithCurrent = true;
|
|
850
|
-
let highlightDifference = 'difference';
|
|
851
|
-
if ((gridCell != null) && (gridCell.cell.column != null)) {
|
|
852
|
-
colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;
|
|
853
|
-
compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;
|
|
854
|
-
highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';
|
|
855
|
-
}
|
|
856
|
-
const currentMonomer = referenceSequence[wordIdx];
|
|
857
|
-
if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {
|
|
858
|
-
transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;
|
|
859
|
-
}
|
|
860
|
-
if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {
|
|
861
|
-
transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;
|
|
862
|
-
}
|
|
863
|
-
if (maxLengthOfMonomer != null) {
|
|
864
|
-
colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);
|
|
865
|
-
}
|
|
866
|
-
let textSize = g.measureText(colorPart + grayPart);
|
|
867
|
-
const indent = 5;
|
|
868
|
-
let maxColorTextSize = g.measureText(colorPart).width;
|
|
869
|
-
let colorTextSize = g.measureText(colorPart).width;
|
|
870
|
-
const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;
|
|
871
|
-
textSize = textSize.width;
|
|
872
|
-
if (drawStyle === DrawStyle.MSA) {
|
|
873
|
-
maxColorTextSize = maxWord[wordIdx];
|
|
874
|
-
textSize = maxWord[wordIdx];
|
|
875
|
-
}
|
|
876
|
-
function draw(dx1, dx2) {
|
|
877
|
-
const drawColor = colorCode ? color : blackColor;
|
|
878
|
-
g.fillStyle = drawColor;
|
|
879
|
-
g.globalAlpha = transparencyRate;
|
|
880
|
-
if (drawStyle === DrawStyle.classic) {
|
|
881
|
-
g.fillText(colorPart, x + dx1, y + dy);
|
|
882
|
-
g.fillStyle = grayColor;
|
|
883
|
-
g.fillText(grayPart, x + dx2, y + dy);
|
|
884
|
-
}
|
|
885
|
-
if (drawStyle === DrawStyle.MSA) {
|
|
886
|
-
g.fillStyle = drawColor;
|
|
887
|
-
g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
if (left || textSize > w) {
|
|
891
|
-
draw(indent, indent + maxColorTextSize);
|
|
892
|
-
return x + maxColorTextSize + g.measureText(grayPart).width;
|
|
893
|
-
}
|
|
894
|
-
else {
|
|
895
|
-
const dx = (w - textSize) / 2;
|
|
896
|
-
draw(dx, dx + maxColorTextSize);
|
|
897
|
-
return x + dx + maxColorTextSize;
|
|
898
|
-
}
|
|
899
|
-
};
|
|
900
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNlbGwtcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBMEQsY0FBYyxDQUFDO0FBRXJHLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUMxQyxDQUEyQixFQUFFLENBQVMsRUFBRSxRQUFnQixjQUFjLEVBQ3RFLFFBQWdCLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLG1CQUEyQixHQUFHLEVBQy9ELFlBQW9CLEVBQUUsRUFBRSxPQUFnQixLQUFLLEVBQUUsWUFBdUIsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUF1QyxFQUFFLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLFdBQStCLElBQUksRUFBRSxvQkFBOEIsRUFBRSxFQUFFLHFCQUFvQyxJQUFJLEVBQVUsRUFBRTs7SUFDcFIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDdEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxD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QyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7S0FFN0Q7U0FBTTtRQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztLQUNsQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7bW9ub21lclRvU2hvcnR9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG5cbmNvbnN0IHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuY29uc3QgYmxhY2tDb2xvciA9ICdyZ2IoMCwwLDApJztcbmNvbnN0IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb246IChhbWlubzogc3RyaW5nLCBtYXhMZW5ndGhPZk1vbm9tZXI6IG51bWJlcikgPT4gc3RyaW5nID0gbW9ub21lclRvU2hvcnQ7XG5cbmV4cG9ydCBlbnVtIERyYXdTdHlsZSB7XG4gIE1TQSA9ICdNU0EnLFxuICBjbGFzc2ljID0gJ2NsYXNzaWMnLFxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBwcmludHMgYSBzdHJpbmcgYWxpZ25lZCB0byBsZWZ0IG9yIGNlbnRlcmVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IHggY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IHkgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3IFdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGggSGVpZ2h0LlxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGcgQ2FudmFzIHJlbmRlcmluZyBjb250ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nIHRvIHByaW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcj11bmRlZmluZWRDb2xvcl0gU3RyaW5nIGNvbG9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwaXZvdD0wXSBQaXJ2b3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsZWZ0PWZhbHNlXSBJcyBsZWZ0IGFsaWduZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zcGFyZW5jeVJhdGU9MC4wXSBUcmFuc3BhcmVuY3kgcmF0ZSB3aGVyZSAxLjAgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScnXSBJcyBzZXBhcmF0b3IgZm9yIHNlcXVlbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbbGFzdD1mYWxzZV0gSXMgY2hlY2tlciBpZiBlbGVtZW50IGxhc3Qgb3Igbm90LlxuICogQHBhcmFtIGRyYXdTdHlsZSBJcyBkcmF3IHN0eWxlLiBNU0EgLSBmb3IgbXVsdGljaGFyU2VxLCBjbGFzc2ljIC0gZm9yIG90aGVyIHNlcS5cbiAqIEBwYXJhbSBtYXhXb3JkIElzIGFycmF5IG9mIG1heCB3b3JkcyBmb3IgZWFjaCBsaW5lLlxuICogQHBhcmFtIHdvcmRJZHggSXMgaW5kZXggb2Ygd29yZCB3ZSBjdXJyZW50bHkgZHJhdy5cbiAqIEBwYXJhbSBncmlkQ2VsbCBJcyBncmlkIGNlbGwuXG4gKiBAcGFyYW0gcmVmZXJlbmNlU2VxdWVuY2UgSXMgcmVmZXJlbmNlIHNlcXVlbmNlIGZvciBkaWZmIG1vZGUuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoT2ZNb25vbWVyIElzIG1heCBsZW5ndGggb2YgbW9ub21lci5cbiAqIEByZXR1cm4ge251bWJlcn0geCBjb29yZGluYXRlIHRvIHN0YXJ0IHByaW50aW5nIGF0LlxuICovXG5leHBvcnQgY29uc3QgcHJpbnRMZWZ0T3JDZW50ZXJlZCA9IChcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICBnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHM6IHN0cmluZywgY29sb3I6IHN0cmluZyA9IHVuZGVmaW5lZENvbG9yLFxuICBwaXZvdDogbnVtYmVyID0gMCwgbGVmdCA9IGZhbHNlLCB0cmFuc3BhcmVuY3lSYXRlOiBudW1iZXIgPSAxLjAsXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gJycsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSwgZHJhd1N0eWxlOiBEcmF3U3R5bGUgPSBEcmF3U3R5bGUuY2xhc3NpYywgbWF4V29yZDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge30sIHdvcmRJZHg6IG51bWJlciA9IDAsIGdyaWRDZWxsOiBERy5HcmlkQ2VsbCB8IG51bGwgPSBudWxsLCByZWZlcmVuY2VTZXF1ZW5jZTogc3RyaW5nW10gPSBbXSwgbWF4TGVuZ3RoT2ZNb25vbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IG51bWJlciA9PiB7XG4gIGcudGV4dEFsaWduID0gJ3N0YXJ0JztcbiAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICBsZXQgZ3JheVBhcnQgPSBsYXN0ID8gJycgOiBzZXBhcmF0b3I7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBncmF5UGFydCA9ICcnO1xuICB9XG4gIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICBsZXQgY29tcGFyZVdpdGhDdXJyZW50ID0gdHJ1ZTtcbiAgbGV0IGhpZ2hsaWdodERpZmZlcmVuY2UgPSAnZGlmZmVyZW5jZSc7XG4gIGlmICgoZ3JpZENlbGwgIT0gbnVsbCkgJiYgKGdyaWRDZWxsLmNlbGwuY29sdW1uICE9IG51bGwpKSB7XG4gICAgY29sb3JDb2RlID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29sb3ItY29kZSddID8/IHRydWU7XG4gICAgY29tcGFyZVdpdGhDdXJyZW50ID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSA/PyB0cnVlO1xuICAgIGhpZ2hsaWdodERpZmZlcmVuY2UgPSBncmlkQ2VsbC5jZWxsLmNvbHVtbi50ZW1wWydoaWdobGlnaHQtZGlmZmVyZW5jZSddID8/ICdkaWZmZXJlbmNlJztcblxuICB9XG4gIGNvbnN0IGN1cnJlbnRNb25vbWVyOiBzdHJpbmcgPSByZWZlcmVuY2VTZXF1ZW5jZVt3b3JkSWR4XTtcbiAgaWYgKGNvbXBhcmVXaXRoQ3VycmVudCAmJiAocmVmZXJlbmNlU2VxdWVuY2UubGVuZ3RoID4gMCkgJiYgKGhpZ2hsaWdodERpZmZlcmVuY2UgPT09ICdkaWZmZXJlbmNlJykpIHtcbiAgICB0cmFuc3BhcmVuY3lSYXRlID0gKGNvbG9yUGFydCA9PSBjdXJyZW50TW9ub21lcikgPyAwLjMgOiB0cmFuc3BhcmVuY3lSYXRlO1xuICB9XG4gIGlmIChjb21wYXJlV2l0aEN1cnJlbnQgJiYgKHJlZmVyZW5jZVNlcXVlbmNlLmxlbmd0aCA+IDApICYmIChoaWdobGlnaHREaWZmZXJlbmNlID09PSAnZXF1YWwnKSkge1xuICAgIHRyYW5zcGFyZW5jeVJhdGUgPSAoY29sb3JQYXJ0ICE9IGN1cnJlbnRNb25vbWVyKSA/IDAuMyA6IHRyYW5zcGFyZW5jeVJhdGU7XG4gIH1cbiAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgY29sb3JQYXJ0ID0gbW9ub21lclRvU2hvcnRGdW5jdGlvbihjb2xvclBhcnQsIG1heExlbmd0aE9mTW9ub21lcik7XG4gIH1cblxuXG4gIGxldCB0ZXh0U2l6ZTogYW55ID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQgKyBncmF5UGFydCk7XG4gIGNvbnN0IGluZGVudCA9IDU7XG5cbiAgbGV0IG1heENvbG9yVGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCkud2lkdGg7XG4gIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICBjb25zdCBkeSA9IGggLyAyIC0gKHRleHRTaXplLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIHRleHRTaXplLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpIC8gMiArIDE7XG4gIHRleHRTaXplID0gdGV4dFNpemUud2lkdGg7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBtYXhDb2xvclRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB0ZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3KGR4MTogbnVtYmVyLCBkeDI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRyYXdDb2xvciA9IGNvbG9yQ29kZSA/IGNvbG9yIDogYmxhY2tDb2xvcjtcbiAgICBnLmZpbGxTdHlsZSA9IGRyYXdDb2xvcjtcbiAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuY2xhc3NpYykge1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEsIHkgKyBkeSk7XG4gICAgICBnLmZpbGxTdHlsZSA9IGdyYXlDb2xvcjtcbiAgICAgIGcuZmlsbFRleHQoZ3JheVBhcnQsIHggKyBkeDIsIHkgKyBkeSk7XG4gICAgfVxuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgIGRyYXcoaW5kZW50LCBpbmRlbnQgKyBtYXhDb2xvclRleHRTaXplKTtcbiAgICByZXR1cm4geCArIG1heENvbG9yVGV4dFNpemUgKyBnLm1lYXN1cmVUZXh0KGdyYXlQYXJ0KS53aWR0aDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGR4ID0gKHcgLSB0ZXh0U2l6ZSkgLyAyO1xuICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgcmV0dXJuIHggKyBkeCArIG1heENvbG9yVGV4dFNpemU7XG4gIH1cbn07XG5cbiJdfQ==
|
|
901
|
-
|
|
902
|
-
/***/ }),
|
|
903
|
-
|
|
904
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js":
|
|
905
|
-
/*!*************************************************************************!*\
|
|
906
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js ***!
|
|
907
|
-
\*************************************************************************/
|
|
908
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
909
|
-
|
|
910
|
-
__webpack_require__.r(__webpack_exports__);
|
|
911
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
912
|
-
/* harmony export */ "detectAlphabet": () => (/* binding */ detectAlphabet),
|
|
913
|
-
/* harmony export */ "getAlphabet": () => (/* binding */ getAlphabet),
|
|
914
|
-
/* harmony export */ "getAlphabetSimilarity": () => (/* binding */ getAlphabetSimilarity),
|
|
915
|
-
/* harmony export */ "getPaletteByType": () => (/* binding */ getPaletteByType),
|
|
916
|
-
/* harmony export */ "getSplitter": () => (/* binding */ getSplitter),
|
|
917
|
-
/* harmony export */ "getSplitterForColumn": () => (/* binding */ getSplitterForColumn),
|
|
918
|
-
/* harmony export */ "getSplitterWithSeparator": () => (/* binding */ getSplitterWithSeparator),
|
|
919
|
-
/* harmony export */ "getStats": () => (/* binding */ getStats),
|
|
920
|
-
/* harmony export */ "monomerRe": () => (/* binding */ monomerRe),
|
|
921
|
-
/* harmony export */ "monomerToShort": () => (/* binding */ monomerToShort),
|
|
922
|
-
/* harmony export */ "pickUpPalette": () => (/* binding */ pickUpPalette),
|
|
923
|
-
/* harmony export */ "pickUpSeqCol": () => (/* binding */ pickUpSeqCol),
|
|
924
|
-
/* harmony export */ "splitterAsFasta": () => (/* binding */ splitterAsFasta),
|
|
925
|
-
/* harmony export */ "splitterAsHelm": () => (/* binding */ splitterAsHelm)
|
|
926
|
-
/* harmony export */ });
|
|
927
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
928
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
929
|
-
/* harmony import */ var wu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! wu */ "wu");
|
|
930
|
-
/* harmony import */ var wu__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(wu__WEBPACK_IMPORTED_MODULE_1__);
|
|
931
|
-
/* harmony import */ var _datagrok_libraries_utils_src_type_declarations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @datagrok-libraries/utils/src/type-declarations */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js");
|
|
932
|
-
/* harmony import */ var _datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @datagrok-libraries/utils/src/vector-operations */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js");
|
|
933
|
-
/* harmony import */ var _aminoacids__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../aminoacids */ "./node_modules/@datagrok-libraries/bio/src/aminoacids.js");
|
|
934
|
-
/* harmony import */ var _nucleotides__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../nucleotides */ "./node_modules/@datagrok-libraries/bio/src/nucleotides.js");
|
|
935
|
-
/* harmony import */ var _unknown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../unknown */ "./node_modules/@datagrok-libraries/bio/src/unknown.js");
|
|
936
|
-
/* harmony import */ var _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/units-handler */ "./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js");
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
;
|
|
946
|
-
/** Stats of sequences with specified splitter func, returns { freq, sameLength }.
|
|
947
|
-
* @param {DG.Column} seqCol
|
|
948
|
-
* @param {number} minLength
|
|
949
|
-
* @param {SplitterFunc} splitter
|
|
950
|
-
* @return { SeqColStats }, sameLength: boolean } stats of column sequences
|
|
951
|
-
*/
|
|
952
|
-
function getStats(seqCol, minLength, splitter) {
|
|
953
|
-
const freq = {};
|
|
954
|
-
let sameLength = true;
|
|
955
|
-
let firstLength = null;
|
|
956
|
-
for (const seq of seqCol.categories) {
|
|
957
|
-
const mSeq = splitter(seq);
|
|
958
|
-
if (firstLength == null)
|
|
959
|
-
firstLength = mSeq.length;
|
|
960
|
-
else if (mSeq.length !== firstLength)
|
|
961
|
-
sameLength = false;
|
|
962
|
-
if (mSeq.length >= minLength) {
|
|
963
|
-
for (const m of mSeq) {
|
|
964
|
-
if (!(m in freq))
|
|
965
|
-
freq[m] = 0;
|
|
966
|
-
freq[m] += 1;
|
|
967
|
-
}
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
return { freq: freq, sameLength: sameLength };
|
|
971
|
-
}
|
|
972
|
-
const monomerRe = /\[(\w+)\]|(\w)|(-)/g;
|
|
973
|
-
/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.
|
|
974
|
-
* @param {any} seq object with sequence
|
|
975
|
-
* @return {string[]} array of monomers
|
|
976
|
-
*/
|
|
977
|
-
function splitterAsFasta(seq) {
|
|
978
|
-
return wu__WEBPACK_IMPORTED_MODULE_1___default()(seq.toString().matchAll(monomerRe))
|
|
979
|
-
.map((ma) => {
|
|
980
|
-
let mRes;
|
|
981
|
-
const m = ma[0];
|
|
982
|
-
if (m.length > 1) {
|
|
983
|
-
mRes = ma[1];
|
|
984
|
-
}
|
|
985
|
-
else {
|
|
986
|
-
mRes = m;
|
|
987
|
-
}
|
|
988
|
-
return mRes;
|
|
989
|
-
}).toArray();
|
|
990
|
-
}
|
|
991
|
-
/** Gets method to split sequence by separator
|
|
992
|
-
* @param {string} separator
|
|
993
|
-
* @param limit
|
|
994
|
-
* @return {SplitterFunc}
|
|
995
|
-
*/
|
|
996
|
-
function getSplitterWithSeparator(separator, limit = undefined) {
|
|
997
|
-
return (seq) => {
|
|
998
|
-
return seq.split(separator, limit);
|
|
999
|
-
};
|
|
1000
|
-
}
|
|
1001
|
-
const helmRe = /(PEPTIDE1|DNA1|RNA1)\{([^}]+)}/g;
|
|
1002
|
-
const helmPp1Re = /\[([^\[\]]+)]/g;
|
|
1003
|
-
/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).
|
|
1004
|
-
* Only for linear polymers, does not split RNA for ribose and phosphate monomers.
|
|
1005
|
-
* @param {string} seq Source string of HELM notation
|
|
1006
|
-
* @return {string[]}
|
|
1007
|
-
*/
|
|
1008
|
-
function splitterAsHelm(seq) {
|
|
1009
|
-
helmRe.lastIndex = 0;
|
|
1010
|
-
const ea = helmRe.exec(seq.toString());
|
|
1011
|
-
const inSeq = ea ? ea[2] : null;
|
|
1012
|
-
const mmPostProcess = (mm) => {
|
|
1013
|
-
helmPp1Re.lastIndex = 0;
|
|
1014
|
-
const pp1M = helmPp1Re.exec(mm);
|
|
1015
|
-
if (pp1M && pp1M.length >= 2)
|
|
1016
|
-
return pp1M[1];
|
|
1017
|
-
else
|
|
1018
|
-
return mm;
|
|
1019
|
-
};
|
|
1020
|
-
const mmList = inSeq ? inSeq.split('.') : [];
|
|
1021
|
-
return mmList.map(mmPostProcess);
|
|
1022
|
-
}
|
|
1023
|
-
/** Get splitter method to split sequences to monomers
|
|
1024
|
-
* @param {string} units
|
|
1025
|
-
* @param {string} separator
|
|
1026
|
-
* @param limit
|
|
1027
|
-
* @return {SplitterFunc}
|
|
1028
|
-
*/
|
|
1029
|
-
function getSplitter(units, separator, limit = undefined) {
|
|
1030
|
-
if (units.toLowerCase().startsWith("fasta" /* NOTATION.FASTA */))
|
|
1031
|
-
return splitterAsFasta;
|
|
1032
|
-
else if (units.toLowerCase().startsWith("separator" /* NOTATION.SEPARATOR */))
|
|
1033
|
-
return getSplitterWithSeparator(separator, limit);
|
|
1034
|
-
else if (units.toLowerCase().startsWith("helm" /* NOTATION.HELM */))
|
|
1035
|
-
return splitterAsHelm;
|
|
1036
|
-
else
|
|
1037
|
-
throw new Error(`Unexpected units ${units} .`);
|
|
1038
|
-
// TODO: Splitter for HELM
|
|
1039
|
-
}
|
|
1040
|
-
/** Generate splitter function for sequence column
|
|
1041
|
-
* @param {DG.Column} col
|
|
1042
|
-
* @return {SplitterFunc} Splitter function
|
|
1043
|
-
*/
|
|
1044
|
-
function getSplitterForColumn(col) {
|
|
1045
|
-
if (col.semType !== datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE)
|
|
1046
|
-
throw new Error(`Get splitter for semType "${datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE}" only.`);
|
|
1047
|
-
const units = col.getTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS);
|
|
1048
|
-
const separator = col.getTag("separator" /* TAGS.separator */);
|
|
1049
|
-
return getSplitter(units, separator);
|
|
1050
|
-
}
|
|
1051
|
-
const longMonomerPartRe = /(\w+)/g;
|
|
1052
|
-
/** Convert long monomer names to short ones */
|
|
1053
|
-
function monomerToShort(amino, maxLengthOfMonomer) {
|
|
1054
|
-
var _a, _b;
|
|
1055
|
-
const shortAminoMatch = amino.match(longMonomerPartRe);
|
|
1056
|
-
const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;
|
|
1057
|
-
const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';
|
|
1058
|
-
return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';
|
|
1059
|
-
}
|
|
1060
|
-
/** */
|
|
1061
|
-
function getAlphabet(alphabet) {
|
|
1062
|
-
switch (alphabet) {
|
|
1063
|
-
case "DNA" /* ALPHABET.DNA */:
|
|
1064
|
-
return _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.DnaFastaAlphabet;
|
|
1065
|
-
case "RNA" /* ALPHABET.RNA */:
|
|
1066
|
-
return _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.RnaFastaAlphabet;
|
|
1067
|
-
case "PT" /* ALPHABET.PT */:
|
|
1068
|
-
return _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.PeptideFastaAlphabet;
|
|
1069
|
-
default:
|
|
1070
|
-
throw new Error(`Unsupported alphabet '${alphabet}'.`);
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
/** Calculate similarity in current sequence and alphabet.
|
|
1074
|
-
* @param {MonomerFreqs} freq
|
|
1075
|
-
* @param {Set<string>} alphabet
|
|
1076
|
-
* @param {string} gapSymbol
|
|
1077
|
-
* @return {number} Cosine similarity
|
|
1078
|
-
*/
|
|
1079
|
-
function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {
|
|
1080
|
-
const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);
|
|
1081
|
-
keys.delete(gapSymbol);
|
|
1082
|
-
const freqA = [];
|
|
1083
|
-
const alphabetA = [];
|
|
1084
|
-
for (const m of keys) {
|
|
1085
|
-
freqA.push(m in freq ? freq[m] : 0);
|
|
1086
|
-
alphabetA.push(alphabet.has(m) ? 1 : 0);
|
|
1087
|
-
}
|
|
1088
|
-
/* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */
|
|
1089
|
-
const freqV = new _datagrok_libraries_utils_src_type_declarations__WEBPACK_IMPORTED_MODULE_2__.Vector(freqA);
|
|
1090
|
-
const alphabetV = new _datagrok_libraries_utils_src_type_declarations__WEBPACK_IMPORTED_MODULE_2__.Vector(alphabetA);
|
|
1091
|
-
return (0,_datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__.vectorDotProduct)(freqV, alphabetV) / ((0,_datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__.vectorLength)(freqV) * (0,_datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__.vectorLength)(alphabetV));
|
|
1092
|
-
}
|
|
1093
|
-
function detectAlphabet(stats) {
|
|
1094
|
-
const alphabetCandidates = [
|
|
1095
|
-
["PT" /* ALPHABET.PT */, _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.PeptideFastaAlphabet],
|
|
1096
|
-
["DNA" /* ALPHABET.DNA */, _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.DnaFastaAlphabet],
|
|
1097
|
-
["RNA" /* ALPHABET.RNA */, _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.RnaFastaAlphabet],
|
|
1098
|
-
];
|
|
1099
|
-
// Calculate likelihoods for alphabet_candidates
|
|
1100
|
-
const alphabetCandidatesSim = alphabetCandidates.map((c) => getAlphabetSimilarity(stats.freq, c[1]));
|
|
1101
|
-
const maxCos = Math.max(...alphabetCandidatesSim);
|
|
1102
|
-
const alphabet = maxCos > 0.65 ? alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][0] : 'UN';
|
|
1103
|
-
return alphabet;
|
|
1104
|
-
}
|
|
1105
|
-
/** Selects a suitable palette based on column data
|
|
1106
|
-
* @param {DG.Column} seqCol Column to look for a palette
|
|
1107
|
-
* @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)
|
|
1108
|
-
* @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column
|
|
1109
|
-
*/
|
|
1110
|
-
function pickUpPalette(seqCol, minLength = 5) {
|
|
1111
|
-
let alphabet;
|
|
1112
|
-
if (seqCol.semType == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE) {
|
|
1113
|
-
const uh = new _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler(seqCol);
|
|
1114
|
-
alphabet = uh.alphabet;
|
|
1115
|
-
}
|
|
1116
|
-
else {
|
|
1117
|
-
const stats = getStats(seqCol, minLength, splitterAsFasta);
|
|
1118
|
-
alphabet = detectAlphabet(stats);
|
|
1119
|
-
}
|
|
1120
|
-
const res = getPaletteByType(alphabet);
|
|
1121
|
-
return res;
|
|
1122
|
-
}
|
|
1123
|
-
function getPaletteByType(paletteType) {
|
|
1124
|
-
switch (paletteType) {
|
|
1125
|
-
case 'PT':
|
|
1126
|
-
return _aminoacids__WEBPACK_IMPORTED_MODULE_4__.AminoacidsPalettes.GrokGroups;
|
|
1127
|
-
case 'NT':
|
|
1128
|
-
case 'DNA':
|
|
1129
|
-
case 'RNA':
|
|
1130
|
-
return _nucleotides__WEBPACK_IMPORTED_MODULE_5__.NucleotidesPalettes.Chromatogram;
|
|
1131
|
-
// other
|
|
1132
|
-
default:
|
|
1133
|
-
return _unknown__WEBPACK_IMPORTED_MODULE_6__.UnknownSeqPalettes.Color;
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
function pickUpSeqCol(df) {
|
|
1137
|
-
var _a;
|
|
1138
|
-
const semTypeColList = df.columns.bySemTypeAll(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE);
|
|
1139
|
-
let resCol = (_a = semTypeColList.find((col) => {
|
|
1140
|
-
const units = col.getTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS);
|
|
1141
|
-
return units ? units.indexOf('MSA') !== -1 : false;
|
|
1142
|
-
})) !== null && _a !== void 0 ? _a : null;
|
|
1143
|
-
if (!resCol && semTypeColList.length > 0)
|
|
1144
|
-
resCol = semTypeColList[0];
|
|
1145
|
-
return resCol;
|
|
1146
|
-
}
|
|
1147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1hY3JvbW9sZWN1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFcEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUUvRixPQUFPLEVBQWEsa0JBQWtCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQTRCbkQsQ0FBQztBQU1GOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxNQUFpQixFQUFFLFNBQWlCLEVBQUUsUUFBc0I7SUFDbkYsTUFBTSxJQUFJLEdBQTRCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDdEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBRXZCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsSUFBSSxXQUFXLElBQUksSUFBSTtZQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVztZQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDNUIsS0FBSyxNQUFNLENBQUMs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QUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxtQ0FBSSxJQUFJLENBQUM7SUFDWCxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHd1IGZyb20gJ3d1JztcblxuaW1wb3J0IHtWZWN0b3J9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7dmVjdG9yTGVuZ3RoLCB2ZWN0b3JEb3RQcm9kdWN0fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4uL3NlcS1wYWxldHRlcyc7XG5pbXBvcnQge0FtaW5vYWNpZHMsIEFtaW5vYWNpZHNQYWxldHRlc30gZnJvbSAnLi4vYW1pbm9hY2lkcyc7XG5pbXBvcnQge051Y2xlb3RpZGVzLCBOdWNsZW90aWRlc1BhbGV0dGVzfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1Vua25vd25TZXFQYWxldHRlc30gZnJvbSAnLi4vdW5rbm93bic7XG5pbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi4vdXRpbHMvdW5pdHMtaGFuZGxlcic7XG5cblxuLyoqIGVudW0gdHlwZSB0byBzaW1wbGlmeSBzZXR0aW5nIFwidXNlci1mcmllbmRseVwiIG5vdGF0aW9uIGlmIG5lY2Vzc2FyeSAqL1xuZXhwb3J0IGNvbnN0IGVudW0gTk9UQVRJT04ge1xuICBGQVNUQSA9ICdmYXN0YScsXG4gIFNFUEFSQVRPUiA9ICdzZXBhcmF0b3InLFxuICBIRUxNID0gJ2hlbG0nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBTElHTk1FTlQge1xuICBTRVFfTVNBID0gJ1NFUS5NU0EnLFxuICBTRVEgPSAnU0VRJyxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQUxQSEFCRVQge1xuICBETkEgPSAnRE5BJyxcbiAgUk5BID0gJ1JOQScsXG4gIFBUID0gJ1BUJyxcbiAgVU4gPSAnVU4nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBUQUdTIHtcbiAgYWxpZ25lZCA9ICdhbGlnbmVkJyxcbiAgYWxwaGFiZXQgPSAnYWxwaGFiZXQnLFxuICBhbHBoYWJldFNpemUgPSAnLmFscGhhYmV0U2l6ZScsXG4gIGFscGhhYmV0SXNNdWx0aWNoYXIgPSAnLmFscGhhYmV0SXNNdWx0aWNoYXInLFxuICBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbn07XG5cbmV4cG9ydCB0eXBlIFNlcUNvbFN0YXRzID0geyBmcmVxOiBNb25vbWVyRnJlcXMsIHNhbWVMZW5ndGg6IGJvb2xlYW4gfVxuZXhwb3J0IHR5cGUgU3BsaXR0ZXJGdW5jID0gKHNlcTogc3RyaW5nKSA9PiBzdHJpbmdbXTtcbmV4cG9ydCB0eXBlIE1vbm9tZXJGcmVxcyA9IHsgW206IHN0cmluZ106IG51bWJlciB9O1xuXG4vKiogU3RhdHMgb2Ygc2VxdWVuY2VzIHdpdGggc3BlY2lmaWVkIHNwbGl0dGVyIGZ1bmMsIHJldHVybnMgeyBmcmVxLCBzYW1lTGVuZ3RoIH0uXG4gKiBAcGFyYW0ge0RHLkNvbHVtbn0gc2VxQ29sXG4gKiBAcGFyYW0ge251bWJlcn0gbWluTGVuZ3RoXG4gKiBAcGFyYW0ge1NwbGl0dGVyRnVuY30gc3BsaXR0ZXJcbiAqIEByZXR1cm4geyBTZXFDb2xTdGF0cyB9LCBzYW1lTGVuZ3RoOiBib29sZWFuIH0gc3RhdHMgb2YgY29sdW1uIHNlcXVlbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHMoc2VxQ29sOiBERy5Db2x1bW4sIG1pbkxlbmd0aDogbnVtYmVyLCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jKTogU2VxQ29sU3RhdHMge1xuICBjb25zdCBmcmVxOiB7IFttOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gIGxldCBmaXJzdExlbmd0aCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBzZXEgb2Ygc2VxQ29sLmNhdGVnb3JpZXMpIHtcbiAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcblxuICAgIGlmIChmaXJzdExlbmd0aCA9PSBudWxsKVxuICAgICAgZmlyc3RMZW5ndGggPSBtU2VxLmxlbmd0aDtcbiAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICBzYW1lTGVuZ3RoID0gZmFsc2U7XG5cbiAgICBpZiAobVNlcS5sZW5ndGggPj0gbWluTGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbVNlcSkge1xuICAgICAgICBpZiAoIShtIGluIGZyZXEpKVxuICAgICAgICAgIGZyZXFbbV0gPSAwO1xuICAgICAgICBmcmVxW21dICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7ZnJlcTogZnJlcSwgc2FtZUxlbmd0aDogc2FtZUxlbmd0aH07XG59XG5cbmV4cG9ydCBjb25zdCBtb25vbWVyUmU6IFJlZ0V4cCA9IC9cXFsoXFx3KylcXF18KFxcdyl8KC0pL2c7XG5cbi8qKiBTcGxpdCBzZXF1ZW5jZSBmb3Igc2luZ2xlIGNoYXJhY3RlciBtb25vbWVycywgc3F1YXJlIGJyYWNrZXRzIG11bHRpY2hhciBtb25vbWVyIG5hbWVzIG9yIGdhcCBzeW1ib2wuXG4gKiBAcGFyYW0ge2FueX0gc2VxIG9iamVjdCB3aXRoIHNlcXVlbmNlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gYXJyYXkgb2YgbW9ub21lcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNGYXN0YShzZXE6IGFueSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHd1PFJlZ0V4cE1hdGNoQXJyYXk+KHNlcS50b1N0cmluZygpLm1hdGNoQWxsKG1vbm9tZXJSZSkpXG4gICAgLm1hcCgobWE6IFJlZ0V4cE1hdGNoQXJyYXkpID0+IHtcbiAgICAgIGxldCBtUmVzOiBzdHJpbmc7XG4gICAgICBjb25zdCBtOiBzdHJpbmcgPSBtYVswXTtcbiAgICAgIGlmIChtLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbVJlcyA9IG1hWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbVJlcyA9IG07XG4gICAgICB9XG4gICAgICByZXR1cm4gbVJlcztcbiAgICB9KS50b0FycmF5KCk7XG59XG5cbi8qKiBHZXRzIG1ldGhvZCB0byBzcGxpdCBzZXF1ZW5jZSBieSBzZXBhcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvcjogc3RyaW5nLCBsaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKTogU3BsaXR0ZXJGdW5jIHtcbiAgcmV0dXJuIChzZXE6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBzZXEuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH07XG59XG5cbmNvbnN0IGhlbG1SZTogUmVnRXhwID0gLyhQRVBUSURFMXxETkExfFJOQTEpXFx7KFtefV0rKX0vZztcbmNvbnN0IGhlbG1QcDFSZTogUmVnRXhwID0gL1xcWyhbXlxcW1xcXV0rKV0vZztcblxuLyoqIFNwbGl0cyBIZWxtIHN0cmluZyB0byBtb25vbWVycywgYnV0IGRvZXMgbm90IHJlcGxhY2UgbW9ub21lciBuYW1lcyB0byBvdGhlciBub3RhdGlvbiAoZS5nLiBmb3IgUk5BKS5cbiAqIE9ubHkgZm9yIGxpbmVhciBwb2x5bWVycywgZG9lcyBub3Qgc3BsaXQgUk5BIGZvciByaWJvc2UgYW5kIHBob3NwaGF0ZSBtb25vbWVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXEgU291cmNlIHN0cmluZyBvZiBIRUxNIG5vdGF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNIZWxtKHNlcTogYW55KTogc3RyaW5nW10ge1xuICBoZWxtUmUubGFzdEluZGV4ID0gMDtcbiAgY29uc3QgZWE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBoZWxtUmUuZXhlYyhzZXEudG9TdHJpbmcoKSk7XG4gIGNvbnN0IGluU2VxOiBzdHJpbmcgfCBudWxsID0gZWEgPyBlYVsyXSA6IG51bGw7XG5cbiAgY29uc3QgbW1Qb3N0UHJvY2VzcyA9IChtbTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBoZWxtUHAxUmUubGFzdEluZGV4ID0gMDtcbiAgICBjb25zdCBwcDFNID0gaGVsbVBwMVJlLmV4ZWMobW0pO1xuICAgIGlmIChwcDFNICYmIHBwMU0ubGVuZ3RoID49IDIpXG4gICAgICByZXR1cm4gcHAxTVsxXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbW07XG4gIH07XG5cbiAgY29uc3QgbW1MaXN0OiBzdHJpbmdbXSA9IGluU2VxID8gaW5TZXEuc3BsaXQoJy4nKSA6IFtdO1xuICByZXR1cm4gbW1MaXN0Lm1hcChtbVBvc3RQcm9jZXNzKTtcbn1cblxuLyoqIEdldCBzcGxpdHRlciBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2VzIHRvIG1vbm9tZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXIodW5pdHM6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBTcGxpdHRlckZ1bmMge1xuICBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE5PVEFUSU9OLkZBU1RBKSlcbiAgICByZXR1cm4gc3BsaXR0ZXJBc0Zhc3RhO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICByZXR1cm4gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvciwgbGltaXQpO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgcmV0dXJuIHNwbGl0dGVyQXNIZWxtO1xuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHVuaXRzICR7dW5pdHN9IC5gKTtcblxuICAvLyBUT0RPOiBTcGxpdHRlciBmb3IgSEVMTVxufVxuXG4vKiogR2VuZXJhdGUgc3BsaXR0ZXIgZnVuY3Rpb24gZm9yIHNlcXVlbmNlIGNvbHVtblxuICogQHBhcmFtIHtERy5Db2x1bW59IGNvbFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfSBTcGxpdHRlciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4oY29sOiBERy5Db2x1bW4pOiBTcGxpdHRlckZ1bmMge1xuICBpZiAoY29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdldCBzcGxpdHRlciBmb3Igc2VtVHlwZSBcIiR7REcuU0VNVFlQRS5NQUNST01PTEVDVUxFfVwiIG9ubHkuYCk7XG5cbiAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICBjb25zdCBzZXBhcmF0b3IgPSBjb2wuZ2V0VGFnKFRBR1Muc2VwYXJhdG9yKTtcbiAgcmV0dXJuIGdldFNwbGl0dGVyKHVuaXRzLCBzZXBhcmF0b3IpO1xufVxuXG5jb25zdCBsb25nTW9ub21lclBhcnRSZTogUmVnRXhwID0gLyhcXHcrKS9nO1xuXG4vKiogQ29udmVydCBsb25nIG1vbm9tZXIgbmFtZXMgdG8gc2hvcnQgb25lcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbm9tZXJUb1Nob3J0KGFtaW5vOiBzdHJpbmcsIG1heExlbmd0aE9mTW9ub21lcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvcnRBbWlub01hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IGFtaW5vLm1hdGNoKGxvbmdNb25vbWVyUGFydFJlKTtcbiAgY29uc3QgbmVlZEFkZERvdHM6IGJvb2xlYW4gPSBhbWluby5sZW5ndGggPiBtYXhMZW5ndGhPZk1vbm9tZXIgfHwgKHNob3J0QW1pbm9NYXRjaD8ubGVuZ3RoID8/IDApID4gMTtcbiAgY29uc3Qgc2hvcnRBbWlubyA9IHNob3J0QW1pbm9NYXRjaD8uWzBdID8/ICcgJztcbiAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG59XG5cbi8qKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0KGFscGhhYmV0OiBBTFBIQUJFVCk6IFNldDxzdHJpbmc+IHtcbiAgc3dpdGNoIChhbHBoYWJldCkge1xuICBjYXNlIEFMUEhBQkVULkROQTpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXQ7XG4gIGNhc2UgQUxQSEFCRVQuUk5BOlxuICAgIHJldHVybiBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldDtcbiAgY2FzZSBBTFBIQUJFVC5QVDpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0O1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYWxwaGFiZXQgJyR7YWxwaGFiZXR9Jy5gKTtcbiAgfVxufVxuXG4vKiogQ2FsY3VsYXRlIHNpbWlsYXJpdHkgaW4gY3VycmVudCBzZXF1ZW5jZSBhbmQgYWxwaGFiZXQuXG4gKiBAcGFyYW0ge01vbm9tZXJGcmVxc30gZnJlcVxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYWxwaGFiZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXBTeW1ib2xcbiAqIEByZXR1cm4ge251bWJlcn0gQ29zaW5lIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0U2ltaWxhcml0eShmcmVxOiBNb25vbWVyRnJlcXMsIGFscGhhYmV0OiBTZXQ8c3RyaW5nPiwgZ2FwU3ltYm9sOiBzdHJpbmcgPSAnLScpOiBudW1iZXIge1xuICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKGZyZXEpKSwgLi4uYWxwaGFiZXRdKTtcbiAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcblxuICBjb25zdCBmcmVxQTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgYWxwaGFiZXRBOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG0gb2Yga2V5cykge1xuICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgIGFscGhhYmV0QS5wdXNoKGFscGhhYmV0LmhhcyhtKSA/IDEgOiAwKTtcbiAgfVxuICAvKiBUaGVyZSB3ZXJlIGEgZmV3IGlkZWFzOiBjaGktc3F1YXJlZCwgcGVhcnNvbiBjb3JyZWxhdGlvbiAodmFyaWFuY2U/KSwgc2NhbGFyIHByb2R1Y3QgKi9cbiAgY29uc3QgZnJlcVY6IFZlY3RvciA9IG5ldyBWZWN0b3IoZnJlcUEpO1xuICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgcmV0dXJuIHZlY3RvckRvdFByb2R1Y3QoZnJlcVYsIGFscGhhYmV0VikgLyAodmVjdG9yTGVuZ3RoKGZyZXFWKSAqIHZlY3Rvckxlbmd0aChhbHBoYWJldFYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEFscGhhYmV0KHN0YXRzOiBTZXFDb2xTdGF0cyk6IHN0cmluZyB7XG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlczogW3N0cmluZywgU2V0PHN0cmluZz5dW10gPSBbXG4gICAgW0FMUEhBQkVULlBULCBVbml0c0hhbmRsZXIuUGVwdGlkZUZhc3RhQWxwaGFiZXRdLFxuICAgIFtBTFBIQUJFVC5ETkEsIFVuaXRzSGFuZGxlci5EbmFGYXN0YUFscGhhYmV0XSxcbiAgICBbQUxQSEFCRVQuUk5BLCBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldF0sXG4gIF07XG5cbiAgLy8gQ2FsY3VsYXRlIGxpa2VsaWhvb2RzIGZvciBhbHBoYWJldF9jYW5kaWRhdGVzXG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlc1NpbTogbnVtYmVyW10gPSBhbHBoYWJldENhbmRpZGF0ZXMubWFwKFxuICAgIChjKSA9PiBnZXRBbHBoYWJldFNpbWlsYXJpdHkoc3RhdHMuZnJlcSwgY1sxXSkpO1xuICBjb25zdCBtYXhDb3MgPSBNYXRoLm1heCguLi5hbHBoYWJldENhbmRpZGF0ZXNTaW0pO1xuICBjb25zdCBhbHBoYWJldCA9IG1heENvcyA+IDAuNjUgPyBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMF0gOiAnVU4nO1xuICByZXR1cm4gYWxwaGFiZXQ7XG59XG5cbi8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbCBDb2x1bW4gdG8gbG9vayBmb3IgYSBwYWxldHRlXG4gKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBQYWxldHRlKHNlcUNvbDogREcuQ29sdW1uLCBtaW5MZW5ndGg6IG51bWJlciA9IDUpOiBTZXFQYWxldHRlIHtcbiAgbGV0IGFscGhhYmV0OiBzdHJpbmc7XG4gIGlmIChzZXFDb2wuc2VtVHlwZSA9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpIHtcbiAgICBjb25zdCB1aDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcihzZXFDb2wpO1xuICAgIGFscGhhYmV0ID0gdWguYWxwaGFiZXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RhdHM6IFNlcUNvbFN0YXRzID0gZ2V0U3RhdHMoc2VxQ29sLCBtaW5MZW5ndGgsIHNwbGl0dGVyQXNGYXN0YSk7XG4gICAgYWxwaGFiZXQgPSBkZXRlY3RBbHBoYWJldChzdGF0cyk7XG4gIH1cblxuICBjb25zdCByZXMgPSBnZXRQYWxldHRlQnlUeXBlKGFscGhhYmV0KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbGV0dGVCeVR5cGUocGFsZXR0ZVR5cGU6IHN0cmluZyk6IFNlcVBhbGV0dGUge1xuICBzd2l0Y2ggKHBhbGV0dGVUeXBlKSB7XG4gIGNhc2UgJ1BUJzpcbiAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gIGNhc2UgJ05UJzpcbiAgY2FzZSAnRE5BJzpcbiAgY2FzZSAnUk5BJzpcbiAgICByZXR1cm4gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgLy8gb3RoZXJcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBTZXFDb2woZGY6IERHLkRhdGFGcmFtZSk6IERHLkNvbHVtbiB8IG51bGwge1xuICBjb25zdCBzZW1UeXBlQ29sTGlzdCA9IGRmLmNvbHVtbnMuYnlTZW1UeXBlQWxsKERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSk7XG4gIGxldCByZXNDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBzZW1UeXBlQ29sTGlzdC5maW5kKChjb2wpID0+IHtcbiAgICBjb25zdCB1bml0cyA9IGNvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gICAgcmV0dXJuIHVuaXRzID8gdW5pdHMuaW5kZXhPZignTVNBJykgIT09IC0xIDogZmFsc2U7XG4gIH0pID8/IG51bGw7XG4gIGlmICghcmVzQ29sICYmIHNlbVR5cGVDb2xMaXN0Lmxlbmd0aCA+IDApXG4gICAgcmVzQ29sID0gc2VtVHlwZUNvbExpc3RbMF07XG4gIHJldHVybiByZXNDb2w7XG59XG4iXX0=
|
|
1148
|
-
|
|
1149
|
-
/***/ }),
|
|
1150
|
-
|
|
1151
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js":
|
|
1152
|
-
/*!******************************************************************************!*\
|
|
1153
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js ***!
|
|
1154
|
-
\******************************************************************************/
|
|
1155
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1156
|
-
|
|
1157
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1158
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1159
|
-
/* harmony export */ "NotationConverter": () => (/* binding */ NotationConverter)
|
|
1160
|
-
/* harmony export */ });
|
|
1161
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
1162
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
1163
|
-
/* harmony import */ var _units_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./units-handler */ "./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js");
|
|
1164
|
-
/* harmony import */ var _macromolecule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./macromolecule */ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js");
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
/** Class for handling conversion of notation systems in Macromolecule columns */
|
|
1169
|
-
class NotationConverter extends _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler {
|
|
1170
|
-
get splitter() {
|
|
1171
|
-
if (this._splitter === null)
|
|
1172
|
-
this._splitter = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_2__.getSplitterForColumn)(this.column);
|
|
1173
|
-
return this._splitter;
|
|
1174
|
-
}
|
|
1175
|
-
toFasta(targetNotation) { return targetNotation === "fasta" /* NOTATION.FASTA */; }
|
|
1176
|
-
toSeparator(targetNotation) { return targetNotation === "separator" /* NOTATION.SEPARATOR */; }
|
|
1177
|
-
toHelm(targetNotation) { return targetNotation === "helm" /* NOTATION.HELM */; }
|
|
1178
|
-
/**
|
|
1179
|
-
* Convert a Macromolecule column from FASTA to SEPARATOR notation
|
|
1180
|
-
*
|
|
1181
|
-
* @param {string} separator A specific separator to be used
|
|
1182
|
-
* @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default
|
|
1183
|
-
* @return {DG.Column} A new column in SEPARATOR notation
|
|
1184
|
-
*/
|
|
1185
|
-
convertFastaToSeparator(separator, fastaGapSymbol = null) {
|
|
1186
|
-
if (fastaGapSymbol === null)
|
|
1187
|
-
fastaGapSymbol = this.defaultGapSymbol;
|
|
1188
|
-
const newColumn = this.getNewColumn("separator" /* NOTATION.SEPARATOR */);
|
|
1189
|
-
// assign the values to the newly created empty column
|
|
1190
|
-
newColumn.init((idx) => {
|
|
1191
|
-
const fastaPolymer = this.column.get(idx);
|
|
1192
|
-
const fastaMonomersArray = this.splitter(fastaPolymer);
|
|
1193
|
-
for (let i = 0; i < fastaMonomersArray.length; i++) {
|
|
1194
|
-
if (fastaMonomersArray[i] === fastaGapSymbol)
|
|
1195
|
-
fastaMonomersArray[i] = _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.SEPARATOR;
|
|
1196
|
-
}
|
|
1197
|
-
return fastaMonomersArray.join(separator);
|
|
1198
|
-
});
|
|
1199
|
-
newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "separator" /* NOTATION.SEPARATOR */);
|
|
1200
|
-
newColumn.setTag("separator" /* TAGS.separator */, separator);
|
|
1201
|
-
return newColumn;
|
|
1202
|
-
}
|
|
1203
|
-
/**
|
|
1204
|
-
* Get the wrapper strings for HELM, depending on the type of the
|
|
1205
|
-
* macromolecule (peptide, DNA, RNA)
|
|
1206
|
-
*
|
|
1207
|
-
* @return {string[]} Array of wrappers
|
|
1208
|
-
*/
|
|
1209
|
-
getHelmWrappers() {
|
|
1210
|
-
const prefix = (this.isDna()) ? 'DNA1{' :
|
|
1211
|
-
(this.isRna()) ? 'RNA1{' :
|
|
1212
|
-
(this.isPeptide()) ? 'PEPTIDE1{' :
|
|
1213
|
-
'Unknown'; // this case should be handled as exceptional
|
|
1214
|
-
if (prefix === 'Unknown')
|
|
1215
|
-
throw new Error('Neither peptide, nor nucleotide');
|
|
1216
|
-
const postfix = '}$$$';
|
|
1217
|
-
const leftWrapper = (this.isDna()) ? 'D(' :
|
|
1218
|
-
(this.isRna()) ? 'R(' : ''; // no wrapper for peptides
|
|
1219
|
-
const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides
|
|
1220
|
-
return [prefix, leftWrapper, rightWrapper, postfix];
|
|
1221
|
-
}
|
|
1222
|
-
// A helper function for converting strings to HELM
|
|
1223
|
-
convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {
|
|
1224
|
-
const monomerArray = this.splitter(sourcePolymer);
|
|
1225
|
-
const monomerHelmArray = monomerArray.map((mm) => {
|
|
1226
|
-
if (mm === sourceGapSymbol)
|
|
1227
|
-
return _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.HELM;
|
|
1228
|
-
else
|
|
1229
|
-
return `${leftWrapper}${mm}${rightWrapper}`;
|
|
1230
|
-
});
|
|
1231
|
-
return `${prefix}${monomerHelmArray.join('.')}${postfix}`;
|
|
1232
|
-
}
|
|
1233
|
-
/**
|
|
1234
|
-
* Convert a string with SEPARATOR/FASTA notation to HELM
|
|
1235
|
-
*
|
|
1236
|
-
* @param {string} sourcePolymer A string to be converted
|
|
1237
|
-
* @param {string | null} sourceGapSymbol An optional gap symbol, set to
|
|
1238
|
-
* default values ('-' for FASTA and '' for SEPARATOR) unless specified
|
|
1239
|
-
* @return {string} The target HELM string
|
|
1240
|
-
*/
|
|
1241
|
-
convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {
|
|
1242
|
-
if (sourceGapSymbol === null)
|
|
1243
|
-
sourceGapSymbol = this.defaultGapSymbol;
|
|
1244
|
-
const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();
|
|
1245
|
-
return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);
|
|
1246
|
-
}
|
|
1247
|
-
/**
|
|
1248
|
-
* Convert a column to HELM
|
|
1249
|
-
*
|
|
1250
|
-
* @param {string | null} sourceGapSymbol
|
|
1251
|
-
* @return {DG.Column}
|
|
1252
|
-
*/
|
|
1253
|
-
convertToHelm(sourceGapSymbol = null) {
|
|
1254
|
-
if (sourceGapSymbol === null)
|
|
1255
|
-
sourceGapSymbol = this.defaultGapSymbol;
|
|
1256
|
-
const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();
|
|
1257
|
-
const newColumn = this.getNewColumn("helm" /* NOTATION.HELM */);
|
|
1258
|
-
// assign the values to the empty column
|
|
1259
|
-
newColumn.init((idx) => {
|
|
1260
|
-
const sourcePolymer = this.column.get(idx);
|
|
1261
|
-
return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);
|
|
1262
|
-
});
|
|
1263
|
-
newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "helm" /* NOTATION.HELM */);
|
|
1264
|
-
return newColumn;
|
|
1265
|
-
}
|
|
1266
|
-
/**
|
|
1267
|
-
* Convert SEPARATOR column to FASTA notation
|
|
1268
|
-
*
|
|
1269
|
-
* @param {string | null} fastaGapSymbol Optional gap symbol for FASTA
|
|
1270
|
-
* @return {DG.Column} Converted column
|
|
1271
|
-
*/
|
|
1272
|
-
convertSeparatorToFasta(fastaGapSymbol = null) {
|
|
1273
|
-
if (fastaGapSymbol === null)
|
|
1274
|
-
fastaGapSymbol = _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.FASTA;
|
|
1275
|
-
const newColumn = this.getNewColumn("fasta" /* NOTATION.FASTA */);
|
|
1276
|
-
// assign the values to the empty column
|
|
1277
|
-
newColumn.init((idx) => {
|
|
1278
|
-
const separatorPolymer = this.column.get(idx);
|
|
1279
|
-
// items can be monomers or separators
|
|
1280
|
-
const separatorItemsArray = this.splitter(separatorPolymer);
|
|
1281
|
-
const fastaMonomersArray = [];
|
|
1282
|
-
for (let i = 0; i < separatorItemsArray.length; i++) {
|
|
1283
|
-
const item = separatorItemsArray[i];
|
|
1284
|
-
if (item.length === 0) {
|
|
1285
|
-
fastaMonomersArray.push(fastaGapSymbol);
|
|
1286
|
-
}
|
|
1287
|
-
else if (item.length > 1) {
|
|
1288
|
-
// the case of a multi-character monomer
|
|
1289
|
-
const monomer = '[' + item + ']';
|
|
1290
|
-
fastaMonomersArray.push(monomer);
|
|
1291
|
-
}
|
|
1292
|
-
else {
|
|
1293
|
-
fastaMonomersArray.push(item);
|
|
1294
|
-
}
|
|
1295
|
-
}
|
|
1296
|
-
return fastaMonomersArray.join('');
|
|
1297
|
-
});
|
|
1298
|
-
newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "fasta" /* NOTATION.FASTA */);
|
|
1299
|
-
return newColumn;
|
|
1300
|
-
}
|
|
1301
|
-
/**
|
|
1302
|
-
* Convert HELM column to FASTA/SEPARATOR
|
|
1303
|
-
*
|
|
1304
|
-
* @param {string} tgtNotation Target notation: FASTA or SEPARATOR
|
|
1305
|
-
* @param {string} tgtSeparator Optional target separator (for HELM ->
|
|
1306
|
-
* @param {string | null} tgtGapSymbol Optional target gap symbol
|
|
1307
|
-
* SEPARATOR)
|
|
1308
|
-
* @return {DG.Column} Converted column
|
|
1309
|
-
*/
|
|
1310
|
-
convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {
|
|
1311
|
-
// This function must not contain calls of isDna() and isRna(), for
|
|
1312
|
-
// source helm columns may contain RNA, DNA and PT across different rows
|
|
1313
|
-
if (!tgtGapSymbol) {
|
|
1314
|
-
tgtGapSymbol = (this.toFasta(tgtNotation)) ?
|
|
1315
|
-
_units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.FASTA :
|
|
1316
|
-
_units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.SEPARATOR;
|
|
1317
|
-
}
|
|
1318
|
-
if (!tgtSeparator) {
|
|
1319
|
-
tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;
|
|
1320
|
-
}
|
|
1321
|
-
const helmWrappersRe = /(R\(|D\(|\)|P)/g;
|
|
1322
|
-
const newColumn = this.getNewColumn(tgtNotation);
|
|
1323
|
-
// assign the values to the empty column
|
|
1324
|
-
newColumn.init((idx) => {
|
|
1325
|
-
const helmPolymer = this.column.get(idx);
|
|
1326
|
-
// we cannot use isDna() or isRna() because source helm columns can
|
|
1327
|
-
// contain DNA, RNA and PT in different cells, so the corresponding
|
|
1328
|
-
// tags cannot be set for the whole column
|
|
1329
|
-
const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');
|
|
1330
|
-
// items can be monomers or helms
|
|
1331
|
-
const helmItemsArray = this.splitter(helmPolymer);
|
|
1332
|
-
const tgtMonomersArray = [];
|
|
1333
|
-
for (let i = 0; i < helmItemsArray.length; i++) {
|
|
1334
|
-
let item = helmItemsArray[i];
|
|
1335
|
-
if (isNucleotide)
|
|
1336
|
-
item = item.replace(helmWrappersRe, '');
|
|
1337
|
-
if (item === _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.HELM) {
|
|
1338
|
-
tgtMonomersArray.push(tgtGapSymbol);
|
|
1339
|
-
}
|
|
1340
|
-
else if (this.toFasta(tgtNotation) && item.length > 1) {
|
|
1341
|
-
// the case of a multi-character monomer converted to FASTA
|
|
1342
|
-
const monomer = '[' + item + ']';
|
|
1343
|
-
tgtMonomersArray.push(monomer);
|
|
1344
|
-
}
|
|
1345
|
-
else {
|
|
1346
|
-
tgtMonomersArray.push(item);
|
|
1347
|
-
}
|
|
1348
|
-
}
|
|
1349
|
-
return tgtMonomersArray.join(tgtSeparator);
|
|
1350
|
-
});
|
|
1351
|
-
// TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR
|
|
1352
|
-
const splitter = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_2__.getSplitterForColumn)(newColumn);
|
|
1353
|
-
const stats = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_2__.getStats)(newColumn, 5, splitter);
|
|
1354
|
-
const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';
|
|
1355
|
-
newColumn.setTag("aligned" /* TAGS.aligned */, aligned);
|
|
1356
|
-
return newColumn;
|
|
1357
|
-
}
|
|
1358
|
-
convertHelmToSeparator() {
|
|
1359
|
-
// TODO: implementatioreturn this.getNewColumn();
|
|
1360
|
-
return this.getNewColumn("separator" /* NOTATION.SEPARATOR */);
|
|
1361
|
-
}
|
|
1362
|
-
/** Dispatcher method for notation conversion
|
|
1363
|
-
*
|
|
1364
|
-
* @param {NOTATION} tgtNotation Notation we want to convert to
|
|
1365
|
-
* @param {string | null} tgtSeparator Possible separator
|
|
1366
|
-
* @return {DG.Column} Converted column
|
|
1367
|
-
*/
|
|
1368
|
-
convert(tgtNotation, tgtSeparator = null) {
|
|
1369
|
-
// possible exceptions
|
|
1370
|
-
if (this.notation === tgtNotation)
|
|
1371
|
-
throw new Error('tgt notation is invalid');
|
|
1372
|
-
if (this.toSeparator(tgtNotation) && tgtSeparator === null)
|
|
1373
|
-
throw new Error('tgt separator is not specified');
|
|
1374
|
-
if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)
|
|
1375
|
-
return this.convertFastaToSeparator(tgtSeparator);
|
|
1376
|
-
else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))
|
|
1377
|
-
return this.convertToHelm();
|
|
1378
|
-
else if (this.isSeparator() && this.toFasta(tgtNotation))
|
|
1379
|
-
return this.convertSeparatorToFasta();
|
|
1380
|
-
else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM
|
|
1381
|
-
return this.convertHelm(tgtNotation);
|
|
1382
|
-
else if (this.isHelm() && this.toSeparator(tgtNotation))
|
|
1383
|
-
return this.convertHelm(tgtNotation, tgtSeparator);
|
|
1384
|
-
else
|
|
1385
|
-
throw new Error('Not supported conversion ' +
|
|
1386
|
-
`from source notation '${this.notation}' to target notation '${tgtNotation}'.`);
|
|
1387
|
-
}
|
|
1388
|
-
constructor(col) {
|
|
1389
|
-
super(col);
|
|
1390
|
-
this._splitter = null;
|
|
1391
|
-
}
|
|
1392
|
-
}
|
|
1393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90YXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm90YXRpb24tY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFFMUcsaUZBQWlGO0FBQ2pGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBR2pELElBQWMsUUFBUTtRQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxjQUF3QixJQUFhLE9BQU8sY0FBYyxpQ0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFFeEYsV0FBVyxDQUFDLGNBQXdCLElBQWEsT0FBTyxjQUFjLHlDQUF1QixDQUFDLENBQUMsQ0FBQztJQUVoRyxNQUFNLENBQUMsY0FBd0IsSUFBYSxPQUFPLGNBQWMsK0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTdGOzs7Ozs7T0FNRztJQUNLLHVCQUF1QixDQUFDLFNBQWlCLEVBQUUsaUJBQWdDLElBQUk7UUFDckYsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN6QixjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLHNDQUFvQixDQUFDO1FBQ3hELHNEQUFzRDtRQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FB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TUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkI7Z0JBQ3pDLHlCQUF5QixJQUFJLENBQUMsUUFBUSx5QkFBeUIsV0FBVyxJQUFJLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsWUFBbUIsR0FBYztRQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUE3UEwsY0FBUyxHQUF3QixJQUFJLENBQUM7SUE4UDlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIERvIG5vdCBjaGFuZ2UgdGhlc2UgaW1wb3J0IGxpbmVzIHRvIG1hdGNoIGV4dGVybmFsIG1vZHVsZXMgaW4gd2VicGFjayBjb25maWd1cmF0aW9uICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi91bml0cy1oYW5kbGVyJztcbmltcG9ydCB7Z2V0U3BsaXR0ZXJGb3JDb2x1bW4sIGdldFN0YXRzLCBOT1RBVElPTiwgU2VxQ29sU3RhdHMsIFNwbGl0dGVyRnVuYywgVEFHU30gZnJvbSAnLi9tYWNyb21vbGVjdWxlJztcblxuLyoqIENsYXNzIGZvciBoYW5kbGluZyBjb252ZXJzaW9uIG9mIG5vdGF0aW9uIHN5c3RlbXMgaW4gTWFjcm9tb2xlY3VsZSBjb2x1bW5zICovXG5leHBvcnQgY2xhc3MgTm90YXRpb25Db252ZXJ0ZXIgZXh0ZW5kcyBVbml0c0hhbmRsZXIge1xuICBwcml2YXRlIF9zcGxpdHRlcjogU3BsaXR0ZXJGdW5jIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGdldCBzcGxpdHRlcigpOiBTcGxpdHRlckZ1bmMge1xuICAgIGlmICh0aGlzLl9zcGxpdHRlciA9PT0gbnVsbClcbiAgICAgIHRoaXMuX3NwbGl0dGVyID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4odGhpcy5jb2x1bW4pO1xuICAgIHJldHVybiB0aGlzLl9zcGxpdHRlcjtcbiAgfVxuXG4gIHB1YmxpYyB0b0Zhc3RhKHRhcmdldE5vdGF0aW9uOiBOT1RBVElPTik6IGJvb2xlYW4geyByZXR1cm4gdGFyZ2V0Tm90YXRpb24gPT09IE5PVEFUSU9OLkZBU1RBOyB9XG5cbiAgcHVibGljIHRvU2VwYXJhdG9yKHRhcmdldE5vdGF0aW9uOiBOT1RBVElPTik6IGJvb2xlYW4geyByZXR1cm4gdGFyZ2V0Tm90YXRpb24gPT09IE5PVEFUSU9OLlNFUEFSQVRPUjsgfVxuXG4gIHB1YmxpYyB0b0hlbG0odGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogYm9vbGVhbiB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gTk9UQVRJT04uSEVMTTsgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgTWFjcm9tb2xlY3VsZSBjb2x1bW4gZnJvbSBGQVNUQSB0byBTRVBBUkFUT1Igbm90YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcGFyYXRvciAgQSBzcGVjaWZpYyBzZXBhcmF0b3IgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFzdGFHYXBTeW1ib2wgIEdhcCBzeW1ib2wgaW4gRkFTVEEsICctJyBieSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gICAgICAgIEEgbmV3IGNvbHVtbiBpbiBTRVBBUkFUT1Igbm90YXRpb25cbiAgICovXG4gIHByaXZhdGUgY29udmVydEZhc3RhVG9TZXBhcmF0b3Ioc2VwYXJhdG9yOiBzdHJpbmcsIGZhc3RhR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IERHLkNvbHVtbiB7XG4gICAgaWYgKGZhc3RhR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgZmFzdGFHYXBTeW1ib2wgPSB0aGlzLmRlZmF1bHRHYXBTeW1ib2w7XG5cbiAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbihOT1RBVElPTi5TRVBBUkFUT1IpO1xuICAgIC8vIGFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBuZXdseSBjcmVhdGVkIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZmFzdGFQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXkgPSB0aGlzLnNwbGl0dGVyKGZhc3RhUG9seW1lcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhc3RhTW9ub21lcnNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZmFzdGFNb25vbWVyc0FycmF5W2ldID09PSBmYXN0YUdhcFN5bWJvbClcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFzdGFNb25vbWVyc0FycmF5LmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9KTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gICAgbmV3Q29sdW1uLnNldFRhZyhUQUdTLnNlcGFyYXRvciwgc2VwYXJhdG9yKTtcbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd3JhcHBlciBzdHJpbmdzIGZvciBIRUxNLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlXG4gICAqIG1hY3JvbW9sZWN1bGUgKHBlcHRpZGUsIEROQSwgUk5BKVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2Ygd3JhcHBlcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0SGVsbVdyYXBwZXJzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwcmVmaXggPSAodGhpcy5pc0RuYSgpKSA/ICdETkExeycgOlxuICAgICAgKHRoaXMuaXNSbmEoKSkgPyAnUk5BMXsnIDpcbiAgICAgICAgKHRoaXMuaXNQZXB0aWRlKCkpID8gJ1BFUFRJREUxeycgOlxuICAgICAgICAgICdVbmtub3duJzsgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGFzIGV4Y2VwdGlvbmFsXG5cbiAgICBpZiAocHJlZml4ID09PSAnVW5rbm93bicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05laXRoZXIgcGVwdGlkZSwgbm9yIG51Y2xlb3RpZGUnKTtcblxuICAgIGNvbnN0IHBvc3RmaXggPSAnfSQkJCc7XG4gICAgY29uc3QgbGVmdFdyYXBwZXIgPSAodGhpcy5pc0RuYSgpKSA/ICdEKCcgOlxuICAgICAgKHRoaXMuaXNSbmEoKSkgPyAnUignIDogJyc7IC8vIG5vIHdyYXBwZXIgZm9yIHBlcHRpZGVzXG4gICAgY29uc3QgcmlnaHRXcmFwcGVyID0gKHRoaXMuaXNEbmEoKSB8fCB0aGlzLmlzUm5hKCkpID8gJylQJyA6ICcnOyAvLyBubyB3cmFwcGVyIGZvciBwZXB0aWRlc1xuICAgIHJldHVybiBbcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4XTtcbiAgfVxuXG4gIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHN0cmluZ3MgdG8gSEVMTVxuICBwcml2YXRlIGNvbnZlcnRUb0hlbG1IZWxwZXIoXG4gICAgc291cmNlUG9seW1lcjogc3RyaW5nLFxuICAgIHNvdXJjZUdhcFN5bWJvbDogc3RyaW5nLFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIGxlZnRXcmFwcGVyOiBzdHJpbmcsXG4gICAgcmlnaHRXcmFwcGVyOiBzdHJpbmcsXG4gICAgcG9zdGZpeDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9ub21lckFycmF5ID0gdGhpcy5zcGxpdHRlcihzb3VyY2VQb2x5bWVyKTtcbiAgICBjb25zdCBtb25vbWVySGVsbUFycmF5OiBzdHJpbmdbXSA9IG1vbm9tZXJBcnJheS5tYXAoKG1tOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChtbSA9PT0gc291cmNlR2FwU3ltYm9sKVxuICAgICAgICByZXR1cm4gVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuSEVMTTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGAke2xlZnRXcmFwcGVyfSR7bW19JHtyaWdodFdyYXBwZXJ9YDtcbiAgICB9KTtcbiAgICByZXR1cm4gYCR7cHJlZml4fSR7bW9ub21lckhlbG1BcnJheS5qb2luKCcuJyl9JHtwb3N0Zml4fWA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHN0cmluZyB3aXRoIFNFUEFSQVRPUi9GQVNUQSBub3RhdGlvbiB0byBIRUxNXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQb2x5bWVyICBBIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBzb3VyY2VHYXBTeW1ib2wgIEFuIG9wdGlvbmFsIGdhcCBzeW1ib2wsIHNldCB0b1xuICAgKiBkZWZhdWx0IHZhbHVlcyAoJy0nIGZvciBGQVNUQSBhbmQgJycgZm9yIFNFUEFSQVRPUikgdW5sZXNzIHNwZWNpZmllZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9ICBUaGUgdGFyZ2V0IEhFTE0gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgY29udmVydFN0cmluZ1RvSGVsbShcbiAgICBzb3VyY2VQb2x5bWVyOiBzdHJpbmcsXG4gICAgc291cmNlR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzb3VyY2VHYXBTeW1ib2wgPT09IG51bGwpXG4gICAgICBzb3VyY2VHYXBTeW1ib2wgPSB0aGlzLmRlZmF1bHRHYXBTeW1ib2w7XG4gICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRUb0hlbG1IZWxwZXIoc291cmNlUG9seW1lciwgc291cmNlR2FwU3ltYm9sLCBwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBjb2x1bW4gdG8gSEVMTVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHNvdXJjZUdhcFN5bWJvbFxuICAgKiBAcmV0dXJuIHtERy5Db2x1bW59XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUb0hlbG0oc291cmNlR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IERHLkNvbHVtbiB7XG4gICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcblxuICAgIGNvbnN0IFtwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXhdID0gdGhpcy5nZXRIZWxtV3JhcHBlcnMoKTtcblxuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLkhFTE0pO1xuICAgIC8vIGFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBlbXB0eSBjb2x1bW5cbiAgICBuZXdDb2x1bW4uaW5pdCgoaWR4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUb0hlbG1IZWxwZXIoc291cmNlUG9seW1lciwgc291cmNlR2FwU3ltYm9sISwgcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4KTtcbiAgICB9KTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIE5PVEFUSU9OLkhFTE0pO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBTRVBBUkFUT1IgY29sdW1uIHRvIEZBU1RBIG5vdGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gZmFzdGFHYXBTeW1ib2wgT3B0aW9uYWwgZ2FwIHN5bWJvbCBmb3IgRkFTVEFcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgQ29udmVydGVkIGNvbHVtblxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0U2VwYXJhdG9yVG9GYXN0YShmYXN0YUdhcFN5bWJvbDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBERy5Db2x1bW4ge1xuICAgIGlmIChmYXN0YUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgIGZhc3RhR2FwU3ltYm9sID0gVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuRkFTVEE7XG5cbiAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbihOT1RBVElPTi5GQVNUQSk7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc2VwYXJhdG9yUG9seW1lciA9IHRoaXMuY29sdW1uLmdldChpZHgpO1xuICAgICAgLy8gaXRlbXMgY2FuIGJlIG1vbm9tZXJzIG9yIHNlcGFyYXRvcnNcbiAgICAgIGNvbnN0IHNlcGFyYXRvckl0ZW1zQXJyYXkgPSB0aGlzLnNwbGl0dGVyKHNlcGFyYXRvclBvbHltZXIpO1xuICAgICAgY29uc3QgZmFzdGFNb25vbWVyc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXBhcmF0b3JJdGVtc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBzZXBhcmF0b3JJdGVtc0FycmF5W2ldO1xuICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChmYXN0YUdhcFN5bWJvbCEpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIHRoZSBjYXNlIG9mIGEgbXVsdGktY2hhcmFjdGVyIG1vbm9tZXJcbiAgICAgICAgICBjb25zdCBtb25vbWVyID0gJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChtb25vbWVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhc3RhTW9ub21lcnNBcnJheS5qb2luKCcnKTtcbiAgICB9KTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIE5PVEFUSU9OLkZBU1RBKTtcbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqICBDb252ZXJ0IEhFTE0gY29sdW1uIHRvIEZBU1RBL1NFUEFSQVRPUlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGd0Tm90YXRpb24gICAgVGFyZ2V0IG5vdGF0aW9uOiBGQVNUQSBvciBTRVBBUkFUT1JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRndFNlcGFyYXRvciAgIE9wdGlvbmFsIHRhcmdldCBzZXBhcmF0b3IgKGZvciBIRUxNIC0+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gdGd0R2FwU3ltYm9sICAgT3B0aW9uYWwgdGFyZ2V0IGdhcCBzeW1ib2xcbiAgICogU0VQQVJBVE9SKVxuICAgKiBAcmV0dXJuIHtERy5Db2x1bW59IENvbnZlcnRlZCBjb2x1bW5cbiAgICovXG4gIHByaXZhdGUgY29udmVydEhlbG0odGd0Tm90YXRpb246IHN0cmluZywgdGd0U2VwYXJhdG9yPzogc3RyaW5nLCB0Z3RHYXBTeW1ib2w/OiBzdHJpbmcpOiBERy5Db2x1bW4ge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgY29udGFpbiBjYWxscyBvZiBpc0RuYSgpIGFuZCBpc1JuYSgpLCBmb3JcbiAgICAvLyBzb3VyY2UgaGVsbSBjb2x1bW5zIG1heSBjb250YWluIFJOQSwgRE5BIGFuZCBQVCBhY3Jvc3MgZGlmZmVyZW50IHJvd3NcbiAgICBpZiAoIXRndEdhcFN5bWJvbCkge1xuICAgICAgdGd0R2FwU3ltYm9sID0gKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbiBhcyBOT1RBVElPTikpID9cbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuRkFTVEEgOlxuICAgICAgICBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgfVxuXG4gICAgaWYgKCF0Z3RTZXBhcmF0b3IpIHtcbiAgICAgIHRndFNlcGFyYXRvciA9ICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24gYXMgTk9UQVRJT04pKSA/ICcnIDogdGhpcy5zZXBhcmF0b3I7XG4gICAgfVxuXG4gICAgY29uc3QgaGVsbVdyYXBwZXJzUmUgPSAvKFJcXCh8RFxcKHxcXCl8UCkvZztcbiAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbih0Z3ROb3RhdGlvbiBhcyBOT1RBVElPTik7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgaGVsbVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcblxuICAgICAgLy8gd2UgY2Fubm90IHVzZSBpc0RuYSgpIG9yIGlzUm5hKCkgYmVjYXVzZSBzb3VyY2UgaGVsbSBjb2x1bW5zIGNhblxuICAgICAgLy8gY29udGFpbiBETkEsIFJOQSBhbmQgUFQgaW4gZGlmZmVyZW50IGNlbGxzLCBzbyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAgLy8gdGFncyBjYW5ub3QgYmUgc2V0IGZvciB0aGUgd2hvbGUgY29sdW1uXG4gICAgICBjb25zdCBpc051Y2xlb3RpZGUgPSBoZWxtUG9seW1lci5zdGFydHNXaXRoKCdETkEnKSB8fCBoZWxtUG9seW1lci5zdGFydHNXaXRoKCdSTkEnKTtcblxuICAgICAgLy8gaXRlbXMgY2FuIGJlIG1vbm9tZXJzIG9yIGhlbG1zXG4gICAgICBjb25zdCBoZWxtSXRlbXNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoaGVsbVBvbHltZXIpO1xuICAgICAgY29uc3QgdGd0TW9ub21lcnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVsbUl0ZW1zQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGl0ZW0gPSBoZWxtSXRlbXNBcnJheVtpXTtcbiAgICAgICAgaWYgKGlzTnVjbGVvdGlkZSlcbiAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKGhlbG1XcmFwcGVyc1JlLCAnJyk7XG4gICAgICAgIGlmIChpdGVtID09PSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNKSB7XG4gICAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKHRndEdhcFN5bWJvbCEpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbiBhcyBOT1RBVElPTikgJiYgaXRlbS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gdGhlIGNhc2Ugb2YgYSBtdWx0aS1jaGFyYWN0ZXIgbW9ub21lciBjb252ZXJ0ZWQgdG8gRkFTVEFcbiAgICAgICAgICBjb25zdCBtb25vbWVyID0gJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICB0Z3RNb25vbWVyc0FycmF5LnB1c2gobW9ub21lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGd0TW9ub21lcnNBcnJheS5qb2luKHRndFNlcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvLyBUQUdTLmFsaWduZWQgaXMgbWFuZGF0b3J5IGZvciBjb2x1bW5zIG9mIE5PVEFUSU9OLkZBU1RBIGFuZCBOT1RBVElPTi5TRVBBUkFUT1JcbiAgICBjb25zdCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4obmV3Q29sdW1uKTtcbiAgICBjb25zdCBzdGF0czogU2VxQ29sU3RhdHMgPSBnZXRTdGF0cyhuZXdDb2x1bW4sIDUsIHNwbGl0dGVyKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBhbGlnbmVkKTtcblxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRIZWxtVG9TZXBhcmF0b3IoKTogREcuQ29sdW1uIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGlvcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gIH1cblxuICAvKiogRGlzcGF0Y2hlciBtZXRob2QgZm9yIG5vdGF0aW9uIGNvbnZlcnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtOT1RBVElPTn0gdGd0Tm90YXRpb24gICBOb3RhdGlvbiB3ZSB3YW50IHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RTZXBhcmF0b3IgICBQb3NzaWJsZSBzZXBhcmF0b3JcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgICAgICAgICAgICAgICBDb252ZXJ0ZWQgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgY29udmVydCh0Z3ROb3RhdGlvbjogTk9UQVRJT04sIHRndFNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBERy5Db2x1bW4ge1xuICAgIC8vIHBvc3NpYmxlIGV4Y2VwdGlvbnNcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gdGd0Tm90YXRpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBub3RhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgaWYgKHRoaXMudG9TZXBhcmF0b3IodGd0Tm90YXRpb24pICYmIHRndFNlcGFyYXRvciA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGd0IHNlcGFyYXRvciBpcyBub3Qgc3BlY2lmaWVkJyk7XG5cbiAgICBpZiAodGhpcy5pc0Zhc3RhKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikgJiYgdGd0U2VwYXJhdG9yICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZhc3RhVG9TZXBhcmF0b3IodGd0U2VwYXJhdG9yKTtcbiAgICBlbHNlIGlmICgodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSAmJiB0aGlzLnRvSGVsbSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtKCk7XG4gICAgZWxzZSBpZiAodGhpcy5pc1NlcGFyYXRvcigpICYmIHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2VwYXJhdG9yVG9GYXN0YSgpO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSkgLy8gdGhlIGNhc2Ugb2YgSEVMTVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24pO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yISk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gJyArXG4gICAgICAgIGBmcm9tIHNvdXJjZSBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgdG8gdGFyZ2V0IG5vdGF0aW9uICcke3RndE5vdGF0aW9ufScuYCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICBzdXBlcihjb2wpO1xuICB9XG59XG4iXX0=
|
|
1394
|
-
|
|
1395
|
-
/***/ }),
|
|
1396
|
-
|
|
1397
|
-
/***/ "./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js":
|
|
1398
|
-
/*!*************************************************************************!*\
|
|
1399
|
-
!*** ./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js ***!
|
|
1400
|
-
\*************************************************************************/
|
|
1401
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1402
|
-
|
|
1403
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1404
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1405
|
-
/* harmony export */ "UnitsHandler": () => (/* binding */ UnitsHandler)
|
|
1406
|
-
/* harmony export */ });
|
|
1407
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
1408
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
1409
|
-
/* harmony import */ var _macromolecule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./macromolecule */ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js");
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
/** Class for handling notation units in Macromolecule columns */
|
|
1413
|
-
class UnitsHandler {
|
|
1414
|
-
static setUnitsToFastaColumn(col) {
|
|
1415
|
-
if (col.semType !== datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE)
|
|
1416
|
-
throw new Error('Fasta column must be MACROMOLECULE');
|
|
1417
|
-
const stats = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.getStats)(col, 5, _macromolecule__WEBPACK_IMPORTED_MODULE_1__.splitterAsFasta);
|
|
1418
|
-
const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';
|
|
1419
|
-
const alphabet = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.detectAlphabet)(stats);
|
|
1420
|
-
col.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "fasta" /* NOTATION.FASTA */);
|
|
1421
|
-
col.setTag("aligned" /* TAGS.aligned */, aligned);
|
|
1422
|
-
col.setTag("alphabet" /* TAGS.alphabet */, alphabet);
|
|
1423
|
-
}
|
|
1424
|
-
get units() { return this._units; }
|
|
1425
|
-
get column() { return this._column; }
|
|
1426
|
-
get notation() { return this._notation; }
|
|
1427
|
-
get defaultGapSymbol() { return this._defaultGapSymbol; }
|
|
1428
|
-
get separator() {
|
|
1429
|
-
var _a;
|
|
1430
|
-
const separator = (_a = this.column.getTag("separator" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;
|
|
1431
|
-
if (this.notation === "separator" /* NOTATION.SEPARATOR */ && separator === undefined)
|
|
1432
|
-
throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);
|
|
1433
|
-
return separator;
|
|
1434
|
-
}
|
|
1435
|
-
get aligned() {
|
|
1436
|
-
const aligned = this.column.getTag("aligned" /* TAGS.aligned */);
|
|
1437
|
-
// TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR
|
|
1438
|
-
if (!aligned && (this.isFasta() || this.isSeparator()))
|
|
1439
|
-
throw new Error('Tag aligned not set');
|
|
1440
|
-
return aligned;
|
|
1441
|
-
}
|
|
1442
|
-
/** Alphabet name (upper case) */
|
|
1443
|
-
get alphabet() {
|
|
1444
|
-
const alphabet = this.column.getTag("alphabet" /* TAGS.alphabet */);
|
|
1445
|
-
// TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR
|
|
1446
|
-
if (!alphabet && (this.isFasta() || this.isSeparator()))
|
|
1447
|
-
throw new Error('Tag alphabet not set');
|
|
1448
|
-
return alphabet;
|
|
1449
|
-
}
|
|
1450
|
-
getAlphabetSize() {
|
|
1451
|
-
if (this.notation == "helm" /* NOTATION.HELM */ || this.alphabet == "UN" /* ALPHABET.UN */) {
|
|
1452
|
-
const alphabetSizeStr = this.column.getTag(".alphabetSize" /* TAGS.alphabetSize */);
|
|
1453
|
-
let alphabetSize;
|
|
1454
|
-
if (alphabetSizeStr) {
|
|
1455
|
-
alphabetSize = parseInt(alphabetSizeStr);
|
|
1456
|
-
}
|
|
1457
|
-
else {
|
|
1458
|
-
// calculate alphabetSize on demand
|
|
1459
|
-
const splitter = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.getSplitterForColumn)(this.column);
|
|
1460
|
-
const stats = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.getStats)(this.column, 1, splitter);
|
|
1461
|
-
alphabetSize = Object.keys(stats.freq).length;
|
|
1462
|
-
}
|
|
1463
|
-
return alphabetSize;
|
|
1464
|
-
}
|
|
1465
|
-
else {
|
|
1466
|
-
switch (this.alphabet) {
|
|
1467
|
-
case "PT" /* ALPHABET.PT */:
|
|
1468
|
-
return 20;
|
|
1469
|
-
case "DNA" /* ALPHABET.DNA */:
|
|
1470
|
-
case "RNA" /* ALPHABET.RNA */:
|
|
1471
|
-
return 4;
|
|
1472
|
-
case 'NT':
|
|
1473
|
-
console.warn(`Unexpected alphabet 'NT'.`);
|
|
1474
|
-
return 4;
|
|
1475
|
-
default:
|
|
1476
|
-
throw new Error(`Unexpected alphabet '${this.alphabet}'.`);
|
|
1477
|
-
}
|
|
1478
|
-
}
|
|
1479
|
-
}
|
|
1480
|
-
getAlphabetIsMultichar() {
|
|
1481
|
-
if (this.notation == "helm" /* NOTATION.HELM */ || this.alphabet == "UN" /* ALPHABET.UN */)
|
|
1482
|
-
return this.column.getTag(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */) == 'true';
|
|
1483
|
-
else
|
|
1484
|
-
return false;
|
|
1485
|
-
}
|
|
1486
|
-
isFasta() { return this.notation === "fasta" /* NOTATION.FASTA */; }
|
|
1487
|
-
isSeparator() { return this.notation === "separator" /* NOTATION.SEPARATOR */; }
|
|
1488
|
-
isHelm() { return this.notation === "helm" /* NOTATION.HELM */; }
|
|
1489
|
-
isRna() { return this.alphabet === "RNA" /* ALPHABET.RNA */; }
|
|
1490
|
-
isDna() { return this.alphabet === "DNA" /* ALPHABET.DNA */; }
|
|
1491
|
-
isPeptide() { return this.alphabet === "PT" /* ALPHABET.PT */; }
|
|
1492
|
-
isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }
|
|
1493
|
-
/** Associate notation types with the corresponding units */
|
|
1494
|
-
/**
|
|
1495
|
-
* @return {NOTATION} Notation associated with the units type
|
|
1496
|
-
*/
|
|
1497
|
-
getNotation() {
|
|
1498
|
-
if (this.units.toLowerCase().startsWith("fasta" /* NOTATION.FASTA */))
|
|
1499
|
-
return "fasta" /* NOTATION.FASTA */;
|
|
1500
|
-
else if (this.units.toLowerCase().startsWith("separator" /* NOTATION.SEPARATOR */))
|
|
1501
|
-
return "separator" /* NOTATION.SEPARATOR */;
|
|
1502
|
-
else if (this.units.toLowerCase().startsWith("helm" /* NOTATION.HELM */))
|
|
1503
|
-
return "helm" /* NOTATION.HELM */;
|
|
1504
|
-
else
|
|
1505
|
-
throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);
|
|
1506
|
-
}
|
|
1507
|
-
/**
|
|
1508
|
-
* Create a new empty column of the specified notation type and the same
|
|
1509
|
-
* length as column
|
|
1510
|
-
*
|
|
1511
|
-
* @param {NOTATION} targetNotation
|
|
1512
|
-
* @return {DG.Column}
|
|
1513
|
-
*/
|
|
1514
|
-
getNewColumn(targetNotation) {
|
|
1515
|
-
const col = this.column;
|
|
1516
|
-
const len = col.length;
|
|
1517
|
-
const name = targetNotation.toLowerCase() + '(' + col.name + ')';
|
|
1518
|
-
const newColName = col.dataFrame.columns.getUnusedName(name);
|
|
1519
|
-
const newColumn = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Column.fromList('string', newColName, new Array(len).fill(''));
|
|
1520
|
-
newColumn.semType = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE;
|
|
1521
|
-
newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, targetNotation);
|
|
1522
|
-
newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.CELL_RENDERER, 'Macromolecule');
|
|
1523
|
-
const srcAligned = col.getTag("aligned" /* TAGS.aligned */);
|
|
1524
|
-
if (srcAligned)
|
|
1525
|
-
newColumn.setTag("aligned" /* TAGS.aligned */, srcAligned);
|
|
1526
|
-
const srcAlphabet = col.getTag("alphabet" /* TAGS.alphabet */);
|
|
1527
|
-
if (srcAlphabet)
|
|
1528
|
-
newColumn.setTag("alphabet" /* TAGS.alphabet */, srcAlphabet);
|
|
1529
|
-
let srcAlphabetSize = col.getTag(".alphabetSize" /* TAGS.alphabetSize */);
|
|
1530
|
-
if (srcAlphabetSize)
|
|
1531
|
-
newColumn.setTag(".alphabetSize" /* TAGS.alphabetSize */, srcAlphabetSize);
|
|
1532
|
-
const srcAlphabetIsMultichar = col.getTag(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */);
|
|
1533
|
-
if (srcAlphabetIsMultichar !== undefined)
|
|
1534
|
-
newColumn.setTag(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);
|
|
1535
|
-
if (targetNotation == "helm" /* NOTATION.HELM */) {
|
|
1536
|
-
srcAlphabetSize = this.getAlphabetSize().toString();
|
|
1537
|
-
newColumn.setTag(".alphabetSize" /* TAGS.alphabetSize */, srcAlphabetSize);
|
|
1538
|
-
}
|
|
1539
|
-
return newColumn;
|
|
1540
|
-
}
|
|
1541
|
-
/**
|
|
1542
|
-
* Create a new empty column using templateCol as a template
|
|
1543
|
-
*
|
|
1544
|
-
* @param {DG.Column} templateCol the properties and units of this column are used as a
|
|
1545
|
-
* template to build the new one
|
|
1546
|
-
* @return {DG.Column}
|
|
1547
|
-
*/
|
|
1548
|
-
static getNewColumn(templateCol) {
|
|
1549
|
-
const col = new UnitsHandler(templateCol);
|
|
1550
|
-
const targetNotation = col.notation;
|
|
1551
|
-
return col.getNewColumn(targetNotation);
|
|
1552
|
-
}
|
|
1553
|
-
/**
|
|
1554
|
-
* A helper function checking the validity of the 'units' string
|
|
1555
|
-
*
|
|
1556
|
-
* @param {string} units the string to be validated
|
|
1557
|
-
* @return {boolean}
|
|
1558
|
-
*/
|
|
1559
|
-
static unitsStringIsValid(units) {
|
|
1560
|
-
units = units.toLowerCase();
|
|
1561
|
-
const prefixes = ["fasta" /* NOTATION.FASTA */, "separator" /* NOTATION.SEPARATOR */, "helm" /* NOTATION.HELM */];
|
|
1562
|
-
const postfixes = ['rna', 'dna', 'pt'];
|
|
1563
|
-
const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));
|
|
1564
|
-
return prefixCriterion;
|
|
1565
|
-
}
|
|
1566
|
-
/**
|
|
1567
|
-
* Construct a new column of semantic type MACROMOLECULE from the list of
|
|
1568
|
-
* specified parameters
|
|
1569
|
-
*
|
|
1570
|
-
* @param {number} len the length of the new column
|
|
1571
|
-
* @param {string} name the name of the new column
|
|
1572
|
-
* @param {string} units the units of the new column
|
|
1573
|
-
* @return {DG.Column}
|
|
1574
|
-
*/
|
|
1575
|
-
static getNewColumnFromParams(len, name, units) {
|
|
1576
|
-
// WARNING: in this implementation is is impossible to verify the uniqueness
|
|
1577
|
-
// of the new column's name
|
|
1578
|
-
// TODO: verify the validity of units parameter
|
|
1579
|
-
if (!UnitsHandler.unitsStringIsValid(units))
|
|
1580
|
-
throw new Error('Invalid format of \'units\' parameter');
|
|
1581
|
-
const newColumn = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Column.fromList('string', name, new Array(len).fill(''));
|
|
1582
|
-
newColumn.semType = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE;
|
|
1583
|
-
newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, units);
|
|
1584
|
-
return newColumn;
|
|
1585
|
-
}
|
|
1586
|
-
constructor(col) {
|
|
1587
|
-
this._column = col;
|
|
1588
|
-
const units = this._column.tags[datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS];
|
|
1589
|
-
if (units !== null)
|
|
1590
|
-
this._units = units;
|
|
1591
|
-
else
|
|
1592
|
-
throw new Error('Units are not specified in column');
|
|
1593
|
-
this._notation = this.getNotation();
|
|
1594
|
-
this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :
|
|
1595
|
-
(this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :
|
|
1596
|
-
UnitsHandler._defaultGapSymbolsDict.SEPARATOR;
|
|
1597
|
-
if (!this.column.tags.has("aligned" /* TAGS.aligned */)) {
|
|
1598
|
-
if (this.isFasta() || this.isSeparator())
|
|
1599
|
-
throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +
|
|
1600
|
-
`tag '${"aligned" /* TAGS.aligned */}' is mandatory.`);
|
|
1601
|
-
}
|
|
1602
|
-
// if (!this.column.tags.has(TAGS.alphabetSize)) {
|
|
1603
|
-
// if (this.isHelm())
|
|
1604
|
-
// throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +
|
|
1605
|
-
// `tag '${TAGS.alphabetSize}' is mandatory.`);
|
|
1606
|
-
// else if (['UN'].includes(this.alphabet))
|
|
1607
|
-
// throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +
|
|
1608
|
-
// `tag '${TAGS.alphabetSize}' is mandatory.`);
|
|
1609
|
-
// }
|
|
1610
|
-
if (!this.column.tags.has(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */)) {
|
|
1611
|
-
if (this.isHelm())
|
|
1612
|
-
throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +
|
|
1613
|
-
`tag '${".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */}' is mandatory.`);
|
|
1614
|
-
else if (['UN'].includes(this.alphabet))
|
|
1615
|
-
throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +
|
|
1616
|
-
`tag '${".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */}' is mandatory.`);
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
}
|
|
1620
|
-
UnitsHandler._defaultGapSymbolsDict = {
|
|
1621
|
-
HELM: '*',
|
|
1622
|
-
SEPARATOR: '',
|
|
1623
|
-
FASTA: '-',
|
|
1624
|
-
};
|
|
1625
|
-
UnitsHandler.PeptideFastaAlphabet = new Set([
|
|
1626
|
-
'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',
|
|
1627
|
-
'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',
|
|
1628
|
-
]);
|
|
1629
|
-
UnitsHandler.DnaFastaAlphabet = new Set(['A', 'C', 'G', 'T']);
|
|
1630
|
-
UnitsHandler.RnaFastaAlphabet = new Set(['A', 'C', 'G', 'U']);
|
|
1631
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdHMtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVuaXRzLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBRUwsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixRQUFRLEVBR1IsZUFBZSxFQUdoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLGlFQUFpRTtBQUNqRSxNQUFNLE9BQU8sWUFBWTtJQWtCaEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQWM7UUFDaEQsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFeEQsTUFBTSxLQUFLLEdBQWdCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSywrQkFBaUIsQ0FBQztRQUMxQyxHQUFHLENBQUMsTUFBTSwrQkFBZSxPQUFPLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsTUFBTSxpQ0FBZ0IsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQWMsS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBYyxNQUFNLEtBQWdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBVyxRQUFRLEtBQWUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFD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RUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQ2hELEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FDakQsQ0FBQyxDQUFDO0FBQ29CLDZCQUFnQixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCw2QkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1xuICBBTFBIQUJFVCxcbiAgZGV0ZWN0QWxwaGFiZXQsXG4gIGdldFNwbGl0dGVyRm9yQ29sdW1uLFxuICBnZXRTdGF0cyxcbiAgTk9UQVRJT04sXG4gIFNlcUNvbFN0YXRzLFxuICBzcGxpdHRlckFzRmFzdGEsXG4gIFNwbGl0dGVyRnVuYyxcbiAgVEFHU1xufSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuXG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIG5vdGF0aW9uIHVuaXRzIGluIE1hY3JvbW9sZWN1bGUgY29sdW1ucyAqL1xuZXhwb3J0IGNsYXNzIFVuaXRzSGFuZGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY29sdW1uOiBERy5Db2x1bW47IC8vIHRoZSBjb2x1bW4gdG8gYmUgY29udmVydGVkXG4gIHByb3RlY3RlZCBfdW5pdHM6IHN0cmluZzsgLy8gdW5pdHMsIG9mIHRoZSBmb3JtIGZhc3RhLCBzZXBhcmF0b3JcbiAgcHJvdGVjdGVkIF9ub3RhdGlvbjogTk9UQVRJT047IC8vIGN1cnJlbnQgbm90YXRpb24gKHdpdGhvdXQgOlNFUTpOVCwgZXRjLilcbiAgcHJvdGVjdGVkIF9kZWZhdWx0R2FwU3ltYm9sOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgX2RlZmF1bHRHYXBTeW1ib2xzRGljdCA9IHtcbiAgICBIRUxNOiAnKicsXG4gICAgU0VQQVJBVE9SOiAnJyxcbiAgICBGQVNUQTogJy0nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUGVwdGlkZUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICdHJywgJ0wnLCAnWScsICdTJywgJ0UnLCAnUScsICdEJywgJ04nLCAnRicsICdBJyxcbiAgICAnSycsICdSJywgJ0gnLCAnQycsICdWJywgJ1AnLCAnVycsICdJJywgJ00nLCAnVCcsXG4gIF0pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdUJ10pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdVJ10pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VW5pdHNUb0Zhc3RhQ29sdW1uKGNvbDogREcuQ29sdW1uKSB7XG4gICAgaWYgKGNvbC5zZW1UeXBlICE9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zhc3RhIGNvbHVtbiBtdXN0IGJlIE1BQ1JPTU9MRUNVTEUnKTtcblxuICAgIGNvbnN0IHN0YXRzOiBTZXFDb2xTdGF0cyA9IGdldFN0YXRzKGNvbCwgNSwgc3BsaXR0ZXJBc0Zhc3RhKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIGNvbnN0IGFscGhhYmV0ID0gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpO1xuXG4gICAgY29sLnNldFRhZyhERy5UQUdTLlVOSVRTLCBOT1RBVElPTi5GQVNUQSk7XG4gICAgY29sLnNldFRhZyhUQUdTLmFsaWduZWQsIGFsaWduZWQpO1xuICAgIGNvbC5zZXRUYWcoVEFHUy5hbHBoYWJldCwgYWxwaGFiZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1bml0cygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdW5pdHM7IH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNvbHVtbigpOiBERy5Db2x1bW4geyByZXR1cm4gdGhpcy5fY29sdW1uOyB9XG5cbiAgcHVibGljIGdldCBub3RhdGlvbigpOiBOT1RBVElPTiB7IHJldHVybiB0aGlzLl9ub3RhdGlvbjsgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdEdhcFN5bWJvbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZGVmYXVsdEdhcFN5bWJvbDsgfVxuXG4gIHB1YmxpYyBnZXQgc2VwYXJhdG9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5zZXBhcmF0b3IpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gTk9UQVRJT04uU0VQQVJBVE9SICYmIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXBhcmF0b3IgaXMgbWFuZGF0b3J5ICBmb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScuYCk7XG4gICAgcmV0dXJuIHNlcGFyYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpZ25lZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWduZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcblxuICAgIC8vIFRBR1MuYWxpZ25lZCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxpZ25lZCAmJiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFnIGFsaWduZWQgbm90IHNldCcpO1xuXG4gICAgcmV0dXJuIGFsaWduZWQ7XG4gIH1cblxuICAvKiogQWxwaGFiZXQgbmFtZSAodXBwZXIgY2FzZSkgKi9cbiAgcHVibGljIGdldCBhbHBoYWJldCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFscGhhYmV0ID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFRBR1MuYWxwaGFiZXQpO1xuXG4gICAgLy8gVEFHUy5hbHBoYWJldCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxwaGFiZXQgJiYgKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhZyBhbHBoYWJldCBub3Qgc2V0Jyk7XG5cbiAgICByZXR1cm4gYWxwaGFiZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxwaGFiZXRTaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSB8fCB0aGlzLmFscGhhYmV0ID09IEFMUEhBQkVULlVOKSB7XG4gICAgICBjb25zdCBhbHBoYWJldFNpemVTdHIgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgICAgbGV0IGFscGhhYmV0U2l6ZTogbnVtYmVyO1xuICAgICAgaWYgKGFscGhhYmV0U2l6ZVN0cikge1xuICAgICAgICBhbHBoYWJldFNpemUgPSBwYXJzZUludChhbHBoYWJldFNpemVTdHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2FsY3VsYXRlIGFscGhhYmV0U2l6ZSBvbiBkZW1hbmRcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXI6IFNwbGl0dGVyRnVuYyA9IGdldFNwbGl0dGVyRm9yQ29sdW1uKHRoaXMuY29sdW1uKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyh0aGlzLmNvbHVtbiwgMSwgc3BsaXR0ZXIpO1xuICAgICAgICBhbHBoYWJldFNpemUgPSBPYmplY3Qua2V5cyhzdGF0cy5mcmVxKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxwaGFiZXRTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuYWxwaGFiZXQpIHtcbiAgICAgIGNhc2UgQUxQSEFCRVQuUFQ6XG4gICAgICAgIHJldHVybiAyMDtcbiAgICAgIGNhc2UgQUxQSEFCRVQuRE5BOlxuICAgICAgY2FzZSBBTFBIQUJFVC5STkE6XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgY2FzZSAnTlQnOlxuICAgICAgICBjb25zb2xlLndhcm4oYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJ05UJy5gKTtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRBbHBoYWJldElzTXVsdGljaGFyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5vdGF0aW9uID09IE5PVEFUSU9OLkhFTE0gfHwgdGhpcy5hbHBoYWJldCA9PSBBTFBIQUJFVC5VTilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldElzTXVsdGljaGFyKSA9PSAndHJ1ZSc7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzRmFzdGEoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5GQVNUQTsgfVxuXG4gIHB1YmxpYyBpc1NlcGFyYXRvcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubm90YXRpb24gPT09IE5PVEFUSU9OLlNFUEFSQVRPUjsgfVxuXG4gIHB1YmxpYyBpc0hlbG0oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5IRUxNOyB9XG5cbiAgcHVibGljIGlzUm5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuUk5BOyB9XG5cbiAgcHVibGljIGlzRG5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BOyB9XG5cbiAgcHVibGljIGlzUGVwdGlkZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuYWxwaGFiZXQgPT09IEFMUEhBQkVULlBUOyB9XG5cbiAgcHVibGljIGlzTXNhKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbGlnbmVkID8gdGhpcy5hbGlnbmVkLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoJ01TQScpIDogZmFsc2U7IH1cblxuICAvKiogQXNzb2NpYXRlIG5vdGF0aW9uIHR5cGVzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdW5pdHMgKi9cbiAgLyoqXG4gICAqIEByZXR1cm4ge05PVEFUSU9OfSAgICAgTm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB1bml0cyB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90YXRpb24oKTogTk9UQVRJT04ge1xuICAgIGlmICh0aGlzLnVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChOT1RBVElPTi5GQVNUQSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uRkFTVEE7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICAgIHJldHVybiBOT1RBVElPTi5TRVBBUkFUT1I7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uSEVMTTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgaGFzIHVuZXhwZWN0ZWQgbm90YXRpb24gJyR7dGhpcy51bml0c30nLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gb2YgdGhlIHNwZWNpZmllZCBub3RhdGlvbiB0eXBlIGFuZCB0aGUgc2FtZVxuICAgKiBsZW5ndGggYXMgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7Tk9UQVRJT059IHRhcmdldE5vdGF0aW9uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHByb3RlY3RlZCBnZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogREcuQ29sdW1uIHtcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbjtcbiAgICBjb25zdCBsZW4gPSBjb2wubGVuZ3RoO1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb3RhdGlvbi50b0xvd2VyQ2FzZSgpICsgJygnICsgY29sLm5hbWUgKyAnKSc7XG4gICAgY29uc3QgbmV3Q29sTmFtZSA9IGNvbC5kYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKG5hbWUpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmV3Q29sTmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdGFyZ2V0Tm90YXRpb24pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5DRUxMX1JFTkRFUkVSLCAnTWFjcm9tb2xlY3VsZScpO1xuXG4gICAgY29uc3Qgc3JjQWxpZ25lZCA9IGNvbC5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcbiAgICBpZiAoc3JjQWxpZ25lZClcbiAgICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBzcmNBbGlnbmVkKTtcblxuICAgIGNvbnN0IHNyY0FscGhhYmV0ID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0KTtcbiAgICBpZiAoc3JjQWxwaGFiZXQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXQsIHNyY0FscGhhYmV0KTtcblxuICAgIGxldCBzcmNBbHBoYWJldFNpemU6IHN0cmluZyA9IGNvbC5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgIGlmIChzcmNBbHBoYWJldFNpemUpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRTaXplLCBzcmNBbHBoYWJldFNpemUpO1xuXG4gICAgY29uc3Qgc3JjQWxwaGFiZXRJc011bHRpY2hhcjogc3RyaW5nID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpO1xuICAgIGlmIChzcmNBbHBoYWJldElzTXVsdGljaGFyICE9PSB1bmRlZmluZWQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciwgc3JjQWxwaGFiZXRJc011bHRpY2hhcik7XG5cbiAgICBpZiAodGFyZ2V0Tm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSkge1xuICAgICAgc3JjQWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKS50b1N0cmluZygpO1xuICAgICAgbmV3Q29sdW1uLnNldFRhZyhUQUdTLmFscGhhYmV0U2l6ZSwgc3JjQWxwaGFiZXRTaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gdXNpbmcgdGVtcGxhdGVDb2wgYXMgYSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gdGVtcGxhdGVDb2wgIHRoZSBwcm9wZXJ0aWVzIGFuZCB1bml0cyBvZiB0aGlzIGNvbHVtbiBhcmUgdXNlZCBhcyBhXG4gICAqIHRlbXBsYXRlIHRvIGJ1aWxkIHRoZSBuZXcgb25lXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uKHRlbXBsYXRlQ29sOiBERy5Db2x1bW4pOiBERy5Db2x1bW4ge1xuICAgIGNvbnN0IGNvbDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcih0ZW1wbGF0ZUNvbCk7XG4gICAgY29uc3QgdGFyZ2V0Tm90YXRpb24gPSBjb2wubm90YXRpb247XG4gICAgcmV0dXJuIGNvbC5nZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIGZ1bmN0aW9uIGNoZWNraW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgJ3VuaXRzJyBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXRzICB0aGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bml0c1N0cmluZ0lzVmFsaWQodW5pdHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHVuaXRzID0gdW5pdHMudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwcmVmaXhlcyA9IFtOT1RBVElPTi5GQVNUQSwgTk9UQVRJT04uU0VQQVJBVE9SLCBOT1RBVElPTi5IRUxNXTtcbiAgICBjb25zdCBwb3N0Zml4ZXMgPSBbJ3JuYScsICdkbmEnLCAncHQnXTtcblxuICAgIGNvbnN0IHByZWZpeENyaXRlcmlvbiA9IHByZWZpeGVzLnNvbWUoKHApID0+IHVuaXRzLnN0YXJ0c1dpdGgocC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgcmV0dXJuIHByZWZpeENyaXRlcmlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29sdW1uIG9mIHNlbWFudGljIHR5cGUgTUFDUk9NT0xFQ1VMRSBmcm9tIHRoZSBsaXN0IG9mXG4gICAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSAgICBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBjb2x1bW5cbiAgICogQHBhcmFtIHtzdHJpbmd9ICAgIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgICB1bml0cyAgdGhlIHVuaXRzIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uRnJvbVBhcmFtcyhcbiAgICBsZW46IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdW5pdHM6IHN0cmluZ1xuICApOiBERy5Db2x1bW4ge1xuICAgIC8vIFdBUk5JTkc6IGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXMgaW1wb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHVuaXF1ZW5lc3NcbiAgICAvLyBvZiB0aGUgbmV3IGNvbHVtbidzIG5hbWVcbiAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIHVuaXRzIHBhcmFtZXRlclxuICAgIGlmICghVW5pdHNIYW5kbGVyLnVuaXRzU3RyaW5nSXNWYWxpZCh1bml0cykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0IG9mIFxcJ3VuaXRzXFwnIHBhcmFtZXRlcicpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdW5pdHMpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICB0aGlzLl9jb2x1bW4gPSBjb2w7XG4gICAgY29uc3QgdW5pdHMgPSB0aGlzLl9jb2x1bW4udGFnc1tERy5UQUdTLlVOSVRTXTtcbiAgICBpZiAodW5pdHMgIT09IG51bGwpXG4gICAgICB0aGlzLl91bml0cyA9IHVuaXRzO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pdHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gY29sdW1uJyk7XG4gICAgdGhpcy5fbm90YXRpb24gPSB0aGlzLmdldE5vdGF0aW9uKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdhcFN5bWJvbCA9ICh0aGlzLmlzRmFzdGEoKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQSA6XG4gICAgICAodGhpcy5pc0hlbG0oKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNIDpcbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuU0VQQVJBVE9SO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFsaWduZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciBjb2x1bW4gJyR7dGhpcy5jb2x1bW4ubmFtZX0nIG9mIG5vdGF0aW9uICcke3RoaXMubm90YXRpb259JyBgICtcbiAgICAgICAgICBgdGFnICcke1RBR1MuYWxpZ25lZH0nIGlzIG1hbmRhdG9yeS5gKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoIXRoaXMuY29sdW1uLnRhZ3MuaGFzKFRBR1MuYWxwaGFiZXRTaXplKSkge1xuICAgIC8vICAgaWYgKHRoaXMuaXNIZWxtKCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gfVxuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpKSB7XG4gICAgICBpZiAodGhpcy5pc0hlbG0oKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgYCArXG4gICAgICAgICAgYHRhZyAnJHtUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXJ9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldElzTXVsdGljaGFyfScgaXMgbWFuZGF0b3J5LmApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
1632
|
-
|
|
1633
|
-
/***/ }),
|
|
1634
|
-
|
|
1635
|
-
/***/ "./node_modules/@datagrok-libraries/utils/src/to-console.js":
|
|
1636
|
-
/*!******************************************************************!*\
|
|
1637
|
-
!*** ./node_modules/@datagrok-libraries/utils/src/to-console.js ***!
|
|
1638
|
-
\******************************************************************/
|
|
1639
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1640
|
-
|
|
1641
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1642
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1643
|
-
/* harmony export */ "errorToConsole": () => (/* binding */ errorToConsole),
|
|
1644
|
-
/* harmony export */ "rectToConsole": () => (/* binding */ rectToConsole)
|
|
1645
|
-
/* harmony export */ });
|
|
1646
|
-
function errorToConsole(err) {
|
|
1647
|
-
var _a;
|
|
1648
|
-
if (typeof err === 'string' || err instanceof String) {
|
|
1649
|
-
return err;
|
|
1650
|
-
}
|
|
1651
|
-
else if ('$thrownJsError' in err) {
|
|
1652
|
-
return errorToConsole(err['$thrownJsError']);
|
|
1653
|
-
}
|
|
1654
|
-
else if (err instanceof Error) {
|
|
1655
|
-
return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;
|
|
1656
|
-
}
|
|
1657
|
-
else {
|
|
1658
|
-
return err.toString();
|
|
1659
|
-
}
|
|
1660
|
-
}
|
|
1661
|
-
function rectToConsole(rect) {
|
|
1662
|
-
return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;
|
|
1663
|
-
}
|
|
1664
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtRQUMvQixPQUFPLE1BQUMsR0FBYSxDQUFDLEtBQUssbUNBQUssR0FBYSxDQUFDLE9BQU8sQ0FBQztLQUN2RDtTQUFNO1FBQ0wsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9Db25zb2xlKGVycjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiBlcnIgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKCckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=
|
|
1665
|
-
|
|
1666
|
-
/***/ }),
|
|
1667
|
-
|
|
1668
|
-
/***/ "./src/cell-renderer.ts":
|
|
1669
|
-
/*!******************************!*\
|
|
1670
|
-
!*** ./src/cell-renderer.ts ***!
|
|
1671
|
-
\******************************/
|
|
1672
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1673
|
-
|
|
1674
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1675
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1676
|
-
/* harmony export */ "HelmCellRenderer": () => (/* binding */ HelmCellRenderer)
|
|
1677
|
-
/* harmony export */ });
|
|
1678
|
-
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
|
|
1679
|
-
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__);
|
|
1680
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
1681
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__);
|
|
1682
|
-
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
|
|
1683
|
-
/* harmony import */ var _datagrok_libraries_bio_src_utils_cell_renderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @datagrok-libraries/bio/src/utils/cell-renderer */ "./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js");
|
|
1684
|
-
/* harmony import */ var _datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @datagrok-libraries/utils/src/to-console */ "./node_modules/@datagrok-libraries/utils/src/to-console.js");
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
class HelmCellRenderer extends datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.GridCellRenderer {
|
|
1691
|
-
get name() { return 'helm'; }
|
|
1692
|
-
get cellType() { return 'helm'; }
|
|
1693
|
-
get defaultWidth() { return 400; }
|
|
1694
|
-
get defaultHeight() { return 100; }
|
|
1695
|
-
onMouseMove(gridCell, e) {
|
|
1696
|
-
var _a, _b, _c;
|
|
1697
|
-
try {
|
|
1698
|
-
const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];
|
|
1699
|
-
const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;
|
|
1700
|
-
const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
|
|
1701
|
-
let left = 0;
|
|
1702
|
-
let right = maxIndex;
|
|
1703
|
-
let found = false;
|
|
1704
|
-
maxLengthWordsSum[maxIndex + 1] = argsX + 1;
|
|
1705
|
-
let mid = 0;
|
|
1706
|
-
if (argsX > maxLengthWordsSum[0]) {
|
|
1707
|
-
while (!found) {
|
|
1708
|
-
mid = Math.floor((right + left) / 2);
|
|
1709
|
-
if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {
|
|
1710
|
-
left = mid;
|
|
1711
|
-
found = true;
|
|
1712
|
-
}
|
|
1713
|
-
else if (argsX < maxLengthWordsSum[mid]) {
|
|
1714
|
-
right = mid - 1;
|
|
1715
|
-
}
|
|
1716
|
-
else if (argsX > maxLengthWordsSum[mid + 1]) {
|
|
1717
|
-
left = mid + 1;
|
|
1718
|
-
}
|
|
1719
|
-
if (left == right) {
|
|
1720
|
-
found = true;
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1723
|
-
}
|
|
1724
|
-
left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;
|
|
1725
|
-
const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.findMonomers)(gridCell.cell.value);
|
|
1726
|
-
let s = (_a = gridCell.cell.value) !== null && _a !== void 0 ? _a : '';
|
|
1727
|
-
let subParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.parseHelm)(s);
|
|
1728
|
-
let allParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getParts)(subParts, s);
|
|
1729
|
-
let tooltipMessage = [];
|
|
1730
|
-
for (let i = 0; i < allParts.length; ++i) {
|
|
1731
|
-
if (monomers.has(allParts[i]))
|
|
1732
|
-
tooltipMessage[i] = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divV([
|
|
1733
|
-
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divText(`Monomer ${allParts[i]} not found.`),
|
|
1734
|
-
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divText('Open the Context Panel, then expand Manage Libraries')
|
|
1735
|
-
]);
|
|
1736
|
-
}
|
|
1737
|
-
((((_c = (_b = tooltipMessage[left]) === null || _b === void 0 ? void 0 : _b.childNodes.length) !== null && _c !== void 0 ? _c : 0) > 0))
|
|
1738
|
-
? datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.tooltip.show(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div(tooltipMessage[left]), e.x + 16, e.y + 16)
|
|
1739
|
-
: datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.tooltip.hide();
|
|
1740
|
-
}
|
|
1741
|
-
catch (err) {
|
|
1742
|
-
const errMsg = (0,_datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_4__.errorToConsole)(err);
|
|
1743
|
-
console.error('Helm: HelmCellRenderer.onMouseMove() error:\n' + errMsg);
|
|
1744
|
-
}
|
|
1745
|
-
}
|
|
1746
|
-
render(g, x, y, w, h, gridCell, cellStyle) {
|
|
1747
|
-
var _a;
|
|
1748
|
-
const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;
|
|
1749
|
-
const undefinedColor = 'rgb(100,100,100)';
|
|
1750
|
-
const grayColor = '#808080';
|
|
1751
|
-
const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.findMonomers)(gridCell.cell.value);
|
|
1752
|
-
let s = (_a = gridCell.cell.value) !== null && _a !== void 0 ? _a : '';
|
|
1753
|
-
let subParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.parseHelm)(s);
|
|
1754
|
-
if (monomers.size == 0) {
|
|
1755
|
-
const host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([], { style: { width: `${w}px`, height: `${h}px` } });
|
|
1756
|
-
host.setAttribute('dataformat', 'helm');
|
|
1757
|
-
host.setAttribute('data', gridCell.cell.value);
|
|
1758
|
-
gridCell.element = host;
|
|
1759
|
-
//@ts-ignore
|
|
1760
|
-
const canvas = new JSDraw2.Editor(host, { width: w, height: h, skin: 'w8', viewonly: true });
|
|
1761
|
-
return;
|
|
1762
|
-
}
|
|
1763
|
-
if (monomers.size > 0) {
|
|
1764
|
-
w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;
|
|
1765
|
-
g.save();
|
|
1766
|
-
g.beginPath();
|
|
1767
|
-
g.rect(x, y, w, h);
|
|
1768
|
-
g.clip();
|
|
1769
|
-
g.font = '12px monospace';
|
|
1770
|
-
g.textBaseline = 'top';
|
|
1771
|
-
let x1 = x;
|
|
1772
|
-
let maxLengthWords = {};
|
|
1773
|
-
let maxLengthWordSum = {};
|
|
1774
|
-
let allParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getParts)(subParts, s);
|
|
1775
|
-
for (let i = 0; i < allParts.length; ++i) {
|
|
1776
|
-
maxLengthWords[i] = allParts[i].length * 7;
|
|
1777
|
-
let color = monomers.has(allParts[i]) ? 'red' : grayColor;
|
|
1778
|
-
g.fillStyle = undefinedColor;
|
|
1779
|
-
x1 = (0,_datagrok_libraries_bio_src_utils_cell_renderer__WEBPACK_IMPORTED_MODULE_3__.printLeftOrCentered)(x1, y, w, h, g, allParts[i], color, 0, true, 1.0);
|
|
1780
|
-
}
|
|
1781
|
-
maxLengthWordSum[0] = maxLengthWords[0];
|
|
1782
|
-
for (let i = 1; i < allParts.length; i++) {
|
|
1783
|
-
maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];
|
|
1784
|
-
}
|
|
1785
|
-
gridCell.cell.column.temp = {
|
|
1786
|
-
'helm-sum-maxLengthWords': maxLengthWordSum,
|
|
1787
|
-
'helm-maxLengthWords': maxLengthWords
|
|
1788
|
-
};
|
|
1789
|
-
g.restore();
|
|
1790
|
-
return;
|
|
1791
|
-
}
|
|
1792
|
-
}
|
|
1793
|
-
}
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
/***/ }),
|
|
1797
|
-
|
|
1798
|
-
/***/ "./src/constants.ts":
|
|
1799
|
-
/*!**************************!*\
|
|
1800
|
-
!*** ./src/constants.ts ***!
|
|
1801
|
-
\**************************/
|
|
1802
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1803
|
-
|
|
1804
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1805
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1806
|
-
/* harmony export */ "MONOMER_SYMBOL": () => (/* binding */ MONOMER_SYMBOL),
|
|
1807
|
-
/* harmony export */ "RGROUPS": () => (/* binding */ RGROUPS),
|
|
1808
|
-
/* harmony export */ "RGROUP_ALTER_ID": () => (/* binding */ RGROUP_ALTER_ID),
|
|
1809
|
-
/* harmony export */ "RGROUP_CAP_GROUP_NAME": () => (/* binding */ RGROUP_CAP_GROUP_NAME),
|
|
1810
|
-
/* harmony export */ "RGROUP_CAP_GROUP_SMILES": () => (/* binding */ RGROUP_CAP_GROUP_SMILES),
|
|
1811
|
-
/* harmony export */ "RGROUP_LABEL": () => (/* binding */ RGROUP_LABEL),
|
|
1812
|
-
/* harmony export */ "SDF_MONOMER_NAME": () => (/* binding */ SDF_MONOMER_NAME),
|
|
1813
|
-
/* harmony export */ "SMILES": () => (/* binding */ SMILES),
|
|
1814
|
-
/* harmony export */ "jsonSdfMonomerLibDict": () => (/* binding */ jsonSdfMonomerLibDict)
|
|
1815
|
-
/* harmony export */ });
|
|
1816
|
-
const jsonSdfMonomerLibDict = {
|
|
1817
|
-
"monomerType": null,
|
|
1818
|
-
"smiles": null,
|
|
1819
|
-
"name": "MonomerName",
|
|
1820
|
-
"author": null,
|
|
1821
|
-
"molfile": "molecule",
|
|
1822
|
-
"naturalAnalog": "MonomerNaturalAnalogCode",
|
|
1823
|
-
"rgroups": "MonomerCaps",
|
|
1824
|
-
"createDate": null,
|
|
1825
|
-
"id": null,
|
|
1826
|
-
"polymerType": "MonomerType",
|
|
1827
|
-
"symbol": "MonomerCode"
|
|
1828
|
-
};
|
|
1829
|
-
const SMILES = 'smiles';
|
|
1830
|
-
const RGROUPS = "rgroups";
|
|
1831
|
-
const MONOMER_SYMBOL = "symbol";
|
|
1832
|
-
const RGROUP_CAP_GROUP_SMILES = "capGroupSmiles";
|
|
1833
|
-
const RGROUP_ALTER_ID = "alternateId";
|
|
1834
|
-
const RGROUP_CAP_GROUP_NAME = "capGroupName";
|
|
1835
|
-
const RGROUP_LABEL = "label";
|
|
1836
|
-
const SDF_MONOMER_NAME = "MonomerName";
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
/***/ }),
|
|
1840
|
-
|
|
1841
|
-
/***/ "./src/helm-web-editor.ts":
|
|
1842
|
-
/*!********************************!*\
|
|
1843
|
-
!*** ./src/helm-web-editor.ts ***!
|
|
1844
|
-
\********************************/
|
|
1845
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1846
|
-
|
|
1847
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1848
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1849
|
-
/* harmony export */ "HelmWebEditor": () => (/* binding */ HelmWebEditor)
|
|
1850
|
-
/* harmony export */ });
|
|
1851
|
-
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
|
|
1852
|
-
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__);
|
|
1853
|
-
|
|
1854
|
-
class HelmWebEditor {
|
|
1855
|
-
constructor() {
|
|
1856
|
-
this.w = 200;
|
|
1857
|
-
this.h = 100;
|
|
1858
|
-
this.host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([], { style: { width: `${this.w}px`, height: `${this.h}px` } });
|
|
1859
|
-
this.editor = new JSDraw2.Editor(this.host, { width: this.w, height: this.h, viewonly: true });
|
|
1860
|
-
}
|
|
1861
|
-
resizeEditor(w, h) {
|
|
1862
|
-
this.editor.setSize(w, h);
|
|
1863
|
-
}
|
|
1864
|
-
createWebEditor(value) {
|
|
1865
|
-
const editorView = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div();
|
|
1866
|
-
org.helm.webeditor.MolViewer.molscale = 0.8;
|
|
1867
|
-
const webEditor = new scil.helm.App(editorView, {
|
|
1868
|
-
showabout: false,
|
|
1869
|
-
mexfontsize: '90%',
|
|
1870
|
-
mexrnapinontab: true,
|
|
1871
|
-
topmargin: 20,
|
|
1872
|
-
mexmonomerstab: true,
|
|
1873
|
-
sequenceviewonly: false,
|
|
1874
|
-
mexfavoritefirst: true,
|
|
1875
|
-
mexfilter: true
|
|
1876
|
-
});
|
|
1877
|
-
const sizes = webEditor.calculateSizes();
|
|
1878
|
-
webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
|
|
1879
|
-
let s = { width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px' };
|
|
1880
|
-
//@ts-ignore
|
|
1881
|
-
scil.apply(webEditor.sequence.style, s);
|
|
1882
|
-
//@ts-ignore
|
|
1883
|
-
scil.apply(webEditor.notation.style, s);
|
|
1884
|
-
s = { width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px' };
|
|
1885
|
-
//@ts-ignore
|
|
1886
|
-
scil.apply(webEditor.properties.parent.style, s);
|
|
1887
|
-
webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);
|
|
1888
|
-
webEditor.mex.resize(sizes.topheight - 80);
|
|
1889
|
-
setTimeout(function () {
|
|
1890
|
-
webEditor.canvas.helm.setSequence(value, 'HELM');
|
|
1891
|
-
}, 200);
|
|
1892
|
-
return { editorDiv: editorView, webEditor: webEditor };
|
|
1893
|
-
}
|
|
1894
|
-
}
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
/***/ }),
|
|
1898
|
-
|
|
1899
|
-
/***/ "./src/utils.ts":
|
|
1900
|
-
/*!**********************!*\
|
|
1901
|
-
!*** ./src/utils.ts ***!
|
|
1902
|
-
\**********************/
|
|
1903
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1904
|
-
|
|
1905
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1906
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1907
|
-
/* harmony export */ "findMonomers": () => (/* binding */ findMonomers),
|
|
1908
|
-
/* harmony export */ "getParts": () => (/* binding */ getParts),
|
|
1909
|
-
/* harmony export */ "parseHelm": () => (/* binding */ parseHelm)
|
|
1910
|
-
/* harmony export */ });
|
|
1911
|
-
function getParts(subParts, s) {
|
|
1912
|
-
let j = 0;
|
|
1913
|
-
let allParts = [];
|
|
1914
|
-
for (let k = 0; k < subParts.length; ++k) {
|
|
1915
|
-
let indexOfMonomer = s.indexOf(subParts[k]);
|
|
1916
|
-
let helmBeforeMonomer = s.slice(j, indexOfMonomer);
|
|
1917
|
-
allParts.push(helmBeforeMonomer);
|
|
1918
|
-
allParts.push(subParts[k]);
|
|
1919
|
-
s = s.substring(indexOfMonomer + subParts[k].length);
|
|
1920
|
-
}
|
|
1921
|
-
allParts.push(s);
|
|
1922
|
-
return allParts;
|
|
1923
|
-
}
|
|
1924
|
-
function parseHelm(s) {
|
|
1925
|
-
var sections = split(s, '$');
|
|
1926
|
-
s = sections[0];
|
|
1927
|
-
var monomers = [];
|
|
1928
|
-
//@ts-ignore
|
|
1929
|
-
if (!scil.Utils.isNullOrEmpty(s)) {
|
|
1930
|
-
var seqs = split(s, '|');
|
|
1931
|
-
for (var i = 0; i < seqs.length; ++i) {
|
|
1932
|
-
var e = detachAnnotation(seqs[i]);
|
|
1933
|
-
s = e.str;
|
|
1934
|
-
var p = s.indexOf('{');
|
|
1935
|
-
s = s.substring(p + 1);
|
|
1936
|
-
p = s.indexOf('}');
|
|
1937
|
-
s = s.substring(0, p);
|
|
1938
|
-
var ss = split(s, '.');
|
|
1939
|
-
for (var monomer of ss) {
|
|
1940
|
-
if (monomer.includes('(') && monomer.includes(')')) {
|
|
1941
|
-
var elements = monomer.replace(/[()]/g, '').split('');
|
|
1942
|
-
for (var el of elements) {
|
|
1943
|
-
monomers.push(el);
|
|
1944
|
-
}
|
|
1945
|
-
}
|
|
1946
|
-
else if (monomer.includes('[') && monomer.includes(']')) {
|
|
1947
|
-
var element = monomer.match(/(?<=\[).*?(?=\])/g, '');
|
|
1948
|
-
monomers.push(element[0]);
|
|
1949
|
-
}
|
|
1950
|
-
else {
|
|
1951
|
-
monomers.push(monomer);
|
|
1952
|
-
}
|
|
1953
|
-
}
|
|
1954
|
-
}
|
|
1955
|
-
}
|
|
1956
|
-
return monomers;
|
|
1957
|
-
}
|
|
1958
|
-
function findMonomers(helmString) {
|
|
1959
|
-
//@ts-ignore
|
|
1960
|
-
const types = Object.keys(org.helm.webeditor.monomerTypeList());
|
|
1961
|
-
const monomers = [];
|
|
1962
|
-
const monomer_names = [];
|
|
1963
|
-
for (var i = 0; i < types.length; i++) {
|
|
1964
|
-
//@ts-ignore
|
|
1965
|
-
monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));
|
|
1966
|
-
Object.keys(monomers[i]).forEach(k => {
|
|
1967
|
-
monomer_names.push(monomers[i][k].id);
|
|
1968
|
-
});
|
|
1969
|
-
}
|
|
1970
|
-
const split_string = parseHelm(helmString);
|
|
1971
|
-
return new Set(split_string.filter(val => !monomer_names.includes(val)));
|
|
1972
|
-
}
|
|
1973
|
-
function split(s, sep) {
|
|
1974
|
-
var ret = [];
|
|
1975
|
-
var frag = '';
|
|
1976
|
-
var parentheses = 0;
|
|
1977
|
-
var bracket = 0;
|
|
1978
|
-
var braces = 0;
|
|
1979
|
-
var quote = 0;
|
|
1980
|
-
for (var i = 0; i < s.length; ++i) {
|
|
1981
|
-
var c = s.substring(i, i + 1);
|
|
1982
|
-
if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {
|
|
1983
|
-
ret.push(frag);
|
|
1984
|
-
frag = '';
|
|
1985
|
-
}
|
|
1986
|
-
else {
|
|
1987
|
-
frag += c;
|
|
1988
|
-
if (quote > 0) {
|
|
1989
|
-
if (c == '\\' && i + 1 < s.length) {
|
|
1990
|
-
++i;
|
|
1991
|
-
var c2 = s.substring(i, i + 1);
|
|
1992
|
-
frag += c2;
|
|
1993
|
-
c += c2;
|
|
1994
|
-
}
|
|
1995
|
-
}
|
|
1996
|
-
if (c == '\"') {
|
|
1997
|
-
if (!(i > 0 && s.substring(i - 1, i) == '\\'))
|
|
1998
|
-
quote = quote == 0 ? 1 : 0;
|
|
1999
|
-
}
|
|
2000
|
-
else if (c == '[')
|
|
2001
|
-
++bracket;
|
|
2002
|
-
else if (c == ']')
|
|
2003
|
-
--bracket;
|
|
2004
|
-
else if (c == '(')
|
|
2005
|
-
++parentheses;
|
|
2006
|
-
else if (c == ')')
|
|
2007
|
-
--parentheses;
|
|
2008
|
-
else if (c == '{')
|
|
2009
|
-
++braces;
|
|
2010
|
-
else if (c == '}')
|
|
2011
|
-
--braces;
|
|
2012
|
-
}
|
|
2013
|
-
}
|
|
2014
|
-
ret.push(frag);
|
|
2015
|
-
return ret;
|
|
2016
|
-
}
|
|
2017
|
-
function detachAnnotation(s) {
|
|
2018
|
-
var ret = _detachAppendix(s, '\"');
|
|
2019
|
-
if (ret.tag != null)
|
|
2020
|
-
return ret;
|
|
2021
|
-
var r = _detachAppendix(s, '\'');
|
|
2022
|
-
return { tag: ret.tag, repeat: r.tag, str: r.str };
|
|
2023
|
-
}
|
|
2024
|
-
function _detachAppendix(s, c) {
|
|
2025
|
-
var tag = null;
|
|
2026
|
-
//@ts-ignore
|
|
2027
|
-
if (scil.Utils.endswith(s, c)) {
|
|
2028
|
-
var p = s.length - 1;
|
|
2029
|
-
while (p > 0) {
|
|
2030
|
-
p = s.lastIndexOf(c, p - 1);
|
|
2031
|
-
if (p <= 0 || s.substring(p - 1, p) != '\\')
|
|
2032
|
-
break;
|
|
2033
|
-
}
|
|
2034
|
-
if (p > 0 && p < s.length - 1) {
|
|
2035
|
-
tag = s.substring(p + 1, s.length - 1);
|
|
2036
|
-
s = s.substring(0, p);
|
|
2037
|
-
}
|
|
2038
|
-
}
|
|
2039
|
-
if (tag != null)
|
|
2040
|
-
tag = tag.replace(new RegExp('\\' + c, 'g'), c);
|
|
2041
|
-
return { tag: unescape(tag), str: s };
|
|
2042
|
-
}
|
|
2043
|
-
function unescape(s) {
|
|
2044
|
-
//@ts-ignore
|
|
2045
|
-
if (scil.Utils.isNullOrEmpty(s))
|
|
2046
|
-
return s;
|
|
2047
|
-
return s.replace(/[\\]./g, function (m) {
|
|
2048
|
-
switch (m) {
|
|
2049
|
-
case '\\r':
|
|
2050
|
-
return '\r';
|
|
2051
|
-
case '\\n':
|
|
2052
|
-
return '\n';
|
|
2053
|
-
case '\\t':
|
|
2054
|
-
return '\t';
|
|
2055
|
-
default:
|
|
2056
|
-
return m.substring(1);
|
|
2057
|
-
}
|
|
2058
|
-
});
|
|
2059
|
-
}
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
/***/ }),
|
|
2063
|
-
|
|
2064
|
-
/***/ "datagrok-api/dg":
|
|
2065
|
-
/*!*********************!*\
|
|
2066
|
-
!*** external "DG" ***!
|
|
2067
|
-
\*********************/
|
|
2068
|
-
/***/ ((module) => {
|
|
2069
|
-
|
|
2070
|
-
module.exports = DG;
|
|
2071
|
-
|
|
2072
|
-
/***/ }),
|
|
2073
|
-
|
|
2074
|
-
/***/ "datagrok-api/grok":
|
|
2075
|
-
/*!***********************!*\
|
|
2076
|
-
!*** external "grok" ***!
|
|
2077
|
-
\***********************/
|
|
2078
|
-
/***/ ((module) => {
|
|
2079
|
-
|
|
2080
|
-
module.exports = grok;
|
|
2081
|
-
|
|
2082
|
-
/***/ }),
|
|
2083
|
-
|
|
2084
|
-
/***/ "datagrok-api/ui":
|
|
2085
|
-
/*!*********************!*\
|
|
2086
|
-
!*** external "ui" ***!
|
|
2087
|
-
\*********************/
|
|
2088
|
-
/***/ ((module) => {
|
|
2089
|
-
|
|
2090
|
-
module.exports = ui;
|
|
2091
|
-
|
|
2092
|
-
/***/ }),
|
|
2093
|
-
|
|
2094
|
-
/***/ "wu":
|
|
2095
|
-
/*!*********************!*\
|
|
2096
|
-
!*** external "wu" ***!
|
|
2097
|
-
\*********************/
|
|
2098
|
-
/***/ ((module) => {
|
|
2099
|
-
|
|
2100
|
-
module.exports = wu;
|
|
2101
|
-
|
|
2102
|
-
/***/ })
|
|
2103
|
-
|
|
2104
|
-
/******/ });
|
|
2105
|
-
/************************************************************************/
|
|
2106
|
-
/******/ // The module cache
|
|
2107
|
-
/******/ var __webpack_module_cache__ = {};
|
|
2108
|
-
/******/
|
|
2109
|
-
/******/ // The require function
|
|
2110
|
-
/******/ function __webpack_require__(moduleId) {
|
|
2111
|
-
/******/ // Check if module is in cache
|
|
2112
|
-
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
2113
|
-
/******/ if (cachedModule !== undefined) {
|
|
2114
|
-
/******/ return cachedModule.exports;
|
|
2115
|
-
/******/ }
|
|
2116
|
-
/******/ // Create a new module (and put it into the cache)
|
|
2117
|
-
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
2118
|
-
/******/ // no module.id needed
|
|
2119
|
-
/******/ // no module.loaded needed
|
|
2120
|
-
/******/ exports: {}
|
|
2121
|
-
/******/ };
|
|
2122
|
-
/******/
|
|
2123
|
-
/******/ // Execute the module function
|
|
2124
|
-
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
2125
|
-
/******/
|
|
2126
|
-
/******/ // Return the exports of the module
|
|
2127
|
-
/******/ return module.exports;
|
|
2128
|
-
/******/ }
|
|
2129
|
-
/******/
|
|
2130
|
-
/************************************************************************/
|
|
2131
|
-
/******/ /* webpack/runtime/compat get default export */
|
|
2132
|
-
/******/ (() => {
|
|
2133
|
-
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
2134
|
-
/******/ __webpack_require__.n = (module) => {
|
|
2135
|
-
/******/ var getter = module && module.__esModule ?
|
|
2136
|
-
/******/ () => (module['default']) :
|
|
2137
|
-
/******/ () => (module);
|
|
2138
|
-
/******/ __webpack_require__.d(getter, { a: getter });
|
|
2139
|
-
/******/ return getter;
|
|
2140
|
-
/******/ };
|
|
2141
|
-
/******/ })();
|
|
2142
|
-
/******/
|
|
2143
|
-
/******/ /* webpack/runtime/define property getters */
|
|
2144
|
-
/******/ (() => {
|
|
2145
|
-
/******/ // define getter functions for harmony exports
|
|
2146
|
-
/******/ __webpack_require__.d = (exports, definition) => {
|
|
2147
|
-
/******/ for(var key in definition) {
|
|
2148
|
-
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
2149
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
2150
|
-
/******/ }
|
|
2151
|
-
/******/ }
|
|
2152
|
-
/******/ };
|
|
2153
|
-
/******/ })();
|
|
2154
|
-
/******/
|
|
2155
|
-
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
2156
|
-
/******/ (() => {
|
|
2157
|
-
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
2158
|
-
/******/ })();
|
|
2159
|
-
/******/
|
|
2160
|
-
/******/ /* webpack/runtime/make namespace object */
|
|
2161
|
-
/******/ (() => {
|
|
2162
|
-
/******/ // define __esModule on exports
|
|
2163
|
-
/******/ __webpack_require__.r = (exports) => {
|
|
2164
|
-
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
2165
|
-
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2166
|
-
/******/ }
|
|
2167
|
-
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
2168
|
-
/******/ };
|
|
2169
|
-
/******/ })();
|
|
2170
|
-
/******/
|
|
2171
|
-
/************************************************************************/
|
|
2172
|
-
var __webpack_exports__ = {};
|
|
2173
|
-
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
|
2174
|
-
(() => {
|
|
2175
|
-
/*!************************!*\
|
|
2176
|
-
!*** ./src/package.ts ***!
|
|
2177
|
-
\************************/
|
|
2178
|
-
__webpack_require__.r(__webpack_exports__);
|
|
2179
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
2180
|
-
/* harmony export */ "_package": () => (/* binding */ _package),
|
|
2181
|
-
/* harmony export */ "editMoleculeCell": () => (/* binding */ editMoleculeCell),
|
|
2182
|
-
/* harmony export */ "getMolfiles": () => (/* binding */ getMolfiles),
|
|
2183
|
-
/* harmony export */ "helmCellRenderer": () => (/* binding */ helmCellRenderer),
|
|
2184
|
-
/* harmony export */ "helmToFasta": () => (/* binding */ helmToFasta),
|
|
2185
|
-
/* harmony export */ "helmToPeptide": () => (/* binding */ helmToPeptide),
|
|
2186
|
-
/* harmony export */ "helmToRNA": () => (/* binding */ helmToRNA),
|
|
2187
|
-
/* harmony export */ "helmToSmiles": () => (/* binding */ helmToSmiles),
|
|
2188
|
-
/* harmony export */ "helmWebEditor": () => (/* binding */ helmWebEditor),
|
|
2189
|
-
/* harmony export */ "initHelm": () => (/* binding */ initHelm),
|
|
2190
|
-
/* harmony export */ "openEditor": () => (/* binding */ openEditor),
|
|
2191
|
-
/* harmony export */ "propertiesPanel": () => (/* binding */ propertiesPanel)
|
|
2192
|
-
/* harmony export */ });
|
|
2193
|
-
/* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
|
|
2194
|
-
/* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
|
|
2195
|
-
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
|
|
2196
|
-
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__);
|
|
2197
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
2198
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__);
|
|
2199
|
-
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
2200
|
-
/* harmony import */ var _helm_web_editor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helm-web-editor */ "./src/helm-web-editor.ts");
|
|
2201
|
-
/* harmony import */ var _cell_renderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./cell-renderer */ "./src/cell-renderer.ts");
|
|
2202
|
-
/* harmony import */ var _datagrok_libraries_bio_src_utils_notation_converter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @datagrok-libraries/bio/src/utils/notation-converter */ "./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js");
|
|
2203
|
-
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
|
|
2204
|
-
/* harmony import */ var _datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @datagrok-libraries/utils/src/to-console */ "./node_modules/@datagrok-libraries/utils/src/to-console.js");
|
|
2205
|
-
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2206
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
2207
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
2208
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
2209
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
2210
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
2211
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
2212
|
-
});
|
|
2213
|
-
};
|
|
2214
|
-
/* Do not change these import lines to match external modules in webpack configuration */
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
const _package = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Package();
|
|
2225
|
-
let monomerLib = null;
|
|
2226
|
-
//tags: init
|
|
2227
|
-
function initHelm() {
|
|
2228
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2229
|
-
return Promise.all([new Promise((resolve, reject) => {
|
|
2230
|
-
// @ts-ignore
|
|
2231
|
-
dojo.ready(function () { resolve(null); });
|
|
2232
|
-
}), yield datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.functions.call('Bio:getBioLib')]).then(([_, lib]) => {
|
|
2233
|
-
monomerLib = lib;
|
|
2234
|
-
rewriteLibraries(); // initHelm()
|
|
2235
|
-
monomerLib.onChanged.subscribe((_) => {
|
|
2236
|
-
try {
|
|
2237
|
-
rewriteLibraries(); // initHelm()
|
|
2238
|
-
const monTypeList = monomerLib.getTypes();
|
|
2239
|
-
const msgStr = 'Monomer lib updated:<br />' + (monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {
|
|
2240
|
-
return `${monType} ${monomerLib.getMonomerNamesByType(monType).length}`;
|
|
2241
|
-
}).join('<br />'));
|
|
2242
|
-
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(msgStr);
|
|
2243
|
-
}
|
|
2244
|
-
catch (err) {
|
|
2245
|
-
const errMsg = (0,_datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_8__.errorToConsole)(err);
|
|
2246
|
-
console.error('Helm: initHelm monomerLib.onChanged() error:\n' + errMsg);
|
|
2247
|
-
// throw err; // Prevent disabling event handler
|
|
2248
|
-
}
|
|
2249
|
-
});
|
|
2250
|
-
});
|
|
2251
|
-
});
|
|
2252
|
-
}
|
|
2253
|
-
function rewriteLibraries() {
|
|
2254
|
-
org.helm.webeditor.Monomers.clear();
|
|
2255
|
-
monomerLib.getTypes().forEach((type) => {
|
|
2256
|
-
const mms = monomerLib.getMonomerNamesByType(type);
|
|
2257
|
-
mms.forEach((symbol) => {
|
|
2258
|
-
let isBroken = false;
|
|
2259
|
-
const monomer = monomerLib.getMonomer(type, symbol);
|
|
2260
|
-
const webEditorMonomer = {
|
|
2261
|
-
id: symbol,
|
|
2262
|
-
m: monomer.molfile,
|
|
2263
|
-
n: monomer.name,
|
|
2264
|
-
na: monomer.naturalAnalog,
|
|
2265
|
-
rs: monomer.rgroups.length,
|
|
2266
|
-
type: monomer.polymerType,
|
|
2267
|
-
mt: monomer.monomerType,
|
|
2268
|
-
at: {}
|
|
2269
|
-
};
|
|
2270
|
-
if (monomer.rgroups.length > 0) {
|
|
2271
|
-
webEditorMonomer.rs = monomer.rgroups.length;
|
|
2272
|
-
const at = {};
|
|
2273
|
-
monomer.rgroups.forEach(it => {
|
|
2274
|
-
at[it[_constants__WEBPACK_IMPORTED_MODULE_3__.RGROUP_LABEL]] = it[_constants__WEBPACK_IMPORTED_MODULE_3__.RGROUP_CAP_GROUP_NAME];
|
|
2275
|
-
});
|
|
2276
|
-
webEditorMonomer.at = at;
|
|
2277
|
-
}
|
|
2278
|
-
else if (monomer.data[_constants__WEBPACK_IMPORTED_MODULE_3__.SMILES] != null) {
|
|
2279
|
-
webEditorMonomer.rs = Object.keys(getRS(monomer.data[_constants__WEBPACK_IMPORTED_MODULE_3__.SMILES].toString())).length;
|
|
2280
|
-
webEditorMonomer.at = getRS(monomer.data[_constants__WEBPACK_IMPORTED_MODULE_3__.SMILES].toString());
|
|
2281
|
-
}
|
|
2282
|
-
else {
|
|
2283
|
-
isBroken = true;
|
|
2284
|
-
}
|
|
2285
|
-
if (!isBroken)
|
|
2286
|
-
org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
|
|
2287
|
-
});
|
|
2288
|
-
});
|
|
2289
|
-
// Obsolete
|
|
2290
|
-
let grid = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid;
|
|
2291
|
-
if (grid)
|
|
2292
|
-
grid.invalidate();
|
|
2293
|
-
}
|
|
2294
|
-
//name: helmCellRenderer
|
|
2295
|
-
//tags: cellRenderer
|
|
2296
|
-
//meta.cellType: helm
|
|
2297
|
-
//meta.columnTags: units=helm
|
|
2298
|
-
//output: grid_cell_renderer result
|
|
2299
|
-
function helmCellRenderer() {
|
|
2300
|
-
return new _cell_renderer__WEBPACK_IMPORTED_MODULE_5__.HelmCellRenderer();
|
|
2301
|
-
}
|
|
2302
|
-
//tags: cellEditor
|
|
2303
|
-
//description: Macromolecule
|
|
2304
|
-
//input: grid_cell cell
|
|
2305
|
-
function editMoleculeCell(cell) {
|
|
2306
|
-
const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.findMonomers)(cell.cell.value);
|
|
2307
|
-
if (cell.gridColumn.column.tags[datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.UNITS] === 'helm')
|
|
2308
|
-
if (monomers.size == 0)
|
|
2309
|
-
webEditor(cell);
|
|
2310
|
-
else
|
|
2311
|
-
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
|
|
2312
|
-
}
|
|
2313
|
-
//name: Open Helm Web Editor
|
|
2314
|
-
//description: Adds editor
|
|
2315
|
-
//meta.action: Open Helm Web Editor
|
|
2316
|
-
//input: string mol { semType: Macromolecule }
|
|
2317
|
-
function openEditor(mol) {
|
|
2318
|
-
let df = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid.dataFrame;
|
|
2319
|
-
let converter = new _datagrok_libraries_bio_src_utils_notation_converter__WEBPACK_IMPORTED_MODULE_6__.NotationConverter(df.columns.bySemType('Macromolecule'));
|
|
2320
|
-
const resStr = converter.convertStringToHelm(mol, '/');
|
|
2321
|
-
const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.findMonomers)(resStr);
|
|
2322
|
-
if (monomers.size == 0)
|
|
2323
|
-
webEditor(undefined, resStr);
|
|
2324
|
-
else
|
|
2325
|
-
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
|
|
2326
|
-
}
|
|
2327
|
-
//name: Properties
|
|
2328
|
-
//tags: panel, widgets
|
|
2329
|
-
//input: string helmString {semType: Macromolecule}
|
|
2330
|
-
//output: widget result
|
|
2331
|
-
function propertiesPanel(helmString) {
|
|
2332
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2333
|
-
let grid = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid;
|
|
2334
|
-
let parent = grid.root.parentElement;
|
|
2335
|
-
const host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
|
|
2336
|
-
parent.appendChild(host);
|
|
2337
|
-
let editor = new JSDraw2.Editor(host, { viewonly: true });
|
|
2338
|
-
host.style.width = '0px';
|
|
2339
|
-
host.style.height = '0px';
|
|
2340
|
-
editor.setHelm(helmString);
|
|
2341
|
-
let formula = editor.getFormula(true);
|
|
2342
|
-
let molWeight = Math.round(editor.getMolWeight() * 100) / 100;
|
|
2343
|
-
let coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;
|
|
2344
|
-
parent.lastChild.remove();
|
|
2345
|
-
return new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Widget(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.tableFromMap({
|
|
2346
|
-
'formula': formula.replace(/<sub>/g, '').replace(/<\/sub>/g, ''),
|
|
2347
|
-
'molecular weight': molWeight,
|
|
2348
|
-
'extinction coefficient': coef,
|
|
2349
|
-
}));
|
|
2350
|
-
});
|
|
2351
|
-
}
|
|
2352
|
-
function webEditor(cell, value) {
|
|
2353
|
-
let view = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div();
|
|
2354
|
-
org.helm.webeditor.MolViewer.molscale = 0.8;
|
|
2355
|
-
let app = new scil.helm.App(view, {
|
|
2356
|
-
showabout: false,
|
|
2357
|
-
mexfontsize: '90%',
|
|
2358
|
-
mexrnapinontab: true,
|
|
2359
|
-
topmargin: 20,
|
|
2360
|
-
mexmonomerstab: true,
|
|
2361
|
-
sequenceviewonly: false,
|
|
2362
|
-
mexfavoritefirst: true,
|
|
2363
|
-
mexfilter: true
|
|
2364
|
-
});
|
|
2365
|
-
var sizes = app.calculateSizes();
|
|
2366
|
-
app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
|
|
2367
|
-
var s = { width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px' };
|
|
2368
|
-
//@ts-ignore
|
|
2369
|
-
scil.apply(app.sequence.style, s);
|
|
2370
|
-
//@ts-ignore
|
|
2371
|
-
scil.apply(app.notation.style, s);
|
|
2372
|
-
s = { width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px' };
|
|
2373
|
-
//@ts-ignore
|
|
2374
|
-
scil.apply(app.properties.parent.style, s);
|
|
2375
|
-
app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);
|
|
2376
|
-
app.mex.resize(sizes.topheight - 80);
|
|
2377
|
-
setTimeout(function () {
|
|
2378
|
-
if (typeof cell !== 'undefined') {
|
|
2379
|
-
app.canvas.helm.setSequence(cell.cell.value, 'HELM');
|
|
2380
|
-
}
|
|
2381
|
-
else {
|
|
2382
|
-
app.canvas.helm.setSequence(value, 'HELM');
|
|
2383
|
-
}
|
|
2384
|
-
}, 200);
|
|
2385
|
-
//@ts-ignore
|
|
2386
|
-
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog({ showHeader: false, showFooter: true })
|
|
2387
|
-
.add(view)
|
|
2388
|
-
.onOK(() => {
|
|
2389
|
-
if (typeof cell !== 'undefined') {
|
|
2390
|
-
cell.cell.value = app.canvas.getHelm(true).replace(/<\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');
|
|
2391
|
-
}
|
|
2392
|
-
}).show({ modal: true, fullScreen: true });
|
|
2393
|
-
}
|
|
2394
|
-
function accessServer(url, key) {
|
|
2395
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2396
|
-
const params = {
|
|
2397
|
-
method: 'GET',
|
|
2398
|
-
headers: {
|
|
2399
|
-
'Accept': 'application/json',
|
|
2400
|
-
}
|
|
2401
|
-
};
|
|
2402
|
-
const response = yield fetch(url, params);
|
|
2403
|
-
const json = yield response.json();
|
|
2404
|
-
return json[key];
|
|
2405
|
-
});
|
|
2406
|
-
}
|
|
2407
|
-
//name: helmToFasta
|
|
2408
|
-
//input: string helmString {semType: Macromolecule}
|
|
2409
|
-
//output: string res
|
|
2410
|
-
function helmToFasta(helmString) {
|
|
2411
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2412
|
-
const url = `http://localhost:8081/WebService/service/Fasta/Produce/${helmString}`;
|
|
2413
|
-
return yield accessServer(url, 'FastaFile');
|
|
2414
|
-
});
|
|
2415
|
-
}
|
|
2416
|
-
//name: helmToRNA
|
|
2417
|
-
//description: converts to rna analogue sequence
|
|
2418
|
-
//input: string helmString {semType: Macromolecule}
|
|
2419
|
-
//output: string res
|
|
2420
|
-
function helmToRNA(helmString) {
|
|
2421
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2422
|
-
const url = `http://localhost:8081/WebService/service/Fasta/Convert/RNA/${helmString}`;
|
|
2423
|
-
return yield accessServer(url, 'Sequence');
|
|
2424
|
-
});
|
|
2425
|
-
}
|
|
2426
|
-
//name: helmToPeptide
|
|
2427
|
-
//description: converts to peptide analogue sequence
|
|
2428
|
-
//input: string helmString {semType: Macromolecule}
|
|
2429
|
-
//output: string res
|
|
2430
|
-
function helmToPeptide(helmString) {
|
|
2431
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2432
|
-
const url = `http://localhost:8081/WebService/service/Fasta/Convert/PEPTIDE/${helmString}`;
|
|
2433
|
-
return yield accessServer(url, 'Sequence');
|
|
2434
|
-
});
|
|
2435
|
-
}
|
|
2436
|
-
//name: helmToSmiles
|
|
2437
|
-
//description: converts to smiles
|
|
2438
|
-
//input: string helmString {semType: Macromolecule}
|
|
2439
|
-
//output: string smiles {semType: Molecule}
|
|
2440
|
-
function helmToSmiles(helmString) {
|
|
2441
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2442
|
-
const url = `http://localhost:8081/WebService/service/SMILES/${helmString}`;
|
|
2443
|
-
return yield accessServer(url, 'SMILES');
|
|
2444
|
-
});
|
|
2445
|
-
}
|
|
2446
|
-
function getRS(smiles) {
|
|
2447
|
-
const newS = smiles.match(/(?<=\[)[^\][]*(?=])/gm);
|
|
2448
|
-
const res = {};
|
|
2449
|
-
let el = '';
|
|
2450
|
-
let digit;
|
|
2451
|
-
for (let i = 0; i < newS.length; i++) {
|
|
2452
|
-
if (newS[i] != null) {
|
|
2453
|
-
if (/\d/.test(newS[i])) {
|
|
2454
|
-
digit = newS[i][newS[i].length - 1];
|
|
2455
|
-
newS[i] = newS[i].replace(/[0-9]/g, '');
|
|
2456
|
-
for (let j = 0; j < newS[i].length; j++) {
|
|
2457
|
-
if (newS[i][j] != ':')
|
|
2458
|
-
el += newS[i][j];
|
|
2459
|
-
}
|
|
2460
|
-
res['R' + digit] = el;
|
|
2461
|
-
el = '';
|
|
2462
|
-
}
|
|
2463
|
-
}
|
|
2464
|
-
}
|
|
2465
|
-
return res;
|
|
2466
|
-
}
|
|
2467
|
-
//name: getMolfiles
|
|
2468
|
-
//input: column col {semType: Macromolecule}
|
|
2469
|
-
//output: column res
|
|
2470
|
-
function getMolfiles(col) {
|
|
2471
|
-
let grid = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid;
|
|
2472
|
-
let parent = grid.root.parentElement;
|
|
2473
|
-
let res = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Column.string('mols', col.length);
|
|
2474
|
-
const host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
|
|
2475
|
-
parent.appendChild(host);
|
|
2476
|
-
let editor = new JSDraw2.Editor(host, { viewonly: true });
|
|
2477
|
-
host.style.width = '0px';
|
|
2478
|
-
host.style.height = '0px';
|
|
2479
|
-
res.init((i) => {
|
|
2480
|
-
editor.setHelm(col.get(i));
|
|
2481
|
-
let mol = editor.getMolfile();
|
|
2482
|
-
return mol;
|
|
2483
|
-
});
|
|
2484
|
-
parent.lastChild.remove();
|
|
2485
|
-
return res;
|
|
2486
|
-
}
|
|
2487
|
-
//name: helmWebEditor
|
|
2488
|
-
//output: object
|
|
2489
|
-
function helmWebEditor() {
|
|
2490
|
-
return new _helm_web_editor__WEBPACK_IMPORTED_MODULE_4__.HelmWebEditor();
|
|
2491
|
-
}
|
|
2492
|
-
|
|
2493
|
-
})();
|
|
2494
|
-
|
|
2495
|
-
helm = __webpack_exports__;
|
|
2496
|
-
/******/ })()
|
|
2497
|
-
;
|
|
2498
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFXO0FBQzdGO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNPO0FBQ1A7QUFDQSxzRkFBc0YsV0FBVztBQUNqRztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQSx1RUFBdUUsV0FBVztBQUNsRjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ087QUFDUCxlQUFlLDREQUFrQjtBQUNqQztBQUNBLGNBQWMsMERBQWdCO0FBQzlCLGlCQUFpQixnREFBTTtBQUN2QjtBQUNBLDRDQUE0QyxnQkFBZ0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGVBQWUsMkRBQWE7QUFDNUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9yYW5kb20uanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvYW1pbm9hY2lkcy5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy9udWNsZW90aWRlcy5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy9zZXEtcGFsZXR0ZXMuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvdW5rbm93bi5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy91dGlscy9jZWxsLXJlbmRlcmVyLmpzIiwid2VicGFjazovL2hlbG0vLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9iaW8vc3JjL3V0aWxzL21hY3JvbW9sZWN1bGUuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvdXRpbHMvbm90YXRpb24tY29udmVydGVyLmpzIiwid2VicGFjazovL2hlbG0vLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9iaW8vc3JjL3V0aWxzL3VuaXRzLWhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90by1jb25zb2xlLmpzIiwid2VicGFjazovL2hlbG0vLi9zcmMvY2VsbC1yZW5kZXJlci50cyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL2hlbG0td2ViLWVkaXRvci50cyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL3V0aWxzLnRzIiwid2VicGFjazovL2hlbG0vZXh0ZXJuYWwgdmFyIFwiREdcIiIsIndlYnBhY2s6Ly9oZWxtL2V4dGVybmFsIHZhciBcImdyb2tcIiIsIndlYnBhY2s6Ly9oZWxtL2V4dGVybmFsIHZhciBcInVpXCIiLCJ3ZWJwYWNrOi8vaGVsbS9leHRlcm5hbCB2YXIgXCJ3dVwiIiwid2VicGFjazovL2hlbG0vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vaGVsbS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vaGVsbS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2hlbG0vLi9zcmMvcGFja2FnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlcyBzaW5nbGUgcmFuZG9tIGZsb2F0IGZyb20gMCB0byByYW5nZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gcmFuZ2UgTWF4IGdlbmVyYXRpbmcgdmFsdWUuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0IGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUZsb2F0KHJhbmdlKSB7XG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiByYW5nZTtcbn1cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHJhbmRvbUZsb2F0KHJhbmdlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2ljbUZ1Wkc5dExtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpY21GdVpHOXRMblJ6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQk96czdPenM3UjBGTlJ6dEJRVU5JTEUxQlFVMHNWVUZCVlN4WFFVRlhMRU5CUVVNc1MwRkJZVHRKUVVOMlF5eFBRVUZQTEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGREwwSXNRMEZCUXp0QlFVVkVPenM3T3pzN1IwRk5SenRCUVVOSUxFMUJRVTBzVlVGQlZTeFRRVUZUTEVOQlFVTXNTMEZCWVR0SlFVTnlReXhQUVVGUExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNWMEZCVnl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGVFTXNRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFLbHh1SUNvZ1IyVnVaWEpoZEdWeklITnBibWRzWlNCeVlXNWtiMjBnWm14dllYUWdabkp2YlNBd0lIUnZJSEpoYm1kbExseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQnlZVzVuWlNCTllYZ2daMlZ1WlhKaGRHbHVaeUIyWVd4MVpTNWNiaUFxSUVCeVpYUjFjbTRnZTI1MWJXSmxjbjBnUVNCeVlXNWtiMjBnWm14dllYUWdaMlZ1WlhKaGRHVmtMbHh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2NtRnVaRzl0Um14dllYUW9jbUZ1WjJVNklHNTFiV0psY2lrNklHNTFiV0psY2lCN1hHNGdJSEpsZEhWeWJpQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ2NtRnVaMlU3WEc1OVhHNWNiaThxS2x4dUlDb2dSMlZ1WlhKaGRHVnpJSE5wYm1kc1pTQnlZVzVrYjIwZ2FXNTBaV2RsY2lCbWNtOXRJREFnZEc4Z2NtRnVaMlV1WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUhKaGJtZGxJRTFoZUNCblpXNWxjbUYwYVc1bklIWmhiSFZsTGx4dUlDb2dRSEpsZEhWeWJpQjdiblZ0WW1WeWZTQkJJSEpoYm1SdmJTQnBiblJsWjJWeUlHZGxibVZ5WVhSbFpDNWNiaUFxTDF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhKaGJtUnZiVWx1ZENoeVlXNW5aVG9nYm5WdFltVnlLVG9nYm5WdFltVnlJSHRjYmlBZ2NtVjBkWEp1SUUxaGRHZ3VabXh2YjNJb2NtRnVaRzl0Um14dllYUW9jbUZ1WjJVcEtUdGNibjFjYmlKZGZRPT0iLCIvKipcbiAqIERlbm90ZXMgYSB2ZWN0b3Igb2YgZmxvYXRpbmcgcG9pdCB2YWx1ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFZlY3RvclxuICogQGV4dGVuZHMge0Zsb2F0MzJBcnJheX1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvciBleHRlbmRzIEZsb2F0MzJBcnJheSB7XG59XG4vKipcbiAqIERlbm90ZXMgYSB0d28tZGltZW5zaW9uYWwgbWF0cml4LlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBNYXRyaXhcbiAqIEBleHRlbmRzIHtBcnJheTxWZWN0b3I+fVxuICovXG5leHBvcnQgY2xhc3MgTWF0cml4IGV4dGVuZHMgQXJyYXkge1xufVxuLyoqXG4gKiBEZW5vdGVzIGNhcnRlc2lhbiBjb29yZGluYXRlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgQ29vcmRpbmF0ZXNcbiAqIEBleHRlbmRzIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBjbGFzcyBDb29yZGluYXRlcyBleHRlbmRzIE1hdHJpeCB7XG59XG4vKipcbiAqIERlbm90ZXMgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5LXR5cGVkIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFZlY3RvcnNcbiAqIEBleHRlbmRzIHtBcnJheTxhbnk+fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9ycyBleHRlbmRzIEFycmF5IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRIbHdaUzFrWldOc1lYSmhkR2x2Ym5NdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUowZVhCbExXUmxZMnhoY21GMGFXOXVjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFUczdPenM3TzBkQlRVYzdRVUZEU0N4TlFVRk5MRTlCUVU4c1RVRkJUeXhUUVVGUkxGbEJRVms3UTBGQlJ6dEJRVVV6UXpzN096czdPMGRCVFVjN1FVRkRTQ3hOUVVGTkxFOUJRVThzVFVGQlR5eFRRVUZSTEV0QlFXRTdRMEZCUnp0QlFVVTFRenM3T3pzN08wZEJUVWM3UVVGRFNDeE5RVUZOTEU5QlFVOHNWMEZCV1N4VFFVRlJMRTFCUVUwN1EwRkJSenRCUVVVeFF6czdPenM3TzBkQlRVYzdRVUZEU0N4TlFVRk5MRTlCUVU4c1QwRkJVU3hUUVVGUkxFdEJRVlU3UTBGQlJ5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dSR1Z1YjNSbGN5QmhJSFpsWTNSdmNpQnZaaUJtYkc5aGRHbHVaeUJ3YjJsMElIWmhiSFZsY3k1Y2JpQXFYRzRnS2lCQVpYaHdiM0owWEc0Z0tpQkFZMnhoYzNNZ1ZtVmpkRzl5WEc0Z0tpQkFaWGgwWlc1a2N5QjdSbXh2WVhRek1rRnljbUY1ZlZ4dUlDb3ZYRzVsZUhCdmNuUWdZMnhoYzNNZ1ZtVmpkRzl5SUdWNGRHVnVaSE1nUm14dllYUXpNa0Z5Y21GNUlIdDlYRzVjYmk4cUtseHVJQ29nUkdWdWIzUmxjeUJoSUhSM2J5MWthVzFsYm5OcGIyNWhiQ0J0WVhSeWFYZ3VYRzRnS2x4dUlDb2dRR1Y0Y0c5eWRGeHVJQ29nUUdOc1lYTnpJRTFoZEhKcGVGeHVJQ29nUUdWNGRHVnVaSE1nZTBGeWNtRjVQRlpsWTNSdmNqNTlYRzRnS2k5Y2JtVjRjRzl5ZENCamJHRnpjeUJOWVhSeWFYZ2daWGgwWlc1a2N5QkJjbkpoZVR4V1pXTjBiM0krSUh0OVhHNWNiaThxS2x4dUlDb2dSR1Z1YjNSbGN5QmpZWEowWlhOcFlXNGdZMjl2Y21ScGJtRjBaWE11WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FHTnNZWE56SUVOdmIzSmthVzVoZEdWelhHNGdLaUJBWlhoMFpXNWtjeUI3VFdGMGNtbDRmVnh1SUNvdlhHNWxlSEJ2Y25RZ1kyeGhjM01nUTI5dmNtUnBibUYwWlhNZ1pYaDBaVzVrY3lCTllYUnlhWGdnZTMxY2JseHVMeW9xWEc0Z0tpQkVaVzV2ZEdWeklHRnVJR0Z5Y21GNUlHOW1JR0Z5WW1sMGNtRnllUzEwZVhCbFpDQjJaV04wYjNKekxseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUJqYkdGemN5QldaV04wYjNKelhHNGdLaUJBWlhoMFpXNWtjeUI3UVhKeVlYazhZVzU1UG4xY2JpQXFMMXh1Wlhod2IzSjBJR05zWVhOeklGWmxZM1J2Y25NZ1pYaDBaVzVrY3lCQmNuSmhlVHhoYm5rK0lIdDlYRzVjYmk4cUtseHVJQ29nUkdWdWIzUmxjeUJoSUdScFkzUnBiMjVoY25rZ1kyOXVkR0ZwYm1sdVp5Qm1kVzVqZEdsdmJpQnZjSFJwYjI1ekxseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUIwZVhCbElFOXdkR2x2Ym5OY2JpQXFMMXh1Wlhod2IzSjBJSFI1Y0dVZ1QzQjBhVzl1Y3lBOUlIdGJibUZ0WlRvZ2MzUnlhVzVuWFRvZ1lXNTVmVHRjYmx4dUx5b3FYRzRnS2lCRVpXNXZkR1Z6SUdOMWMzUnZiU0JrYVhOMFlXNWpaU0J0WlhSeWFXTWdZbVYwZDJWbGJpQjBhR1VnZEhkdklHZHBkbVZ1SUhabFkzUnZjbk11WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FIUjVjR1VnUkdsemRHRnVZMlZOWlhSeWFXTmNiaUFxSUVCd1lYSmhiU0I3WVc1NWZTQjJNU0JVYUdVZ1ptbHljM1FnZG1WamRHOXlMbHh1SUNvZ1FIQmhjbUZ0SUh0aGJubDlJSFl5SUZSb1pTQnpaV052Ym1RZ2RtVmpkRzl5TGx4dUlDb2dRSEpsZEhWeWJpQjdiblZ0WW1WeWZTQkVhWE4wWVc1alpTQmlaWFIzWldWdUlIUm9aWE5sSUhSM2J5QjJaV04wYjNKekxseHVJQ292WEc1bGVIQnZjblFnZEhsd1pTQkVhWE4wWVc1alpVMWxkSEpwWXlBOUlDaDJNVG9nWVc1NUxDQjJNam9nWVc1NUtTQTlQaUFvYm5WdFltVnlLVHRjYmx4dUx5b3FYRzRnS2lCRVpXNXZkR1Z6SUdFZ2MybHRjR3hsSUhOMGNtbHVaeUIwYnlCemRISnBibWNnWkdsamRHbHZibUZ5ZVM1Y2JpQXFYRzRnS2lCQVpYaHdiM0owWEc0Z0tpQkFkSGx3WlNCVGRISnBibWRFYVdOMGFXOXVZWEo1WEc0Z0tpOWNibVY0Y0c5eWRDQjBlWEJsSUZOMGNtbHVaMFJwWTNScGIyNWhjbmtnUFNCN1cydGxlVG9nYzNSeWFXNW5YVG9nYzNSeWFXNW5mVHRjYmlKZGZRPT0iLCJpbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7IHJhbmRvbUZsb2F0LCByYW5kb21JbnQgfSBmcm9tICcuL3JhbmRvbSc7XG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24gPSBmYWxzZSwgbWVzc2FnZSA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICAgIGlmICghY29uZGl0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG4vKipcbiAqIENyZWF0ZXMgbmV3IHR3by1kaW1lbnNpb25hbCBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiByb3dzKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIGNvbHVtbnMpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsPTBdIEEgdmFsdWUgdG8gZmlsbCB0aGUgY29vcmRpbmF0ZXMgd2l0aC5cbiAqIEByZXR1cm4ge0Nvb3JkaW5hdGVzfSBBIHR3by1kaW1lbnNpb25hbCBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKiBAdG9kbyBNaWdodCBiZSBzbG93IHNpbmNlIHVzZWQgQXJyYXkubWFwLiBQcm9iYWJseSBuZWVkcyBwZXJmb3JtYW5jZSByZXZpc2lvbi5cbiAqL1xuZnVuY3Rpb24gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjEsIGRpbWVuc2lvbjIsIGZpbGwgPSAwKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShkaW1lbnNpb24xKS5maWxsKGZpbGwpLm1hcCgoKSA9PiAobmV3IFZlY3RvcihkaW1lbnNpb24yKS5maWxsKGZpbGwpKSk7XG59XG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4KSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShtYXRyaXhbMF0ubGVuZ3RoKS5maWxsKDApXG4gICAgICAgIC5tYXAoKF8sIGkpID0+IChuZXcgVmVjdG9yKG1hdHJpeC5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBqKSA9PiAobWF0cml4W2pdW2ldKSkpKTtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocCwgcSwgbXVsdGlwbGllciA9IDEpIHtcbiAgICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcbiAgICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuICAgIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICAgICAgdG90YWxbaV0gPSBwW2ldICsgbXVsdGlwbGllciAqIHFbaV07XG4gICAgcmV0dXJuIHRvdGFsO1xufVxuLyoqXG4gKiBTdW1zIHRoZSB2ZWN0b3IncyBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gdiBUaGUgdmVjdG9yIHRvIGJlIHN1bW1lZC5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZlY3RvcidzIGl0ZW1zIHN1bS5cbiAqL1xuZnVuY3Rpb24gaXRlbXNTdW0odikge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgICAgICB0b3RhbCArPSB2W2ldO1xuICAgIHJldHVybiB0b3RhbDtcbn1cbi8qKlxuICogU3VxYXJlcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBzcXVhcmUuXG4gKiBAcmV0dXJuIHtWZWN0b3J9IEEgbmV3IHZlY3RvciBjb250YWluaW5nIHRoZSBvcmlnaW5hbCdzIGl0ZW1zIHNxdWFyZWQuXG4gKi9cbmZ1bmN0aW9uIHZlY3RvclNxdWFyZSh2KSB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gICAgY29uc3QgdG90YWwgPSBuZXcgVmVjdG9yKG5JdGVtcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgICAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuICAgIHJldHVybiB0b3RhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JMZW5ndGgodikge1xuICAgIGxldCBzcXJTdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICAgICAgc3FyU3VtICs9IHZbaV0gKiB2W2ldO1xuICAgIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JEb3RQcm9kdWN0KHYxLCB2Mikge1xuICAgIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgdmVjdG9ycyBtdXN0IG1hdGNoJyk7XG4gICAgbGV0IHByb2QgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspXG4gICAgICAgIHByb2QgKz0gdjFbaV0gKiB2MltpXTtcbiAgICByZXR1cm4gcHJvZDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIG1hdHJpeC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTEuXSBNYXggdmFsdWUgZ2l2ZW4gYnkgcmFuZG9tIGdlbmVyYXRvci5cbiAqIEByZXR1cm4ge01hdHJpeH0gQSBuZXcgbWF0cml4IGZpbGxlZCB3aXRoIHJhbmRvbSBmbG9hdGluZyBwb2ludCAgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFJhbmRvbU1hdHJpeChkaW1lbnNpb24xLCBkaW1lbnNpb24yLCBzY2FsZSA9IDEuKSB7XG4gICAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjEsIGRpbWVuc2lvbjIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltZW5zaW9uMTsgKytpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0cml4O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcSBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm4ge251bWJlcn0gRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShwLCBxKSB7XG4gICAgY29uc3QgZGlmZiA9IHZlY3RvckFkZChwLCBxLCAtMSk7XG4gICAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICAgIGNvbnN0IHNxZGlmZlN1bW0gPSBpdGVtc1N1bShzcWRpZmYpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoc3FkaWZmU3VtbSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGEsIGRpc3RhbmNlKSB7XG4gICAgY29uc3Qgbkl0ZW1zID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRyaXg7XG59XG4vKiogR2VuZXJhdGVzIGFycmF5IGZyb20gYSByYW5nZSBbYmVnaW47IGVuZF0gb3IgW2JlZ2luOyBlbmQpIGlmIGVuZEV4Y2x1c2l2ZS4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2VuUmFuZ2UoYmVnaW4sIGVuZCwgZW5kRXhjbHVzaXZlID0gZmFsc2UpIHtcbiAgICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gICAgY29uc3Qgc2VyaWVzID0gbmV3IEludDMyQXJyYXkobkl0ZW1zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKVxuICAgICAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG4gICAgcmV0dXJuIHNlcmllcztcbn1cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGEsIGIpID0+IChiWzBdIC0gYVswXSkgOiAoYSwgYikgPT4gKGFbMF0gLSBiWzBdKTtcbiAgICBjb25zdCBkZWNvciA9ICh2LCBpKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICAgIGNvbnN0IHVuZGVjb3IgPSAoYSkgPT4gYVsxXTsgLy8gbGVhdmUgb25seSBpbmRleFxuICAgIGNvbnN0IF9hcmdzb3J0ID0gKGFycikgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgICByZXR1cm4gX2FyZ3NvcnQodmFsdWVzKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGgsIG4sIGRpc3QpIHtcbiAgICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXMsIG9yZGVyQnkpIHtcbiAgICAgICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICAgICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICAgICAgICAgIG1heFZhbHVlID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJzZXQgPSBbcmFuZG9tSW50KGxlbmd0aCAtIDEpXTtcbiAgICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKCFzdWJzZXQuaW5jbHVkZXMoaSkpXG4gICAgICAgICAgICBjb21wbGVtZW50LmFkZChpKTtcbiAgICB9XG4gICAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IG1heEJ5KGNvbXBsZW1lbnQudmFsdWVzKCksIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uICh2YWwsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgICB9KSkpO1xuICAgICAgICBpZiAoaWR4KSB7XG4gICAgICAgICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic2V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhKSB7XG4gICAgbGV0IG1lYW4gPSAwO1xuICAgIGxldCBzdGQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICAgICAgbWVhbiArPSBkYXRhW2ldO1xuICAgIG1lYW4gLz0gZGF0YS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgICAgICBzdGQgKz0gKGRhdGFbaV0gLSBtZWFuKSAqIChkYXRhW2ldIC0gbWVhbik7XG4gICAgc3RkID0gTWF0aC5zcXJ0KHN0ZCAvIGRhdGEubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuICAgIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhLCBiKSB7XG4gICAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhLmZpbHRlcigoeCkgPT4gIWJTZXQuaGFzKHgpKSkudmFsdWVzKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZG1WamRHOXlMVzl3WlhKaGRHbHZibk11YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SjJaV04wYjNJdGIzQmxjbUYwYVc5dWN5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVZNc1RVRkJUU3hGUVVGMVF5eE5RVUZOTEhGQ1FVRnhRaXhEUVVGRE8wRkJRM3BHTEU5QlFVOHNSVUZCUXl4WFFVRlhMRVZCUVVVc1UwRkJVeXhGUVVGRExFMUJRVTBzVlVGQlZTeERRVUZETzBGQlJXaEVPenM3T3pzN08wZEJUMGM3UVVGRFNDeE5RVUZOTEZWQlFWVXNUVUZCVFN4RFFVRkRMRmxCUVhGQ0xFdEJRVXNzUlVGQlJTeFZRVUZyUWl4clFrRkJhMEk3U1VGRGNrWXNTVUZCU1N4RFFVRkRMRk5CUVZNN1VVRkRXaXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUXpkQ0xFTkJRVU03UVVGRlJEczdPenM3T3pzN1IwRlJSenRCUVVOSUxGTkJRVk1zWlVGQlpTeERRVUZETEZWQlFXdENMRVZCUVVVc1ZVRkJhMElzUlVGQlJTeFBRVUZsTEVOQlFVTTdTVUZETDBVc1QwRkJUeXhKUVVGSkxFdEJRVXNzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU42Uml4RFFVRkRPMEZCUlVRN096czdPenM3UjBGUFJ6dEJRVU5JTEUxQlFVMHNWVUZCVlN4bFFVRmxMRU5CUVVNc1RVRkJZenRKUVVNMVF5eFBRVUZQTEVsQlFVa3NTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRE8xTkJRM1pETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEzUkdMRU5CUVVNN1FVRkZSRHM3T3pzN096czdSMEZSUnp0QlFVTklMRTFCUVUwc1ZVRkJWU3hUUVVGVExFTkJRVU1zUTBGQlV5eEZRVUZGTEVOQlFWTXNSVUZCUlN4aFFVRnhRaXhEUVVGRE8wbEJRM0JGTEUxQlFVMHNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU03U1VGRmVFSXNUVUZCVFN4RFFVRkRMRTFCUVUwc1NVRkJTU3hEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTERoQ1FVRTRRaXhEUVVGRExFTkJRVU03U1VGRk0wUXNUVUZCVFN4TFFVRkxMRWRCUVVjc1NVRkJTU3hOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdTVUZGYWtNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhOUVVGTkxFVkJRVVVzUlVGQlJTeERRVUZETzFGQlF5OUNMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVVjBReXhQUVVGUExFdEJRVXNzUTBGQlF6dEJRVU5tTEVOQlFVTTdRVUZGUkRzN096czdSMEZMUnp0QlFVTklMRk5CUVZNc1VVRkJVU3hEUVVGRExFTkJRVk03U1VGRGVrSXNTVUZCU1N4TFFVRkxMRWRCUVVjc1EwRkJReXhEUVVGRE8wbEJSV1FzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNSVUZCUlN4RFFVRkRPMUZCUXk5Q0xFdEJRVXNzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkZhRUlzVDBGQlR5eExRVUZMTEVOQlFVTTdRVUZEWml4RFFVRkRPMEZCUlVRN096czdPMGRCUzBjN1FVRkRTQ3hUUVVGVExGbEJRVmtzUTBGQlF5eERRVUZUTzBsQlF6ZENMRTFCUVUwc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTTdTVUZEZUVJc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1NVRkZha01zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNSVUZCUlN4RFFVRkRPMUZCUXk5Q0xFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUlhwQ0xFOUJRVThzUzBGQlN5eERRVUZETzBGQlEyWXNRMEZCUXp0QlFVVkVMRTFCUVUwc1ZVRkJWU3haUVVGWkxFTkJRVU1zUTBGQlV6dEpRVU53UXl4SlFVRkpMRTFCUVUwc1IwRkJWeXhEUVVGRExFTkJRVU03U1VGRGRrSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJWeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRk8xRkJRM1pETEUxQlFVMHNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNoQ0xFOUJRVThzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVNelFpeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMR2RDUVVGblFpeERRVUZETEVWQlFWVXNSVUZCUlN4RlFVRlZPMGxCUTNKRUxFbEJRVWtzUlVGQlJTeERRVUZETEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNc1RVRkJUVHRSUVVONFFpeE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMRGhEUVVFNFF5eERRVUZETEVOQlFVTTdTVUZEYkVVc1NVRkJTU3hKUVVGSkxFZEJRVmNzUTBGQlF5eERRVUZETzBsQlEzSkNMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU1zUlVGQlJUdFJRVU40UXl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVONFFpeFBRVUZQTEVsQlFVa3NRMEZCUXp0QlFVTmtMRU5CUVVNN1FVRkZSRHM3T3pzN096czdSMEZSUnp0QlFVTklMRTFCUVUwc1ZVRkJWU3huUWtGQlowSXNRMEZCUXl4VlFVRnJRaXhGUVVGRkxGVkJRV3RDTEVWQlFVVXNVVUZCWjBJc1JVRkJSVHRKUVVONlJpeE5RVUZOTEUxQlFVMHNSMEZCUnl4bFFVRmxMRU5CUVVNc1ZVRkJWU3hGUVVGRkxGVkJRVlVzUTBGQlF5eERRVUZETzBsQlJYWkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4VlFVRlZMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVU3VVVGRGJrTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEZWQlFWVXNSVUZCUlN4RlFVRkZMRU5CUVVNN1dVRkRha01zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGZEJRVmNzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0TFFVTnlRenRKUVVORUxFOUJRVThzVFVGQlRTeERRVUZETzBGQlEyaENMRU5CUVVNN1FVRkZSRHM3T3pzN096dEhRVTlITzBGQlEwZ3NUVUZCVFN4VlFVRlZMREJDUVVFd1FpeERRVUZETEVOQlFWTXNSVUZCUlN4RFFVRlRPMGxCUXpkRUxFMUJRVTBzU1VGQlNTeEhRVUZITEZOQlFWTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEYWtNc1RVRkJUU3hOUVVGTkxFZEJRVWNzV1VGQldTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMGxCUTJ4RExFMUJRVTBzVlVGQlZTeEhRVUZITEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRKUVVOd1F5eFBRVUZQTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03UVVGREwwSXNRMEZCUXp0QlFVVkVPenM3T3pzN08wZEJUMGM3UVVGRFNDeE5RVUZOTEZWQlFWVXNhMEpCUVd0Q0xFTkJRVU1zU1VGQllTeEZRVUZGTEZGQlFYZENPMGxCUTNoRkxFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNN1NVRkRNMElzVFVGQlRTeE5RVUZOTEVkQlFVY3NaVUZCWlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdTVUZGYkVRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRTFCUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdFJRVU12UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRTFCUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdFpRVU51UXl4TlFVRk5MRU5CUVVNc1IwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRekZHTEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFOQlEycERPMHRCUTBZN1NVRkRSQ3hQUVVGUExFMUJRVTBzUTBGQlF6dEJRVU5vUWl4RFFVRkRPMEZCUlVRc2EwWkJRV3RHTzBGQlEyeEdMRTFCUVUwc1ZVRkJWU3hSUVVGUkxFTkJRVU1zUzBGQllTeEZRVUZGTEVkQlFWY3NSVUZCUlN4WlFVRlpMRWRCUVVjc1MwRkJTenRKUVVOMlJTeE5RVUZOTEUxQlFVMHNSMEZCUnl4SFFVRkhMRWRCUVVjc1MwRkJTeXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzQkVMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzVlVGQlZTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMGxCUlhSRExFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFVkJRVVVzUlVGQlJTeERRVUZETzFGQlF6ZENMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUlhoQ0xFOUJRVThzVFVGQlRTeERRVUZETzBGQlEyaENMRU5CUVVNN1FVRkZSRHM3T3pzN096dEhRVTlITzBGQlEwZ3NUVUZCVFN4VlFVRlZMRTlCUVU4c1EwRkJReXhOUVVGaExFVkJRVVVzVDBGQlR5eEhRVUZITEV0QlFVczdTVUZEY0VRc1RVRkJUU3hOUVVGTkxFZEJRVWNzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVZFc1JVRkJSU3hEUVVGUkxFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVkVzUlVGQlJTeERRVUZSTEVWQlFVVXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM1pITEUxQlFVMHNTMEZCU3l4SFFVRkhMRU5CUVVNc1EwRkJUU3hGUVVGRkxFTkJRVk1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eHhRa0ZCY1VJN1NVRkRiRVVzVFVGQlRTeFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRlJMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRzFDUVVGdFFqdEpRVU4yUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhEUVVGRExFZEJRVlVzUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBsQlF6RkZMRTlCUVU4c1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlF6RkNMRU5CUVVNN1FVRkZSRHM3T3pzN096dEhRVTlITzBGQlEwZ3NUVUZCVFN4VlFVRlZMR2RDUVVGblFpeERRVUZETEUxQlFXTXNSVUZCUlN4RFFVRlRMRVZCUVVVc1NVRkJkME03U1VGRGJFY3NVMEZCVXl4TFFVRkxMRU5CUVVNc1RVRkJaME1zUlVGQlJTeFBRVUU0UWp0UlFVTTNSU3hKUVVGSkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTTdVVUZEY0VJc1NVRkJTU3hWUVVGVkxFZEJRVWNzU1VGQlNTeERRVUZETzFGQlJYUkNMRXRCUVVzc1RVRkJUU3hQUVVGUExFbEJRVWtzVFVGQlRTeEZRVUZGTzFsQlF6VkNMRTFCUVUwc1kwRkJZeXhIUVVGSExFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0WlFVTjRReXhKUVVGSkxGVkJRVlVzU1VGQlNTeEpRVUZKTEVsQlFVa3NZMEZCWXl4SFFVRkhMRlZCUVZVc1JVRkJSVHRuUWtGRGNrUXNVVUZCVVN4SFFVRkhMRTlCUVU4c1EwRkJRenRuUWtGRGJrSXNWVUZCVlN4SFFVRkhMR05CUVdNc1EwRkJRenRoUVVNM1FqdFRRVU5HTzFGQlEwUXNUMEZCVHl4UlFVRlJMRU5CUVVNN1NVRkRiRUlzUTBGQlF6dEpRVVZFTEUxQlFVMHNUVUZCVFN4SFFVRkhMRU5CUVVNc1UwRkJVeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNaRExFMUJRVTBzVlVGQlZTeEhRVUZITEVsQlFVa3NSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkZOMElzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFMUJRVTBzUlVGQlJTeEZRVUZGTEVOQlFVTXNSVUZCUlR0UlFVTXZRaXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRja0lzVlVGQlZTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRMUVVOeVFqdEpRVVZFTEU5QlFVOHNUVUZCVFN4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFVkJRVVU3VVVGRGVFSXNUVUZCVFN4SFFVRkhMRWRCUVVjc1MwRkJTeXhEUVVObUxGVkJRVlVzUTBGQlF5eE5RVUZOTEVWQlFUaENMRVZCUXk5RExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVWQlFVVXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhWUVVGVExFZEJRVWNzUlVGQlJTeExRVUZMTzFsQlEzaEVMRTlCUVU4c1NVRkJTU3hEUVVGRExFTkJRVU1zUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTjBRaXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEVUN4SlFVRkpMRWRCUVVjc1JVRkJSVHRaUVVOUUxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRha0lzVlVGQlZTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRUUVVONFFqdExRVU5HTzBsQlEwUXNUMEZCVHl4TlFVRk5MRU5CUVVNN1FVRkRhRUlzUTBGQlF6dEJRVVZFT3pzN1IwRkhSenRCUVVOSUxFMUJRVTBzVlVGQlZTeFRRVUZUTEVOQlFVTXNTVUZCV1R0SlFVTndReXhKUVVGSkxFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTTdTVUZEWWl4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU03U1VGRldpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRU5CUVVNN1VVRkRiRU1zU1VGQlNTeEpRVUZKTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVWc1FpeEpRVUZKTEVsQlFVa3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJRenRKUVVWd1FpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRU5CUVVNN1VVRkRiRU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eERRVUZETzBsQlJUZERMRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03U1VGRmJrTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1JVRkJSU3hEUVVGRE8xRkJRMnhETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03U1VGRmJrTXNUMEZCVHl4SlFVRkpMRU5CUVVNN1FVRkRaQ3hEUVVGRE8wRkJSVVE3T3pzN08wZEJTMGM3UVVGRFNDeE5RVUZOTEZWQlFWVXNZVUZCWVN4RFFVRkRMRU5CUVZFc1JVRkJSU3hEUVVGUk8wbEJRemxETEUxQlFVMHNTVUZCU1N4SFFVRkhMRWxCUVVrc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzaENMRTlCUVU4c1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFTkJRVU03UVVGRGNrVXNRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1RXRjBjbWw0TENCV1pXTjBiM0lzSUVOdmIzSmthVzVoZEdWekxDQldaV04wYjNKekxDQkVhWE4wWVc1alpVMWxkSEpwWTMwZ1puSnZiU0FuTGk5MGVYQmxMV1JsWTJ4aGNtRjBhVzl1Y3ljN1hHNXBiWEJ2Y25RZ2UzSmhibVJ2YlVac2IyRjBMQ0J5WVc1a2IyMUpiblI5SUdaeWIyMGdKeTR2Y21GdVpHOXRKenRjYmx4dUx5b3FYRzRnS2lCQmMzTmxjblJ6SUdFZ1kyOXVaR2wwYVc5dUlHSjVJSFJvY205M2FXNW5JR0Z1SUVWeWNtOXlMbHh1SUNwY2JpQXFJRUJsZUhCdmNuUmNiaUFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJOdmJtUnBkR2x2YmoxbVlXeHpaVjBnUTI5dVpHbDBhVzl1SUhSdklHRnpjMlZ5ZEM1Y2JpQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZTQmJiV1Z6YzJGblpUMG5RWE56WlhKMGFXOXVJR1Z5Y205eUxpZGRJRTFsYzNOaFoyVWdkRzhnYjNWMGNIVjBMbHh1SUNvZ1FIUm9jbTkzY3lCN1JYSnliM0o5WEc0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmhjM05sY25Rb1kyOXVaR2wwYVc5dU9pQmliMjlzWldGdUlEMGdabUZzYzJVc0lHMWxjM05oWjJVNklITjBjbWx1WnlBOUlDZEJjM05sY25ScGIyNGdaWEp5YjNJdUp5a2dlMXh1SUNCcFppQW9JV052Ym1ScGRHbHZiaWxjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb2JXVnpjMkZuWlNrN1hHNTlYRzVjYmk4cUtseHVJQ29nUTNKbFlYUmxjeUJ1WlhjZ2RIZHZMV1JwYldWdWMybHZibUZzSUdGeWNtRjVJR0Z1WkNCbWFXeHNjeUJwZENCM2FYUm9JSFJvWlNCMllXeDFaU0JuYVhabGJpNWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ1pHbHRaVzV6YVc5dU1TQlVhR1VnWm1seWMzUWdaR2x0Wlc1emFXOXVJRzltSUhSb1pTQmpiMjl5WkdsdVlYUmxjeUFvYm5WdFltVnlJRzltSUhKdmQzTXBMbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUdScGJXVnVjMmx2YmpJZ1ZHaGxJSE5sWTI5dVpDQmthVzFsYm5OcGIyNGdiMllnZEdobElHTnZiM0prYVc1aGRHVnpJQ2h1ZFcxaVpYSWdiMllnWTI5c2RXMXVjeWt1WEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ1cyWnBiR3c5TUYwZ1FTQjJZV3gxWlNCMGJ5Qm1hV3hzSUhSb1pTQmpiMjl5WkdsdVlYUmxjeUIzYVhSb0xseHVJQ29nUUhKbGRIVnliaUI3UTI5dmNtUnBibUYwWlhOOUlFRWdkSGR2TFdScGJXVnVjMmx2Ym1Gc0lHWnBiR3hsWkNCM2FYUm9JSFJvWlNCMllXeDFaU0JuYVhabGJpNWNiaUFxSUVCMGIyUnZJRTFwWjJoMElHSmxJSE5zYjNjZ2MybHVZMlVnZFhObFpDQkJjbkpoZVM1dFlYQXVJRkJ5YjJKaFlteDVJRzVsWldSeklIQmxjbVp2Y20xaGJtTmxJSEpsZG1semFXOXVMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQnBibWwwUTI5dmNtUnBibUYwWlhNb1pHbHRaVzV6YVc5dU1Ub2diblZ0WW1WeUxDQmthVzFsYm5OcGIyNHlPaUJ1ZFcxaVpYSXNJR1pwYkd3NklHNTFiV0psY2lBOUlEQXBPaUJEYjI5eVpHbHVZWFJsY3lCN1hHNGdJSEpsZEhWeWJpQnVaWGNnUVhKeVlYa29aR2x0Wlc1emFXOXVNU2t1Wm1sc2JDaG1hV3hzS1M1dFlYQW9LQ2tnUFQ0Z0tHNWxkeUJXWldOMGIzSW9aR2x0Wlc1emFXOXVNaWt1Wm1sc2JDaG1hV3hzS1NrcE8xeHVmVnh1WEc0dktpcGNiaUFxSUZSeVlXNXpjRzl6WlNCdFlYUnlhWGd1WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FIQmhjbUZ0SUh0TllYUnlhWGg5SUcxaGRISnBlQ0JVYUdVZ2JXRjBjbWw0SUhSdklHSmxJSFJ5WVc1emNHOXpaV1F1WEc0Z0tpQkFjbVYwZFhKdUlIdE5ZWFJ5YVhoOUlGUnlZVzV6Y0c5elpXUWdiV0YwY21sNExseHVJQ29nUUhSdlpHOGdUV2xuYUhRZ1ltVWdjMnh2ZHlCemFXNWpaU0IxYzJWa0lFRnljbUY1TG0xaGNDNGdVSEp2WW1GaWJIa2dibVZsWkhNZ2NHVnlabTl5YldGdVkyVWdjbVYyYVhOcGIyNHVYRzRnS2k5Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCMGNtRnVjM0J2YzJWTllYUnlhWGdvYldGMGNtbDRPaUJOWVhSeWFYZ3BPaUJOWVhSeWFYZ2dlMXh1SUNCeVpYUjFjbTRnYm1WM0lFRnljbUY1S0cxaGRISnBlRnN3WFM1c1pXNW5kR2dwTG1acGJHd29NQ2xjYmlBZ0lDQXViV0Z3S0NoZkxDQnBLU0E5UGlBb2JtVjNJRlpsWTNSdmNpaHRZWFJ5YVhndWJHVnVaM1JvS1M1bWFXeHNLREFwTG0xaGNDZ29YeXdnYWlrZ1BUNGdLRzFoZEhKcGVGdHFYVnRwWFNrcEtTazdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1FXUmtjeUIwZDI4Z2RtVmpkRzl5Y3lCM2FYUm9JSFJvWlNCelpXTnZibVFnYjI1bElIUnZJR0psSUcxMWJIUnBjR3hwWldRZ1lua2dkR2hsSUdkcGRtVnVJSEpoZEdsdkxseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUJ3WVhKaGJTQjdWbVZqZEc5eWZTQndJRlJvWlNCbWFYSnpkQ0IyWldOMGIzSWdkRzhnWVdSa0xseHVJQ29nUUhCaGNtRnRJSHRXWldOMGIzSjlJSEVnVkdobElITmxZMjl1WkNCMlpXTjBiM0lnZEc4Z1lXUmtMbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUZ0dGRXeDBhWEJzYVdWeVBURmRJRUVnYlhWc2RHbHdiR2xsY2lCMGJ5QmlaU0IxYzJWa0lHSmxabTl5WlNCMGFHVWdjMlZqYjI1a0lIWmxZM1J2Y2lCcGN5QmhaR1JsWkM1Y2JpQXFJRUJ5WlhSMWNtNGdlMVpsWTNSdmNuMGdUbVYzSUhabFkzUnZjaUJqYjI1MFlXbHVaV1FnZEdobElISmxjM1ZzZENCdlppQnZjR1Z5WVhScGIyNGdjQ3R0ZFd4MGFYQnNhV1Z5S25FdVhHNGdLaTljYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUIyWldOMGIzSkJaR1FvY0RvZ1ZtVmpkRzl5TENCeE9pQldaV04wYjNJc0lHMTFiSFJwY0d4cFpYSTZJRzUxYldKbGNpQTlJREVwT2lCV1pXTjBiM0lnZTF4dUlDQmpiMjV6ZENCdVNYUmxiWE1nUFNCd0xteGxibWQwYUR0Y2JseHVJQ0JoYzNObGNuUW9ia2wwWlcxeklEMDlJSEV1YkdWdVozUm9MQ0FuVm1WamRHOXlJR3hsYm1kMGFITWdaRzhnYm05MElHMWhkR05vTGljcE8xeHVYRzRnSUdOdmJuTjBJSFJ2ZEdGc0lEMGdibVYzSUZabFkzUnZjaWh1U1hSbGJYTXBPMXh1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2djQzVzWlc1bmRHZzdJQ3NyYVNsY2JpQWdJQ0IwYjNSaGJGdHBYU0E5SUhCYmFWMGdLeUJ0ZFd4MGFYQnNhV1Z5SUNvZ2NWdHBYVHRjYmx4dUlDQnlaWFIxY200Z2RHOTBZV3c3WEc1OVhHNWNiaThxS2x4dUlDb2dVM1Z0Y3lCMGFHVWdkbVZqZEc5eUozTWdhWFJsYlhNdVhHNGdLbHh1SUNvZ1FIQmhjbUZ0SUh0V1pXTjBiM0o5SUhZZ1ZHaGxJSFpsWTNSdmNpQjBieUJpWlNCemRXMXRaV1F1WEc0Z0tpQkFjbVYwZFhKdUlIdHVkVzFpWlhKOUlGUm9aU0IyWldOMGIzSW5jeUJwZEdWdGN5QnpkVzB1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR2wwWlcxelUzVnRLSFk2SUZabFkzUnZjaWs2SUc1MWJXSmxjaUI3WEc0Z0lHeGxkQ0IwYjNSaGJDQTlJREE3WEc1Y2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0IyTG14bGJtZDBhRHNnS3l0cEtWeHVJQ0FnSUhSdmRHRnNJQ3M5SUhaYmFWMDdYRzVjYmlBZ2NtVjBkWEp1SUhSdmRHRnNPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlGTjFjV0Z5WlhNZ2RHaGxJSFpsWTNSdmNpZHpJR2wwWlcxekxseHVJQ3BjYmlBcUlFQndZWEpoYlNCN1ZtVmpkRzl5ZlNCMklGUm9aU0IyWldOMGIzSWdkRzhnYzNGMVlYSmxMbHh1SUNvZ1FISmxkSFZ5YmlCN1ZtVmpkRzl5ZlNCQklHNWxkeUIyWldOMGIzSWdZMjl1ZEdGcGJtbHVaeUIwYUdVZ2IzSnBaMmx1WVd3bmN5QnBkR1Z0Y3lCemNYVmhjbVZrTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUIyWldOMGIzSlRjWFZoY21Vb2Rqb2dWbVZqZEc5eUtUb2dWbVZqZEc5eUlIdGNiaUFnWTI5dWMzUWdia2wwWlcxeklEMGdkaTVzWlc1bmRHZzdYRzRnSUdOdmJuTjBJSFJ2ZEdGc0lEMGdibVYzSUZabFkzUnZjaWh1U1hSbGJYTXBPMXh1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkaTVzWlc1bmRHZzdJQ3NyYVNsY2JpQWdJQ0IwYjNSaGJGdHBYU0E5SUhaYmFWMGdLaUIyVzJsZE8xeHVYRzRnSUhKbGRIVnliaUIwYjNSaGJEdGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhabFkzUnZja3hsYm1kMGFDaDJPaUJXWldOMGIzSXBPaUJ1ZFcxaVpYSWdlMXh1SUNCc1pYUWdjM0Z5VTNWdE9pQnVkVzFpWlhJZ1BTQXdPMXh1SUNCbWIzSWdLR3hsZENCcE9pQnVkVzFpWlhJZ1BTQXdPeUJwSUR3Z2RpNXNaVzVuZEdnN0lHa3JLeWxjYmlBZ0lDQnpjWEpUZFcwZ0t6MGdkbHRwWFNBcUlIWmJhVjA3WEc0Z0lISmxkSFZ5YmlCTllYUm9Mbk54Y25Rb2MzRnlVM1Z0S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSFpsWTNSdmNrUnZkRkJ5YjJSMVkzUW9kakU2SUZabFkzUnZjaXdnZGpJNklGWmxZM1J2Y2lrNklHNTFiV0psY2lCN1hHNGdJR2xtSUNoMk1TNXNaVzVuZEdnZ0lUMGdkakl1YkdWdVozUm9LVnh1SUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblZHaGxJR1JwYldWdWMybHZibUZzYVhSNUlHOW1JSFJvWlNCMlpXTjBiM0p6SUcxMWMzUWdiV0YwWTJnbktUdGNiaUFnYkdWMElIQnliMlE2SUc1MWJXSmxjaUE5SURBN1hHNGdJR1p2Y2lBb2JHVjBJR2s2SUc1MWJXSmxjaUE5SURBN0lHa2dQQ0IyTVM1c1pXNW5kR2c3SUdrckt5bGNiaUFnSUNCd2NtOWtJQ3M5SUhZeFcybGRJQ29nZGpKYmFWMDdYRzRnSUhKbGRIVnliaUJ3Y205a08xeHVmVnh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCdFlYUnlhWGdnWm1sc2JHVmtJSGRwZEdnZ2NtRnVaRzl0SUdac2IyRjBhVzVuSUhCdmFXNTBJSFpoYkhWbGN5NWNiaUFxWEc0Z0tpQkFaWGh3YjNKMFhHNGdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdaR2x0Wlc1emFXOXVNU0JVYUdVZ1ptbHljM1FnWkdsdFpXNXphVzl1SUc5bUlIUm9aU0J0WVhSeWFYZ3VYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnWkdsdFpXNXphVzl1TWlCVWFHVWdjMlZqYjI1a0lHUnBiV1Z1YzJsdmJpQnZaaUIwYUdVZ2JXRjBjbWw0TGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlGdHpZMkZzWlQweExsMGdUV0Y0SUhaaGJIVmxJR2RwZG1WdUlHSjVJSEpoYm1SdmJTQm5aVzVsY21GMGIzSXVYRzRnS2lCQWNtVjBkWEp1SUh0TllYUnlhWGg5SUVFZ2JtVjNJRzFoZEhKcGVDQm1hV3hzWldRZ2QybDBhQ0J5WVc1a2IyMGdabXh2WVhScGJtY2djRzlwYm5RZ0lIWmhiSFZsY3k1Y2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1pwYkd4U1lXNWtiMjFOWVhSeWFYZ29aR2x0Wlc1emFXOXVNVG9nYm5WdFltVnlMQ0JrYVcxbGJuTnBiMjR5T2lCdWRXMWlaWElzSUhOallXeGxPaUJ1ZFcxaVpYSWdQU0F4TGlrNklFMWhkSEpwZUNCN1hHNGdJR052Ym5OMElHMWhkSEpwZUNBOUlHbHVhWFJEYjI5eVpHbHVZWFJsY3loa2FXMWxibk5wYjI0eExDQmthVzFsYm5OcGIyNHlLVHRjYmx4dUlDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1JwYldWdWMybHZiakU3SUNzcmFTa2dlMXh1SUNBZ0lHWnZjaUFvYkdWMElHb2dQU0F3T3lCcUlEd2daR2x0Wlc1emFXOXVNanNnS3l0cUtWeHVJQ0FnSUNBZ2JXRjBjbWw0VzJsZFcycGRJRDBnY21GdVpHOXRSbXh2WVhRb2MyTmhiR1VwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJ0WVhSeWFYZzdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1EyRnNZM1ZzWVhSbGN5QkZkV05zYVdSbFlXNGdaR2x6ZEdGdVkyVWdZbVYwZDJWbGJpQjBkMjhnZG1WamRHOXljeTVjYmlBcVhHNGdLaUJBWlhod2IzSjBYRzRnS2lCQWNHRnlZVzBnZTFabFkzUnZjbjBnY0NCVWFHVWdabWx5YzNRZ2RtVmpkRzl5TGx4dUlDb2dRSEJoY21GdElIdFdaV04wYjNKOUlIRWdWR2hsSUhObFkyOXVaQ0IyWldOMGIzSXVYRzRnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEo5SUVWMVkyeHBaR1ZoYmlCa2FYTjBZVzVqWlNCaVpYUjNaV1Z1SUhSb1pTQm5hWFpsYmlCMlpXTjBiM0p6TGx4dUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkZzWTNWc1lYUmxSWFZqYkdsa1pXRnVSR2x6ZEdGdVkyVW9jRG9nVm1WamRHOXlMQ0J4T2lCV1pXTjBiM0lwT2lCdWRXMWlaWElnZTF4dUlDQmpiMjV6ZENCa2FXWm1JRDBnZG1WamRHOXlRV1JrS0hBc0lIRXNJQzB4S1R0Y2JpQWdZMjl1YzNRZ2MzRmthV1ptSUQwZ2RtVmpkRzl5VTNGMVlYSmxLR1JwWm1ZcE8xeHVJQ0JqYjI1emRDQnpjV1JwWm1aVGRXMXRJRDBnYVhSbGJYTlRkVzBvYzNGa2FXWm1LVHRjYmlBZ2NtVjBkWEp1SUUxaGRHZ3VjM0Z5ZENoemNXUnBabVpUZFcxdEtUdGNibjFjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1Z6SUdFZ1pHbHpkR0Z1WTJVZ2JXRjBjbWw0SUhWemFXNW5JR0VnWTNWemRHOXRJR1JwYzNSaGJtTmxJR1oxYm1OMGFXOXVMbHh1SUNwY2JpQXFJRUJsZUhCdmNuUmNiaUFxSUVCd1lYSmhiU0I3Vm1WamRHOXljMzBnWkdGMFlTQkpibkIxZENCMlpXTjBiM0p6SUhSdklHTmhiR04xYkdGMFpTQmthWE4wWVc1alpYTXVYRzRnS2lCQWNHRnlZVzBnZTBScGMzUmhibU5sVFdWMGNtbGpmU0JrYVhOMFlXNWpaU0JEZFhOMGIyMGdaR2x6ZEdGdVkyVWdablZ1WTNScGIyNHVYRzRnS2lCQWNtVjBkWEp1SUh0TllYUnlhWGg5SUVOaGJHTjFiR0YwWldRZ1kzVnpkRzl0SUdScGMzUmhibU5sSUcxaGRISnBlQzVjYmlBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTmhiR05FYVhOMFlXNWpaVTFoZEhKcGVDaGtZWFJoT2lCV1pXTjBiM0p6TENCa2FYTjBZVzVqWlRvZ1JHbHpkR0Z1WTJWTlpYUnlhV01wT2lCTllYUnlhWGdnZTF4dUlDQmpiMjV6ZENCdVNYUmxiWE1nUFNCa1lYUmhMbXhsYm1kMGFEdGNiaUFnWTI5dWMzUWdiV0YwY21sNElEMGdhVzVwZEVOdmIzSmthVzVoZEdWektHNUpkR1Z0Y3l3Z2JrbDBaVzF6TENBd0tUdGNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHNUpkR1Z0Y3pzZ0t5dHBLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhaUE5SUdrZ0t5QXhPeUJxSUR3Z2JrbDBaVzF6T3lBcksyb3BJSHRjYmlBZ0lDQWdJR052Ym5OMElHUTZJRzUxYldKbGNpQTlJQ2hrWVhSaFcybGRJRDA5SUc1MWJHd3BJSHg4SUNoa1lYUmhXMnBkSUQwOUlHNTFiR3dwSUQ4Z01DQTZJR1JwYzNSaGJtTmxLR1JoZEdGYmFWMHNJR1JoZEdGYmFsMHBPMXh1SUNBZ0lDQWdiV0YwY21sNFcybGRXMnBkSUQwZ2JXRjBjbWw0VzJwZFcybGRJRDBnWkR0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJRzFoZEhKcGVEdGNibjFjYmx4dUx5b3FJRWRsYm1WeVlYUmxjeUJoY25KaGVTQm1jbTl0SUdFZ2NtRnVaMlVnVzJKbFoybHVPeUJsYm1SZElHOXlJRnRpWldkcGJqc2daVzVrS1NCcFppQmxibVJGZUdOc2RYTnBkbVV1SUNvcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxibEpoYm1kbEtHSmxaMmx1T2lCdWRXMWlaWElzSUdWdVpEb2diblZ0WW1WeUxDQmxibVJGZUdOc2RYTnBkbVVnUFNCbVlXeHpaU2s2SUVsdWRETXlRWEp5WVhrZ2UxeHVJQ0JqYjI1emRDQnVTWFJsYlhNZ1BTQmxibVFnTFNCaVpXZHBiaUFySUNobGJtUkZlR05zZFhOcGRtVWdQeUF3SURvZ01TazdYRzRnSUdOdmJuTjBJSE5sY21sbGN5QTlJRzVsZHlCSmJuUXpNa0Z5Y21GNUtHNUpkR1Z0Y3lrN1hHNWNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCdVNYUmxiWE03SUNzcmFTbGNiaUFnSUNCelpYSnBaWE5iYVYwZ1BTQmlaV2RwYmlBcklHazdYRzVjYmlBZ2NtVjBkWEp1SUhObGNtbGxjenRjYm4xY2JseHVMeW9xWEc0Z0tpQlNaWFIxY201eklHOXlaR1Z5SUc5bUlIWmhiSFZsY3lCaGN5QnBaaUIwYUdWNUlHRnlaU0J6YjNKMFpXUXVYRzRnS2x4dUlDb2dRR1Y0Y0c5eWRGeHVJQ29nUUhCaGNtRnRJSHRoYm5sYlhYMGdkbUZzZFdWeklFbHVjSFYwSUdGeWNtRjVMbHh1SUNvZ1FIQmhjbUZ0SUh0aWIyOXNaV0Z1ZlNCYmNtVjJaWEp6WlQxbVlXeHpaVjBnVjJobGRHaGxjaUIwYnlCeVpYUjFjbTRnY21WMlpYSnpaV1FnYjNKa1pYSXVYRzRnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEpiWFgwZ1ZHaGxJRzl5WkdWeUlHTnZiWEIxZEdWa0xseHVJQ292WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWVhKblUyOXlkQ2gyWVd4MVpYTTZJR0Z1ZVZ0ZExDQnlaWFpsY25ObElEMGdabUZzYzJVcE9pQnVkVzFpWlhKYlhTQjdYRzRnSUdOdmJuTjBJSE52Y25SbWJpQTlJSEpsZG1WeWMyVWdQeUFvWVRvZ1lXNTVXMTBzSUdJNklHRnVlVnRkS1NBOVBpQW9ZbHN3WFNBdElHRmJNRjBwSURvZ0tHRTZJR0Z1ZVZ0ZExDQmlPaUJoYm5sYlhTa2dQVDRnS0dGYk1GMGdMU0JpV3pCZEtUdGNiaUFnWTI5dWMzUWdaR1ZqYjNJZ1BTQW9kam9nWVc1NUxDQnBPaUJ1ZFcxaVpYSXBJRDArSUZ0MkxDQnBYVHNnTHk4Z2MyVjBJR2x1WkdWNElIUnZJSFpoYkhWbFhHNGdJR052Ym5OMElIVnVaR1ZqYjNJZ1BTQW9ZVG9nWVc1NVcxMHBJRDArSUdGYk1WMDdJQzh2SUd4bFlYWmxJRzl1YkhrZ2FXNWtaWGhjYmlBZ1kyOXVjM1FnWDJGeVozTnZjblFnUFNBb1lYSnlPaUJoYm5sYlhTa2dQVDRnWVhKeUxtMWhjQ2hrWldOdmNpa3VjMjl5ZENoemIzSjBabTRwTG0xaGNDaDFibVJsWTI5eUtUdGNiaUFnY21WMGRYSnVJRjloY21kemIzSjBLSFpoYkhWbGN5azdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCMGFHVWdhVzVrWlhobGN5QnZaaUIwYUdVZ2JXOXpkQ0JrYVhabGNuTmxJRzlpYW1WamRITWdZV05qYjNKa2FXNW5JSFJ2SUhSb1pTQmthWE4wSUdaMWJtTjBhVzl1WEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ2JHVnVaM1JvSUhSdmRHRnNJRzUxYldKbGNpQnZaaUJ2WW1wbFkzUnpYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnYmlCdWRXMWlaWElnYjJZZ1pHbDJaWEp6WlNCbGJHVnRaVzUwY3lCMGJ5Qm1hVzVrWEc0Z0tpQkFjR0Z5WVcwZ2V5aHBNVG9nYm5WdFltVnlMQ0JwTWpvZ2JuVnRZbVZ5S1NBOVBpQnVkVzFpWlhKOUlHUnBjM1FnWVNCbWRXNWpkR2x2YmlCM2FHbGphQ0JqWVd4amRXeGhkR1Z6SUdScGMzUmhibU5sSUdKbGRIZGxaVzVjYmlBcUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwZDI4Z2IySnFaV04wY3lCMWMybHVaeUIwYUdWcGNpQnBibVJsZUdWelhHNGdLaUJBY21WMGRYSnVjeUI3Ym5WdFltVnlXMTE5SUZSb1pTQnBibVJsZUdWeklHOW1JSFJvWlNCdGIzTjBJR1JwZG1WeWMyVWdiMkpxWldOMGMxeHVJQ292WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWMFJHbDJaWEp6WlZOMVluTmxkQ2hzWlc1bmRHZzZJRzUxYldKbGNpd2diam9nYm5WdFltVnlMQ0JrYVhOME9pQW9hVEU2SUc1MWJXSmxjaXdnYVRJNklHNTFiV0psY2lrZ1BUNGdiblZ0WW1WeUtUb2diblZ0WW1WeVcxMGdlMXh1SUNCbWRXNWpkR2x2YmlCdFlYaENlU2gyWVd4MVpYTTZJRWwwWlhKaFlteGxTWFJsY21GMGIzSThiblZ0WW1WeVBpd2diM0prWlhKQ2VUb2dLR2s2SUc1MWJXSmxjaWtnUFQ0Z2JuVnRZbVZ5S1NCN1hHNGdJQ0FnYkdWMElHMWhlRlpoYkhWbElEMGdiblZzYkR0Y2JpQWdJQ0JzWlhRZ2JXRjRUM0prWlhKQ2VTQTlJRzUxYkd3N1hHNWNiaUFnSUNCbWIzSWdLR052Ym5OMElHVnNaVzFsYm5RZ2IyWWdkbUZzZFdWektTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCbGJHVnRaVzUwVDNKa1pYSkNlU0E5SUc5eVpHVnlRbmtvWld4bGJXVnVkQ2s3WEc0Z0lDQWdJQ0JwWmlBb2JXRjRUM0prWlhKQ2VTQTlQU0J1ZFd4c0lIeDhJR1ZzWlcxbGJuUlBjbVJsY2tKNUlENGdiV0Y0VDNKa1pYSkNlU2tnZTF4dUlDQWdJQ0FnSUNCdFlYaFdZV3gxWlNBOUlHVnNaVzFsYm5RN1hHNGdJQ0FnSUNBZ0lHMWhlRTl5WkdWeVFua2dQU0JsYkdWdFpXNTBUM0prWlhKQ2VUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJRzFoZUZaaGJIVmxPMXh1SUNCOVhHNWNiaUFnWTI5dWMzUWdjM1ZpYzJWMElEMGdXM0poYm1SdmJVbHVkQ2hzWlc1bmRHZ2dMU0F4S1YwN1hHNGdJR052Ym5OMElHTnZiWEJzWlcxbGJuUWdQU0J1WlhjZ1UyVjBLQ2s3WEc1Y2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JzWlc1bmRHZzdJQ3NyYVNrZ2UxeHVJQ0FnSUdsbUlDZ2hjM1ZpYzJWMExtbHVZMngxWkdWektHa3BLVnh1SUNBZ0lDQWdZMjl0Y0d4bGJXVnVkQzVoWkdRb2FTazdYRzRnSUgxY2JseHVJQ0IzYUdsc1pTQW9jM1ZpYzJWMExteGxibWQwYUNBOElHNHBJSHRjYmlBZ0lDQmpiMjV6ZENCcFpIZ2dQU0J0WVhoQ2VTaGNiaUFnSUNBZ0lHTnZiWEJzWlcxbGJuUXVkbUZzZFdWektDa2dZWE1nU1hSbGNtRmliR1ZKZEdWeVlYUnZjanh1ZFcxaVpYSStMRnh1SUNBZ0lDQWdLR2twSUQwK0lFMWhkR2d1YldsdUxtRndjR3g1S0UxaGRHZ3NJSE4xWW5ObGRDNXRZWEFvWm5WdVkzUnBiMjRvZG1Gc0xDQnBibVJsZUNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pHbHpkQ2hwTENCMllXd3BPMXh1SUNBZ0lDQWdmU2twS1R0Y2JpQWdJQ0JwWmlBb2FXUjRLU0I3WEc0Z0lDQWdJQ0J6ZFdKelpYUXVjSFZ6YUNocFpIZ3BPMXh1SUNBZ0lDQWdZMjl0Y0d4bGJXVnVkQzVrWld4bGRHVW9hV1I0S1R0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJSE4xWW5ObGREdGNibjFjYmx4dUx5b3FYRzRnS2lCU1pYUjFjbTV6SUc1dmNtMWhiR2w2WldRZ2RtVmpkRzl5WEc0Z0tpQkFjR0Z5WVcwZ2UxWmxZM1J2Y24wZ1pHRjBZU0J1ZFcxbGNtbGpZV3dnWVhKeVlYbGNiaUFxTDF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUc1dmNtMWhiR2w2WlNoa1lYUmhPaUJXWldOMGIzSXBPaUJXWldOMGIzSWdlMXh1SUNCc1pYUWdiV1ZoYmlBOUlEQTdYRzRnSUd4bGRDQnpkR1FnUFNBd08xeHVYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1pHRjBZUzVzWlc1bmRHZzdJQ3NyYVNsY2JpQWdJQ0J0WldGdUlDczlJR1JoZEdGYmFWMDdYRzVjYmlBZ2JXVmhiaUF2UFNCa1lYUmhMbXhsYm1kMGFEdGNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHUmhkR0V1YkdWdVozUm9PeUFySzJrcFhHNGdJQ0FnYzNSa0lDczlJQ2hrWVhSaFcybGRJQzBnYldWaGJpa2dLaUFvWkdGMFlWdHBYU0F0SUcxbFlXNHBPMXh1WEc0Z0lITjBaQ0E5SUUxaGRHZ3VjM0Z5ZENoemRHUWdMeUJrWVhSaExteGxibWQwYUNrN1hHNWNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCa1lYUmhMbXhsYm1kMGFEc2dLeXRwS1Z4dUlDQWdJR1JoZEdGYmFWMGdQU0FvWkdGMFlWdHBYU0F0SUcxbFlXNHBJQzhnYzNSa08xeHVYRzRnSUhKbGRIVnliaUJrWVhSaE8xeHVmVnh1WEc0dktpcGNiaUFxSUVacGJtUnpJSE5sZENCa2FXWm1aWEpsYm1ObElHSmxkSGRsWlc0Z2RIZHZJR3hwYzNSekxseHVJQ29nUUhCaGNtRnRJSHRoYm5sYlhYMGdZU0JVYUdVZ1ptbHljM1FnYkdsemRDNWNiaUFxSUVCd1lYSmhiU0I3WVc1NVcxMTlJR0lnVkdobElITmxZMjl1WkNCc2FYTjBMbHh1SUNvZ1FISmxkSFZ5YmlCN1lXNTVXMTE5WEc0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnpaWFJFYVdabVpYSmxibU5sS0dFNklHRnVlVnRkTENCaU9pQmhibmxiWFNrNklHRnVlVnRkSUh0Y2JpQWdZMjl1YzNRZ1lsTmxkQ0E5SUc1bGR5QlRaWFFvWWlrN1hHNGdJSEpsZEhWeWJpQkJjbkpoZVM1bWNtOXRLRzVsZHlCVFpYUW9ZUzVtYVd4MFpYSW9LSGdwSUQwK0lDRmlVMlYwTG1oaGN5aDRLU2twTG5aaGJIVmxjeWdwS1R0Y2JuMWNiaUpkZlE9PSIsImltcG9ydCB7IFNlcVBhbGV0dGVCYXNlIH0gZnJvbSAnLi9zZXEtcGFsZXR0ZXMnO1xuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgICBzdGF0aWMgZ2V0IExlc2soKSB7XG4gICAgICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgICAgICAgICAgW1snRycsICdBJywgJ1MnLCAnVCddLCAnb3JhbmdlJ10sXG4gICAgICAgICAgICAgICAgW1snQycsICdWJywgJ0knLCAnTCcsICdQJywgJ0YnLCAnWScsICdNJywgJ1cnXSwgJ2FsbF9ncmVlbiddLFxuICAgICAgICAgICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgICAgICAgICAgW1snRCcsICdFJ10sICdyZWQnXSxcbiAgICAgICAgICAgICAgICBbWydLJywgJ1InXSwgJ2FsbF9ibHVlJ10sXG4gICAgICAgICAgICBdLCBmYWxzZSwgQW1pbm9hY2lkc1BhbGV0dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sZXNrO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEdyb2tHcm91cHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgICAgICAgICAgW1snQycsICdVJ10sICd5ZWxsb3cnXSxcbiAgICAgICAgICAgICAgICBbWydHJywgJ1AnXSwgJ3JlZCddLFxuICAgICAgICAgICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgICAgICAgICAgW1snUicsICdIJywgJ0snXSwgJ2xpZ2h0X2JsdWUnXSxcbiAgICAgICAgICAgICAgICBbWydEJywgJ0UnXSwgJ2RhcmtfYmx1ZSddLFxuICAgICAgICAgICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgICAgICAgXSwgZmFsc2UsIEFtaW5vYWNpZHNQYWxldHRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ3Jva0dyb3VwcztcbiAgICB9XG4gICAgc3RhdGljIGdldCBSYXNNb2woKSB7XG4gICAgICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhc01vbCA9IG5ldyBBbWlub2FjaWRzUGFsZXR0ZXMoe1xuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9hY2Nlcy5lbnMtbHlvbi5mci9iaW90aWMvcmFzdG9wL2hlbHAvY29sb3VyLmh0bVxuICAgICAgICAgICAgICAgICdEJzogJyNFNjBBMEEnLFxuICAgICAgICAgICAgICAgICdFJzogJyNFNjBBMEEnLFxuICAgICAgICAgICAgICAgICdDJzogJyNFNkU2MDAnLFxuICAgICAgICAgICAgICAgICdNJzogJyNFNkU2MDAnLFxuICAgICAgICAgICAgICAgICdLJzogJyMxNDVBRkYnLFxuICAgICAgICAgICAgICAgICdSJzogJyMxNDVBRkYnLFxuICAgICAgICAgICAgICAgICdTJzogJyNGQTk2MDAnLFxuICAgICAgICAgICAgICAgICdUJzogJyNGQTk2MDAnLFxuICAgICAgICAgICAgICAgICdGJzogJyMzMjMyQUEnLFxuICAgICAgICAgICAgICAgICdZJzogJyMzMjMyQUEnLFxuICAgICAgICAgICAgICAgICdOJzogJyMwMERDREMnLFxuICAgICAgICAgICAgICAgICdRJzogJyMwMERDREMnLFxuICAgICAgICAgICAgICAgICdHJzogJyNFQkVCRUInLFxuICAgICAgICAgICAgICAgICdMJzogJyMwRjgyMEYnLFxuICAgICAgICAgICAgICAgICdWJzogJyMwRjgyMEYnLFxuICAgICAgICAgICAgICAgICdJJzogJyMwRjgyMEYnLFxuICAgICAgICAgICAgICAgICdBJzogJyNDOEM4QzgnLFxuICAgICAgICAgICAgICAgICdXJzogJyNCNDVBQjQnLFxuICAgICAgICAgICAgICAgICdIJzogJyM4MjgyRDInLFxuICAgICAgICAgICAgICAgICdQJzogJyNEQzk2ODInLFxuICAgICAgICAgICAgICAgICdvdGhlcnMnOiAnI0JFQTA2RScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gICAgfVxuICAgIGdldChtKSB7XG4gICAgICAgIGNvbnN0IHJlc00gPSBtIGluIEFtaW5vYWNpZHNQYWxldHRlcy5hYVN5bm9ueW1zID8gQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXNbbV0gOiBtO1xuICAgICAgICBjb25zdCByZXMgPSBzdXBlci5nZXQocmVzTSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufVxuLyoqIE9ubHkgc29tZSBvZiB0aGUgc3lub255bXMuIFRoZXNlIHdlcmUgb2J0YWluZWQgZnJvbSB0aGUgY2x1c3RlcmVkIG9saWdvcGVwdGlkZSBkYXRhc2V0LiAqL1xuQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXMgPSB7XG4gICAgJ01lTmxlJzogJ0wnLFxuICAgICdNZUEnOiAnQScsXG4gICAgJ01lRyc6ICdHJyxcbiAgICAnTWVGJzogJ0YnLFxufTtcbmV4cG9ydCBjbGFzcyBBbWlub2FjaWRzIHtcbiAgICBzdGF0aWMgZ2V0UGFsZXR0ZShzY2hlbWUgPSAnZ3JvaycpIHtcbiAgICAgICAgc3dpdGNoIChzY2hlbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2dyb2snOlxuICAgICAgICAgICAgICAgIHJldHVybiBBbWlub2FjaWRzUGFsZXR0ZXMuR3Jva0dyb3VwcztcbiAgICAgICAgICAgIGNhc2UgJ2xlc2snOlxuICAgICAgICAgICAgICAgIHJldHVybiBBbWlub2FjaWRzUGFsZXR0ZXMuTGVzaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVtUGFsZXR0ZTogc2NoZW1lIFxcYCR7c2NoZW1lfVxcYCBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgZGl2aWRlZCBhbWlubyBhY2lkIHdpdGggaXRzIGNvbnRlbnQgaW4gdGhlIGJyYWNrZXQsIGlmIHRoZSBjb250ZW50IGlzIG51bWJlciwgdGhlbiBpdHMgb21pdHRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGMgcmF3IGFtaW5vXG4gICAgICogQHJldHVybiB7W3N0cmluZywgc3RyaW5nXX0gb3V0ZXIgYW5kIGlubmVyIGNvbnRlbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SW5uZXJPdXRlcihjKSB7XG4gICAgICAgIGxldCBpc0lubmVyID0gMDtcbiAgICAgICAgbGV0IGlubmVyID0gJyc7XG4gICAgICAgIGxldCBvdXRlciA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYykge1xuICAgICAgICAgICAgaWYgKGNoYXIgPT0gJygnKVxuICAgICAgICAgICAgICAgIGlzSW5uZXIrKztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyknKVxuICAgICAgICAgICAgICAgIGlzSW5uZXItLTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzSW5uZXIpXG4gICAgICAgICAgICAgICAgaW5uZXIgKz0gY2hhcjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvdXRlciArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoaW5uZXIpKSA/IFtvdXRlciwgJyddIDogW291dGVyLCBpbm5lcl07XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDb2xvckFBUGl2b3QobW9ub21lciA9ICcnLCBzY2hlbWUgPSAnZ3JvaycpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIC8vY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IEFBUGFsZXR0ZXMuR3Jva0dyb3VwcygpO1xuICAgICAgICBjb25zdCBjaGVtUGFsZXR0ZUluc3RhbmNlID0gdGhpcy5nZXRQYWxldHRlKHNjaGVtZSk7XG4gICAgICAgIGxldCBbb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXJdID0gdGhpcy5nZXRJbm5lck91dGVyKG1vbm9tZXIpO1xuICAgICAgICBvdXRlck1vbm9tZXIgPSAob3V0ZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtvdXRlck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IG91dGVyTW9ub21lcik7XG4gICAgICAgIGlubmVyTW9ub21lciA9IChpbm5lck1vbm9tZXIubGVuZ3RoID4gNiA/IGAke2lubmVyTW9ub21lci5zbGljZSgwLCAzKX0uLi5gIDogaW5uZXJNb25vbWVyKTtcbiAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDEgfHwgbW9ub21lclsxXSA9PSAnKCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtaW5vID0gKF9hID0gbW9ub21lclswXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbm9tZXJbMF0gPT0gJ2QnICYmIG1vbm9tZXJbMV0gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSkge1xuICAgICAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDIgfHwgbW9ub21lclsyXSA9PSAnKCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbWlubyA9IChfYiA9IG1vbm9tZXJbMV0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMl0gOlxuICAgICAgICAgICAgICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtb25vbWVyLnN1YnN0cmluZygwLCAzKSBpbiB0aGlzLkFBRnVsbE5hbWVzKSB7XG4gICAgICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMyB8fCBtb25vbWVyWzNdID09ICcoJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygwLCAzKV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgICAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCAzXSA6XG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgoX2MgPSBtb25vbWVyWzBdKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9Mb3dlckNhc2UoKSkgPT0gbW9ub21lclswXSkge1xuICAgICAgICAgICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDEsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gNCB8fCBtb25vbWVyWzRdID09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbWlubyA9IHRoaXMuQUFGdWxsTmFtZXNbbW9ub21lci5zdWJzdHJpbmcoMSwgMyldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCA0XSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAwXTtcbiAgICB9XG59XG5BbWlub2FjaWRzLlNlbVR5cGUgPSAnQW1pbm9hY2lkcyc7XG5BbWlub2FjaWRzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudCA9ICdBbWlub2FjaWRzTXVsdGlwbGVBbGlnbm1lbnQnO1xuQW1pbm9hY2lkcy51bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcbkFtaW5vYWNpZHMuTmFtZXMgPSB7XG4gICAgJ0cnOiAnR2x5Y2luZScsXG4gICAgJ0wnOiAnTGV1Y2luZScsXG4gICAgJ1knOiAnVHlyb3NpbmUnLFxuICAgICdTJzogJ1NlcmluZScsXG4gICAgJ0UnOiAnR2x1dGFtaWMgYWNpZCcsXG4gICAgJ1EnOiAnR2x1dGFtaW5lJyxcbiAgICAnRCc6ICdBc3BhcnRpYyBhY2lkJyxcbiAgICAnTic6ICdBc3BhcmFnaW5lJyxcbiAgICAnRic6ICdQaGVueWxhbGFuaW5lJyxcbiAgICAnQSc6ICdBbGFuaW5lJyxcbiAgICAnSyc6ICdMeXNpbmUnLFxuICAgICdSJzogJ0FyZ2luaW5lJyxcbiAgICAnSCc6ICdIaXN0aWRpbmUnLFxuICAgICdDJzogJ0N5c3RlaW5lJyxcbiAgICAnVic6ICdWYWxpbmUnLFxuICAgICdQJzogJ1Byb2xpbmUnLFxuICAgICdXJzogJ1RyeXB0b3BoYW4nLFxuICAgICdJJzogJ0lzb2xldWNpbmUnLFxuICAgICdNJzogJ01ldGhpb25pbmUnLFxuICAgICdUJzogJ1RocmVvbmluZScsXG59O1xuQW1pbm9hY2lkcy5BQVNtaWxlcyA9IHtcbiAgICAnRyc6ICdOQ0MoPU8pTycsXG4gICAgJ0wnOiAnTltDQEhdKENDKEMpQylDKD1PKU8nLFxuICAgICdZJzogJ05DKENDMT1DQz1DKE8pQz1DMSlDKD1PKU8nLFxuICAgICdTJzogJ05DKENPKUMoPU8pTycsXG4gICAgJ0UnOiAnTltDQEBIXShDQ0MoTyk9TylDKD1PKU8nLFxuICAgICdRJzogJ05bQ0BASF0oQ0NDKE4pPU8pQyg9TylPJyxcbiAgICAnRCc6ICdOW0NAQEhdKENDKE8pPU8pQyg9TylPJyxcbiAgICAnTic6ICdOW0NAQEhdKENDKE4pPU8pQyg9TylPJyxcbiAgICAnRic6ICdOQyhDQzE9Q0M9Q0M9QzEpQyg9TylPJyxcbiAgICAnQSc6ICdOW0NASF0oQylDKD1PKU8nLFxuICAgICdLJzogJ05DKENDQ0NOKUMoPU8pTycsXG4gICAgJ1InOiAnTltDQEhdKENDQ05DKD1OKUMpQyg9TylPJyxcbiAgICAnSCc6ICdOQyhDQzE9Q049Q1tOXTEpQyg9TylPJyxcbiAgICAnQyc6ICdOW0NAQEhdKENTKUMoPU8pTycsXG4gICAgJ1YnOiAnTkMoQyhDKUMpQyg9TylPJyxcbiAgICAnUCc6ICdOKENDQzEpQzFDKD1PKU8nLFxuICAgICdXJzogJ05bQ0BASF0oQ2MxYzJjY2NjYzJuKFtIXSljMSlDKD1PKU8nLFxuICAgICdJJzogJ05bQ0BIXShbQ0BIXShDKUNDKUMoPU8pTycsXG4gICAgJ00nOiAnTkMoQ0NTQylDKD1PKU8nLFxuICAgICdUJzogJ05DKEMoTylDKUMoPU8pTycsXG59O1xuQW1pbm9hY2lkcy5BQVNtaWxlc1RydW5jYXRlZCA9IHtcbiAgICAnRyc6ICcqQyonLFxuICAgICdMJzogJ0NDKEMpQ1tDQEhdKCopKicsXG4gICAgJ1knOiAnQzE9Q0MoPUNDPUMxQ0MoKikqKU8nLFxuICAgICdTJzogJ09DQygqKUMqJyxcbiAgICAnRSc6ICcqW0NAQEhdKENDQyhPKT1PKSonLFxuICAgICdRJzogJypOW0NAQEhdKENDQyhOKT1PKSonLFxuICAgICdEJzogJypbQ0BASF0oQ0MoTyk9TykqJyxcbiAgICAnTic6ICcqW0NAQEhdKENDKE4pPU8pKicsXG4gICAgJ0YnOiAnQzE9Q0M9QyhDPUMxKUNDKCopKicsXG4gICAgJ0EnOiAnQ1tDQEhdKCopKicsXG4gICAgJ0snOiAnQyhDQ04pQ0MoKikqJyxcbiAgICAnUic6ICcqW0NASF0oQ0NDTkMoPU4pQykqJyxcbiAgICAnSCc6ICdDMT1DKE5DPU4xKUNDKCopKicsXG4gICAgJ0MnOiAnQyhbQ0BASF0oKikqKVMnLFxuICAgICdWJzogJ0NDKEMpQygqKSonLFxuICAgICdQJzogJ0MxQ0NOKCopQzEqJyxcbiAgICAnVyc6ICcqW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpKicsXG4gICAgJ0knOiAnQ0NbQ0BIXShDKVtDQEhdKCopKicsXG4gICAgJ00nOiAnQ1NDQ0MoKikqJyxcbiAgICAnVCc6ICdDQyhPKUMoKikqJyxcbn07XG4vKiogVE9ETzogRnVsbD9cbiAqL1xuQW1pbm9hY2lkcy5BQUZ1bGxOYW1lcyA9IHtcbiAgICAnQWxhJzogJ0EnLFxuICAgICdBcmcnOiAnUicsXG4gICAgJ0Fzbic6ICdOJyxcbiAgICAnQXNwJzogJ0QnLFxuICAgICdDeXMnOiAnQycsXG4gICAgJ0dsbic6ICdRJyxcbiAgICAnR2x1JzogJ0UnLFxuICAgICdHbHknOiAnRycsXG4gICAgJ0hpcyc6ICdIJyxcbiAgICAnSWxlJzogJ0knLFxuICAgICdMZXUnOiAnTCcsXG4gICAgJ0x5cyc6ICdLJyxcbiAgICAnTWV0JzogJ00nLFxuICAgICdQaGUnOiAnRicsXG4gICAgJ1Bybyc6ICdQJyxcbiAgICAnU2VyJzogJ1MnLFxuICAgICdUaHInOiAnVCcsXG4gICAgJ1RycCc6ICdXJyxcbiAgICAnVHlyJzogJ1knLFxuICAgICdWYWwnOiAnVicsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pWVcxcGJtOWhZMmxrY3k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbUZ0YVc1dllXTnBaSE11ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlMwRXNUMEZCVHl4RlFVRmhMR05CUVdNc1JVRkJReXhOUVVGTkxHZENRVUZuUWl4RFFVRkRPMEZCUlRGRUxFMUJRVTBzVDBGQlR5eHJRa0ZCYlVJc1UwRkJVU3hqUVVGak8wbEJSemRETEUxQlFVMHNTMEZCU3l4SlFVRkpPMUZCUTNCQ0xFbEJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NTMEZCU3l4TFFVRkxMRU5CUVVNc1JVRkJSVHRaUVVONFFpeEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU03WjBKQlF6TkNMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRU5CUVVNc1JVRkJSU3hSUVVGUkxFTkJRVU03WjBKQlEyaERMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhGUVVGRkxGZEJRVmNzUTBGQlF6dG5Ra0ZETlVRc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RFFVRkRMRVZCUVVVc1UwRkJVeXhEUVVGRE8yZENRVU0xUWl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFZEJRVWNzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXp0blFrRkRia0lzUTBGQlF5eERRVUZETEVkQlFVY3NSVUZCUlN4SFFVRkhMRU5CUVVNc1JVRkJSU3hWUVVGVkxFTkJRVU03WVVGRGVrSXNSVUZCUlN4TFFVRkxMRVZCUVVVc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXp0VFFVTXZRanRSUVVORUxFOUJRVThzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXp0SlFVTnVRaXhEUVVGRE8wbEJTVTBzVFVGQlRTeExRVUZMTEZWQlFWVTdVVUZETVVJc1NVRkJTU3hKUVVGSkxFTkJRVU1zVlVGQlZTeExRVUZMTEV0QlFVc3NRMEZCUXl4RlFVRkZPMWxCUXpsQ0xFbEJRVWtzUTBGQlF5eFZRVUZWTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJRenRuUWtGRGFrTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hIUVVGSExFTkJRVU1zUlVGQlJTeFJRVUZSTEVOQlFVTTdaMEpCUTNSQ0xFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4RFFVRkRMRVZCUVVVc1MwRkJTeXhEUVVGRE8yZENRVU51UWl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RlFVRkZMRmRCUVZjc1EwRkJRenRuUWtGRGRrUXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eERRVUZETEVWQlFVVXNXVUZCV1N4RFFVRkRPMmRDUVVNdlFpeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhGUVVGRkxGZEJRVmNzUTBGQlF6dG5Ra0ZEZWtJc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhGUVVGRkxGRkJRVkVzUTBGQlF6dGhRVU5xUXl4RlFVRkZMRXRCUVVzc1JVRkJSU3hyUWtGQmEwSXNRMEZCUXl4RFFVRkRPMU5CUXk5Q08xRkJRMFFzVDBGQlR5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRPMGxCUTNwQ0xFTkJRVU03U1VGSlRTeE5RVUZOTEV0QlFVc3NUVUZCVFR0UlFVTjBRaXhKUVVGSkxFbEJRVWtzUTBGQlF5eE5RVUZOTEV0QlFVc3NTMEZCU3l4RFFVRkRMRVZCUVVVN1dVRkRNVUlzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMR3RDUVVGclFpeERRVUZETzJkQ1FVTnVReXg1UkVGQmVVUTdaMEpCUTNwRUxFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEZGQlFWRXNSVUZCUlN4VFFVRlRPMkZCUTNCQ0xFTkJRVU1zUTBGQlF6dFRRVU5LTzFGQlEwUXNUMEZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRE8wbEJRM0pDTEVOQlFVTTdTVUZGWlN4SFFVRkhMRU5CUVVNc1EwRkJVenRSUVVNelFpeE5RVUZOTEVsQlFVa3NSMEZCUnl4RFFVRkRMRWxCUVVrc2EwSkJRV3RDTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJReXhyUWtGQmEwSXNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjJSaXhOUVVGTkxFZEJRVWNzUjBGQlJ5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8xRkJRelZDTEU5QlFVOHNSMEZCUnl4RFFVRkRPMGxCUTJJc1EwRkJRenM3UVVGRlJDdzRSa0ZCT0VZN1FVRkRMMFVzTmtKQlFWVXNSMEZCSzBJN1NVRkRkRVFzVDBGQlR5eEZRVUZGTEVkQlFVYzdTVUZEV2l4TFFVRkxMRVZCUVVVc1IwRkJSenRKUVVOV0xFdEJRVXNzUlVGQlJTeEhRVUZITzBsQlExWXNTMEZCU3l4RlFVRkZMRWRCUVVjN1EwRkRXQ3hEUVVGRE8wRkJSMG9zVFVGQlRTeFBRVUZQTEZWQlFWVTdTVUZ4UjJRc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF5eFRRVUZwUWl4TlFVRk5PMUZCUXpsRExGRkJRVkVzVFVGQlRTeEZRVUZGTzFsQlEyaENMRXRCUVVzc1RVRkJUVHRuUWtGRFZDeFBRVUZQTEd0Q1FVRnJRaXhEUVVGRExGVkJRVlVzUTBGQlF6dFpRVU4yUXl4TFFVRkxMRTFCUVUwN1owSkJRMVFzVDBGQlR5eHJRa0ZCYTBJc1EwRkJReXhKUVVGSkxFTkJRVU03V1VGRGFrTTdaMEpCUTBVc1RVRkJUU3hKUVVGSkxFdEJRVXNzUTBGQlF5eDVRa0ZCZVVJc1RVRkJUU3h0UWtGQmJVSXNRMEZCUXl4RFFVRkRPMU5CUTNKRk8wbEJRMGdzUTBGQlF6dEpRVVZFT3pzN096dFBRVXRITzBsQlEwa3NUVUZCVFN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGVE8xRkJRMjVETEVsQlFVa3NUMEZCVHl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOb1FpeEpRVUZKTEV0QlFVc3NSMEZCUnl4RlFVRkZMRU5CUVVNN1VVRkRaaXhKUVVGSkxFdEJRVXNzUjBGQlJ5eEZRVUZGTEVOQlFVTTdVVUZGWml4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJUdFpRVU53UWl4SlFVRkpMRWxCUVVrc1NVRkJTU3hIUVVGSE8yZENRVU5pTEU5QlFVOHNSVUZCUlN4RFFVRkRPMmxDUVVOUUxFbEJRVWtzU1VGQlNTeEpRVUZKTEVkQlFVYzdaMEpCUTJ4Q0xFOUJRVThzUlVGQlJTeERRVUZETzJsQ1FVTlFMRWxCUVVrc1QwRkJUenRuUWtGRFpDeExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRPenRuUWtGRlpDeExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRPMU5CUTJwQ08xRkJSVVFzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4UlFVRlJMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wbEJRMmhGTEVOQlFVTTdTVUZGVFN4TlFVRk5MRU5CUVVNc1pVRkJaU3hEUVVGRExGVkJRV3RDTEVWQlFVVXNSVUZCUlN4VFFVRnBRaXhOUVVGTk96dFJRVU42UlN4elJFRkJjMFE3VVVGRGRFUXNUVUZCVFN4dFFrRkJiVUlzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8xRkJRM0JFTEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1dVRkJXU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEdGQlFXRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRSUVVNdlJDeFpRVUZaTEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dFJRVU16Uml4WlFVRlpMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhaUVVGWkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXp0UlFVVXpSaXhKUVVGSkxFOUJRVThzUTBGQlF5eE5RVUZOTEVsQlFVa3NRMEZCUXl4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeEhRVUZITEVWQlFVVTdXVUZETlVNc1RVRkJUU3hMUVVGTExFZEJRVWNzVFVGQlFTeFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMREJEUVVGRkxGZEJRVmNzUlVGQlJ5eERRVUZETzFsQlEzcERMRTlCUVU4c1MwRkJTeXhKUVVGSkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN1owSkJRMjVETEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZMRXRCUVVzc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRNVVFzUTBGQlF5eEpRVUZKTEVOQlFVTXNZMEZCWXl4RlFVRkZMRmxCUVZrc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdVMEZEZUVRN1VVRkZSQ3hKUVVGSkxFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlJTeEpRVUZKTEcxQ1FVRnRRaXhGUVVGRk8xbEJRek5FTEVsQlFVa3NUMEZCVHl4RFFVRkRMRTFCUVUwc1NVRkJTU3hEUVVGRExFbEJRVWtzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRWRCUVVjc1JVRkJSVHRuUWtGRE5VTXNUVUZCVFN4TFFVRkxMRWRCUVVjc1RVRkJRU3hQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETERCRFFVRkZMRmRCUVZjc1JVRkJSeXhEUVVGRE8yZENRVU42UXl4UFFVRlBMRXRCUVVzc1NVRkJTU3h0UWtGQmJVSXNRMEZCUXl4RFFVRkRPMjlDUVVOdVF5eERRVUZETEcxQ1FVRnRRaXhEUVVGRExFZEJRVWNzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlN4TFFVRkxMRVZCUVVVc1dVRkJXU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdiMEpCUXpGRUxFTkJRVU1zU1VGQlNTeERRVUZETEdOQlFXTXNSVUZCUlN4WlFVRlpMRVZCUVVVc1dVRkJXU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzJGQlEzaEVPMU5CUTBZN1VVRkZSQ3hKUVVGSkxFOUJRVThzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhKUVVGSkxFbEJRVWtzUTBGQlF5eFhRVUZYTEVWQlFVVTdXVUZETDBNc1NVRkJTU3hQUVVGUExFTkJRVU1zVFVGQlRTeEpRVUZKTEVOQlFVTXNTVUZCU1N4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUjBGQlJ5eEZRVUZGTzJkQ1FVTTFReXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWMEZCVnl4RFFVRkRMRTlCUVU4c1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRM2hFTEU5QlFVOHNTMEZCU3l4SlFVRkpMRzFDUVVGdFFpeERRVUZETEVOQlFVTTdiMEpCUTI1RExFTkJRVU1zYlVKQlFXMUNMRU5CUVVNc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTEV0QlFVc3NSVUZCUlN4WlFVRlpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHZRa0ZETVVRc1EwRkJReXhKUVVGSkxFTkJRVU1zWTBGQll5eEZRVUZGTEZsQlFWa3NSVUZCUlN4WlFVRlpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03WVVGRGVFUTdVMEZEUmp0UlFVVkVMRWxCUVVrc1EwRkJRU3hOUVVGQkxFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNNRU5CUVVVc1YwRkJWeXhGUVVGRkxFdEJRVWtzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZPMWxCUXpORExFbEJRVWtzVDBGQlR5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFbEJRVWtzU1VGQlNTeERRVUZETEZkQlFWY3NSVUZCUlR0blFrRkRMME1zU1VGQlNTeFBRVUZQTEVOQlFVTXNUVUZCVFN4SlFVRkpMRU5CUVVNc1NVRkJTU3hQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NSMEZCUnl4RlFVRkZPMjlDUVVNMVF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExFOUJRVThzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YjBKQlEzaEVMRTlCUVU4c1MwRkJTeXhKUVVGSkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN2QwSkJRMjVETEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZMRXRCUVVzc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0M1FrRkRNVVFzUTBGQlF5eEpRVUZKTEVOQlFVTXNZMEZCWXl4RlFVRkZMRmxCUVZrc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdhVUpCUTNoRU8yRkJRMFk3VTBGRFJqdFJRVVZFTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1kwRkJZeXhGUVVGRkxGbEJRVmtzUlVGQlJTeFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRPVVFzUTBGQlF6czdRVUZ3VEdVc2EwSkJRVThzUjBGQlZ5eFpRVUZaTEVOQlFVTTdRVUZGTDBJc2JVTkJRWGRDTEVkQlFWY3NOa0pCUVRaQ0xFTkJRVU03UVVGRk1VVXNlVUpCUVdNc1IwRkJSeXhyUWtGQmEwSXNRMEZCUXp0QlFVVTNRaXhuUWtGQlN5eEhRVUZ4UWp0SlFVTjBReXhIUVVGSExFVkJRVVVzVTBGQlV6dEpRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMGxCUTJRc1IwRkJSeXhGUVVGRkxGVkJRVlU3U1VGRFppeEhRVUZITEVWQlFVVXNVVUZCVVR0SlFVTmlMRWRCUVVjc1JVRkJSU3hsUVVGbE8wbEJRM0JDTEVkQlFVY3NSVUZCUlN4WFFVRlhPMGxCUTJoQ0xFZEJRVWNzUlVGQlJTeGxRVUZsTzBsQlEzQkNMRWRCUVVjc1JVRkJSU3haUVVGWk8wbEJRMnBDTEVkQlFVY3NSVUZCUlN4bFFVRmxPMGxCUTNCQ0xFZEJRVWNzUlVGQlJTeFRRVUZUTzBsQlEyUXNSMEZCUnl4RlFVRkZMRkZCUVZFN1NVRkRZaXhIUVVGSExFVkJRVVVzVlVGQlZUdEpRVU5tTEVkQlFVY3NSVUZCUlN4WFFVRlhPMGxCUTJoQ0xFZEJRVWNzUlVGQlJTeFZRVUZWTzBsQlEyWXNSMEZCUnl4RlFVRkZMRkZCUVZFN1NVRkRZaXhIUVVGSExFVkJRVVVzVTBGQlV6dEpRVU5rTEVkQlFVY3NSVUZCUlN4WlFVRlpPMGxCUTJwQ0xFZEJRVWNzUlVGQlJTeFpRVUZaTzBsQlEycENMRWRCUVVjc1JVRkJSU3haUVVGWk8wbEJRMnBDTEVkQlFVY3NSVUZCUlN4WFFVRlhPME5CUTJwQ0xFTkJRVU03UVVGRldTeHRRa0ZCVVN4SFFVRnhRanRKUVVONlF5eEhRVUZITEVWQlFVVXNWVUZCVlR0SlFVTm1MRWRCUVVjc1JVRkJSU3h6UWtGQmMwSTdTVUZETTBJc1IwRkJSeXhGUVVGRkxESkNRVUV5UWp0SlFVTm9ReXhIUVVGSExFVkJRVVVzWTBGQll6dEpRVU51UWl4SFFVRkhMRVZCUVVVc2VVSkJRWGxDTzBsQlF6bENMRWRCUVVjc1JVRkJSU3g1UWtGQmVVSTdTVUZET1VJc1IwRkJSeXhGUVVGRkxIZENRVUYzUWp0SlFVTTNRaXhIUVVGSExFVkJRVVVzZDBKQlFYZENPMGxCUXpkQ0xFZEJRVWNzUlVGQlJTeDNRa0ZCZDBJN1NVRkROMElzUjBGQlJ5eEZRVUZGTEdsQ1FVRnBRanRKUVVOMFFpeEhRVUZITEVWQlFVVXNhVUpCUVdsQ08wbEJRM1JDTEVkQlFVY3NSVUZCUlN3d1FrRkJNRUk3U1VGREwwSXNSMEZCUnl4RlFVRkZMSGRDUVVGM1FqdEpRVU0zUWl4SFFVRkhMRVZCUVVVc2JVSkJRVzFDTzBsQlEzaENMRWRCUVVjc1JVRkJSU3hwUWtGQmFVSTdTVUZEZEVJc1IwRkJSeXhGUVVGRkxHbENRVUZwUWp0SlFVTjBRaXhIUVVGSExFVkJRVVVzYjBOQlFXOURPMGxCUTNwRExFZEJRVWNzUlVGQlJTd3dRa0ZCTUVJN1NVRkRMMElzUjBGQlJ5eEZRVUZGTEdkQ1FVRm5RanRKUVVOeVFpeEhRVUZITEVWQlFVVXNhVUpCUVdsQ08wTkJRM1pDTEVOQlFVTTdRVUZGV1N3MFFrRkJhVUlzUjBGQmNVSTdTVUZEYkVRc1IwRkJSeXhGUVVGRkxFdEJRVXM3U1VGRFZpeEhRVUZITEVWQlFVVXNhVUpCUVdsQ08wbEJRM1JDTEVkQlFVY3NSVUZCUlN4elFrRkJjMEk3U1VGRE0wSXNSMEZCUnl4RlFVRkZMRlZCUVZVN1NVRkRaaXhIUVVGSExFVkJRVVVzYjBKQlFXOUNPMGxCUTNwQ0xFZEJRVWNzUlVGQlJTeHhRa0ZCY1VJN1NVRkRNVUlzUjBGQlJ5eEZRVUZGTEcxQ1FVRnRRanRKUVVONFFpeEhRVUZITEVWQlFVVXNiVUpCUVcxQ08wbEJRM2hDTEVkQlFVY3NSVUZCUlN4eFFrRkJjVUk3U1VGRE1VSXNSMEZCUnl4RlFVRkZMRmxCUVZrN1NVRkRha0lzUjBGQlJ5eEZRVUZGTEdOQlFXTTdTVUZEYmtJc1IwRkJSeXhGUVVGRkxIRkNRVUZ4UWp0SlFVTXhRaXhIUVVGSExFVkJRVVVzYlVKQlFXMUNPMGxCUTNoQ0xFZEJRVWNzUlVGQlJTeG5Ra0ZCWjBJN1NVRkRja0lzUjBGQlJ5eEZRVUZGTEZsQlFWazdTVUZEYWtJc1IwRkJSeXhGUVVGRkxHRkJRV0U3U1VGRGJFSXNSMEZCUnl4RlFVRkZMQ3RDUVVFclFqdEpRVU53UXl4SFFVRkhMRVZCUVVVc2NVSkJRWEZDTzBsQlF6RkNMRWRCUVVjc1JVRkJSU3hYUVVGWE8wbEJRMmhDTEVkQlFVY3NSVUZCUlN4WlFVRlpPME5CUTJ4Q0xFTkJRVU03UVVGRlJqdEhRVU5ITzBGQlExY3NjMEpCUVZjc1IwRkJjVUk3U1VGRE5VTXNTMEZCU3l4RlFVRkZMRWRCUVVjN1NVRkRWaXhMUVVGTExFVkJRVVVzUjBGQlJ6dEpRVU5XTEV0QlFVc3NSVUZCUlN4SFFVRkhPMGxCUTFZc1MwRkJTeXhGUVVGRkxFZEJRVWM3U1VGRFZpeExRVUZMTEVWQlFVVXNSMEZCUnp0SlFVTldMRXRCUVVzc1JVRkJSU3hIUVVGSE8wbEJRMVlzUzBGQlN5eEZRVUZGTEVkQlFVYzdTVUZEVml4TFFVRkxMRVZCUVVVc1IwRkJSenRKUVVOV0xFdEJRVXNzUlVGQlJTeEhRVUZITzBsQlExWXNTMEZCU3l4RlFVRkZMRWRCUVVjN1NVRkRWaXhMUVVGTExFVkJRVVVzUjBGQlJ6dEpRVU5XTEV0QlFVc3NSVUZCUlN4SFFVRkhPMGxCUTFZc1MwRkJTeXhGUVVGRkxFZEJRVWM3U1VGRFZpeExRVUZMTEVWQlFVVXNSMEZCUnp0SlFVTldMRXRCUVVzc1JVRkJSU3hIUVVGSE8wbEJRMVlzUzBGQlN5eEZRVUZGTEVkQlFVYzdTVUZEVml4TFFVRkxMRVZCUVVVc1IwRkJSenRKUVVOV0xFdEJRVXNzUlVGQlJTeEhRVUZITzBsQlExWXNTMEZCU3l4RlFVRkZMRWRCUVVjN1NVRkRWaXhMUVVGTExFVkJRVVVzUjBGQlJ6dERRVU5ZTEVOQlFVTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdLaUJoY3lCbmNtOXJJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzluY205ckp6dGNibWx0Y0c5eWRDQXFJR0Z6SUhWcElHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOTFhU2M3WEc1cGJYQnZjblFnS2lCaGN5QkVSeUJtY205dElDZGtZWFJoWjNKdmF5MWhjR2t2Wkdjbk8xeHVYRzVwYlhCdmNuUWdlMU4wY21sdVowUnBZM1JwYjI1aGNubDlJR1p5YjIwZ0owQmtZWFJoWjNKdmF5MXNhV0p5WVhKcFpYTXZkWFJwYkhNdmMzSmpMM1I1Y0dVdFpHVmpiR0Z5WVhScGIyNXpKenRjYm1sdGNHOXlkQ0I3VTJWeFVHRnNaWFIwWlN3Z1UyVnhVR0ZzWlhSMFpVSmhjMlY5SUdaeWIyMGdKeTR2YzJWeExYQmhiR1YwZEdWekp6dGNibHh1Wlhod2IzSjBJR05zWVhOeklFRnRhVzV2WVdOcFpITlFZV3hsZEhSbGN5QmxlSFJsYm1SeklGTmxjVkJoYkdWMGRHVkNZWE5sSUh0Y2JpQWdjSEpwZG1GMFpTQnpkR0YwYVdNZ2JHVnphem9nVTJWeFVHRnNaWFIwWlR0Y2JseHVJQ0J3ZFdKc2FXTWdjM1JoZEdsaklHZGxkQ0JNWlhOcktDazZJRk5sY1ZCaGJHVjBkR1VnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbXhsYzJzZ1BUMDlJSFp2YVdRZ01Da2dlMXh1SUNBZ0lDQWdkR2hwY3k1c1pYTnJJRDBnZEdocGN5NXRZV3RsVUdGc1pYUjBaU2hiWEc0Z0lDQWdJQ0FnSUZ0YkowY25MQ0FuUVNjc0lDZFRKeXdnSjFRblhTd2dKMjl5WVc1blpTZGRMRnh1SUNBZ0lDQWdJQ0JiV3lkREp5d2dKMVluTENBblNTY3NJQ2RNSnl3Z0oxQW5MQ0FuUmljc0lDZFpKeXdnSjAwbkxDQW5WeWRkTENBbllXeHNYMmR5WldWdUoxMHNYRzRnSUNBZ0lDQWdJRnRiSjA0bkxDQW5VU2NzSUNkSUoxMHNJQ2R0WVdkbGJuUmhKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkowUW5MQ0FuUlNkZExDQW5jbVZrSjEwc1hHNGdJQ0FnSUNBZ0lGdGJKMHNuTENBblVpZGRMQ0FuWVd4c1gySnNkV1VuWFN4Y2JpQWdJQ0FnSUYwc0lHWmhiSE5sTENCQmJXbHViMkZqYVdSelVHRnNaWFIwWlhNcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1c1pYTnJPMXh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0J6ZEdGMGFXTWdaM0p2YTBkeWIzVndjem9nVTJWeFVHRnNaWFIwWlR0Y2JseHVJQ0J3ZFdKc2FXTWdjM1JoZEdsaklHZGxkQ0JIY205clIzSnZkWEJ6S0NrNklGTmxjVkJoYkdWMGRHVWdlMXh1SUNBZ0lHbG1JQ2gwYUdsekxtZHliMnRIY205MWNITWdQVDA5SUhadmFXUWdNQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NW5jbTlyUjNKdmRYQnpJRDBnZEdocGN5NXRZV3RsVUdGc1pYUjBaU2hiWEc0Z0lDQWdJQ0FnSUZ0YkowTW5MQ0FuVlNkZExDQW5lV1ZzYkc5M0oxMHNYRzRnSUNBZ0lDQWdJRnRiSjBjbkxDQW5VQ2RkTENBbmNtVmtKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkowRW5MQ0FuVmljc0lDZEpKeXdnSjB3bkxDQW5UU2NzSUNkR0p5d2dKMWtuTENBblZ5ZGRMQ0FuWVd4c1gyZHlaV1Z1SjEwc1hHNGdJQ0FnSUNBZ0lGdGJKMUluTENBblNDY3NJQ2RMSjEwc0lDZHNhV2RvZEY5aWJIVmxKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkowUW5MQ0FuUlNkZExDQW5aR0Z5YTE5aWJIVmxKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkoxTW5MQ0FuVkNjc0lDZE9KeXdnSjFFblhTd2dKMjl5WVc1blpTZGRMRnh1SUNBZ0lDQWdYU3dnWm1Gc2MyVXNJRUZ0YVc1dllXTnBaSE5RWVd4bGRIUmxjeWs3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbWR5YjJ0SGNtOTFjSE03WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUhOMFlYUnBZeUJ5WVhOTmIydzZJRk5sY1ZCaGJHVjBkR1U3WEc1Y2JpQWdjSFZpYkdsaklITjBZWFJwWXlCblpYUWdVbUZ6VFc5c0tDazZJRk5sY1ZCaGJHVjBkR1VnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbkpoYzAxdmJDQTlQVDBnZG05cFpDQXdLU0I3WEc0Z0lDQWdJQ0IwYUdsekxuSmhjMDF2YkNBOUlHNWxkeUJCYldsdWIyRmphV1J6VUdGc1pYUjBaWE1vZTF4dUlDQWdJQ0FnSUNBdkx5Qm9kSFJ3T2k4dllXTmpaWE11Wlc1ekxXeDViMjR1Wm5JdlltbHZkR2xqTDNKaGMzUnZjQzlvWld4d0wyTnZiRzkxY2k1b2RHMWNiaUFnSUNBZ0lDQWdKMFFuT2lBbkkwVTJNRUV3UVNjc0lDOHZJR0Z6Y0N3Z1lYTndZWEowYVdNZ1lXTnBaQ3dnWVhOd1hHNGdJQ0FnSUNBZ0lDZEZKem9nSnlORk5qQkJNRUVuTENBdkx5Qm5iSFVzSUdkc2RYUmhiV2xqSUdGamFXUmNiaUFnSUNBZ0lDQWdKME1uT2lBbkkwVTJSVFl3TUNjc0lDOHZJR041Y3l3Z1kzbHpkR1ZwYm1WY2JpQWdJQ0FnSUNBZ0owMG5PaUFuSTBVMlJUWXdNQ2NzSUM4dklHMWxkQ3dnYldWMGFHbHZibWx1WlZ4dUlDQWdJQ0FnSUNBblN5YzZJQ2NqTVRRMVFVWkdKeXdnTHk4Z2JIbHpMQ0JzZVhOcGJtVmNiaUFnSUNBZ0lDQWdKMUluT2lBbkl6RTBOVUZHUmljc0lDOHZJR0Z5Wnl3Z1lYSm5hVzVwYm1WY2JpQWdJQ0FnSUNBZ0oxTW5PaUFuSTBaQk9UWXdNQ2NzSUM4dklITmxjaXdnYzJWeWFXNWxYRzRnSUNBZ0lDQWdJQ2RVSnpvZ0p5TkdRVGsyTURBbkxDQXZMeUIwYUhJc0lIUm9jbVZ2Ym1sdVpWeHVJQ0FnSUNBZ0lDQW5SaWM2SUNjak16SXpNa0ZCSnl3Z0x5OGdjR2hsTENCd2FHVnVlV3hoYkdGdWFXNWxYRzRnSUNBZ0lDQWdJQ2RaSnpvZ0p5TXpNak15UVVFbkxDQXZMeUIwZVhJc0lIUjVjbTl6YVc1bFhHNGdJQ0FnSUNBZ0lDZE9Kem9nSnlNd01FUkRSRU1uTENBdkx5QmhjMjRzSUdGemNHRnlZV2RwYm1WY2JpQWdJQ0FnSUNBZ0oxRW5PaUFuSXpBd1JFTkVReWNzSUM4dklHZHNiaXdnWjJ4MWRHRnRhVzVsWEc0Z0lDQWdJQ0FnSUNkSEp6b2dKeU5GUWtWQ1JVSW5MQ0F2THlCbmJIa3NJR2RzZVdOcGJtVmNiaUFnSUNBZ0lDQWdKMHduT2lBbkl6QkdPREl3Umljc0lDOHZJR3hsZFN3Z2JHVjFZMmx1WlZ4dUlDQWdJQ0FnSUNBblZpYzZJQ2NqTUVZNE1qQkdKeXdnTHk4Z2RtRnNMQ0IyWVd4cGJtVmNiaUFnSUNBZ0lDQWdKMGtuT2lBbkl6QkdPREl3Umljc0lDOHZJR2xzWlN3Z2FYTnZiR1YxWTJsdVpWeHVJQ0FnSUNBZ0lDQW5RU2M2SUNjalF6aERPRU00Snl3Z0x5OGdZV3hoTENCaGJHRnVhVzVsWEc0Z0lDQWdJQ0FnSUNkWEp6b2dKeU5DTkRWQlFqUW5MQ0F2THlCMGNuQXNJSFJ5ZVhCMGIzQm9ZVzVjYmlBZ0lDQWdJQ0FnSjBnbk9pQW5Jemd5T0RKRU1pY3NJQzh2SUdocGN5d2dhR2x6ZEdsa2FXNWxYRzRnSUNBZ0lDQWdJQ2RRSnpvZ0p5TkVRemsyT0RJbkxDQXZMeUJ3Y204c0lIQnliMnhwYm1WY2JpQWdJQ0FnSUNBZ0oyOTBhR1Z5Y3ljNklDY2pRa1ZCTURaRkp5eGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NXlZWE5OYjJ3N1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ2IzWmxjbkpwWkdVZ1oyVjBLRzA2SUhOMGNtbHVaeWs2SUhOMGNtbHVaeUI3WEc0Z0lDQWdZMjl1YzNRZ2NtVnpUU0E5SUcwZ2FXNGdRVzFwYm05aFkybGtjMUJoYkdWMGRHVnpMbUZoVTNsdWIyNTViWE1nUHlCQmJXbHViMkZqYVdSelVHRnNaWFIwWlhNdVlXRlRlVzV2Ym5sdGMxdHRYU0E2SUcwN1hHNGdJQ0FnWTI5dWMzUWdjbVZ6SUQwZ2MzVndaWEl1WjJWMEtISmxjMDBwTzF4dUlDQWdJSEpsZEhWeWJpQnlaWE03WEc0Z0lIMWNibHh1SUNBdktpb2dUMjVzZVNCemIyMWxJRzltSUhSb1pTQnplVzV2Ym5sdGN5NGdWR2hsYzJVZ2QyVnlaU0J2WW5SaGFXNWxaQ0JtY205dElIUm9aU0JqYkhWemRHVnlaV1FnYjJ4cFoyOXdaWEIwYVdSbElHUmhkR0Z6WlhRdUlDb3ZYRzRnSUhCeWFYWmhkR1VnYzNSaGRHbGpJR0ZoVTNsdWIyNTViWE02SUhzZ1cyNWhiV1U2SUhOMGNtbHVaMTA2SUhOMGNtbHVaeUI5SUQwZ2UxeHVJQ0FnSUNkTlpVNXNaU2M2SUNkTUp5d2dMeThnVG14bElDMGdibTl5YkdWMVkybHVaVnh1SUNBZ0lDZE5aVUVuT2lBblFTY3NYRzRnSUNBZ0owMWxSeWM2SUNkSEp5eGNiaUFnSUNBblRXVkdKem9nSjBZbkxGeHVJQ0I5TzF4dWZWeHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1FXMXBibTloWTJsa2N5QjdYRzRnSUhOMFlYUnBZeUJ5WldGa2IyNXNlU0JUWlcxVWVYQmxPaUJ6ZEhKcGJtY2dQU0FuUVcxcGJtOWhZMmxrY3ljN1hHNWNiaUFnYzNSaGRHbGpJSEpsWVdSdmJteDVJRk5sYlZSNWNHVk5kV3gwYVhCc1pVRnNhV2R1YldWdWREb2djM1J5YVc1bklEMGdKMEZ0YVc1dllXTnBaSE5OZFd4MGFYQnNaVUZzYVdkdWJXVnVkQ2M3WEc1Y2JpQWdjM1JoZEdsaklIVnVaR1ZtYVc1bFpFTnZiRzl5SUQwZ0ozSm5ZaWd4TURBc01UQXdMREV3TUNrbk8xeHVYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdUbUZ0WlhNNklGTjBjbWx1WjBScFkzUnBiMjVoY25rZ1BTQjdYRzRnSUNBZ0owY25PaUFuUjJ4NVkybHVaU2NzWEc0Z0lDQWdKMHduT2lBblRHVjFZMmx1WlNjc1hHNGdJQ0FnSjFrbk9pQW5WSGx5YjNOcGJtVW5MRnh1SUNBZ0lDZFRKem9nSjFObGNtbHVaU2NzWEc0Z0lDQWdKMFVuT2lBblIyeDFkR0Z0YVdNZ1lXTnBaQ2NzWEc0Z0lDQWdKMUVuT2lBblIyeDFkR0Z0YVc1bEp5eGNiaUFnSUNBblJDYzZJQ2RCYzNCaGNuUnBZeUJoWTJsa0p5eGNiaUFnSUNBblRpYzZJQ2RCYzNCaGNtRm5hVzVsSnl4Y2JpQWdJQ0FuUmljNklDZFFhR1Z1ZVd4aGJHRnVhVzVsSnl4Y2JpQWdJQ0FuUVNjNklDZEJiR0Z1YVc1bEp5eGNiaUFnSUNBblN5YzZJQ2RNZVhOcGJtVW5MRnh1SUNBZ0lDZFNKem9nSjBGeVoybHVhVzVsSnl4Y2JpQWdJQ0FuU0NjNklDZElhWE4wYVdScGJtVW5MRnh1SUNBZ0lDZERKem9nSjBONWMzUmxhVzVsSnl4Y2JpQWdJQ0FuVmljNklDZFdZV3hwYm1VbkxGeHVJQ0FnSUNkUUp6b2dKMUJ5YjJ4cGJtVW5MRnh1SUNBZ0lDZFhKem9nSjFSeWVYQjBiM0JvWVc0bkxGeHVJQ0FnSUNkSkp6b2dKMGx6YjJ4bGRXTnBibVVuTEZ4dUlDQWdJQ2ROSnpvZ0owMWxkR2hwYjI1cGJtVW5MRnh1SUNBZ0lDZFVKem9nSjFSb2NtVnZibWx1WlNjc1hHNGdJSDA3WEc1Y2JpQWdjSFZpYkdsaklITjBZWFJwWXlCQlFWTnRhV3hsY3pvZ1UzUnlhVzVuUkdsamRHbHZibUZ5ZVNBOUlIdGNiaUFnSUNBblJ5YzZJQ2RPUTBNb1BVOHBUeWNzWEc0Z0lDQWdKMHduT2lBblRsdERRRWhkS0VOREtFTXBReWxES0QxUEtVOG5MRnh1SUNBZ0lDZFpKem9nSjA1REtFTkRNVDFEUXoxREtFOHBRejFETVNsREtEMVBLVThuTEZ4dUlDQWdJQ2RUSnpvZ0owNURLRU5QS1VNb1BVOHBUeWNzWEc0Z0lDQWdKMFVuT2lBblRsdERRRUJJWFNoRFEwTW9UeWs5VHlsREtEMVBLVThuTEZ4dUlDQWdJQ2RSSnpvZ0owNWJRMEJBU0Ywb1EwTkRLRTRwUFU4cFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuUkNjNklDZE9XME5BUUVoZEtFTkRLRThwUFU4cFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuVGljNklDZE9XME5BUUVoZEtFTkRLRTRwUFU4cFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuUmljNklDZE9ReWhEUXpFOVEwTTlRME05UXpFcFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuUVNjNklDZE9XME5BU0Ywb1F5bERLRDFQS1U4bkxGeHVJQ0FnSUNkTEp6b2dKMDVES0VORFEwTk9LVU1vUFU4cFR5Y3NYRzRnSUNBZ0oxSW5PaUFuVGx0RFFFaGRLRU5EUTA1REtEMU9LVU1wUXlnOVR5bFBKeXhjYmlBZ0lDQW5TQ2M2SUNkT1F5aERRekU5UTA0OVExdE9YVEVwUXlnOVR5bFBKeXhjYmlBZ0lDQW5ReWM2SUNkT1cwTkFRRWhkS0VOVEtVTW9QVThwVHljc1hHNGdJQ0FnSjFZbk9pQW5Ua01vUXloREtVTXBReWc5VHlsUEp5eGNiaUFnSUNBblVDYzZJQ2RPS0VORFF6RXBRekZES0QxUEtVOG5MRnh1SUNBZ0lDZFhKem9nSjA1YlEwQkFTRjBvUTJNeFl6SmpZMk5qWXpKdUtGdElYU2xqTVNsREtEMVBLVThuTEZ4dUlDQWdJQ2RKSnpvZ0owNWJRMEJJWFNoYlEwQklYU2hES1VOREtVTW9QVThwVHljc1hHNGdJQ0FnSjAwbk9pQW5Ua01vUTBOVFF5bERLRDFQS1U4bkxGeHVJQ0FnSUNkVUp6b2dKMDVES0VNb1R5bERLVU1vUFU4cFR5Y3NYRzRnSUgwN1hHNWNiaUFnY0hWaWJHbGpJSE4wWVhScFl5QkJRVk50YVd4bGMxUnlkVzVqWVhSbFpEb2dVM1J5YVc1blJHbGpkR2x2Ym1GeWVTQTlJSHRjYmlBZ0lDQW5SeWM2SUNjcVF5b25MRnh1SUNBZ0lDZE1Kem9nSjBOREtFTXBRMXREUUVoZEtDb3BLaWNzWEc0Z0lDQWdKMWtuT2lBblF6RTlRME1vUFVORFBVTXhRME1vS2lrcUtVOG5MRnh1SUNBZ0lDZFRKem9nSjA5RFF5Z3FLVU1xSnl4Y2JpQWdJQ0FuUlNjNklDY3FXME5BUUVoZEtFTkRReWhQS1QxUEtTb25MRnh1SUNBZ0lDZFJKem9nSnlwT1cwTkFRRWhkS0VORFF5aE9LVDFQS1NvbkxGeHVJQ0FnSUNkRUp6b2dKeXBiUTBCQVNGMG9RME1vVHlrOVR5a3FKeXhjYmlBZ0lDQW5UaWM2SUNjcVcwTkFRRWhkS0VOREtFNHBQVThwS2ljc1hHNGdJQ0FnSjBZbk9pQW5RekU5UTBNOVF5aERQVU14S1VOREtDb3BLaWNzWEc0Z0lDQWdKMEVuT2lBblExdERRRWhkS0NvcEtpY3NYRzRnSUNBZ0owc25PaUFuUXloRFEwNHBRME1vS2lrcUp5eGNiaUFnSUNBblVpYzZJQ2NxVzBOQVNGMG9RME5EVGtNb1BVNHBReWtxSnl4Y2JpQWdJQ0FuU0NjNklDZERNVDFES0U1RFBVNHhLVU5ES0NvcEtpY3NYRzRnSUNBZ0owTW5PaUFuUXloYlEwQkFTRjBvS2lrcUtWTW5MRnh1SUNBZ0lDZFdKem9nSjBOREtFTXBReWdxS1NvbkxGeHVJQ0FnSUNkUUp6b2dKME14UTBOT0tDb3BRekVxSnl4Y2JpQWdJQ0FuVnljNklDY3FXME5BUUVoZEtFTmpNV015WTJOalkyTXliaWhiU0YwcFl6RXBLaWNzWEc0Z0lDQWdKMGtuT2lBblEwTmJRMEJJWFNoREtWdERRRWhkS0NvcEtpY3NYRzRnSUNBZ0owMG5PaUFuUTFORFEwTW9LaWtxSnl4Y2JpQWdJQ0FuVkNjNklDZERReWhQS1VNb0tpa3FKeXhjYmlBZ2ZUdGNibHh1SUNBdktpb2dWRTlFVHpvZ1JuVnNiRDljYmlBZ0lDb3ZYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdRVUZHZFd4c1RtRnRaWE02SUZOMGNtbHVaMFJwWTNScGIyNWhjbmtnUFNCN1hHNGdJQ0FnSjBGc1lTYzZJQ2RCSnl4Y2JpQWdJQ0FuUVhKbkp6b2dKMUluTEZ4dUlDQWdJQ2RCYzI0bk9pQW5UaWNzWEc0Z0lDQWdKMEZ6Y0NjNklDZEVKeXhjYmlBZ0lDQW5RM2x6SnpvZ0owTW5MRnh1SUNBZ0lDZEhiRzRuT2lBblVTY3NYRzRnSUNBZ0owZHNkU2M2SUNkRkp5eGNiaUFnSUNBblIyeDVKem9nSjBjbkxGeHVJQ0FnSUNkSWFYTW5PaUFuU0Njc1hHNGdJQ0FnSjBsc1pTYzZJQ2RKSnl4Y2JpQWdJQ0FuVEdWMUp6b2dKMHduTEZ4dUlDQWdJQ2RNZVhNbk9pQW5TeWNzWEc0Z0lDQWdKMDFsZENjNklDZE5KeXhjYmlBZ0lDQW5VR2hsSnpvZ0owWW5MRnh1SUNBZ0lDZFFjbThuT2lBblVDY3NYRzRnSUNBZ0oxTmxjaWM2SUNkVEp5eGNiaUFnSUNBblZHaHlKem9nSjFRbkxGeHVJQ0FnSUNkVWNuQW5PaUFuVnljc1hHNGdJQ0FnSjFSNWNpYzZJQ2RaSnl4Y2JpQWdJQ0FuVm1Gc0p6b2dKMVluTEZ4dUlDQjlPMXh1WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nWjJWMFVHRnNaWFIwWlNoelkyaGxiV1U2SUhOMGNtbHVaeUE5SUNkbmNtOXJKeWs2SUZObGNWQmhiR1YwZEdVZ2UxeHVJQ0FnSUhOM2FYUmphQ0FvYzJOb1pXMWxLU0I3WEc0Z0lDQWdZMkZ6WlNBblozSnZheWM2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdRVzFwYm05aFkybGtjMUJoYkdWMGRHVnpMa2R5YjJ0SGNtOTFjSE03WEc0Z0lDQWdZMkZ6WlNBbmJHVnpheWM2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdRVzFwYm05aFkybGtjMUJoYkdWMGRHVnpMa3hsYzJzN1hHNGdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGdRMmhsYlZCaGJHVjBkR1U2SUhOamFHVnRaU0JjWEdBa2UzTmphR1Z0WlgxY1hHQWdaRzlsY3lCdWIzUWdaWGhwYzNSZ0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVbVYwZFhKdWN5QmthWFpwWkdWa0lHRnRhVzV2SUdGamFXUWdkMmwwYUNCcGRITWdZMjl1ZEdWdWRDQnBiaUIwYUdVZ1luSmhZMnRsZEN3Z2FXWWdkR2hsSUdOdmJuUmxiblFnYVhNZ2JuVnRZbVZ5TENCMGFHVnVJR2wwY3lCdmJXbDBkR1ZrWEc0Z0lDQXFYRzRnSUNBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCaklISmhkeUJoYldsdWIxeHVJQ0FnS2lCQWNtVjBkWEp1SUh0YmMzUnlhVzVuTENCemRISnBibWRkZlNCdmRYUmxjaUJoYm1RZ2FXNXVaWElnWTI5dWRHVnVkRnh1SUNBZ0tpOWNiaUFnY0hWaWJHbGpJSE4wWVhScFl5Qm5aWFJKYm01bGNrOTFkR1Z5S0dNNklITjBjbWx1WnlrNklGdHpkSEpwYm1jc0lITjBjbWx1WjEwZ2UxeHVJQ0FnSUd4bGRDQnBjMGx1Ym1WeUlEMGdNRHRjYmlBZ0lDQnNaWFFnYVc1dVpYSWdQU0FuSnp0Y2JpQWdJQ0JzWlhRZ2IzVjBaWElnUFNBbkp6dGNibHh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdZMmhoY2lCdlppQmpLU0I3WEc0Z0lDQWdJQ0JwWmlBb1kyaGhjaUE5UFNBbktDY3BYRzRnSUNBZ0lDQWdJR2x6U1c1dVpYSXJLenRjYmlBZ0lDQWdJR1ZzYzJVZ2FXWWdLR05vWVhJZ1BUMGdKeWtuS1Z4dUlDQWdJQ0FnSUNCcGMwbHVibVZ5TFMwN1hHNGdJQ0FnSUNCbGJITmxJR2xtSUNocGMwbHVibVZ5S1Z4dUlDQWdJQ0FnSUNCcGJtNWxjaUFyUFNCamFHRnlPMXh1SUNBZ0lDQWdaV3h6WlZ4dUlDQWdJQ0FnSUNCdmRYUmxjaUFyUFNCamFHRnlPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlBaGFYTk9ZVTRvY0dGeWMyVkpiblFvYVc1dVpYSXBLU0EvSUZ0dmRYUmxjaXdnSnlkZElEb2dXMjkxZEdWeUxDQnBibTVsY2wwN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUdkbGRFTnZiRzl5UVVGUWFYWnZkQ2h0YjI1dmJXVnlPaUJ6ZEhKcGJtY2dQU0FuSnl3Z2MyTm9aVzFsT2lBblozSnZheWNnUFNBblozSnZheWNwT2lCYmMzUnlhVzVuTENCemRISnBibWNzSUhOMGNtbHVaeXdnYm5WdFltVnlYU0I3WEc0Z0lDQWdMeTlqYjI1emRDQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxJRDBnUVVGUVlXeGxkSFJsY3k1SGNtOXJSM0p2ZFhCektDazdYRzRnSUNBZ1kyOXVjM1FnWTJobGJWQmhiR1YwZEdWSmJuTjBZVzVqWlNBOUlIUm9hWE11WjJWMFVHRnNaWFIwWlNoelkyaGxiV1VwTzF4dUlDQWdJR3hsZENCYmIzVjBaWEpOYjI1dmJXVnlMQ0JwYm01bGNrMXZibTl0WlhKZElEMGdkR2hwY3k1blpYUkpibTVsY2s5MWRHVnlLRzF2Ym05dFpYSXBPMXh1SUNBZ0lHOTFkR1Z5VFc5dWIyMWxjaUE5SUNodmRYUmxjazF2Ym05dFpYSXViR1Z1WjNSb0lENGdOaUEvSUdBa2UyOTFkR1Z5VFc5dWIyMWxjaTV6YkdsalpTZ3dMQ0F6S1gwdUxpNWdJRG9nYjNWMFpYSk5iMjV2YldWeUtUdGNiaUFnSUNCcGJtNWxjazF2Ym05dFpYSWdQU0FvYVc1dVpYSk5iMjV2YldWeUxteGxibWQwYUNBK0lEWWdQeUJnSkh0cGJtNWxjazF2Ym05dFpYSXVjMnhwWTJVb01Dd2dNeWw5TGk0dVlDQTZJR2x1Ym1WeVRXOXViMjFsY2lrN1hHNWNiaUFnSUNCcFppQW9iVzl1YjIxbGNpNXNaVzVuZEdnZ1BUMGdNU0I4ZkNCdGIyNXZiV1Z5V3pGZElEMDlJQ2NvSnlrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWVcxcGJtOGdQU0J0YjI1dmJXVnlXekJkUHk1MGIxVndjR1Z5UTJGelpTZ3BJVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmhiV2x1YnlCcGJpQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxJRDljYmlBZ0lDQWdJQ0FnVzJOb1pXMVFZV3hsZEhSbFNXNXpkR0Z1WTJVdVoyVjBLR0Z0YVc1dktTd2dZVzFwYm04c0lHbHVibVZ5VFc5dWIyMWxjaXdnTVYwZ09seHVJQ0FnSUNBZ0lDQmJkR2hwY3k1MWJtUmxabWx1WldSRGIyeHZjaXdnYjNWMFpYSk5iMjV2YldWeUxDQnBibTVsY2sxdmJtOXRaWElzSURGZE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaHRiMjV2YldWeVd6QmRJRDA5SUNka0p5QW1KaUJ0YjI1dmJXVnlXekZkSVNCcGJpQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxLU0I3WEc0Z0lDQWdJQ0JwWmlBb2JXOXViMjFsY2k1c1pXNW5kR2dnUFQwZ01pQjhmQ0J0YjI1dmJXVnlXekpkSUQwOUlDY29KeWtnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JoYldsdWJ5QTlJRzF2Ym05dFpYSmJNVjAvTG5SdlZYQndaWEpEWVhObEtDa2hPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZVzFwYm04Z2FXNGdZMmhsYlZCaGJHVjBkR1ZKYm5OMFlXNWpaU0EvWEc0Z0lDQWdJQ0FnSUNBZ1cyTm9aVzFRWVd4bGRIUmxTVzV6ZEdGdVkyVXVaMlYwS0dGdGFXNXZLU3dnWVcxcGJtOHNJR2x1Ym1WeVRXOXViMjFsY2l3Z01sMGdPbHh1SUNBZ0lDQWdJQ0FnSUZ0MGFHbHpMblZ1WkdWbWFXNWxaRU52Ykc5eUxDQnZkWFJsY2sxdmJtOXRaWElzSUdsdWJtVnlUVzl1YjIxbGNpd2dNbDA3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0cxdmJtOXRaWEl1YzNWaWMzUnlhVzVuS0RBc0lETXBJR2x1SUhSb2FYTXVRVUZHZFd4c1RtRnRaWE1wSUh0Y2JpQWdJQ0FnSUdsbUlDaHRiMjV2YldWeUxteGxibWQwYUNBOVBTQXpJSHg4SUcxdmJtOXRaWEpiTTEwZ1BUMGdKeWduS1NCN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUdGdGFXNXZJRDBnZEdocGN5NUJRVVoxYkd4T1lXMWxjMXR0YjI1dmJXVnlMbk4xWW5OMGNtbHVaeWd3TENBektWMDdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhiV2x1YnlCcGJpQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxJRDljYmlBZ0lDQWdJQ0FnSUNCYlkyaGxiVkJoYkdWMGRHVkpibk4wWVc1alpTNW5aWFFvWVcxcGJtOHBMQ0JoYldsdWJ5d2dhVzV1WlhKTmIyNXZiV1Z5TENBelhTQTZYRzRnSUNBZ0lDQWdJQ0FnVzNSb2FYTXVkVzVrWldacGJtVmtRMjlzYjNJc0lHOTFkR1Z5VFc5dWIyMWxjaXdnYVc1dVpYSk5iMjV2YldWeUxDQXpYVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvYlc5dWIyMWxjbHN3WFQ4dWRHOU1iM2RsY2tOaGMyVW9LU0E5UFNCdGIyNXZiV1Z5V3pCZEtTQjdYRzRnSUNBZ0lDQnBaaUFvYlc5dWIyMWxjaTV6ZFdKemRISnBibWNvTVN3Z015a2dhVzRnZEdocGN5NUJRVVoxYkd4T1lXMWxjeWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9iVzl1YjIxbGNpNXNaVzVuZEdnZ1BUMGdOQ0I4ZkNCdGIyNXZiV1Z5V3pSZElEMDlJQ2NvSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR052Ym5OMElHRnRhVzV2SUQwZ2RHaHBjeTVCUVVaMWJHeE9ZVzFsYzF0dGIyNXZiV1Z5TG5OMVluTjBjbWx1WnlneExDQXpLVjA3WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdGdGFXNXZJR2x1SUdOb1pXMVFZV3hsZEhSbFNXNXpkR0Z1WTJVZ1AxeHVJQ0FnSUNBZ0lDQWdJQ0FnVzJOb1pXMVFZV3hsZEhSbFNXNXpkR0Z1WTJVdVoyVjBLR0Z0YVc1dktTd2dZVzFwYm04c0lHbHVibVZ5VFc5dWIyMWxjaXdnTkYwZ09seHVJQ0FnSUNBZ0lDQWdJQ0FnVzNSb2FYTXVkVzVrWldacGJtVmtRMjlzYjNJc0lHOTFkR1Z5VFc5dWIyMWxjaXdnYVc1dVpYSk5iMjV2YldWeUxDQTBYVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQmJkR2hwY3k1MWJtUmxabWx1WldSRGIyeHZjaXdnYjNWMFpYSk5iMjV2YldWeUxDQnBibTVsY2sxdmJtOXRaWElzSURCZE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0IHsgU2VxUGFsZXR0ZUJhc2UgfSBmcm9tICcuL3NlcS1wYWxldHRlcyc7XG5leHBvcnQgY2xhc3MgTnVjbGVvdGlkZXNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgICBzdGF0aWMgZ2V0IENocm9tYXRvZ3JhbSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hyb21hdG9ncmFtID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHRoaXMuY2hyb21hdG9ncmFtID0gbmV3IE51Y2xlb3RpZGVzUGFsZXR0ZXMoe1xuICAgICAgICAgICAgICAgICdBJzogJ2dyZWVuJyxcbiAgICAgICAgICAgICAgICAnQyc6ICdibHVlJyxcbiAgICAgICAgICAgICAgICAnRyc6ICdibGFjaycsXG4gICAgICAgICAgICAgICAgJ1QnOiAncmVkJyxcbiAgICAgICAgICAgICAgICAnVSc6ICdyZWQnLFxuICAgICAgICAgICAgICAgICdvdGhlcnMnOiAnZ3JheScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaHJvbWF0b2dyYW07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE51Y2xlb3RpZGVzIHtcbn1cbk51Y2xlb3RpZGVzLlNlbVR5cGUgPSAnTnVjbGVvdGlkZXMnO1xuTnVjbGVvdGlkZXMuU2VtVHlwZU11bHRpcGxlQWxpZ25tZW50ID0gJ051Y2xlb3RpZGVzTXVsdGlwbGVBbGlnbm1lbnQnO1xuTnVjbGVvdGlkZXMuTmFtZXMgPSB7XG4gICAgJ0EnOiAnQWRlbmluZScsXG4gICAgJ0MnOiAnQ3l0b3NpbmUnLFxuICAgICdHJzogJ0d1YW5pbmUnLFxuICAgICdUJzogJ1RoeW1pbmUnLFxuICAgICdVJzogJ1VyYWNpbCcsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYm5WamJHVnZkR2xrWlhNdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUp1ZFdOc1pXOTBhV1JsY3k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkxRU3hQUVVGUExFVkJRV0VzWTBGQll5eEZRVUZETEUxQlFVMHNaMEpCUVdkQ0xFTkJRVU03UVVGRk1VUXNUVUZCVFN4UFFVRlBMRzFDUVVGdlFpeFRRVUZSTEdOQlFXTTdTVUZIT1VNc1RVRkJUU3hMUVVGTExGbEJRVms3VVVGRE5VSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1dVRkJXU3hMUVVGTExFdEJRVXNzUTBGQlF5eEZRVUZGTzFsQlEyaERMRWxCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzU1VGQlNTeHRRa0ZCYlVJc1EwRkJRenRuUWtGRE1VTXNSMEZCUnl4RlFVRkZMRTlCUVU4N1owSkJRMW9zUjBGQlJ5eEZRVUZGTEUxQlFVMDdaMEpCUTFnc1IwRkJSeXhGUVVGRkxFOUJRVTg3WjBKQlExb3NSMEZCUnl4RlFVRkZMRXRCUVVzN1owSkJRMVlzUjBGQlJ5eEZRVUZGTEV0QlFVczdaMEpCUTFZc1VVRkJVU3hGUVVGRkxFMUJRVTA3WVVGRGFrSXNRMEZCUXl4RFFVRkRPMU5CUTBvN1VVRkRSQ3hQUVVGUExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTTdTVUZETTBJc1EwRkJRenREUVVOR08wRkJSVVFzVFVGQlRTeFBRVUZQTEZkQlFWYzdPMEZCUTA0c2JVSkJRVThzUjBGQlZ5eGhRVUZoTEVOQlFVTTdRVUZGYUVNc2IwTkJRWGRDTEVkQlFWY3NPRUpCUVRoQ0xFTkJRVU03UVVGRmNFVXNhVUpCUVVzc1IwRkJjVUk3U1VGRGRFTXNSMEZCUnl4RlFVRkZMRk5CUVZNN1NVRkRaQ3hIUVVGSExFVkJRVVVzVlVGQlZUdEpRVU5tTEVkQlFVY3NSVUZCUlN4VFFVRlRPMGxCUTJRc1IwRkJSeXhGUVVGRkxGTkJRVk03U1VGRFpDeEhRVUZITEVWQlFVVXNVVUZCVVR0RFFVTmtMRU5CUVVNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJSFZwSUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5MWFTYzdYRzVwYlhCdmNuUWdLaUJoY3lCRVJ5Qm1jbTl0SUNka1lYUmhaM0p2YXkxaGNHa3ZaR2NuTzF4dVhHNXBiWEJ2Y25RZ2UxTjBjbWx1WjBScFkzUnBiMjVoY25sOUlHWnliMjBnSjBCa1lYUmhaM0p2YXkxc2FXSnlZWEpwWlhNdmRYUnBiSE12YzNKakwzUjVjR1V0WkdWamJHRnlZWFJwYjI1ekp6dGNibWx0Y0c5eWRDQjdVMlZ4VUdGc1pYUjBaU3dnVTJWeFVHRnNaWFIwWlVKaGMyVjlJR1p5YjIwZ0p5NHZjMlZ4TFhCaGJHVjBkR1Z6Snp0Y2JseHVaWGh3YjNKMElHTnNZWE56SUU1MVkyeGxiM1JwWkdWelVHRnNaWFIwWlhNZ1pYaDBaVzVrY3lCVFpYRlFZV3hsZEhSbFFtRnpaU0I3WEc0Z0lIQnlhWFpoZEdVZ2MzUmhkR2xqSUdOb2NtOXRZWFJ2WjNKaGJUb2dVMlZ4VUdGc1pYUjBaVHRjYmx4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUdkbGRDQkRhSEp2YldGMGIyZHlZVzBvS1RvZ1UyVnhVR0ZzWlhSMFpTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdVkyaHliMjFoZEc5bmNtRnRJRDA5UFNCMmIybGtJREFwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVZMmh5YjIxaGRHOW5jbUZ0SUQwZ2JtVjNJRTUxWTJ4bGIzUnBaR1Z6VUdGc1pYUjBaWE1vZTF4dUlDQWdJQ0FnSUNBblFTYzZJQ2RuY21WbGJpY3NYRzRnSUNBZ0lDQWdJQ2RESnpvZ0oySnNkV1VuTEZ4dUlDQWdJQ0FnSUNBblJ5YzZJQ2RpYkdGamF5Y3NJQzh2SUc5eVlXNW5aU0EvWEc0Z0lDQWdJQ0FnSUNkVUp6b2dKM0psWkNjc1hHNGdJQ0FnSUNBZ0lDZFZKem9nSjNKbFpDY3NYRzRnSUNBZ0lDQWdJQ2R2ZEdobGNuTW5PaUFuWjNKaGVTY3NYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMmh5YjIxaGRHOW5jbUZ0TzF4dUlDQjlYRzU5WEc1Y2JtVjRjRzl5ZENCamJHRnpjeUJPZFdOc1pXOTBhV1JsY3lCN1hHNGdJSE4wWVhScFl5QnlaV0ZrYjI1c2VTQlRaVzFVZVhCbE9pQnpkSEpwYm1jZ1BTQW5UblZqYkdWdmRHbGtaWE1uTzF4dVhHNGdJSE4wWVhScFl5QnlaV0ZrYjI1c2VTQlRaVzFVZVhCbFRYVnNkR2x3YkdWQmJHbG5ibTFsYm5RNklITjBjbWx1WnlBOUlDZE9kV05zWlc5MGFXUmxjMDExYkhScGNHeGxRV3hwWjI1dFpXNTBKenRjYmx4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUU1aGJXVnpPaUJUZEhKcGJtZEVhV04wYVc5dVlYSjVJRDBnZTF4dUlDQWdJQ2RCSnpvZ0owRmtaVzVwYm1VbkxGeHVJQ0FnSUNkREp6b2dKME41ZEc5emFXNWxKeXhjYmlBZ0lDQW5SeWM2SUNkSGRXRnVhVzVsSnl4Y2JpQWdJQ0FuVkNjNklDZFVhSGx0YVc1bEp5eGNiaUFnSUNBblZTYzZJQ2RWY21GamFXd25MRnh1SUNCOU8xeHVmVnh1SWwxOSIsImV4cG9ydCBjbGFzcyBTZXFQYWxldHRlQmFzZSB7XG4gICAgc3RhdGljIG1ha2VQYWxldHRlKGR0LCBzaW1wbGlmaWVkID0gZmFsc2UsIFBhbGV0dGVUeXBlID0gU2VxUGFsZXR0ZUJhc2UpIHtcbiAgICAgICAgY29uc3QgcGFsZXR0ZSA9IHt9O1xuICAgICAgICBkdC5mb3JFYWNoKChjcCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqTGlzdCA9IGNwWzBdO1xuICAgICAgICAgICAgY29uc3QgY29sb3VyID0gY3BbMV07XG4gICAgICAgICAgICBvYmpMaXN0LmZvckVhY2goKG9iaiwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFsZXR0ZVtvYmpdID0gdGhpcy5jb2xvdXJQYWxldHRlW2NvbG91cl1bc2ltcGxpZmllZCA/IDAgOiBpbmRdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFBhbGV0dGVUeXBlKHBhbGV0dGUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihwYWxldHRlKSB7XG4gICAgICAgIHRoaXMuX3BhbGV0dGUgPSBwYWxldHRlO1xuICAgIH1cbiAgICBnZXQobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFsZXR0ZVttXTtcbiAgICB9XG59XG5TZXFQYWxldHRlQmFzZS51bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcbi8qKiBQYWxldHRlIHdpdGggc2hhZGVzIG9mIHByaW1hcnkgY29sb3JzICovXG5TZXFQYWxldHRlQmFzZS5jb2xvdXJQYWxldHRlID0ge1xuICAgICdvcmFuZ2UnOiBbJ3JnYigyNTUsMTg3LDEyMCknLCAncmdiKDI0NSwxNjcsMTAwKScsICdyZ2IoMjM1LDEzNyw3MCknLCAncmdiKDIwNSwgMTExLCA3MSknXSxcbiAgICAnYWxsX2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KScsICdyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsXG4gICAgICAgICdyZ2IoMjQsMTEwLDc5KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnYWxsX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDEyMiwgMTAyLCAxODkpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDE0MSwgMTI0LCAyMTcpJyxcbiAgICAgICAgJ3JnYigzMSwgMTIwLCAxNTApJ10sXG4gICAgJ21hZ2VudGEnOiBbJ3JnYigxNjIsMTA2LDE5MiknLCAncmdiKDE5NywxNjUsMjI0KScsICdyZ2IoMjA4LDExMywyMTgpJ10sXG4gICAgJ3JlZCc6IFsncmdiKDIxNCwzOSw0MCknLCAncmdiKDI1NSwxNTIsMTUwKSddLFxuICAgICdzdF9ibHVlJzogWydyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDE1OCwyMTgsMjI5KScsICdyZ2IoMzEsMTE5LDE4MCknXSxcbiAgICAnZGFya19ibHVlJzogWydyZ2IoMzEsMTE5LDE4MCknLCAncmdiKDMxLCAxMjAsIDE1MCknXSxcbiAgICAnbGlnaHRfYmx1ZSc6IFsncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDEwOCwgMjE4LCAyMjkpJywgJ3JnYigyMywxOTAsMjI3KSddLFxuICAgICdsaWxhY19ibHVlJzogWydyZ2IoMTI0LDEwMiwyMTEpJywgJ3JnYigxNDksMTM0LDIxNyknLCAncmdiKDk3LCA4MSwgMTUwKSddLFxuICAgICdkYXJrX2dyZWVuJzogWydyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsICdyZ2IoMjQsMTEwLDc5KSddLFxuICAgICdncmVlbic6IFsncmdiKDQ0LDE2MCw0NCknLCAncmdiKDc0LDE2MCw3NCknXSxcbiAgICAnbGlnaHRfZ3JlZW4nOiBbJ3JnYigxNTIsMjIzLDEzOCknLCAncmdiKDE4MiwgMjIzLCAxMzgpJywgJ3JnYigxNTIsIDE5MywgMTM4KSddLFxuICAgICdzdF9ncmVlbic6IFsncmdiKDQ0LDE2MCw0NCknLCAncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMzksIDE3NCwgOTYpJywgJ3JnYig3NCwxNjAsNzQpJ10sXG4gICAgJ3BpbmsnOiBbJ3JnYigyNDcsMTgyLDIxMCknXSxcbiAgICAnYnJvd24nOiBbJ3JnYigxNDAsODYsNzUpJywgJ3JnYigxMDIsIDYyLCA1NCknXSxcbiAgICAnZ3JheSc6IFsncmdiKDEyNywxMjcsMTI3KScsICdyZ2IoMTk5LDE5OSwxOTkpJywgJ3JnYigxOTYsMTU2LDE0OCknLCAncmdiKDIyMiwgMjIyLCAxODApJ10sXG4gICAgJ3llbGxvdyc6IFsncmdiKDE4OCwxODksMzQpJ10sXG4gICAgJ3doaXRlJzogWydyZ2IoMjMwLDIzMCwyMzApJ10sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYzJWeExYQmhiR1YwZEdWekxtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpYzJWeExYQmhiR1YwZEdWekxuUnpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRV2xDUVN4TlFVRk5MRTlCUVU4c1kwRkJZenRKUVRKQ1ppeE5RVUZOTEVOQlFVTXNWMEZCVnl4RFFVRkRMRVZCUVhkQ0xFVkJRMjVFTEZWQlFWVXNSMEZCUnl4TFFVRkxMRVZCUVVVc1kwRkJjVU1zWTBGQll6dFJRVVYyUlN4TlFVRk5MRTlCUVU4c1IwRkJPRUlzUlVGQlJTeERRVUZETzFGQlF6bERMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNSVUZCUlR0WlFVTm9RaXhOUVVGTkxFOUJRVThzUjBGQlJ5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRkRUlzVFVGQlRTeE5RVUZOTEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRM0pDTEU5QlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVWQlFVVTdaMEpCUXpOQ0xFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1lVRkJZU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTnNSU3hEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU5NTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTBnc1QwRkJUeXhKUVVGSkxGZEJRVmNzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0SlFVTnNReXhEUVVGRE8wbEJTVVFzV1VGQldTeFBRVUZuUXp0UlFVTXhReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXp0SlFVTXhRaXhEUVVGRE8wbEJSVTBzUjBGQlJ5eERRVUZETEVOQlFWTTdVVUZEYkVJc1QwRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUXpGQ0xFTkJRVU03TzBGQmFFUmhMRFpDUVVGakxFZEJRVWNzYTBKQlFXdENMRU5CUVVNN1FVRkZiRVFzTkVOQlFUUkRPMEZCUXpsQ0xEUkNRVUZoTEVkQlFXZERPMGxCUTNwRUxGRkJRVkVzUlVGQlJTeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxHdENRVUZyUWl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEcxQ1FVRnRRaXhEUVVGRE8wbEJRekZHTEZkQlFWY3NSVUZCUlN4RFFVRkRMR2RDUVVGblFpeEZRVUZGTEdkQ1FVRm5RaXhGUVVGRkxHZENRVUZuUWl4RlFVRkZMR2RDUVVGblFpeEZRVUZGTEdkQ1FVRm5RanRSUVVOd1J5eG5Ra0ZCWjBJc1JVRkJSU3hyUWtGQmEwSXNSVUZCUlN4dlFrRkJiMElzUlVGQlJTeHZRa0ZCYjBJc1EwRkJRenRKUVVOdVJpeFZRVUZWTEVWQlFVVXNRMEZCUXl4cFFrRkJhVUlzUlVGQlJTeHBRa0ZCYVVJc1JVRkJSU3h2UWtGQmIwSXNSVUZCUlN4clFrRkJhMElzUlVGQlJTeHZRa0ZCYjBJN1VVRkRMMGNzYlVKQlFXMUNMRU5CUVVNN1NVRkRkRUlzVTBGQlV5eEZRVUZGTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzYTBKQlFXdENMRVZCUVVVc2EwSkJRV3RDTEVOQlFVTTdTVUZEZGtVc1MwRkJTeXhGUVVGRkxFTkJRVU1zWjBKQlFXZENMRVZCUVVVc2EwSkJRV3RDTEVOQlFVTTdTVUZETjBNc1UwRkJVeXhGUVVGRkxFTkJRVU1zYVVKQlFXbENMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNhVUpCUVdsQ0xFTkJRVU03U1VGRGNrVXNWMEZCVnl4RlFVRkZMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNiVUpCUVcxQ0xFTkJRVU03U1VGRGNrUXNXVUZCV1N4RlFVRkZMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzYjBKQlFXOUNMRVZCUVVVc2FVSkJRV2xDTEVOQlFVTTdTVUZET1VZc1dVRkJXU3hGUVVGRkxFTkJRVU1zYTBKQlFXdENMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNhMEpCUVd0Q0xFTkJRVU03U1VGRE1VVXNXVUZCV1N4RlFVRkZMRU5CUVVNc1owSkJRV2RDTEVWQlFVVXNaMEpCUVdkQ0xFVkJRVVVzWjBKQlFXZENMRVZCUVVVc1owSkJRV2RDTEVOQlFVTTdTVUZEZEVZc1QwRkJUeXhGUVVGRkxFTkJRVU1zWjBKQlFXZENMRVZCUVVVc1owSkJRV2RDTEVOQlFVTTdTVUZETjBNc1lVRkJZU3hGUVVGRkxFTkJRVU1zYTBKQlFXdENMRVZCUVVVc2IwSkJRVzlDTEVWQlFVVXNiMEpCUVc5Q0xFTkJRVU03U1VGREwwVXNWVUZCVlN4RlFVRkZMRU5CUVVNc1owSkJRV2RDTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzYTBKQlFXdENMRVZCUVVVc1owSkJRV2RDTEVOQlFVTTdTVUZEZUVZc1RVRkJUU3hGUVVGRkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNN1NVRkROVUlzVDBGQlR5eEZRVUZGTEVOQlFVTXNaMEpCUVdkQ0xFVkJRVVVzYTBKQlFXdENMRU5CUVVNN1NVRkRMME1zVFVGQlRTeEZRVUZGTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzYTBKQlFXdENMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNiMEpCUVc5Q0xFTkJRVU03U1VGRE1VWXNVVUZCVVN4RlFVRkZMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTTdTVUZETjBJc1QwRkJUeXhGUVVGRkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNN1EwRkRPVUlzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQXFJR0Z6SUdkeWIyc2dabkp2YlNBblpHRjBZV2R5YjJzdFlYQnBMMmR5YjJzbk8xeHVhVzF3YjNKMElDb2dZWE1nZFdrZ1puSnZiU0FuWkdGMFlXZHliMnN0WVhCcEwzVnBKenRjYm1sdGNHOXlkQ0FxSUdGeklFUkhJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzlrWnljN1hHNWNibVY0Y0c5eWRDQnBiblJsY21aaFkyVWdVMlZ4VUdGc1pYUjBaU0I3WEc0Z0lDOHZJRlJvWlhKbElHRnlaU0IwYjI4Z2JYVmphQ0J3Y205aWJHVnRJSGRwZEdnZ2FXNWtaWGhsY2lCd2NtOXdaWEowZVNCcGJpQjBlWEJsYzJOeWFYQjBMbHh1SUNBdkx5QXZLaXBjYmlBZ0x5OGdJQ29nUUhCaGNtRnRJSHR6ZEhKcGJtZDlJRzBnVFc5dWIyMWxjaUJqYUdGeVlXTjBaWEpjYmlBZ0x5OGdJQ29nUUhKbGRIVnliaUI3YzNSeWFXNW5mU0JEYjJ4dmNseHVJQ0F2THlBZ0tpOWNiaUFnTHk4Z1cyMDZJSE4wY21sdVoxMDZJSE4wY21sdVp6dGNiaUFnTHlvcUlFMXZibTl0WlhJZ1kyOXNiM0pjYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlHMGdUVzl1YjIxbGNseHVJQ0FnS2k5Y2JpQWdaMlYwS0cwNklITjBjbWx1WnlrNklITjBjbWx1Wnp0Y2JuMWNibHh1Wlhod2IzSjBJR05zWVhOeklGTmxjVkJoYkdWMGRHVkNZWE5sSUdsdGNHeGxiV1Z1ZEhNZ1UyVnhVR0ZzWlhSMFpTQjdYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdkVzVrWldacGJtVmtRMjlzYjNJZ1BTQW5jbWRpS0RFd01Dd3hNREFzTVRBd0tTYzdYRzVjYmlBZ0x5b3FJRkJoYkdWMGRHVWdkMmwwYUNCemFHRmtaWE1nYjJZZ2NISnBiV0Z5ZVNCamIyeHZjbk1nS2k5Y2JpQWdjSFZpYkdsaklITjBZWFJwWXlCamIyeHZkWEpRWVd4bGRIUmxPaUI3SUZ0clpYazZJSE4wY21sdVoxMDZJSE4wY21sdVoxdGRJSDBnUFNCN1hHNGdJQ0FnSjI5eVlXNW5aU2M2SUZzbmNtZGlLREkxTlN3eE9EY3NNVEl3S1Njc0lDZHlaMklvTWpRMUxERTJOeXd4TURBcEp5d2dKM0puWWlneU16VXNNVE0zTERjd0tTY3NJQ2R5WjJJb01qQTFMQ0F4TVRFc0lEY3hLU2RkTEZ4dUlDQWdJQ2RoYkd4ZlozSmxaVzRuT2lCYkozSm5ZaWcwTkN3eE5qQXNORFFwSnl3Z0ozSm5ZaWczTkN3eE5qQXNOelFwSnl3Z0ozSm5ZaWd5TXl3eE1ETXNOVGNwSnl3Z0ozSm5ZaWd6TUN3eE1UQXNPVFlwSnl3Z0ozSm5ZaWcyTUN3eE16RXNPVFVwSnl4Y2JpQWdJQ0FnSUNkeVoySW9NalFzTVRFd0xEYzVLU2NzSUNkeVoySW9NVFV5TERJeU15d3hNemdwSnl3Z0ozSm5ZaWd4T0RJc0lESXlNeXdnTVRNNEtTY3NJQ2R5WjJJb01UVXlMQ0F4T1RNc0lERXpPQ2tuWFN4Y2JpQWdJQ0FuWVd4c1gySnNkV1VuT2lCYkozSm5ZaWd6TVN3eE1Ua3NNVGd3S1Njc0lDZHlaMklvTWpNc01Ua3dMREl3TnlrbkxDQW5jbWRpS0RFeU1pd2dNVEF5TENBeE9Ea3BKeXdnSjNKbllpZ3hOVGdzTWpFNExESXlPU2tuTENBbmNtZGlLREUwTVN3Z01USTBMQ0F5TVRjcEp5eGNiaUFnSUNBZ0lDZHlaMklvTXpFc0lERXlNQ3dnTVRVd0tTZGRMRnh1SUNBZ0lDZHRZV2RsYm5SaEp6b2dXeWR5WjJJb01UWXlMREV3Tml3eE9USXBKeXdnSjNKbllpZ3hPVGNzTVRZMUxESXlOQ2tuTENBbmNtZGlLREl3T0N3eE1UTXNNakU0S1NkZExGeHVJQ0FnSUNkeVpXUW5PaUJiSjNKbllpZ3lNVFFzTXprc05EQXBKeXdnSjNKbllpZ3lOVFVzTVRVeUxERTFNQ2tuWFN4Y2JpQWdJQ0FuYzNSZllteDFaU2M2SUZzbmNtZGlLREl6TERFNU1Dd3lNRGNwSnl3Z0ozSm5ZaWd4TlRnc01qRTRMREl5T1NrbkxDQW5jbWRpS0RNeExERXhPU3d4T0RBcEoxMHNYRzRnSUNBZ0oyUmhjbXRmWW14MVpTYzZJRnNuY21kaUtETXhMREV4T1N3eE9EQXBKeXdnSjNKbllpZ3pNU3dnTVRJd0xDQXhOVEFwSjEwc1hHNGdJQ0FnSjJ4cFoyaDBYMkpzZFdVbk9pQmJKM0puWWlneU15d3hPVEFzTWpBM0tTY3NJQ2R5WjJJb01UVTRMREl4T0N3eU1qa3BKeXdnSjNKbllpZ3hNRGdzSURJeE9Dd2dNakk1S1Njc0lDZHlaMklvTWpNc01Ua3dMREl5TnlrblhTeGNiaUFnSUNBbmJHbHNZV05mWW14MVpTYzZJRnNuY21kaUtERXlOQ3d4TURJc01qRXhLU2NzSUNkeVoySW9NVFE1TERFek5Dd3lNVGNwSnl3Z0ozSm5ZaWc1Tnl3Z09ERXNJREUxTUNrblhTeGNiaUFnSUNBblpHRnlhMTluY21WbGJpYzZJRnNuY21kaUtESXpMREV3TXl3MU55a25MQ0FuY21kaUtETXdMREV4TUN3NU5pa25MQ0FuY21kaUtEWXdMREV6TVN3NU5Ta25MQ0FuY21kaUtESTBMREV4TUN3M09Ta25YU3hjYmlBZ0lDQW5aM0psWlc0bk9pQmJKM0puWWlnME5Dd3hOakFzTkRRcEp5d2dKM0puWWlnM05Dd3hOakFzTnpRcEoxMHNYRzRnSUNBZ0oyeHBaMmgwWDJkeVpXVnVKem9nV3lkeVoySW9NVFV5TERJeU15d3hNemdwSnl3Z0ozSm5ZaWd4T0RJc0lESXlNeXdnTVRNNEtTY3NJQ2R5WjJJb01UVXlMQ0F4T1RNc0lERXpPQ2tuWFN4Y2JpQWdJQ0FuYzNSZlozSmxaVzRuT2lCYkozSm5ZaWcwTkN3eE5qQXNORFFwSnl3Z0ozSm5ZaWd4TlRJc01qSXpMREV6T0NrbkxDQW5jbWRpS0RNNUxDQXhOelFzSURrMktTY3NJQ2R5WjJJb056UXNNVFl3TERjMEtTZGRMRnh1SUNBZ0lDZHdhVzVySnpvZ1d5ZHlaMklvTWpRM0xERTRNaXd5TVRBcEoxMHNYRzRnSUNBZ0oySnliM2R1SnpvZ1d5ZHlaMklvTVRRd0xEZzJMRGMxS1Njc0lDZHlaMklvTVRBeUxDQTJNaXdnTlRRcEoxMHNYRzRnSUNBZ0oyZHlZWGtuT2lCYkozSm5ZaWd4TWpjc01USTNMREV5TnlrbkxDQW5jbWRpS0RFNU9Td3hPVGtzTVRrNUtTY3NJQ2R5WjJJb01UazJMREUxTml3eE5EZ3BKeXdnSjNKbllpZ3lNaklzSURJeU1pd2dNVGd3S1NkZExGeHVJQ0FnSUNkNVpXeHNiM2NuT2lCYkozSm5ZaWd4T0Rnc01UZzVMRE0wS1NkZExGeHVJQ0FnSUNkM2FHbDBaU2M2SUZzbmNtZGlLREl6TUN3eU16QXNNak13S1NkZExGeHVJQ0I5TzF4dVhHNGdJSEJ5YjNSbFkzUmxaQ0J6ZEdGMGFXTWdiV0ZyWlZCaGJHVjBkR1VvWkhRNklGdHpkSEpwYm1kYlhTd2djM1J5YVc1blhWdGRMRnh1SUNBZ0lITnBiWEJzYVdacFpXUWdQU0JtWVd4elpTd2dVR0ZzWlhSMFpWUjVjR1U2SUhSNWNHVnZaaUJUWlhGUVlXeGxkSFJsUW1GelpTQTlJRk5sY1ZCaGJHVjBkR1ZDWVhObFhHNGdJQ2tnZTF4dUlDQWdJR052Ym5OMElIQmhiR1YwZEdVNklIc2dXMnRsZVRvZ2MzUnlhVzVuWFRvZ2MzUnlhVzVuSUgwZ1BTQjdmVHRjYmlBZ0lDQmtkQzVtYjNKRllXTm9LQ2hqY0NrZ1BUNGdlMXh1SUNBZ0lDQWdZMjl1YzNRZ2IySnFUR2x6ZENBOUlHTndXekJkTzF4dUlDQWdJQ0FnWTI5dWMzUWdZMjlzYjNWeUlEMGdZM0JiTVYwN1hHNGdJQ0FnSUNCdlltcE1hWE4wTG1admNrVmhZMmdvS0c5aWFpd2dhVzVrS1NBOVBpQjdYRzRnSUNBZ0lDQWdJSEJoYkdWMGRHVmJiMkpxWFNBOUlIUm9hWE11WTI5c2IzVnlVR0ZzWlhSMFpWdGpiMnh2ZFhKZFczTnBiWEJzYVdacFpXUWdQeUF3SURvZ2FXNWtYVHRjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDBwTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVUdGc1pYUjBaVlI1Y0dVb2NHRnNaWFIwWlNrN1hHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElISmxZV1J2Ym14NUlGOXdZV3hsZEhSbE9pQjdJRnR0T2lCemRISnBibWRkT2lCemRISnBibWNnZlR0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2lod1lXeGxkSFJsT2lCN0lGdHRPaUJ6ZEhKcGJtZGRPaUJ6ZEhKcGJtY2dmU2tnZTF4dUlDQWdJSFJvYVhNdVgzQmhiR1YwZEdVZ1BTQndZV3hsZEhSbE8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklHZGxkQ2h0T2lCemRISnBibWNwT2lCemRISnBibWNnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5d1lXeGxkSFJsVzIxZE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbi8qKiBtYWtlcyB0aGUgY29sb3IgbGVzcyB3aGl0ZSwgbWFrZXMgdGhlIHRyYW5zcGFyZW5jeSBlZmZlY3QgYWx3YXlzIHBlcmNlcHRpYmxlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgeCBjb29yZGluYXRlLlxuICogKi9cbmZ1bmN0aW9uIGNvcnJlY3RDb2xvcihjb2xvcikge1xuICAgIGlmIChjb2xvciA9PSBudWxsKVxuICAgICAgICByZXR1cm4gJ3JnYigxMDAsMTAwLDEwMCknO1xuICAgIGNvbnN0IGRnQ29sb3IgPSBERy5Db2xvci5mcm9tSHRtbChjb2xvcik7XG4gICAgY29uc3QgZyA9IERHLkNvbG9yLmcoZGdDb2xvcik7XG4gICAgY29uc3QgciA9IERHLkNvbG9yLnIoZGdDb2xvcik7XG4gICAgY29uc3QgYiA9IERHLkNvbG9yLmIoZGdDb2xvcik7XG4gICAgLy8gY2FsY3VsYXRlIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byB3aGl0ZVxuICAgIGNvbnN0IGRpc3RUb0JsYWNrID0gTWF0aC5zcXJ0KE1hdGgucG93KDAgLSByLCAyKSArIE1hdGgucG93KDAgLSBnLCAyKSArIE1hdGgucG93KDAgLSBiLCAyKSk7XG4gICAgLy8gbm9ybWFsaXplIHZlY3RvciByIGcgYlxuICAgIGNvbnN0IG5vcm1SID0gciAvIGRpc3RUb0JsYWNrO1xuICAgIGNvbnN0IG5vcm1HID0gZyAvIGRpc3RUb0JsYWNrO1xuICAgIGNvbnN0IG5vcm1CID0gYiAvIGRpc3RUb0JsYWNrO1xuICAgIGlmIChkaXN0VG9CbGFjayA+IDIxMCkge1xuICAgICAgICByZXR1cm4gYHJnYigke25vcm1SICogMjEwfSwke25vcm1HICogMjEwfSwke25vcm1CICogMjEwfSlgO1xuICAgIH1cbiAgICByZXR1cm4gREcuQ29sb3IudG9SZ2IoZGdDb2xvcik7XG59XG5leHBvcnQgY2xhc3MgU3RyaW5nVXRpbHMge1xuICAgIHN0YXRpYyBoYXNoQ29kZShzKSB7XG4gICAgICAgIGxldCBoYXNoID0gMDtcbiAgICAgICAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hyID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgICAgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG59XG5pbXBvcnQgeyBTZXFQYWxldHRlQmFzZSB9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcbmV4cG9ydCBjbGFzcyBVbmtub3duU2VxUGFsZXR0ZSB7XG59XG5leHBvcnQgY2xhc3MgR3JheUFsbFBhbGV0dGUgZXh0ZW5kcyBVbmtub3duU2VxUGFsZXR0ZSB7XG4gICAgZ2V0KG0pIHtcbiAgICAgICAgcmV0dXJuICcjNjY2NjY2JztcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbG9yUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgICBzdGF0aWMgYnVpbGRQYWxldHRlKCkge1xuICAgICAgICBjb25zdCByZXMgPSBbXS5jb25jYXQoLi4uT2JqZWN0LnZhbHVlcyhTZXFQYWxldHRlQmFzZS5jb2xvdXJQYWxldHRlKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGdldChtKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBTdHJpbmdVdGlscy5oYXNoQ29kZShtKTtcbiAgICAgICAgY29uc3QgcEkgPSBoYXNoICUgVW5rbm93bkNvbG9yUGFsZXR0ZS5wYWxldHRlLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGNvcnJlY3RDb2xvcihVbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGVbcEldKTtcbiAgICB9XG59XG5Vbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGUgPSBVbmtub3duQ29sb3JQYWxldHRlLmJ1aWxkUGFsZXR0ZSgpO1xuZXhwb3J0IGNsYXNzIFVua25vd25TZXFQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgICBzdGF0aWMgZ2V0IEdyYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYXkgPT09IHZvaWQgMClcbiAgICAgICAgICAgIHRoaXMuZ3JheSA9IG5ldyBHcmF5QWxsUGFsZXR0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncmF5O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IENvbG9yKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xvciA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IG5ldyBVbmtub3duQ29sb3JQYWxldHRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRXNXJibTkzYmk1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJblZ1YTI1dmQyNHVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUlVFc1QwRkJUeXhMUVVGTExFVkJRVVVzVFVGQlRTeHBRa0ZCYVVJc1EwRkJRenRCUVVWMFF6czdTMEZGU3p0QlFVTk1MRk5CUVZNc1dVRkJXU3hEUVVGRExFdEJRVzlDTzBsQlEzaERMRWxCUVVrc1MwRkJTeXhKUVVGSkxFbEJRVWs3VVVGRFppeFBRVUZQTEd0Q1FVRnJRaXhEUVVGRE8wbEJSVFZDTEUxQlFVMHNUMEZCVHl4SFFVRlhMRVZCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMGxCUTJwRUxFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBsQlF6bENMRTFCUVUwc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8wbEJRemxDTEUxQlFVMHNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMGxCUXpsQ0xIZERRVUYzUXp0SlFVTjRReXhOUVVGTkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZETlVZc2VVSkJRWGxDTzBsQlEzcENMRTFCUVUwc1MwRkJTeXhIUVVGSExFTkJRVU1zUjBGQlJ5eFhRVUZYTEVOQlFVTTdTVUZET1VJc1RVRkJUU3hMUVVGTExFZEJRVWNzUTBGQlF5eEhRVUZITEZkQlFWY3NRMEZCUXp0SlFVTTVRaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eERRVUZETEVkQlFVY3NWMEZCVnl4RFFVRkRPMGxCUXpsQ0xFbEJRVWtzVjBGQlZ5eEhRVUZITEVkQlFVY3NSVUZCUlR0UlFVTnlRaXhQUVVGUExFOUJRVThzUzBGQlN5eEhRVUZITEVkQlFVY3NTVUZCU1N4TFFVRkxMRWRCUVVjc1IwRkJSeXhKUVVGSkxFdEJRVXNzUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXp0TFFVTTFSRHRKUVVORUxFOUJRVThzUlVGQlJTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03UVVGRGFrTXNRMEZCUXp0QlFVVkVMRTFCUVUwc1QwRkJUeXhYUVVGWE8wbEJRMllzVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRlRPMUZCUXpsQ0xFbEJRVWtzU1VGQlNTeEhRVUZYTEVOQlFVTXNRMEZCUXp0UlFVTnlRaXhKUVVGSkxFTkJRVU1zUTBGQlF5eE5RVUZOTEV0QlFVc3NRMEZCUXp0WlFVTm9RaXhQUVVGUExFbEJRVWtzUTBGQlF6dFJRVU5rTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVZjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRM3BETEUxQlFVMHNSMEZCUnl4SFFVRlhMRU5CUVVNc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEY0VNc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETzFsQlEyeERMRWxCUVVrc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5d3lRa0ZCTWtJN1UwRkRka003VVVGRFJDeFBRVUZQTEVsQlFVa3NRMEZCUXp0SlFVTmtMRU5CUVVNN1EwRkRSanRCUVVWRUxFOUJRVThzUlVGQllTeGpRVUZqTEVWQlFVTXNUVUZCVFN4blFrRkJaMElzUTBGQlF6dEJRVVV4UkN4TlFVRk5MRTlCUVdkQ0xHbENRVUZwUWp0RFFVVjBRenRCUVVWRUxFMUJRVTBzVDBGQlR5eGpRVUZsTEZOQlFWRXNhVUpCUVdsQ08wbEJRelZETEVkQlFVY3NRMEZCUXl4RFFVRlRPMUZCUTJ4Q0xFOUJRVThzVTBGQlV5eERRVUZETzBsQlEyNUNMRU5CUVVNN1EwRkRSanRCUVVkRUxFMUJRVTBzVDBGQlR5eHRRa0ZCYjBJc1UwRkJVU3hwUWtGQmFVSTdTVUZIYUVRc1RVRkJUU3hEUVVGRExGbEJRVms3VVVGRGVrSXNUVUZCVFN4SFFVRkhMRWRCUVVrc1JVRkJaU3hEUVVGRExFMUJRVTBzUTBGQlF5eEhRVUZITEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1kwRkJZeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VZc1QwRkJUeXhIUVVGSExFTkJRVU03U1VGRFlpeERRVUZETzBsQlJVMHNSMEZCUnl4RFFVRkRMRU5CUVZNN1VVRkRiRUlzVFVGQlRTeEpRVUZKTEVkQlFWY3NWMEZCVnl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU0zUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhKUVVGSkxFZEJRVWNzYlVKQlFXMUNMRU5CUVVNc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF6dFJRVU55UkN4UFFVRlBMRmxCUVZrc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4UFFVRlBMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU4yUkN4RFFVRkRPenRCUVZoaExESkNRVUZQTEVkQlFXRXNiVUpCUVcxQ0xFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTTdRVUZqZGtVc1RVRkJUU3hQUVVGUExHdENRVUZ0UWl4VFFVRlJMR05CUVdNN1NVRkhOME1zVFVGQlRTeExRVUZMTEVsQlFVazdVVUZEY0VJc1NVRkJTU3hKUVVGSkxFTkJRVU1zU1VGQlNTeExRVUZMTEV0QlFVc3NRMEZCUXp0WlFVTjBRaXhKUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVsQlFVa3NZMEZCWXl4RlFVRkZMRU5CUVVNN1VVRkRia01zVDBGQlR5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRPMGxCUTI1Q0xFTkJRVU03U1VGSlRTeE5RVUZOTEV0QlFVc3NTMEZCU3p0UlFVTnlRaXhKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEV0QlFVc3NTMEZCU3l4RFFVRkRPMWxCUTNaQ0xFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4dFFrRkJiVUlzUlVGQlJTeERRVUZETzFGQlEzcERMRTlCUVU4c1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dEpRVU53UWl4RFFVRkRPME5CUTBZaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJSFZwSUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5MWFTYzdYRzVwYlhCdmNuUWdLaUJoY3lCRVJ5Qm1jbTl0SUNka1lYUmhaM0p2YXkxaGNHa3ZaR2NuTzF4dVhHNHZLaW9nYldGclpYTWdkR2hsSUdOdmJHOXlJR3hsYzNNZ2QyaHBkR1VzSUcxaGEyVnpJSFJvWlNCMGNtRnVjM0JoY21WdVkza2daV1ptWldOMElHRnNkMkY1Y3lCd1pYSmpaWEIwYVdKc1pWeHVJQ29nUUhCaGNtRnRJSHR6ZEhKcGJtZDlJR052Ykc5eUlIZ2dZMjl2Y21ScGJtRjBaUzVjYmlBcUlDb3ZYRzVtZFc1amRHbHZiaUJqYjNKeVpXTjBRMjlzYjNJb1kyOXNiM0k2SUhOMGNtbHVaeUI4SUc1MWJHd3BPaUJ6ZEhKcGJtY2dlMXh1SUNCcFppQW9ZMjlzYjNJZ1BUMGdiblZzYkNsY2JpQWdJQ0J5WlhSMWNtNGdKM0puWWlneE1EQXNNVEF3TERFd01Da25PMXh1WEc0Z0lHTnZibk4wSUdSblEyOXNiM0k2SUc1MWJXSmxjaUE5SUVSSExrTnZiRzl5TG1aeWIyMUlkRzFzS0dOdmJHOXlLVHRjYmlBZ1kyOXVjM1FnWnlBOUlFUkhMa052Ykc5eUxtY29aR2REYjJ4dmNpazdYRzRnSUdOdmJuTjBJSElnUFNCRVJ5NURiMnh2Y2k1eUtHUm5RMjlzYjNJcE8xeHVJQ0JqYjI1emRDQmlJRDBnUkVjdVEyOXNiM0l1WWloa1owTnZiRzl5S1R0Y2JpQWdMeThnWTJGc1kzVnNZWFJsSUdWMVkyeHBaR1ZoYmlCa2FYTjBZVzVqWlNCMGJ5QjNhR2wwWlZ4dUlDQmpiMjV6ZENCa2FYTjBWRzlDYkdGamF5QTlJRTFoZEdndWMzRnlkQ2hOWVhSb0xuQnZkeWd3SUMwZ2Npd2dNaWtnS3lCTllYUm9MbkJ2ZHlnd0lDMGdaeXdnTWlrZ0t5Qk5ZWFJvTG5CdmR5Z3dJQzBnWWl3Z01pa3BPMXh1SUNBdkx5QnViM0p0WVd4cGVtVWdkbVZqZEc5eUlISWdaeUJpWEc0Z0lHTnZibk4wSUc1dmNtMVNJRDBnY2lBdklHUnBjM1JVYjBKc1lXTnJPMXh1SUNCamIyNXpkQ0J1YjNKdFJ5QTlJR2NnTHlCa2FYTjBWRzlDYkdGamF6dGNiaUFnWTI5dWMzUWdibTl5YlVJZ1BTQmlJQzhnWkdsemRGUnZRbXhoWTJzN1hHNGdJR2xtSUNoa2FYTjBWRzlDYkdGamF5QStJREl4TUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJnY21kaUtDUjdibTl5YlZJZ0tpQXlNVEI5TENSN2JtOXliVWNnS2lBeU1UQjlMQ1I3Ym05eWJVSWdLaUF5TVRCOUtXQTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlFUkhMa052Ykc5eUxuUnZVbWRpS0dSblEyOXNiM0lwTzF4dWZWeHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1UzUnlhVzVuVlhScGJITWdlMXh1SUNCd2RXSnNhV01nYzNSaGRHbGpJR2hoYzJoRGIyUmxLSE02SUhOMGNtbHVaeWs2SUc1MWJXSmxjaUI3WEc0Z0lDQWdiR1YwSUdoaGMyZzZJRzUxYldKbGNpQTlJREE3WEc0Z0lDQWdhV1lnS0hNdWJHVnVaM1JvSUQwOVBTQXdLVnh1SUNBZ0lDQWdjbVYwZFhKdUlHaGhjMmc3WEc0Z0lDQWdabTl5SUNoc1pYUWdhVG9nYm5WdFltVnlJRDBnTURzZ2FTQThJSE11YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdOb2Nqb2diblZ0WW1WeUlEMGdjeTVqYUdGeVEyOWtaVUYwS0drcE8xeHVJQ0FnSUNBZ2FHRnphQ0E5SUNnb2FHRnphQ0E4UENBMUtTQXRJR2hoYzJncElDc2dZMmh5TzF4dUlDQWdJQ0FnYUdGemFDQjhQU0F3T3lBdkx5QkRiMjUyWlhKMElIUnZJRE15WW1sMElHbHVkR1ZuWlhKY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHaGhjMmc3WEc0Z0lIMWNibjFjYmx4dWFXMXdiM0owSUh0VFpYRlFZV3hsZEhSbExDQlRaWEZRWVd4bGRIUmxRbUZ6WlgwZ1puSnZiU0FuTGk5elpYRXRjR0ZzWlhSMFpYTW5PMXh1WEc1bGVIQnZjblFnWVdKemRISmhZM1FnWTJ4aGMzTWdWVzVyYm05M2JsTmxjVkJoYkdWMGRHVWdhVzF3YkdWdFpXNTBjeUJUWlhGUVlXeGxkSFJsSUh0Y2JpQWdjSFZpYkdsaklHRmljM1J5WVdOMElHZGxkQ2h0T2lCemRISnBibWNwT2lCemRISnBibWM3WEc1OVhHNWNibVY0Y0c5eWRDQmpiR0Z6Y3lCSGNtRjVRV3hzVUdGc1pYUjBaU0JsZUhSbGJtUnpJRlZ1YTI1dmQyNVRaWEZRWVd4bGRIUmxJSHRjYmlBZ2NIVmliR2xqSUdkbGRDaHRPaUJ6ZEhKcGJtY3BPaUJ6ZEhKcGJtY2dlMXh1SUNBZ0lISmxkSFZ5YmlBbkl6WTJOalkyTmljN1hHNGdJSDFjYm4xY2JseHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1ZXNXJibTkzYmtOdmJHOXlVR0ZzWlhSMFpTQmxlSFJsYm1SeklGVnVhMjV2ZDI1VFpYRlFZV3hsZEhSbElIdGNiaUFnY0hWaWJHbGpJSE4wWVhScFl5QndZV3hsZEhSbE9pQnpkSEpwYm1kYlhTQTlJRlZ1YTI1dmQyNURiMnh2Y2xCaGJHVjBkR1V1WW5WcGJHUlFZV3hsZEhSbEtDazdYRzVjYmlBZ2NISnBkbUYwWlNCemRHRjBhV01nWW5WcGJHUlFZV3hsZEhSbEtDazZJSE4wY21sdVoxdGRJSHRjYmlBZ0lDQmpiMjV6ZENCeVpYTWdQU0FvVzEwZ1lYTWdjM1J5YVc1blcxMHBMbU52Ym1OaGRDZ3VMaTVQWW1wbFkzUXVkbUZzZFdWektGTmxjVkJoYkdWMGRHVkNZWE5sTG1OdmJHOTFjbEJoYkdWMGRHVXBLVHRjYmlBZ0lDQnlaWFIxY200Z2NtVnpPMXh1SUNCOVhHNWNiaUFnY0hWaWJHbGpJR2RsZENodE9pQnpkSEpwYm1jcE9pQnpkSEpwYm1jZ2UxeHVJQ0FnSUdOdmJuTjBJR2hoYzJnNklHNTFiV0psY2lBOUlGTjBjbWx1WjFWMGFXeHpMbWhoYzJoRGIyUmxLRzBwTzF4dUlDQWdJR052Ym5OMElIQkpJRDBnYUdGemFDQWxJRlZ1YTI1dmQyNURiMnh2Y2xCaGJHVjBkR1V1Y0dGc1pYUjBaUzVzWlc1bmRHZzdYRzRnSUNBZ2NtVjBkWEp1SUdOdmNuSmxZM1JEYjJ4dmNpaFZibXR1YjNkdVEyOXNiM0pRWVd4bGRIUmxMbkJoYkdWMGRHVmJjRWxkS1R0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1kyeGhjM01nVlc1cmJtOTNibE5sY1ZCaGJHVjBkR1Z6SUdWNGRHVnVaSE1nVTJWeFVHRnNaWFIwWlVKaGMyVWdlMXh1SUNCd2NtbDJZWFJsSUhOMFlYUnBZeUJuY21GNU9pQlRaWEZRWVd4bGRIUmxPMXh1WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nWjJWMElFZHlZWGtvS1RvZ1UyVnhVR0ZzWlhSMFpTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdVozSmhlU0E5UFQwZ2RtOXBaQ0F3S1Z4dUlDQWdJQ0FnZEdocGN5NW5jbUY1SUQwZ2JtVjNJRWR5WVhsQmJHeFFZV3hsZEhSbEtDazdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaM0poZVR0Y2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ2MzUmhkR2xqSUdOdmJHOXlPaUJUWlhGUVlXeGxkSFJsTzF4dVhHNGdJSEIxWW14cFl5QnpkR0YwYVdNZ1oyVjBJRU52Ykc5eUtDazZJRk5sY1ZCaGJHVjBkR1VnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbU52Ykc5eUlEMDlQU0IyYjJsa0lEQXBYRzRnSUNBZ0lDQjBhR2x6TG1OdmJHOXlJRDBnYm1WM0lGVnVhMjV2ZDI1RGIyeHZjbEJoYkdWMGRHVW9LVHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVqYjJ4dmNqdGNiaUFnZlZ4dWZWeHVJbDE5IiwiaW1wb3J0IHsgbW9ub21lclRvU2hvcnQgfSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuY29uc3QgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5jb25zdCBncmF5Q29sb3IgPSAnIzgwODA4MCc7XG5jb25zdCBibGFja0NvbG9yID0gJ3JnYigwLDAsMCknO1xuY29uc3QgbW9ub21lclRvU2hvcnRGdW5jdGlvbiA9IG1vbm9tZXJUb1Nob3J0O1xuZXhwb3J0IHZhciBEcmF3U3R5bGU7XG4oZnVuY3Rpb24gKERyYXdTdHlsZSkge1xuICAgIERyYXdTdHlsZVtcIk1TQVwiXSA9IFwiTVNBXCI7XG4gICAgRHJhd1N0eWxlW1wiY2xhc3NpY1wiXSA9IFwiY2xhc3NpY1wiO1xufSkoRHJhd1N0eWxlIHx8IChEcmF3U3R5bGUgPSB7fSkpO1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcHJpbnRzIGEgc3RyaW5nIGFsaWduZWQgdG8gbGVmdCBvciBjZW50ZXJlZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCB4IGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0geSB5IGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0gdyBXaWR0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBoIEhlaWdodC5cbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBnIENhbnZhcyByZW5kZXJpbmcgY29udGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzIFN0cmluZyB0byBwcmludC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3I9dW5kZWZpbmVkQ29sb3JdIFN0cmluZyBjb2xvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGl2b3Q9MF0gUGlydm90LlxuICogQHBhcmFtIHtib29sZWFufSBbbGVmdD1mYWxzZV0gSXMgbGVmdCBhbGlnbmVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc3BhcmVuY3lSYXRlPTAuMF0gVHJhbnNwYXJlbmN5IHJhdGUgd2hlcmUgMS4wIGlzIGZ1bGx5IHRyYW5zcGFyZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj0nJ10gSXMgc2VwYXJhdG9yIGZvciBzZXF1ZW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xhc3Q9ZmFsc2VdIElzIGNoZWNrZXIgaWYgZWxlbWVudCBsYXN0IG9yIG5vdC5cbiAqIEBwYXJhbSBkcmF3U3R5bGUgSXMgZHJhdyBzdHlsZS4gTVNBIC0gZm9yIG11bHRpY2hhclNlcSwgY2xhc3NpYyAtIGZvciBvdGhlciBzZXEuXG4gKiBAcGFyYW0gbWF4V29yZCBJcyBhcnJheSBvZiBtYXggd29yZHMgZm9yIGVhY2ggbGluZS5cbiAqIEBwYXJhbSB3b3JkSWR4IElzIGluZGV4IG9mIHdvcmQgd2UgY3VycmVudGx5IGRyYXcuXG4gKiBAcGFyYW0gZ3JpZENlbGwgSXMgZ3JpZCBjZWxsLlxuICogQHBhcmFtIHJlZmVyZW5jZVNlcXVlbmNlIElzIHJlZmVyZW5jZSBzZXF1ZW5jZSBmb3IgZGlmZiBtb2RlLlxuICogQHBhcmFtIG1heExlbmd0aE9mTW9ub21lciBJcyBtYXggbGVuZ3RoIG9mIG1vbm9tZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHggY29vcmRpbmF0ZSB0byBzdGFydCBwcmludGluZyBhdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHByaW50TGVmdE9yQ2VudGVyZWQgPSAoeCwgeSwgdywgaCwgZywgcywgY29sb3IgPSB1bmRlZmluZWRDb2xvciwgcGl2b3QgPSAwLCBsZWZ0ID0gZmFsc2UsIHRyYW5zcGFyZW5jeVJhdGUgPSAxLjAsIHNlcGFyYXRvciA9ICcnLCBsYXN0ID0gZmFsc2UsIGRyYXdTdHlsZSA9IERyYXdTdHlsZS5jbGFzc2ljLCBtYXhXb3JkID0ge30sIHdvcmRJZHggPSAwLCBncmlkQ2VsbCA9IG51bGwsIHJlZmVyZW5jZVNlcXVlbmNlID0gW10sIG1heExlbmd0aE9mTW9ub21lciA9IG51bGwpID0+IHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICBnLnRleHRBbGlnbiA9ICdzdGFydCc7XG4gICAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICAgIGxldCBncmF5UGFydCA9IGxhc3QgPyAnJyA6IHNlcGFyYXRvcjtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuTVNBKSB7XG4gICAgICAgIGdyYXlQYXJ0ID0gJyc7XG4gICAgfVxuICAgIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICAgIGxldCBjb21wYXJlV2l0aEN1cnJlbnQgPSB0cnVlO1xuICAgIGxldCBoaWdobGlnaHREaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnO1xuICAgIGlmICgoZ3JpZENlbGwgIT0gbnVsbCkgJiYgKGdyaWRDZWxsLmNlbGwuY29sdW1uICE9IG51bGwpKSB7XG4gICAgICAgIGNvbG9yQ29kZSA9IChfYSA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2NvbG9yLWNvZGUnXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgICAgICAgY29tcGFyZVdpdGhDdXJyZW50ID0gKF9iID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTtcbiAgICAgICAgaGlnaGxpZ2h0RGlmZmVyZW5jZSA9IChfYyA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2hpZ2hsaWdodC1kaWZmZXJlbmNlJ10pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICdkaWZmZXJlbmNlJztcbiAgICB9XG4gICAgY29uc3QgY3VycmVudE1vbm9tZXIgPSByZWZlcmVuY2VTZXF1ZW5jZVt3b3JkSWR4XTtcbiAgICBpZiAoY29tcGFyZVdpdGhDdXJyZW50ICYmIChyZWZlcmVuY2VTZXF1ZW5jZS5sZW5ndGggPiAwKSAmJiAoaGlnaGxpZ2h0RGlmZmVyZW5jZSA9PT0gJ2RpZmZlcmVuY2UnKSkge1xuICAgICAgICB0cmFuc3BhcmVuY3lSYXRlID0gKGNvbG9yUGFydCA9PSBjdXJyZW50TW9ub21lcikgPyAwLjMgOiB0cmFuc3BhcmVuY3lSYXRlO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZVdpdGhDdXJyZW50ICYmIChyZWZlcmVuY2VTZXF1ZW5jZS5sZW5ndGggPiAwKSAmJiAoaGlnaGxpZ2h0RGlmZmVyZW5jZSA9PT0gJ2VxdWFsJykpIHtcbiAgICAgICAgdHJhbnNwYXJlbmN5UmF0ZSA9IChjb2xvclBhcnQgIT0gY3VycmVudE1vbm9tZXIpID8gMC4zIDogdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICB9XG4gICAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgICAgIGNvbG9yUGFydCA9IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb24oY29sb3JQYXJ0LCBtYXhMZW5ndGhPZk1vbm9tZXIpO1xuICAgIH1cbiAgICBsZXQgdGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCArIGdyYXlQYXJ0KTtcbiAgICBjb25zdCBpbmRlbnQgPSA1O1xuICAgIGxldCBtYXhDb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICAgIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICAgIGNvbnN0IGR5ID0gaCAvIDIgLSAodGV4dFNpemUuZm9udEJvdW5kaW5nQm94QXNjZW50ICsgdGV4dFNpemUuZm9udEJvdW5kaW5nQm94RGVzY2VudCkgLyAyICsgMTtcbiAgICB0ZXh0U2l6ZSA9IHRleHRTaXplLndpZHRoO1xuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgICAgbWF4Q29sb3JUZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gICAgICAgIHRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhdyhkeDEsIGR4Mikge1xuICAgICAgICBjb25zdCBkcmF3Q29sb3IgPSBjb2xvckNvZGUgPyBjb2xvciA6IGJsYWNrQ29sb3I7XG4gICAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICAgICAgaWYgKGRyYXdTdHlsZSA9PT0gRHJhd1N0eWxlLmNsYXNzaWMpIHtcbiAgICAgICAgICAgIGcuZmlsbFRleHQoY29sb3JQYXJ0LCB4ICsgZHgxLCB5ICsgZHkpO1xuICAgICAgICAgICAgZy5maWxsU3R5bGUgPSBncmF5Q29sb3I7XG4gICAgICAgICAgICBnLmZpbGxUZXh0KGdyYXlQYXJ0LCB4ICsgZHgyLCB5ICsgZHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgICAgICBkcmF3KGluZGVudCwgaW5kZW50ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgICAgIHJldHVybiB4ICsgbWF4Q29sb3JUZXh0U2l6ZSArIGcubWVhc3VyZVRleHQoZ3JheVBhcnQpLndpZHRoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZHggPSAodyAtIHRleHRTaXplKSAvIDI7XG4gICAgICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgICAgIHJldHVybiB4ICsgZHggKyBtYXhDb2xvclRleHRTaXplO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lZMlZzYkMxeVpXNWtaWEpsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbU5sYkd3dGNtVnVaR1Z5WlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJSVUVzVDBGQlR5eEZRVUZETEdOQlFXTXNSVUZCUXl4TlFVRk5MR2xDUVVGcFFpeERRVUZETzBGQlJTOURMRTFCUVUwc1kwRkJZeXhIUVVGSExHdENRVUZyUWl4RFFVRkRPMEZCUXpGRExFMUJRVTBzVTBGQlV5eEhRVUZITEZOQlFWTXNRMEZCUXp0QlFVTTFRaXhOUVVGTkxGVkJRVlVzUjBGQlJ5eFpRVUZaTEVOQlFVTTdRVUZEYUVNc1RVRkJUU3h6UWtGQmMwSXNSMEZCTUVRc1kwRkJZeXhEUVVGRE8wRkJSWEpITEUxQlFVMHNRMEZCVGl4SlFVRlpMRk5CUjFnN1FVRklSQ3hYUVVGWkxGTkJRVk03U1VGRGJrSXNkMEpCUVZjc1EwRkJRVHRKUVVOWUxHZERRVUZ0UWl4RFFVRkJPMEZCUTNKQ0xFTkJRVU1zUlVGSVZ5eFRRVUZUTEV0QlFWUXNVMEZCVXl4UlFVZHdRanRCUVVWRU96czdPenM3T3pzN096czdPenM3T3pzN096czdPMGRCYzBKSE8wRkJRMGdzVFVGQlRTeERRVUZETEUxQlFVMHNiVUpCUVcxQ0xFZEJRVWNzUTBGRGFrTXNRMEZCVXl4RlFVRkZMRU5CUVZNc1JVRkJSU3hEUVVGVExFVkJRVVVzUTBGQlV5eEZRVU14UXl4RFFVRXlRaXhGUVVGRkxFTkJRVk1zUlVGQlJTeFJRVUZuUWl4alFVRmpMRVZCUTNSRkxGRkJRV2RDTEVOQlFVTXNSVUZCUlN4SlFVRkpMRWRCUVVjc1MwRkJTeXhGUVVGRkxHMUNRVUV5UWl4SFFVRkhMRVZCUXk5RUxGbEJRVzlDTEVWQlFVVXNSVUZCUlN4UFFVRm5RaXhMUVVGTExFVkJRVVVzV1VGQmRVSXNVMEZCVXl4RFFVRkRMRTlCUVU4c1JVRkJSU3hWUVVGMVF5eEZRVUZGTEVWQlFVVXNWVUZCYTBJc1EwRkJReXhGUVVGRkxGZEJRU3RDTEVsQlFVa3NSVUZCUlN4dlFrRkJPRUlzUlVGQlJTeEZRVUZGTEhGQ1FVRnZReXhKUVVGSkxFVkJRVlVzUlVGQlJUczdTVUZEY0ZJc1EwRkJReXhEUVVGRExGTkJRVk1zUjBGQlJ5eFBRVUZQTEVOQlFVTTdTVUZEZEVJc1NVRkJTU3hUUVVGVExFZEJRVWNzUTBGQlF5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNdlFpeEpRVUZKTEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNVMEZCVXl4RFFVRkRPMGxCUTNKRExFbEJRVWtzVTBGQlV5eExRVUZMTEZOQlFWTXNRMEZCUXl4SFFVRkhMRVZCUVVVN1VVRkRMMElzVVVGQlVTeEhRVUZITEVWQlFVVXNRMEZCUXp0TFFVTm1PMGxCUTBRc1NVRkJTU3hUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETzBsQlEzSkNMRWxCUVVrc2EwSkJRV3RDTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUXpsQ0xFbEJRVWtzYlVKQlFXMUNMRWRCUVVjc1dVRkJXU3hEUVVGRE8wbEJRM1pETEVsQlFVa3NRMEZCUXl4UlFVRlJMRWxCUVVrc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJUdFJRVU40UkN4VFFVRlRMRWRCUVVjc1RVRkJRU3hSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHMURRVUZKTEVsQlFVa3NRMEZCUXp0UlFVTTFSQ3hyUWtGQmEwSXNSMEZCUnl4TlFVRkJMRkZCUVZFc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4elFrRkJjMElzUTBGQlF5eHRRMEZCU1N4SlFVRkpMRU5CUVVNN1VVRkRMMFVzYlVKQlFXMUNMRWRCUVVjc1RVRkJRU3hSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc2MwSkJRWE5DTEVOQlFVTXNiVU5CUVVrc1dVRkJXU3hEUVVGRE8wdEJSWHBHTzBsQlEwUXNUVUZCVFN4alFVRmpMRWRCUVZjc2FVSkJRV2xDTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1NVRkRNVVFzU1VGQlNTeHJRa0ZCYTBJc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEcxQ1FVRnRRaXhMUVVGTExGbEJRVmtzUTBGQlF5eEZRVUZGTzFGQlEyeEhMR2RDUVVGblFpeEhRVUZITEVOQlFVTXNVMEZCVXl4SlFVRkpMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMR2RDUVVGblFpeERRVUZETzB0QlF6TkZPMGxCUTBRc1NVRkJTU3hyUWtGQmEwSXNTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4TFFVRkxMRTlCUVU4c1EwRkJReXhGUVVGRk8xRkJRemRHTEdkQ1FVRm5RaXhIUVVGSExFTkJRVU1zVTBGQlV5eEpRVUZKTEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEdkQ1FVRm5RaXhEUVVGRE8wdEJRek5GTzBsQlEwUXNTVUZCU1N4clFrRkJhMElzU1VGQlNTeEpRVUZKTEVWQlFVVTdVVUZET1VJc1UwRkJVeXhIUVVGSExITkNRVUZ6UWl4RFFVRkRMRk5CUVZNc1JVRkJSU3hyUWtGQmEwSXNRMEZCUXl4RFFVRkRPMHRCUTI1Rk8wbEJSMFFzU1VGQlNTeFJRVUZSTEVkQlFWRXNRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFZEJRVWNzVVVGQlVTeERRVUZETEVOQlFVTTdTVUZEZUVRc1RVRkJUU3hOUVVGTkxFZEJRVWNzUTBGQlF5eERRVUZETzBsQlJXcENMRWxCUVVrc1owSkJRV2RDTEVkQlFVY3NRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTTdTVUZEZEVRc1NVRkJTU3hoUVVGaExFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03U1VGRGJrUXNUVUZCVFN4RlFVRkZMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEZGQlFWRXNRMEZCUXl4eFFrRkJjVUlzUjBGQlJ5eFJRVUZSTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUXpsR0xGRkJRVkVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRPMGxCUXpGQ0xFbEJRVWtzVTBGQlV5eExRVUZMTEZOQlFWTXNRMEZCUXl4SFFVRkhMRVZCUVVVN1VVRkRMMElzWjBKQlFXZENMRWRCUVVjc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzFGQlEzQkRMRkZCUVZFc1IwRkJSeXhQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdTMEZETjBJN1NVRkZSQ3hUUVVGVExFbEJRVWtzUTBGQlF5eEhRVUZYTEVWQlFVVXNSMEZCVnp0UlFVTndReXhOUVVGTkxGTkJRVk1zUjBGQlJ5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zVlVGQlZTeERRVUZETzFGQlEycEVMRU5CUVVNc1EwRkJReXhUUVVGVExFZEJRVWNzVTBGQlV5eERRVUZETzFGQlEzaENMRU5CUVVNc1EwRkJReXhYUVVGWExFZEJRVWNzWjBKQlFXZENMRU5CUVVNN1VVRkRha01zU1VGQlNTeFRRVUZUTEV0QlFVc3NVMEZCVXl4RFFVRkRMRTlCUVU4c1JVRkJSVHRaUVVOdVF5eERRVUZETEVOQlFVTXNVVUZCVVN4RFFVRkRMRk5CUVZNc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJRenRaUVVOMlF5eERRVUZETEVOQlFVTXNVMEZCVXl4SFFVRkhMRk5CUVZNc1EwRkJRenRaUVVONFFpeERRVUZETEVOQlFVTXNVVUZCVVN4RFFVRkRMRkZCUVZFc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJRenRUUVVOMlF6dFJRVU5FTEVsQlFVa3NVMEZCVXl4TFFVRkxMRk5CUVZNc1EwRkJReXhIUVVGSExFVkJRVVU3V1VGREwwSXNRMEZCUXl4RFFVRkRMRk5CUVZNc1IwRkJSeXhUUVVGVExFTkJRVU03V1VGRGVFSXNRMEZCUXl4RFFVRkRMRkZCUVZFc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF5eEhRVUZITEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eEhRVUZITEdGQlFXRXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTXNRMEZCUXp0VFFVTnVSanRKUVVOSUxFTkJRVU03U1VGRlJDeEpRVUZKTEVsQlFVa3NTVUZCU1N4UlFVRlJMRWRCUVVjc1EwRkJReXhGUVVGRk8xRkJRM2hDTEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1RVRkJUU3hIUVVGSExHZENRVUZuUWl4RFFVRkRMRU5CUVVNN1VVRkRlRU1zVDBGQlR5eERRVUZETEVkQlFVY3NaMEpCUVdkQ0xFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03UzBGRk4wUTdVMEZCVFR0UlFVTk1MRTFCUVUwc1JVRkJSU3hIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVNNVFpeEpRVUZKTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1IwRkJSeXhuUWtGQlowSXNRMEZCUXl4RFFVRkRPMUZCUTJoRExFOUJRVThzUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4blFrRkJaMElzUTBGQlF6dExRVU5zUXp0QlFVTklMRU5CUVVNc1EwRkJReUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0FxSUdGeklFUkhJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzlrWnljN1hHNWNibWx0Y0c5eWRDQjdiVzl1YjIxbGNsUnZVMmh2Y25SOUlHWnliMjBnSnk0dmJXRmpjbTl0YjJ4bFkzVnNaU2M3WEc1Y2JtTnZibk4wSUhWdVpHVm1hVzVsWkVOdmJHOXlJRDBnSjNKbllpZ3hNREFzTVRBd0xERXdNQ2tuTzF4dVkyOXVjM1FnWjNKaGVVTnZiRzl5SUQwZ0p5TTRNRGd3T0RBbk8xeHVZMjl1YzNRZ1lteGhZMnREYjJ4dmNpQTlJQ2R5WjJJb01Dd3dMREFwSnp0Y2JtTnZibk4wSUcxdmJtOXRaWEpVYjFOb2IzSjBSblZ1WTNScGIyNDZJQ2hoYldsdWJ6b2djM1J5YVc1bkxDQnRZWGhNWlc1bmRHaFBaazF2Ym05dFpYSTZJRzUxYldKbGNpa2dQVDRnYzNSeWFXNW5JRDBnYlc5dWIyMWxjbFJ2VTJodmNuUTdYRzVjYm1WNGNHOXlkQ0JsYm5WdElFUnlZWGRUZEhsc1pTQjdYRzRnSUUxVFFTQTlJQ2ROVTBFbkxGeHVJQ0JqYkdGemMybGpJRDBnSjJOc1lYTnphV01uTEZ4dWZWeHVYRzR2S2lwY2JpQXFJRUVnWm5WdVkzUnBiMjRnZEdoaGRDQndjbWx1ZEhNZ1lTQnpkSEpwYm1jZ1lXeHBaMjVsWkNCMGJ5QnNaV1owSUc5eUlHTmxiblJsY21Wa0xseHVJQ3BjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCNElIZ2dZMjl2Y21ScGJtRjBaUzVjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCNUlIa2dZMjl2Y21ScGJtRjBaUzVjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCM0lGZHBaSFJvTGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlHZ2dTR1ZwWjJoMExseHVJQ29nUUhCaGNtRnRJSHREWVc1MllYTlNaVzVrWlhKcGJtZERiMjUwWlhoME1rUjlJR2NnUTJGdWRtRnpJSEpsYm1SbGNtbHVaeUJqYjI1MFpYaDBMbHh1SUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhNZ1UzUnlhVzVuSUhSdklIQnlhVzUwTGx4dUlDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlGdGpiMnh2Y2oxMWJtUmxabWx1WldSRGIyeHZjbDBnVTNSeWFXNW5JR052Ykc5eUxseHVJQ29nUUhCaGNtRnRJSHR1ZFcxaVpYSjlJRnR3YVhadmREMHdYU0JRYVhKMmIzUXVYRzRnS2lCQWNHRnlZVzBnZTJKdmIyeGxZVzU5SUZ0c1pXWjBQV1poYkhObFhTQkpjeUJzWldaMElHRnNhV2R1WldRdVhHNGdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdXM1J5WVc1emNHRnlaVzVqZVZKaGRHVTlNQzR3WFNCVWNtRnVjM0JoY21WdVkza2djbUYwWlNCM2FHVnlaU0F4TGpBZ2FYTWdablZzYkhrZ2RISmhibk53WVhKbGJuUmNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0JiYzJWd1lYSmhkRzl5UFNjblhTQkpjeUJ6WlhCaGNtRjBiM0lnWm05eUlITmxjWFZsYm1ObExseHVJQ29nUUhCaGNtRnRJSHRpYjI5c1pXRnVmU0JiYkdGemREMW1ZV3h6WlYwZ1NYTWdZMmhsWTJ0bGNpQnBaaUJsYkdWdFpXNTBJR3hoYzNRZ2IzSWdibTkwTGx4dUlDb2dRSEJoY21GdElHUnlZWGRUZEhsc1pTQkpjeUJrY21GM0lITjBlV3hsTGlCTlUwRWdMU0JtYjNJZ2JYVnNkR2xqYUdGeVUyVnhMQ0JqYkdGemMybGpJQzBnWm05eUlHOTBhR1Z5SUhObGNTNWNiaUFxSUVCd1lYSmhiU0J0WVhoWGIzSmtJRWx6SUdGeWNtRjVJRzltSUcxaGVDQjNiM0prY3lCbWIzSWdaV0ZqYUNCc2FXNWxMbHh1SUNvZ1FIQmhjbUZ0SUhkdmNtUkpaSGdnU1hNZ2FXNWtaWGdnYjJZZ2QyOXlaQ0IzWlNCamRYSnlaVzUwYkhrZ1pISmhkeTVjYmlBcUlFQndZWEpoYlNCbmNtbGtRMlZzYkNCSmN5Qm5jbWxrSUdObGJHd3VYRzRnS2lCQWNHRnlZVzBnY21WbVpYSmxibU5sVTJWeGRXVnVZMlVnU1hNZ2NtVm1aWEpsYm1ObElITmxjWFZsYm1ObElHWnZjaUJrYVdabUlHMXZaR1V1WEc0Z0tpQkFjR0Z5WVcwZ2JXRjRUR1Z1WjNSb1QyWk5iMjV2YldWeUlFbHpJRzFoZUNCc1pXNW5kR2dnYjJZZ2JXOXViMjFsY2k1Y2JpQXFJRUJ5WlhSMWNtNGdlMjUxYldKbGNuMGdlQ0JqYjI5eVpHbHVZWFJsSUhSdklITjBZWEowSUhCeWFXNTBhVzVuSUdGMExseHVJQ292WEc1bGVIQnZjblFnWTI5dWMzUWdjSEpwYm5STVpXWjBUM0pEWlc1MFpYSmxaQ0E5SUNoY2JpQWdlRG9nYm5WdFltVnlMQ0I1T2lCdWRXMWlaWElzSUhjNklHNTFiV0psY2l3Z2FEb2diblZ0WW1WeUxGeHVJQ0JuT2lCRFlXNTJZWE5TWlc1a1pYSnBibWREYjI1MFpYaDBNa1FzSUhNNklITjBjbWx1Wnl3Z1kyOXNiM0k2SUhOMGNtbHVaeUE5SUhWdVpHVm1hVzVsWkVOdmJHOXlMRnh1SUNCd2FYWnZkRG9nYm5WdFltVnlJRDBnTUN3Z2JHVm1kQ0E5SUdaaGJITmxMQ0IwY21GdWMzQmhjbVZ1WTNsU1lYUmxPaUJ1ZFcxaVpYSWdQU0F4TGpBc1hHNGdJSE5sY0dGeVlYUnZjam9nYzNSeWFXNW5JRDBnSnljc0lHeGhjM1E2SUdKdmIyeGxZVzRnUFNCbVlXeHpaU3dnWkhKaGQxTjBlV3hsT2lCRWNtRjNVM1I1YkdVZ1BTQkVjbUYzVTNSNWJHVXVZMnhoYzNOcFl5d2diV0Y0VjI5eVpEb2dleUJiYVc1a1pYZzZJSE4wY21sdVoxMDZJRzUxYldKbGNpQjlJRDBnZTMwc0lIZHZjbVJKWkhnNklHNTFiV0psY2lBOUlEQXNJR2R5YVdSRFpXeHNPaUJFUnk1SGNtbGtRMlZzYkNCOElHNTFiR3dnUFNCdWRXeHNMQ0J5WldabGNtVnVZMlZUWlhGMVpXNWpaVG9nYzNSeWFXNW5XMTBnUFNCYlhTd2diV0Y0VEdWdVozUm9UMlpOYjI1dmJXVnlPaUJ1ZFcxaVpYSWdmQ0J1ZFd4c0lEMGdiblZzYkNrNklHNTFiV0psY2lBOVBpQjdYRzRnSUdjdWRHVjRkRUZzYVdkdUlEMGdKM04wWVhKMEp6dGNiaUFnYkdWMElHTnZiRzl5VUdGeWRDQTlJSE11YzNWaWMzUnlhVzVuS0RBcE8xeHVJQ0JzWlhRZ1ozSmhlVkJoY25RZ1BTQnNZWE4wSUQ4Z0p5Y2dPaUJ6WlhCaGNtRjBiM0k3WEc0Z0lHbG1JQ2hrY21GM1UzUjViR1VnUFQwOUlFUnlZWGRUZEhsc1pTNU5VMEVwSUh0Y2JpQWdJQ0JuY21GNVVHRnlkQ0E5SUNjbk8xeHVJQ0I5WEc0Z0lHeGxkQ0JqYjJ4dmNrTnZaR1VnUFNCMGNuVmxPMXh1SUNCc1pYUWdZMjl0Y0dGeVpWZHBkR2hEZFhKeVpXNTBJRDBnZEhKMVpUdGNiaUFnYkdWMElHaHBaMmhzYVdkb2RFUnBabVpsY21WdVkyVWdQU0FuWkdsbVptVnlaVzVqWlNjN1hHNGdJR2xtSUNnb1ozSnBaRU5sYkd3Z0lUMGdiblZzYkNrZ0ppWWdLR2R5YVdSRFpXeHNMbU5sYkd3dVkyOXNkVzF1SUNFOUlHNTFiR3dwS1NCN1hHNGdJQ0FnWTI5c2IzSkRiMlJsSUQwZ1ozSnBaRU5sYkd3dVkyVnNiQzVqYjJ4MWJXNHVkR1Z0Y0ZzblkyOXNiM0l0WTI5a1pTZGRJRDgvSUhSeWRXVTdYRzRnSUNBZ1kyOXRjR0Z5WlZkcGRHaERkWEp5Wlc1MElEMGdaM0pwWkVObGJHd3VZMlZzYkM1amIyeDFiVzR1ZEdWdGNGc25ZMjl0Y0dGeVpTMTNhWFJvTFdOMWNuSmxiblFuWFNBL1B5QjBjblZsTzF4dUlDQWdJR2hwWjJoc2FXZG9kRVJwWm1abGNtVnVZMlVnUFNCbmNtbGtRMlZzYkM1alpXeHNMbU52YkhWdGJpNTBaVzF3V3lkb2FXZG9iR2xuYUhRdFpHbG1abVZ5Wlc1alpTZGRJRDgvSUNka2FXWm1aWEpsYm1ObEp6dGNibHh1SUNCOVhHNGdJR052Ym5OMElHTjFjbkpsYm5STmIyNXZiV1Z5T2lCemRISnBibWNnUFNCeVpXWmxjbVZ1WTJWVFpYRjFaVzVqWlZ0M2IzSmtTV1I0WFR0Y2JpQWdhV1lnS0dOdmJYQmhjbVZYYVhSb1EzVnljbVZ1ZENBbUppQW9jbVZtWlhKbGJtTmxVMlZ4ZFdWdVkyVXViR1Z1WjNSb0lENGdNQ2tnSmlZZ0tHaHBaMmhzYVdkb2RFUnBabVpsY21WdVkyVWdQVDA5SUNka2FXWm1aWEpsYm1ObEp5a3BJSHRjYmlBZ0lDQjBjbUZ1YzNCaGNtVnVZM2xTWVhSbElEMGdLR052Ykc5eVVHRnlkQ0E5UFNCamRYSnlaVzUwVFc5dWIyMWxjaWtnUHlBd0xqTWdPaUIwY21GdWMzQmhjbVZ1WTNsU1lYUmxPMXh1SUNCOVhHNGdJR2xtSUNoamIyMXdZWEpsVjJsMGFFTjFjbkpsYm5RZ0ppWWdLSEpsWm1WeVpXNWpaVk5sY1hWbGJtTmxMbXhsYm1kMGFDQStJREFwSUNZbUlDaG9hV2RvYkdsbmFIUkVhV1ptWlhKbGJtTmxJRDA5UFNBblpYRjFZV3duS1NrZ2UxeHVJQ0FnSUhSeVlXNXpjR0Z5Wlc1amVWSmhkR1VnUFNBb1kyOXNiM0pRWVhKMElDRTlJR04xY25KbGJuUk5iMjV2YldWeUtTQS9JREF1TXlBNklIUnlZVzV6Y0dGeVpXNWplVkpoZEdVN1hHNGdJSDFjYmlBZ2FXWWdLRzFoZUV4bGJtZDBhRTltVFc5dWIyMWxjaUFoUFNCdWRXeHNLU0I3WEc0Z0lDQWdZMjlzYjNKUVlYSjBJRDBnYlc5dWIyMWxjbFJ2VTJodmNuUkdkVzVqZEdsdmJpaGpiMnh2Y2xCaGNuUXNJRzFoZUV4bGJtZDBhRTltVFc5dWIyMWxjaWs3WEc0Z0lIMWNibHh1WEc0Z0lHeGxkQ0IwWlhoMFUybDZaVG9nWVc1NUlEMGdaeTV0WldGemRYSmxWR1Y0ZENoamIyeHZjbEJoY25RZ0t5Qm5jbUY1VUdGeWRDazdYRzRnSUdOdmJuTjBJR2x1WkdWdWRDQTlJRFU3WEc1Y2JpQWdiR1YwSUcxaGVFTnZiRzl5VkdWNGRGTnBlbVVnUFNCbkxtMWxZWE4xY21WVVpYaDBLR052Ykc5eVVHRnlkQ2t1ZDJsa2RHZzdYRzRnSUd4bGRDQmpiMnh2Y2xSbGVIUlRhWHBsSUQwZ1p5NXRaV0Z6ZFhKbFZHVjRkQ2hqYjJ4dmNsQmhjblFwTG5kcFpIUm9PMXh1SUNCamIyNXpkQ0JrZVNBOUlHZ2dMeUF5SUMwZ0tIUmxlSFJUYVhwbExtWnZiblJDYjNWdVpHbHVaMEp2ZUVGelkyVnVkQ0FySUhSbGVIUlRhWHBsTG1admJuUkNiM1Z1WkdsdVowSnZlRVJsYzJObGJuUXBJQzhnTWlBcklERTdYRzRnSUhSbGVIUlRhWHBsSUQwZ2RHVjRkRk5wZW1VdWQybGtkR2c3WEc0Z0lHbG1JQ2hrY21GM1UzUjViR1VnUFQwOUlFUnlZWGRUZEhsc1pTNU5VMEVwSUh0Y2JpQWdJQ0J0WVhoRGIyeHZjbFJsZUhSVGFYcGxJRDBnYldGNFYyOXlaRnQzYjNKa1NXUjRYVHRjYmlBZ0lDQjBaWGgwVTJsNlpTQTlJRzFoZUZkdmNtUmJkMjl5WkVsa2VGMDdYRzRnSUgxY2JseHVJQ0JtZFc1amRHbHZiaUJrY21GM0tHUjRNVG9nYm5WdFltVnlMQ0JrZURJNklHNTFiV0psY2lrNklIWnZhV1FnZTF4dUlDQWdJR052Ym5OMElHUnlZWGREYjJ4dmNpQTlJR052Ykc5eVEyOWtaU0EvSUdOdmJHOXlJRG9nWW14aFkydERiMnh2Y2p0Y2JpQWdJQ0JuTG1acGJHeFRkSGxzWlNBOUlHUnlZWGREYjJ4dmNqdGNiaUFnSUNCbkxtZHNiMkpoYkVGc2NHaGhJRDBnZEhKaGJuTndZWEpsYm1ONVVtRjBaVHRjYmlBZ0lDQnBaaUFvWkhKaGQxTjBlV3hsSUQwOVBTQkVjbUYzVTNSNWJHVXVZMnhoYzNOcFl5a2dlMXh1SUNBZ0lDQWdaeTVtYVd4c1ZHVjRkQ2hqYjJ4dmNsQmhjblFzSUhnZ0t5QmtlREVzSUhrZ0t5QmtlU2s3WEc0Z0lDQWdJQ0JuTG1acGJHeFRkSGxzWlNBOUlHZHlZWGxEYjJ4dmNqdGNiaUFnSUNBZ0lHY3VabWxzYkZSbGVIUW9aM0poZVZCaGNuUXNJSGdnS3lCa2VESXNJSGtnS3lCa2VTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaGtjbUYzVTNSNWJHVWdQVDA5SUVSeVlYZFRkSGxzWlM1TlUwRXBJSHRjYmlBZ0lDQWdJR2N1Wm1sc2JGTjBlV3hsSUQwZ1pISmhkME52Ykc5eU8xeHVJQ0FnSUNBZ1p5NW1hV3hzVkdWNGRDaGpiMnh2Y2xCaGNuUXNJSGdnS3lCa2VERWdLeUFvS0cxaGVGZHZjbVJiZDI5eVpFbGtlRjBnTFNCamIyeHZjbFJsZUhSVGFYcGxLU0F2SURJcExDQjVJQ3NnWkhrcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lHbG1JQ2hzWldaMElIeDhJSFJsZUhSVGFYcGxJRDRnZHlrZ2UxeHVJQ0FnSUdSeVlYY29hVzVrWlc1MExDQnBibVJsYm5RZ0t5QnRZWGhEYjJ4dmNsUmxlSFJUYVhwbEtUdGNiaUFnSUNCeVpYUjFjbTRnZUNBcklHMWhlRU52Ykc5eVZHVjRkRk5wZW1VZ0t5Qm5MbTFsWVhOMWNtVlVaWGgwS0dkeVlYbFFZWEowS1M1M2FXUjBhRHRjYmx4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUdOdmJuTjBJR1I0SUQwZ0tIY2dMU0IwWlhoMFUybDZaU2tnTHlBeU8xeHVJQ0FnSUdSeVlYY29aSGdzSUdSNElDc2diV0Y0UTI5c2IzSlVaWGgwVTJsNlpTazdYRzRnSUNBZ2NtVjBkWEp1SUhnZ0t5QmtlQ0FySUcxaGVFTnZiRzl5VkdWNGRGTnBlbVU3WEc0Z0lIMWNibjA3WEc1Y2JpSmRmUT09IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB3dSBmcm9tICd3dSc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQgeyB2ZWN0b3JMZW5ndGgsIHZlY3RvckRvdFByb2R1Y3QgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgeyBBbWlub2FjaWRzUGFsZXR0ZXMgfSBmcm9tICcuLi9hbWlub2FjaWRzJztcbmltcG9ydCB7IE51Y2xlb3RpZGVzUGFsZXR0ZXMgfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQgeyBVbmtub3duU2VxUGFsZXR0ZXMgfSBmcm9tICcuLi91bmtub3duJztcbmltcG9ydCB7IFVuaXRzSGFuZGxlciB9IGZyb20gJy4uL3V0aWxzL3VuaXRzLWhhbmRsZXInO1xuO1xuLyoqIFN0YXRzIG9mIHNlcXVlbmNlcyB3aXRoIHNwZWNpZmllZCBzcGxpdHRlciBmdW5jLCByZXR1cm5zIHsgZnJlcSwgc2FtZUxlbmd0aCB9LlxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbFxuICogQHBhcmFtIHtudW1iZXJ9IG1pbkxlbmd0aFxuICogQHBhcmFtIHtTcGxpdHRlckZ1bmN9IHNwbGl0dGVyXG4gKiBAcmV0dXJuIHsgU2VxQ29sU3RhdHMgfSwgc2FtZUxlbmd0aDogYm9vbGVhbiB9IHN0YXRzIG9mIGNvbHVtbiBzZXF1ZW5jZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXRzKHNlcUNvbCwgbWluTGVuZ3RoLCBzcGxpdHRlcikge1xuICAgIGNvbnN0IGZyZXEgPSB7fTtcbiAgICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gICAgbGV0IGZpcnN0TGVuZ3RoID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHNlcSBvZiBzZXFDb2wuY2F0ZWdvcmllcykge1xuICAgICAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcbiAgICAgICAgaWYgKGZpcnN0TGVuZ3RoID09IG51bGwpXG4gICAgICAgICAgICBmaXJzdExlbmd0aCA9IG1TZXEubGVuZ3RoO1xuICAgICAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICAgICAgICBzYW1lTGVuZ3RoID0gZmFsc2U7XG4gICAgICAgIGlmIChtU2VxLmxlbmd0aCA+PSBtaW5MZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtU2VxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobSBpbiBmcmVxKSlcbiAgICAgICAgICAgICAgICAgICAgZnJlcVttXSA9IDA7XG4gICAgICAgICAgICAgICAgZnJlcVttXSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGZyZXE6IGZyZXEsIHNhbWVMZW5ndGg6IHNhbWVMZW5ndGggfTtcbn1cbmV4cG9ydCBjb25zdCBtb25vbWVyUmUgPSAvXFxbKFxcdyspXFxdfChcXHcpfCgtKS9nO1xuLyoqIFNwbGl0IHNlcXVlbmNlIGZvciBzaW5nbGUgY2hhcmFjdGVyIG1vbm9tZXJzLCBzcXVhcmUgYnJhY2tldHMgbXVsdGljaGFyIG1vbm9tZXIgbmFtZXMgb3IgZ2FwIHN5bWJvbC5cbiAqIEBwYXJhbSB7YW55fSBzZXEgb2JqZWN0IHdpdGggc2VxdWVuY2VcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBhcnJheSBvZiBtb25vbWVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXR0ZXJBc0Zhc3RhKHNlcSkge1xuICAgIHJldHVybiB3dShzZXEudG9TdHJpbmcoKS5tYXRjaEFsbChtb25vbWVyUmUpKVxuICAgICAgICAubWFwKChtYSkgPT4ge1xuICAgICAgICBsZXQgbVJlcztcbiAgICAgICAgY29uc3QgbSA9IG1hWzBdO1xuICAgICAgICBpZiAobS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBtUmVzID0gbWFbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtUmVzID0gbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbVJlcztcbiAgICB9KS50b0FycmF5KCk7XG59XG4vKiogR2V0cyBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2UgYnkgc2VwYXJhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yXG4gKiBAcGFyYW0gbGltaXRcbiAqIEByZXR1cm4ge1NwbGl0dGVyRnVuY31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwbGl0dGVyV2l0aFNlcGFyYXRvcihzZXBhcmF0b3IsIGxpbWl0ID0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChzZXEpID0+IHtcbiAgICAgICAgcmV0dXJuIHNlcS5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xufVxuY29uc3QgaGVsbVJlID0gLyhQRVBUSURFMXxETkExfFJOQTEpXFx7KFtefV0rKX0vZztcbmNvbnN0IGhlbG1QcDFSZSA9IC9cXFsoW15cXFtcXF1dKyldL2c7XG4vKiogU3BsaXRzIEhlbG0gc3RyaW5nIHRvIG1vbm9tZXJzLCBidXQgZG9lcyBub3QgcmVwbGFjZSBtb25vbWVyIG5hbWVzIHRvIG90aGVyIG5vdGF0aW9uIChlLmcuIGZvciBSTkEpLlxuICogT25seSBmb3IgbGluZWFyIHBvbHltZXJzLCBkb2VzIG5vdCBzcGxpdCBSTkEgZm9yIHJpYm9zZSBhbmQgcGhvc3BoYXRlIG1vbm9tZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlcSBTb3VyY2Ugc3RyaW5nIG9mIEhFTE0gbm90YXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXR0ZXJBc0hlbG0oc2VxKSB7XG4gICAgaGVsbVJlLmxhc3RJbmRleCA9IDA7XG4gICAgY29uc3QgZWEgPSBoZWxtUmUuZXhlYyhzZXEudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgaW5TZXEgPSBlYSA/IGVhWzJdIDogbnVsbDtcbiAgICBjb25zdCBtbVBvc3RQcm9jZXNzID0gKG1tKSA9PiB7XG4gICAgICAgIGhlbG1QcDFSZS5sYXN0SW5kZXggPSAwO1xuICAgICAgICBjb25zdCBwcDFNID0gaGVsbVBwMVJlLmV4ZWMobW0pO1xuICAgICAgICBpZiAocHAxTSAmJiBwcDFNLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgcmV0dXJuIHBwMU1bMV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBtbTtcbiAgICB9O1xuICAgIGNvbnN0IG1tTGlzdCA9IGluU2VxID8gaW5TZXEuc3BsaXQoJy4nKSA6IFtdO1xuICAgIHJldHVybiBtbUxpc3QubWFwKG1tUG9zdFByb2Nlc3MpO1xufVxuLyoqIEdldCBzcGxpdHRlciBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2VzIHRvIG1vbm9tZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXIodW5pdHMsIHNlcGFyYXRvciwgbGltaXQgPSB1bmRlZmluZWQpIHtcbiAgICBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLykpXG4gICAgICAgIHJldHVybiBzcGxpdHRlckFzRmFzdGE7XG4gICAgZWxzZSBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwic2VwYXJhdG9yXCIgLyogTk9UQVRJT04uU0VQQVJBVE9SICovKSlcbiAgICAgICAgcmV0dXJuIGdldFNwbGl0dGVyV2l0aFNlcGFyYXRvcihzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLykpXG4gICAgICAgIHJldHVybiBzcGxpdHRlckFzSGVsbTtcbiAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB1bml0cyAke3VuaXRzfSAuYCk7XG4gICAgLy8gVE9ETzogU3BsaXR0ZXIgZm9yIEhFTE1cbn1cbi8qKiBHZW5lcmF0ZSBzcGxpdHRlciBmdW5jdGlvbiBmb3Igc2VxdWVuY2UgY29sdW1uXG4gKiBAcGFyYW0ge0RHLkNvbHVtbn0gY29sXG4gKiBAcmV0dXJuIHtTcGxpdHRlckZ1bmN9IFNwbGl0dGVyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGxpdHRlckZvckNvbHVtbihjb2wpIHtcbiAgICBpZiAoY29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZXQgc3BsaXR0ZXIgZm9yIHNlbVR5cGUgXCIke0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRX1cIiBvbmx5LmApO1xuICAgIGNvbnN0IHVuaXRzID0gY29sLmdldFRhZyhERy5UQUdTLlVOSVRTKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBjb2wuZ2V0VGFnKFwic2VwYXJhdG9yXCIgLyogVEFHUy5zZXBhcmF0b3IgKi8pO1xuICAgIHJldHVybiBnZXRTcGxpdHRlcih1bml0cywgc2VwYXJhdG9yKTtcbn1cbmNvbnN0IGxvbmdNb25vbWVyUGFydFJlID0gLyhcXHcrKS9nO1xuLyoqIENvbnZlcnQgbG9uZyBtb25vbWVyIG5hbWVzIHRvIHNob3J0IG9uZXMgKi9cbmV4cG9ydCBmdW5jdGlvbiBtb25vbWVyVG9TaG9ydChhbWlubywgbWF4TGVuZ3RoT2ZNb25vbWVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCBzaG9ydEFtaW5vTWF0Y2ggPSBhbWluby5tYXRjaChsb25nTW9ub21lclBhcnRSZSk7XG4gICAgY29uc3QgbmVlZEFkZERvdHMgPSBhbWluby5sZW5ndGggPiBtYXhMZW5ndGhPZk1vbm9tZXIgfHwgKChfYSA9IHNob3J0QW1pbm9NYXRjaCA9PT0gbnVsbCB8fCBzaG9ydEFtaW5vTWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNob3J0QW1pbm9NYXRjaC5sZW5ndGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApID4gMTtcbiAgICBjb25zdCBzaG9ydEFtaW5vID0gKF9iID0gc2hvcnRBbWlub01hdGNoID09PSBudWxsIHx8IHNob3J0QW1pbm9NYXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2hvcnRBbWlub01hdGNoWzBdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnICc7XG4gICAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG59XG4vKiogKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHBoYWJldChhbHBoYWJldCkge1xuICAgIHN3aXRjaCAoYWxwaGFiZXQpIHtcbiAgICAgICAgY2FzZSBcIkROQVwiIC8qIEFMUEhBQkVULkROQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuRG5hRmFzdGFBbHBoYWJldDtcbiAgICAgICAgY2FzZSBcIlJOQVwiIC8qIEFMUEhBQkVULlJOQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldDtcbiAgICAgICAgY2FzZSBcIlBUXCIgLyogQUxQSEFCRVQuUFQgKi86XG4gICAgICAgICAgICByZXR1cm4gVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBhbHBoYWJldCAnJHthbHBoYWJldH0nLmApO1xuICAgIH1cbn1cbi8qKiBDYWxjdWxhdGUgc2ltaWxhcml0eSBpbiBjdXJyZW50IHNlcXVlbmNlIGFuZCBhbHBoYWJldC5cbiAqIEBwYXJhbSB7TW9ub21lckZyZXFzfSBmcmVxXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhbHBoYWJldFxuICogQHBhcmFtIHtzdHJpbmd9IGdhcFN5bWJvbFxuICogQHJldHVybiB7bnVtYmVyfSBDb3NpbmUgc2ltaWxhcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxwaGFiZXRTaW1pbGFyaXR5KGZyZXEsIGFscGhhYmV0LCBnYXBTeW1ib2wgPSAnLScpIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldChbLi4ubmV3IFNldChPYmplY3Qua2V5cyhmcmVxKSksIC4uLmFscGhhYmV0XSk7XG4gICAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcbiAgICBjb25zdCBmcmVxQSA9IFtdO1xuICAgIGNvbnN0IGFscGhhYmV0QSA9IFtdO1xuICAgIGZvciAoY29uc3QgbSBvZiBrZXlzKSB7XG4gICAgICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgICAgICBhbHBoYWJldEEucHVzaChhbHBoYWJldC5oYXMobSkgPyAxIDogMCk7XG4gICAgfVxuICAgIC8qIFRoZXJlIHdlcmUgYSBmZXcgaWRlYXM6IGNoaS1zcXVhcmVkLCBwZWFyc29uIGNvcnJlbGF0aW9uICh2YXJpYW5jZT8pLCBzY2FsYXIgcHJvZHVjdCAqL1xuICAgIGNvbnN0IGZyZXFWID0gbmV3IFZlY3RvcihmcmVxQSk7XG4gICAgY29uc3QgYWxwaGFiZXRWID0gbmV3IFZlY3RvcihhbHBoYWJldEEpO1xuICAgIHJldHVybiB2ZWN0b3JEb3RQcm9kdWN0KGZyZXFWLCBhbHBoYWJldFYpIC8gKHZlY3Rvckxlbmd0aChmcmVxVikgKiB2ZWN0b3JMZW5ndGgoYWxwaGFiZXRWKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpIHtcbiAgICBjb25zdCBhbHBoYWJldENhbmRpZGF0ZXMgPSBbXG4gICAgICAgIFtcIlBUXCIgLyogQUxQSEFCRVQuUFQgKi8sIFVuaXRzSGFuZGxlci5QZXB0aWRlRmFzdGFBbHBoYWJldF0sXG4gICAgICAgIFtcIkROQVwiIC8qIEFMUEhBQkVULkROQSAqLywgVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXRdLFxuICAgICAgICBbXCJSTkFcIiAvKiBBTFBIQUJFVC5STkEgKi8sIFVuaXRzSGFuZGxlci5SbmFGYXN0YUFscGhhYmV0XSxcbiAgICBdO1xuICAgIC8vIENhbGN1bGF0ZSBsaWtlbGlob29kcyBmb3IgYWxwaGFiZXRfY2FuZGlkYXRlc1xuICAgIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlc1NpbSA9IGFscGhhYmV0Q2FuZGlkYXRlcy5tYXAoKGMpID0+IGdldEFscGhhYmV0U2ltaWxhcml0eShzdGF0cy5mcmVxLCBjWzFdKSk7XG4gICAgY29uc3QgbWF4Q29zID0gTWF0aC5tYXgoLi4uYWxwaGFiZXRDYW5kaWRhdGVzU2ltKTtcbiAgICBjb25zdCBhbHBoYWJldCA9IG1heENvcyA+IDAuNjUgPyBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMF0gOiAnVU4nO1xuICAgIHJldHVybiBhbHBoYWJldDtcbn1cbi8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbCBDb2x1bW4gdG8gbG9vayBmb3IgYSBwYWxldHRlXG4gKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBQYWxldHRlKHNlcUNvbCwgbWluTGVuZ3RoID0gNSkge1xuICAgIGxldCBhbHBoYWJldDtcbiAgICBpZiAoc2VxQ29sLnNlbVR5cGUgPT0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFKSB7XG4gICAgICAgIGNvbnN0IHVoID0gbmV3IFVuaXRzSGFuZGxlcihzZXFDb2wpO1xuICAgICAgICBhbHBoYWJldCA9IHVoLmFscGhhYmV0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyhzZXFDb2wsIG1pbkxlbmd0aCwgc3BsaXR0ZXJBc0Zhc3RhKTtcbiAgICAgICAgYWxwaGFiZXQgPSBkZXRlY3RBbHBoYWJldChzdGF0cyk7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGdldFBhbGV0dGVCeVR5cGUoYWxwaGFiZXQpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFsZXR0ZUJ5VHlwZShwYWxldHRlVHlwZSkge1xuICAgIHN3aXRjaCAocGFsZXR0ZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnUFQnOlxuICAgICAgICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgICAgICBjYXNlICdOVCc6XG4gICAgICAgIGNhc2UgJ0ROQSc6XG4gICAgICAgIGNhc2UgJ1JOQSc6XG4gICAgICAgICAgICByZXR1cm4gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgICAgIC8vIG90aGVyXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBTZXFDb2woZGYpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgc2VtVHlwZUNvbExpc3QgPSBkZi5jb2x1bW5zLmJ5U2VtVHlwZUFsbChERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpO1xuICAgIGxldCByZXNDb2wgPSAoX2EgPSBzZW1UeXBlQ29sTGlzdC5maW5kKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICAgICAgICByZXR1cm4gdW5pdHMgPyB1bml0cy5pbmRleE9mKCdNU0EnKSAhPT0gLTEgOiBmYWxzZTtcbiAgICB9KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbDtcbiAgICBpZiAoIXJlc0NvbCAmJiBzZW1UeXBlQ29sTGlzdC5sZW5ndGggPiAwKVxuICAgICAgICByZXNDb2wgPSBzZW1UeXBlQ29sTGlzdFswXTtcbiAgICByZXR1cm4gcmVzQ29sO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldGamNtOXRiMnhsWTNWc1pTNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSW0xaFkzSnZiVzlzWldOMWJHVXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUlVFc1QwRkJUeXhMUVVGTExFVkJRVVVzVFVGQlRTeHBRa0ZCYVVJc1EwRkJRenRCUVVOMFF5eFBRVUZQTEVWQlFVVXNUVUZCVFN4SlFVRkpMRU5CUVVNN1FVRkZjRUlzVDBGQlR5eEZRVUZETEUxQlFVMHNSVUZCUXl4TlFVRk5MR2xFUVVGcFJDeERRVUZETzBGQlEzWkZMRTlCUVU4c1JVRkJReXhaUVVGWkxFVkJRVVVzWjBKQlFXZENMRVZCUVVNc1RVRkJUU3hwUkVGQmFVUXNRMEZCUXp0QlFVVXZSaXhQUVVGUExFVkJRV0VzYTBKQlFXdENMRVZCUVVNc1RVRkJUU3hsUVVGbExFTkJRVU03UVVGRE4wUXNUMEZCVHl4RlFVRmpMRzFDUVVGdFFpeEZRVUZETEUxQlFVMHNaMEpCUVdkQ0xFTkJRVU03UVVGRGFFVXNUMEZCVHl4RlFVRkRMR3RDUVVGclFpeEZRVUZETEUxQlFVMHNXVUZCV1N4RFFVRkRPMEZCUXpsRExFOUJRVThzUlVGQlF5eFpRVUZaTEVWQlFVTXNUVUZCVFN4M1FrRkJkMElzUTBGQlF6dEJRVFJDYmtRc1EwRkJRenRCUVUxR096czdPenRIUVV0SE8wRkJRMGdzVFVGQlRTeFZRVUZWTEZGQlFWRXNRMEZCUXl4TlFVRnBRaXhGUVVGRkxGTkJRV2xDTEVWQlFVVXNVVUZCYzBJN1NVRkRia1lzVFVGQlRTeEpRVUZKTEVkQlFUUkNMRVZCUVVVc1EwRkJRenRKUVVONlF5eEpRVUZKTEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRkRUlzU1VGQlNTeFhRVUZYTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUlhaQ0xFdEJRVXNzVFVGQlRTeEhRVUZITEVsQlFVa3NUVUZCVFN4RFFVRkRMRlZCUVZVc1JVRkJSVHRSUVVOdVF5eE5RVUZOTEVsQlFVa3NSMEZCUnl4UlFVRlJMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRk0wSXNTVUZCU1N4WFFVRlhMRWxCUVVrc1NVRkJTVHRaUVVOeVFpeFhRVUZYTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJRenRoUVVOMlFpeEpRVUZKTEVsQlFVa3NRMEZCUXl4TlFVRk5MRXRCUVVzc1YwRkJWenRaUVVOc1F5eFZRVUZWTEVkQlFVY3NTMEZCU3l4RFFVRkRPMUZCUlhKQ0xFbEJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNTVUZCU1N4VFFVRlRMRVZCUVVVN1dVRkROVUlzUzBGQlN5eE5RVUZOTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVN1owSkJRM0JDTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hKUVVGSkxFTkJRVU03YjBKQlEyUXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dG5Ra0ZEWkN4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzJGQlEyUTdVMEZEUmp0TFFVTkdPMGxCUTBRc1QwRkJUeXhGUVVGRExFbEJRVWtzUlVGQlJTeEpRVUZKTEVWQlFVVXNWVUZCVlN4RlFVRkZMRlZCUVZVc1JVRkJReXhEUVVGRE8wRkJRemxETEVOQlFVTTdRVUZGUkN4TlFVRk5MRU5CUVVNc1RVRkJUU3hUUVVGVExFZEJRVmNzY1VKQlFYRkNMRU5CUVVNN1FVRkZka1E3T3p0SFFVZEhPMEZCUTBnc1RVRkJUU3hWUVVGVkxHVkJRV1VzUTBGQlF5eEhRVUZSTzBsQlEzUkRMRTlCUVU4c1JVRkJSU3hEUVVGdFFpeEhRVUZITEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNc1VVRkJVU3hEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETzFOQlF6VkVMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVzlDTEVWQlFVVXNSVUZCUlR0UlFVTTFRaXhKUVVGSkxFbEJRVmtzUTBGQlF6dFJRVU5xUWl4TlFVRk5MRU5CUVVNc1IwRkJWeXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEZUVJc1NVRkJTU3hEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0WlFVTm9RaXhKUVVGSkxFZEJRVWNzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMU5CUTJRN1lVRkJUVHRaUVVOTUxFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTTdVMEZEVmp0UlFVTkVMRTlCUVU4c1NVRkJTU3hEUVVGRE8wbEJRMlFzUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkZMRU5CUVVNN1FVRkRha0lzUTBGQlF6dEJRVVZFT3pzN08wZEJTVWM3UVVGRFNDeE5RVUZOTEZWQlFWVXNkMEpCUVhkQ0xFTkJRVU1zVTBGQmFVSXNSVUZCUlN4UlFVRTBRaXhUUVVGVE8wbEJReTlHTEU5QlFVOHNRMEZCUXl4SFFVRlhMRVZCUVVVc1JVRkJSVHRSUVVOeVFpeFBRVUZQTEVkQlFVY3NRMEZCUXl4TFFVRkxMRU5CUVVNc1UwRkJVeXhGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzBsQlEzSkRMRU5CUVVNc1EwRkJRenRCUVVOS0xFTkJRVU03UVVGRlJDeE5RVUZOTEUxQlFVMHNSMEZCVnl4cFEwRkJhVU1zUTBGQlF6dEJRVU42UkN4TlFVRk5MRk5CUVZNc1IwRkJWeXhuUWtGQlowSXNRMEZCUXp0QlFVVXpRenM3T3p0SFFVbEhPMEZCUTBnc1RVRkJUU3hWUVVGVkxHTkJRV01zUTBGQlF5eEhRVUZSTzBsQlEzSkRMRTFCUVUwc1EwRkJReXhUUVVGVExFZEJRVWNzUTBGQlF5eERRVUZETzBsQlEzSkNMRTFCUVUwc1JVRkJSU3hIUVVFeVFpeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhSUVVGUkxFVkJRVVVzUTBGQlF5eERRVUZETzBsQlF5OUVMRTFCUVUwc1MwRkJTeXhIUVVGclFpeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRPMGxCUlM5RExFMUJRVTBzWVVGQllTeEhRVUZITEVOQlFVTXNSVUZCVlN4RlFVRlZMRVZCUVVVN1VVRkRNME1zVTBGQlV5eERRVUZETEZOQlFWTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRlRUlzVFVGQlRTeEpRVUZKTEVkQlFVY3NVMEZCVXl4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU5vUXl4SlFVRkpMRWxCUVVrc1NVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEVOQlFVTTdXVUZETVVJc1QwRkJUeXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdPMWxCUldZc1QwRkJUeXhGUVVGRkxFTkJRVU03U1VGRFpDeERRVUZETEVOQlFVTTdTVUZGUml4TlFVRk5MRTFCUVUwc1IwRkJZU3hMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXp0SlFVTjJSQ3hQUVVGUExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNN1FVRkRia01zUTBGQlF6dEJRVVZFT3pzN096dEhRVXRITzBGQlEwZ3NUVUZCVFN4VlFVRlZMRmRCUVZjc1EwRkJReXhMUVVGaExFVkJRVVVzVTBGQmFVSXNSVUZCUlN4UlFVRTBRaXhUUVVGVE8wbEJRMnBITEVsQlFVa3NTMEZCU3l4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExGVkJRVlVzT0VKQlFXZENPMUZCUTJoRUxFOUJRVThzWlVGQlpTeERRVUZETzFOQlEzQkNMRWxCUVVrc1MwRkJTeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEZWQlFWVXNjME5CUVc5Q08xRkJRM3BFTEU5QlFVOHNkMEpCUVhkQ0xFTkJRVU1zVTBGQlV5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMU5CUXk5RExFbEJRVWtzUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRlZCUVZVc05FSkJRV1U3VVVGRGNFUXNUMEZCVHl4alFVRmpMRU5CUVVNN08xRkJSWFJDTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc2IwSkJRVzlDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRU5CUVVNN1NVRkZha1FzTUVKQlFUQkNPMEZCUXpWQ0xFTkJRVU03UVVGRlJEczdPMGRCUjBjN1FVRkRTQ3hOUVVGTkxGVkJRVlVzYjBKQlFXOUNMRU5CUVVNc1IwRkJZenRKUVVOcVJDeEpRVUZKTEVkQlFVY3NRMEZCUXl4UFFVRlBMRXRCUVVzc1JVRkJSU3hEUVVGRExFOUJRVThzUTBGQlF5eGhRVUZoTzFGQlF6RkRMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zTmtKQlFUWkNMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zWVVGQllTeFRRVUZUTEVOQlFVTXNRMEZCUXp0SlFVVnNSaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdTVUZEZUVNc1RVRkJUU3hUUVVGVExFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNhME5CUVdkQ0xFTkJRVU03U1VGRE4wTXNUMEZCVHl4WFFVRlhMRU5CUVVNc1MwRkJTeXhGUVVGRkxGTkJRVk1zUTBGQlF5eERRVUZETzBGQlEzWkRMRU5CUVVNN1FVRkZSQ3hOUVVGTkxHbENRVUZwUWl4SFFVRlhMRkZCUVZFc1EwRkJRenRCUVVVelF5d3JRMEZCSzBNN1FVRkRMME1zVFVGQlRTeFZRVUZWTEdOQlFXTXNRMEZCUXl4TFFVRmhMRVZCUVVVc2EwSkJRVEJDT3p0SlFVTjBSU3hOUVVGTkxHVkJRV1VzUjBGQk5FSXNTMEZCU3l4RFFVRkRMRXRCUVVzc1EwRkJReXhwUWtGQmFVSXNRMEZCUXl4RFFVRkRPMGxCUTJoR0xFMUJRVTBzVjBGQlZ5eEhRVUZaTEV0QlFVc3NRMEZCUXl4TlFVRk5MRWRCUVVjc2EwSkJRV3RDTEVsQlFVa3NRMEZCUXl4TlFVRkJMR1ZCUVdVc1lVRkJaaXhsUVVGbExIVkNRVUZtTEdWQlFXVXNRMEZCUlN4TlFVRk5MRzFEUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0SlFVTnlSeXhOUVVGTkxGVkJRVlVzUjBGQlJ5eE5RVUZCTEdWQlFXVXNZVUZCWml4bFFVRmxMSFZDUVVGbUxHVkJRV1VzUTBGQlJ5eERRVUZETEVOQlFVTXNiVU5CUVVrc1IwRkJSeXhEUVVGRE8wbEJReTlETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFVkJRVVVzYTBKQlFXdENMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03UVVGRGRrWXNRMEZCUXp0QlFVVkVMRTFCUVUwN1FVRkRUaXhOUVVGTkxGVkJRVlVzVjBGQlZ5eERRVUZETEZGQlFXdENPMGxCUXpWRExGRkJRVkVzVVVGQlVTeEZRVUZGTzFGQlEyeENPMWxCUTBVc1QwRkJUeXhaUVVGWkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNN1VVRkRka003V1VGRFJTeFBRVUZQTEZsQlFWa3NRMEZCUXl4blFrRkJaMElzUTBGQlF6dFJRVU4yUXp0WlFVTkZMRTlCUVU4c1dVRkJXU3hEUVVGRExHOUNRVUZ2UWl4RFFVRkRPMUZCUXpORE8xbEJRMFVzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl4NVFrRkJlVUlzVVVGQlVTeEpRVUZKTEVOQlFVTXNRMEZCUXp0TFFVTjRSRHRCUVVOSUxFTkJRVU03UVVGRlJEczdPenM3UjBGTFJ6dEJRVU5JTEUxQlFVMHNWVUZCVlN4eFFrRkJjVUlzUTBGQlF5eEpRVUZyUWl4RlFVRkZMRkZCUVhGQ0xFVkJRVVVzV1VGQmIwSXNSMEZCUnp0SlFVTjBSeXhOUVVGTkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVkQlFVY3NRMEZCVXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhGUVVGRkxFZEJRVWNzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTXpSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRPMGxCUlhaQ0xFMUJRVTBzUzBGQlN5eEhRVUZoTEVWQlFVVXNRMEZCUXp0SlFVTXpRaXhOUVVGTkxGTkJRVk1zUjBGQllTeEZRVUZGTEVOQlFVTTdTVUZETDBJc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeEpRVUZKTEVWQlFVVTdVVUZEY0VJc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVsQlFVa3NTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JETEZOQlFWTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0TFFVTjZRenRKUVVORUxEQkdRVUV3Ump0SlFVTXhSaXhOUVVGTkxFdEJRVXNzUjBGQlZ5eEpRVUZKTEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVONFF5eE5RVUZOTEZOQlFWTXNSMEZCVnl4SlFVRkpMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEpRVU5vUkN4UFFVRlBMR2RDUVVGblFpeERRVUZETEV0QlFVc3NSVUZCUlN4VFFVRlRMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4WlFVRlpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU01Uml4RFFVRkRPMEZCUlVRc1RVRkJUU3hWUVVGVkxHTkJRV01zUTBGQlF5eExRVUZyUWp0SlFVTXZReXhOUVVGTkxHdENRVUZyUWl4SFFVRTBRanRSUVVOc1JDeDVRa0ZCWXl4WlFVRlpMRU5CUVVNc2IwSkJRVzlDTEVOQlFVTTdVVUZEYUVRc01rSkJRV1VzV1VGQldTeERRVUZETEdkQ1FVRm5RaXhEUVVGRE8xRkJRemRETERKQ1FVRmxMRmxCUVZrc1EwRkJReXhuUWtGQlowSXNRMEZCUXp0TFFVTTVReXhEUVVGRE8wbEJSVVlzWjBSQlFXZEVPMGxCUTJoRUxFMUJRVTBzY1VKQlFYRkNMRWRCUVdFc2EwSkJRV3RDTEVOQlFVTXNSMEZCUnl4RFFVTTFSQ3hEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNjVUpCUVhGQ0xFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEyeEVMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4eFFrRkJjVUlzUTBGQlF5eERRVUZETzBsQlEyeEVMRTFCUVUwc1VVRkJVU3hIUVVGSExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMR3RDUVVGclFpeERRVUZETEhGQ1FVRnhRaXhEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTTdTVUZEY2tjc1QwRkJUeXhSUVVGUkxFTkJRVU03UVVGRGJFSXNRMEZCUXp0QlFVVkVPenM3TzBkQlNVYzdRVUZEU0N4TlFVRk5MRlZCUVZVc1lVRkJZU3hEUVVGRExFMUJRV2xDTEVWQlFVVXNXVUZCYjBJc1EwRkJRenRKUVVOd1JTeEpRVUZKTEZGQlFXZENMRU5CUVVNN1NVRkRja0lzU1VGQlNTeE5RVUZOTEVOQlFVTXNUMEZCVHl4SlFVRkpMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zWVVGQllTeEZRVUZGTzFGQlF6bERMRTFCUVUwc1JVRkJSU3hIUVVGcFFpeEpRVUZKTEZsQlFWa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOc1JDeFJRVUZSTEVkQlFVY3NSVUZCUlN4RFFVRkRMRkZCUVZFc1EwRkJRenRMUVVONFFqdFRRVUZOTzFGQlEwd3NUVUZCVFN4TFFVRkxMRWRCUVdkQ0xGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNVMEZCVXl4RlFVRkZMR1ZCUVdVc1EwRkJReXhEUVVGRE8xRkJRM2hGTEZGQlFWRXNSMEZCUnl4alFVRmpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UzBGRGJFTTdTVUZGUkN4TlFVRk5MRWRCUVVjc1IwRkJSeXhuUWtGQlowSXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRKUVVOMlF5eFBRVUZQTEVkQlFVY3NRMEZCUXp0QlFVTmlMRU5CUVVNN1FVRkZSQ3hOUVVGTkxGVkJRVlVzWjBKQlFXZENMRU5CUVVNc1YwRkJiVUk3U1VGRGJFUXNVVUZCVVN4WFFVRlhMRVZCUVVVN1VVRkRja0lzUzBGQlN5eEpRVUZKTzFsQlExQXNUMEZCVHl4clFrRkJhMElzUTBGQlF5eFZRVUZWTEVOQlFVTTdVVUZEZGtNc1MwRkJTeXhKUVVGSkxFTkJRVU03VVVGRFZpeExRVUZMTEV0QlFVc3NRMEZCUXp0UlFVTllMRXRCUVVzc1MwRkJTenRaUVVOU0xFOUJRVThzYlVKQlFXMUNMRU5CUVVNc1dVRkJXU3hEUVVGRE8xRkJRM2hETEZGQlFWRTdVVUZEVmp0WlFVTkZMRTlCUVU4c2EwSkJRV3RDTEVOQlFVTXNTMEZCU3l4RFFVRkRPMHRCUTJwRE8wRkJRMGdzUTBGQlF6dEJRVVZFTEUxQlFVMHNWVUZCVlN4WlFVRlpMRU5CUVVNc1JVRkJaMEk3TzBsQlF6TkRMRTFCUVUwc1kwRkJZeXhIUVVGSExFVkJRVVVzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zWVVGQllTeERRVUZETEVOQlFVTTdTVUZEZWtVc1NVRkJTU3hOUVVGTkxFZEJRWEZDTEUxQlFVRXNZMEZCWXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEZRVUZGTzFGQlEzcEVMRTFCUVUwc1MwRkJTeXhIUVVGSExFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU40UXl4UFFVRlBMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMGxCUTNKRUxFTkJRVU1zUTBGQlF5eHRRMEZCU1N4SlFVRkpMRU5CUVVNN1NVRkRXQ3hKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEdOQlFXTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJRenRSUVVOMFF5eE5RVUZOTEVkQlFVY3NZMEZCWXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRemRDTEU5QlFVOHNUVUZCVFN4RFFVRkRPMEZCUTJoQ0xFTkJRVU1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnS2lCaGN5Qm5jbTlySUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5bmNtOXJKenRjYm1sdGNHOXlkQ0FxSUdGeklIVnBJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzkxYVNjN1hHNXBiWEJ2Y25RZ0tpQmhjeUJFUnlCbWNtOXRJQ2RrWVhSaFozSnZheTFoY0drdlpHY25PMXh1YVcxd2IzSjBJSGQxSUdaeWIyMGdKM2QxSnp0Y2JseHVhVzF3YjNKMElIdFdaV04wYjNKOUlHWnliMjBnSjBCa1lYUmhaM0p2YXkxc2FXSnlZWEpwWlhNdmRYUnBiSE12YzNKakwzUjVjR1V0WkdWamJHRnlZWFJwYjI1ekp6dGNibWx0Y0c5eWRDQjdkbVZqZEc5eVRHVnVaM1JvTENCMlpXTjBiM0pFYjNSUWNtOWtkV04wZlNCbWNtOXRJQ2RBWkdGMFlXZHliMnN0YkdsaWNtRnlhV1Z6TDNWMGFXeHpMM055WXk5MlpXTjBiM0l0YjNCbGNtRjBhVzl1Y3ljN1hHNXBiWEJ2Y25RZ2UxTmxjVkJoYkdWMGRHVjlJR1p5YjIwZ0p5NHVMM05sY1Mxd1lXeGxkSFJsY3ljN1hHNXBiWEJ2Y25RZ2UwRnRhVzV2WVdOcFpITXNJRUZ0YVc1dllXTnBaSE5RWVd4bGRIUmxjMzBnWm5KdmJTQW5MaTR2WVcxcGJtOWhZMmxrY3ljN1hHNXBiWEJ2Y25RZ2UwNTFZMnhsYjNScFpHVnpMQ0JPZFdOc1pXOTBhV1JsYzFCaGJHVjBkR1Z6ZlNCbWNtOXRJQ2N1TGk5dWRXTnNaVzkwYVdSbGN5YzdYRzVwYlhCdmNuUWdlMVZ1YTI1dmQyNVRaWEZRWVd4bGRIUmxjMzBnWm5KdmJTQW5MaTR2ZFc1cmJtOTNiaWM3WEc1cGJYQnZjblFnZTFWdWFYUnpTR0Z1Wkd4bGNuMGdabkp2YlNBbkxpNHZkWFJwYkhNdmRXNXBkSE10YUdGdVpHeGxjaWM3WEc1Y2JseHVMeW9xSUdWdWRXMGdkSGx3WlNCMGJ5QnphVzF3YkdsbWVTQnpaWFIwYVc1bklGd2lkWE5sY2kxbWNtbGxibVJzZVZ3aUlHNXZkR0YwYVc5dUlHbG1JRzVsWTJWemMyRnllU0FxTDF4dVpYaHdiM0owSUdOdmJuTjBJR1Z1ZFcwZ1RrOVVRVlJKVDA0Z2UxeHVJQ0JHUVZOVVFTQTlJQ2RtWVhOMFlTY3NYRzRnSUZORlVFRlNRVlJQVWlBOUlDZHpaWEJoY21GMGIzSW5MRnh1SUNCSVJVeE5JRDBnSjJobGJHMG5MRnh1ZlZ4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnWlc1MWJTQkJURWxIVGsxRlRsUWdlMXh1SUNCVFJWRmZUVk5CSUQwZ0oxTkZVUzVOVTBFbkxGeHVJQ0JUUlZFZ1BTQW5VMFZSSnl4Y2JuMWNibHh1Wlhod2IzSjBJR052Ym5OMElHVnVkVzBnUVV4UVNFRkNSVlFnZTF4dUlDQkVUa0VnUFNBblJFNUJKeXhjYmlBZ1VrNUJJRDBnSjFKT1FTY3NYRzRnSUZCVUlEMGdKMUJVSnl4Y2JpQWdWVTRnUFNBblZVNG5MRnh1ZlZ4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnWlc1MWJTQlVRVWRUSUh0Y2JpQWdZV3hwWjI1bFpDQTlJQ2RoYkdsbmJtVmtKeXhjYmlBZ1lXeHdhR0ZpWlhRZ1BTQW5ZV3h3YUdGaVpYUW5MRnh1SUNCaGJIQm9ZV0psZEZOcGVtVWdQU0FuTG1Gc2NHaGhZbVYwVTJsNlpTY3NYRzRnSUdGc2NHaGhZbVYwU1hOTmRXeDBhV05vWVhJZ1BTQW5MbUZzY0doaFltVjBTWE5OZFd4MGFXTm9ZWEluTEZ4dUlDQnpaWEJoY21GMGIzSWdQU0FuYzJWd1lYSmhkRzl5Snl4Y2JuMDdYRzVjYm1WNGNHOXlkQ0IwZVhCbElGTmxjVU52YkZOMFlYUnpJRDBnZXlCbWNtVnhPaUJOYjI1dmJXVnlSbkpsY1hNc0lITmhiV1ZNWlc1bmRHZzZJR0p2YjJ4bFlXNGdmVnh1Wlhod2IzSjBJSFI1Y0dVZ1UzQnNhWFIwWlhKR2RXNWpJRDBnS0hObGNUb2djM1J5YVc1bktTQTlQaUJ6ZEhKcGJtZGJYVHRjYm1WNGNHOXlkQ0IwZVhCbElFMXZibTl0WlhKR2NtVnhjeUE5SUhzZ1cyMDZJSE4wY21sdVoxMDZJRzUxYldKbGNpQjlPMXh1WEc0dktpb2dVM1JoZEhNZ2IyWWdjMlZ4ZFdWdVkyVnpJSGRwZEdnZ2MzQmxZMmxtYVdWa0lITndiR2wwZEdWeUlHWjFibU1zSUhKbGRIVnlibk1nZXlCbWNtVnhMQ0J6WVcxbFRHVnVaM1JvSUgwdVhHNGdLaUJBY0dGeVlXMGdlMFJITGtOdmJIVnRibjBnYzJWeFEyOXNYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnYldsdVRHVnVaM1JvWEc0Z0tpQkFjR0Z5WVcwZ2UxTndiR2wwZEdWeVJuVnVZMzBnYzNCc2FYUjBaWEpjYmlBcUlFQnlaWFIxY200Z2V5QlRaWEZEYjJ4VGRHRjBjeUI5TENCellXMWxUR1Z1WjNSb09pQmliMjlzWldGdUlIMGdjM1JoZEhNZ2IyWWdZMjlzZFcxdUlITmxjWFZsYm1ObGMxeHVJQ292WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWMFUzUmhkSE1vYzJWeFEyOXNPaUJFUnk1RGIyeDFiVzRzSUcxcGJreGxibWQwYURvZ2JuVnRZbVZ5TENCemNHeHBkSFJsY2pvZ1UzQnNhWFIwWlhKR2RXNWpLVG9nVTJWeFEyOXNVM1JoZEhNZ2UxeHVJQ0JqYjI1emRDQm1jbVZ4T2lCN0lGdHRPaUJ6ZEhKcGJtZGRPaUJ1ZFcxaVpYSWdmU0E5SUh0OU8xeHVJQ0JzWlhRZ2MyRnRaVXhsYm1kMGFDQTlJSFJ5ZFdVN1hHNGdJR3hsZENCbWFYSnpkRXhsYm1kMGFDQTlJRzUxYkd3N1hHNWNiaUFnWm05eUlDaGpiMjV6ZENCelpYRWdiMllnYzJWeFEyOXNMbU5oZEdWbmIzSnBaWE1wSUh0Y2JpQWdJQ0JqYjI1emRDQnRVMlZ4SUQwZ2MzQnNhWFIwWlhJb2MyVnhLVHRjYmx4dUlDQWdJR2xtSUNobWFYSnpkRXhsYm1kMGFDQTlQU0J1ZFd4c0tWeHVJQ0FnSUNBZ1ptbHljM1JNWlc1bmRHZ2dQU0J0VTJWeExteGxibWQwYUR0Y2JpQWdJQ0JsYkhObElHbG1JQ2h0VTJWeExteGxibWQwYUNBaFBUMGdabWx5YzNSTVpXNW5kR2dwWEc0Z0lDQWdJQ0J6WVcxbFRHVnVaM1JvSUQwZ1ptRnNjMlU3WEc1Y2JpQWdJQ0JwWmlBb2JWTmxjUzVzWlc1bmRHZ2dQajBnYldsdVRHVnVaM1JvS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElHMGdiMllnYlZObGNTa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb0lTaHRJR2x1SUdaeVpYRXBLVnh1SUNBZ0lDQWdJQ0FnSUdaeVpYRmJiVjBnUFNBd08xeHVJQ0FnSUNBZ0lDQm1jbVZ4VzIxZElDczlJREU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNGdJSEpsZEhWeWJpQjdabkpsY1RvZ1puSmxjU3dnYzJGdFpVeGxibWQwYURvZ2MyRnRaVXhsYm1kMGFIMDdYRzU5WEc1Y2JtVjRjRzl5ZENCamIyNXpkQ0J0YjI1dmJXVnlVbVU2SUZKbFowVjRjQ0E5SUM5Y1hGc29YRngzS3lsY1hGMThLRnhjZHlsOEtDMHBMMmM3WEc1Y2JpOHFLaUJUY0d4cGRDQnpaWEYxWlc1alpTQm1iM0lnYzJsdVoyeGxJR05vWVhKaFkzUmxjaUJ0YjI1dmJXVnljeXdnYzNGMVlYSmxJR0p5WVdOclpYUnpJRzExYkhScFkyaGhjaUJ0YjI1dmJXVnlJRzVoYldWeklHOXlJR2RoY0NCemVXMWliMnd1WEc0Z0tpQkFjR0Z5WVcwZ2UyRnVlWDBnYzJWeElHOWlhbVZqZENCM2FYUm9JSE5sY1hWbGJtTmxYRzRnS2lCQWNtVjBkWEp1SUh0emRISnBibWRiWFgwZ1lYSnlZWGtnYjJZZ2JXOXViMjFsY25OY2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSE53YkdsMGRHVnlRWE5HWVhOMFlTaHpaWEU2SUdGdWVTazZJSE4wY21sdVoxdGRJSHRjYmlBZ2NtVjBkWEp1SUhkMVBGSmxaMFY0Y0UxaGRHTm9RWEp5WVhrK0tITmxjUzUwYjFOMGNtbHVaeWdwTG0xaGRHTm9RV3hzS0cxdmJtOXRaWEpTWlNrcFhHNGdJQ0FnTG0xaGNDZ29iV0U2SUZKbFowVjRjRTFoZEdOb1FYSnlZWGtwSUQwK0lIdGNiaUFnSUNBZ0lHeGxkQ0J0VW1Wek9pQnpkSEpwYm1jN1hHNGdJQ0FnSUNCamIyNXpkQ0J0T2lCemRISnBibWNnUFNCdFlWc3dYVHRjYmlBZ0lDQWdJR2xtSUNodExteGxibWQwYUNBK0lERXBJSHRjYmlBZ0lDQWdJQ0FnYlZKbGN5QTlJRzFoV3pGZE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2JWSmxjeUE5SUcwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnYlZKbGN6dGNiaUFnSUNCOUtTNTBiMEZ5Y21GNUtDazdYRzU5WEc1Y2JpOHFLaUJIWlhSeklHMWxkR2h2WkNCMGJ5QnpjR3hwZENCelpYRjFaVzVqWlNCaWVTQnpaWEJoY21GMGIzSmNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0J6WlhCaGNtRjBiM0pjYmlBcUlFQndZWEpoYlNCc2FXMXBkRnh1SUNvZ1FISmxkSFZ5YmlCN1UzQnNhWFIwWlhKR2RXNWpmVnh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVjBVM0JzYVhSMFpYSlhhWFJvVTJWd1lYSmhkRzl5S0hObGNHRnlZWFJ2Y2pvZ2MzUnlhVzVuTENCc2FXMXBkRG9nYm5WdFltVnlJSHdnZFc1a1pXWnBibVZrSUQwZ2RXNWtaV1pwYm1Wa0tUb2dVM0JzYVhSMFpYSkdkVzVqSUh0Y2JpQWdjbVYwZFhKdUlDaHpaWEU2SUhOMGNtbHVaeWtnUFQ0Z2UxeHVJQ0FnSUhKbGRIVnliaUJ6WlhFdWMzQnNhWFFvYzJWd1lYSmhkRzl5TENCc2FXMXBkQ2s3WEc0Z0lIMDdYRzU5WEc1Y2JtTnZibk4wSUdobGJHMVNaVG9nVW1WblJYaHdJRDBnTHloUVJWQlVTVVJGTVh4RVRrRXhmRkpPUVRFcFhGeDdLRnRlZlYwcktYMHZaenRjYm1OdmJuTjBJR2hsYkcxUWNERlNaVG9nVW1WblJYaHdJRDBnTDF4Y1d5aGJYbHhjVzF4Y1hWMHJLVjB2Wnp0Y2JseHVMeW9xSUZOd2JHbDBjeUJJWld4dElITjBjbWx1WnlCMGJ5QnRiMjV2YldWeWN5d2dZblYwSUdSdlpYTWdibTkwSUhKbGNHeGhZMlVnYlc5dWIyMWxjaUJ1WVcxbGN5QjBieUJ2ZEdobGNpQnViM1JoZEdsdmJpQW9aUzVuTGlCbWIzSWdVazVCS1M1Y2JpQXFJRTl1YkhrZ1ptOXlJR3hwYm1WaGNpQndiMng1YldWeWN5d2daRzlsY3lCdWIzUWdjM0JzYVhRZ1VrNUJJR1p2Y2lCeWFXSnZjMlVnWVc1a0lIQm9iM053YUdGMFpTQnRiMjV2YldWeWN5NWNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0J6WlhFZ1UyOTFjbU5sSUhOMGNtbHVaeUJ2WmlCSVJVeE5JRzV2ZEdGMGFXOXVYRzRnS2lCQWNtVjBkWEp1SUh0emRISnBibWRiWFgxY2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSE53YkdsMGRHVnlRWE5JWld4dEtITmxjVG9nWVc1NUtUb2djM1J5YVc1blcxMGdlMXh1SUNCb1pXeHRVbVV1YkdGemRFbHVaR1Y0SUQwZ01EdGNiaUFnWTI5dWMzUWdaV0U2SUZKbFowVjRjRVY0WldOQmNuSmhlU0I4SUc1MWJHd2dQU0JvWld4dFVtVXVaWGhsWXloelpYRXVkRzlUZEhKcGJtY29LU2s3WEc0Z0lHTnZibk4wSUdsdVUyVnhPaUJ6ZEhKcGJtY2dmQ0J1ZFd4c0lEMGdaV0VnUHlCbFlWc3lYU0E2SUc1MWJHdzdYRzVjYmlBZ1kyOXVjM1FnYlcxUWIzTjBVSEp2WTJWemN5QTlJQ2h0YlRvZ2MzUnlhVzVuS1RvZ2MzUnlhVzVuSUQwK0lIdGNiaUFnSUNCb1pXeHRVSEF4VW1VdWJHRnpkRWx1WkdWNElEMGdNRHRjYmlBZ0lDQmpiMjV6ZENCd2NERk5JRDBnYUdWc2JWQndNVkpsTG1WNFpXTW9iVzBwTzF4dUlDQWdJR2xtSUNod2NERk5JQ1ltSUhCd01VMHViR1Z1WjNSb0lENDlJRElwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEF4VFZzeFhUdGNiaUFnSUNCbGJITmxYRzRnSUNBZ0lDQnlaWFIxY200Z2JXMDdYRzRnSUgwN1hHNWNiaUFnWTI5dWMzUWdiVzFNYVhOME9pQnpkSEpwYm1kYlhTQTlJR2x1VTJWeElEOGdhVzVUWlhFdWMzQnNhWFFvSnk0bktTQTZJRnRkTzF4dUlDQnlaWFIxY200Z2JXMU1hWE4wTG0xaGNDaHRiVkJ2YzNSUWNtOWpaWE56S1R0Y2JuMWNibHh1THlvcUlFZGxkQ0J6Y0d4cGRIUmxjaUJ0WlhSb2IyUWdkRzhnYzNCc2FYUWdjMlZ4ZFdWdVkyVnpJSFJ2SUcxdmJtOXRaWEp6WEc0Z0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WjMwZ2RXNXBkSE5jYmlBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCelpYQmhjbUYwYjNKY2JpQXFJRUJ3WVhKaGJTQnNhVzFwZEZ4dUlDb2dRSEpsZEhWeWJpQjdVM0JzYVhSMFpYSkdkVzVqZlZ4dUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaMlYwVTNCc2FYUjBaWElvZFc1cGRITTZJSE4wY21sdVp5d2djMlZ3WVhKaGRHOXlPaUJ6ZEhKcGJtY3NJR3hwYldsME9pQnVkVzFpWlhJZ2ZDQjFibVJsWm1sdVpXUWdQU0IxYm1SbFptbHVaV1FwT2lCVGNHeHBkSFJsY2taMWJtTWdlMXh1SUNCcFppQW9kVzVwZEhNdWRHOU1iM2RsY2tOaGMyVW9LUzV6ZEdGeWRITlhhWFJvS0U1UFZFRlVTVTlPTGtaQlUxUkJLU2xjYmlBZ0lDQnlaWFIxY200Z2MzQnNhWFIwWlhKQmMwWmhjM1JoTzF4dUlDQmxiSE5sSUdsbUlDaDFibWwwY3k1MGIweHZkMlZ5UTJGelpTZ3BMbk4wWVhKMGMxZHBkR2dvVGs5VVFWUkpUMDR1VTBWUVFWSkJWRTlTS1NsY2JpQWdJQ0J5WlhSMWNtNGdaMlYwVTNCc2FYUjBaWEpYYVhSb1UyVndZWEpoZEc5eUtITmxjR0Z5WVhSdmNpd2diR2x0YVhRcE8xeHVJQ0JsYkhObElHbG1JQ2gxYm1sMGN5NTBiMHh2ZDJWeVEyRnpaU2dwTG5OMFlYSjBjMWRwZEdnb1RrOVVRVlJKVDA0dVNFVk1UU2twWEc0Z0lDQWdjbVYwZFhKdUlITndiR2wwZEdWeVFYTklaV3h0TzF4dUlDQmxiSE5sWEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHQlZibVY0Y0dWamRHVmtJSFZ1YVhSeklDUjdkVzVwZEhOOUlDNWdLVHRjYmx4dUlDQXZMeUJVVDBSUE9pQlRjR3hwZEhSbGNpQm1iM0lnU0VWTVRWeHVmVnh1WEc0dktpb2dSMlZ1WlhKaGRHVWdjM0JzYVhSMFpYSWdablZ1WTNScGIyNGdabTl5SUhObGNYVmxibU5sSUdOdmJIVnRibHh1SUNvZ1FIQmhjbUZ0SUh0RVJ5NURiMngxYlc1OUlHTnZiRnh1SUNvZ1FISmxkSFZ5YmlCN1UzQnNhWFIwWlhKR2RXNWpmU0JUY0d4cGRIUmxjaUJtZFc1amRHbHZibHh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVjBVM0JzYVhSMFpYSkdiM0pEYjJ4MWJXNG9ZMjlzT2lCRVJ5NURiMngxYlc0cE9pQlRjR3hwZEhSbGNrWjFibU1nZTF4dUlDQnBaaUFvWTI5c0xuTmxiVlI1Y0dVZ0lUMDlJRVJITGxORlRWUlpVRVV1VFVGRFVrOU5UMHhGUTFWTVJTbGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUVkbGRDQnpjR3hwZEhSbGNpQm1iM0lnYzJWdFZIbHdaU0JjSWlSN1JFY3VVMFZOVkZsUVJTNU5RVU5TVDAxUFRFVkRWVXhGZlZ3aUlHOXViSGt1WUNrN1hHNWNiaUFnWTI5dWMzUWdkVzVwZEhNZ1BTQmpiMnd1WjJWMFZHRm5LRVJITGxSQlIxTXVWVTVKVkZNcE8xeHVJQ0JqYjI1emRDQnpaWEJoY21GMGIzSWdQU0JqYjJ3dVoyVjBWR0ZuS0ZSQlIxTXVjMlZ3WVhKaGRHOXlLVHRjYmlBZ2NtVjBkWEp1SUdkbGRGTndiR2wwZEdWeUtIVnVhWFJ6TENCelpYQmhjbUYwYjNJcE8xeHVmVnh1WEc1amIyNXpkQ0JzYjI1blRXOXViMjFsY2xCaGNuUlNaVG9nVW1WblJYaHdJRDBnTHloY1hIY3JLUzluTzF4dVhHNHZLaW9nUTI5dWRtVnlkQ0JzYjI1bklHMXZibTl0WlhJZ2JtRnRaWE1nZEc4Z2MyaHZjblFnYjI1bGN5QXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJRzF2Ym05dFpYSlViMU5vYjNKMEtHRnRhVzV2T2lCemRISnBibWNzSUcxaGVFeGxibWQwYUU5bVRXOXViMjFsY2pvZ2JuVnRZbVZ5S1RvZ2MzUnlhVzVuSUh0Y2JpQWdZMjl1YzNRZ2MyaHZjblJCYldsdWIwMWhkR05vT2lCU1pXZEZlSEJOWVhSamFFRnljbUY1SUh3Z2JuVnNiQ0E5SUdGdGFXNXZMbTFoZEdOb0tHeHZibWROYjI1dmJXVnlVR0Z5ZEZKbEtUdGNiaUFnWTI5dWMzUWdibVZsWkVGa1pFUnZkSE02SUdKdmIyeGxZVzRnUFNCaGJXbHVieTVzWlc1bmRHZ2dQaUJ0WVhoTVpXNW5kR2hQWmsxdmJtOXRaWElnZkh3Z0tITm9iM0owUVcxcGJtOU5ZWFJqYUQ4dWJHVnVaM1JvSUQ4L0lEQXBJRDRnTVR0Y2JpQWdZMjl1YzNRZ2MyaHZjblJCYldsdWJ5QTlJSE5vYjNKMFFXMXBibTlOWVhSamFEOHVXekJkSUQ4L0lDY2dKenRjYmlBZ2NtVjBkWEp1SUNGdVpXVmtRV1JrUkc5MGN5QS9JSE5vYjNKMFFXMXBibThnT2lCemFHOXlkRUZ0YVc1dkxuTjFZbk4wY21sdVp5Z3dMQ0J0WVhoTVpXNW5kR2hQWmsxdmJtOXRaWElwSUNzZ0orS0FwaWM3WEc1OVhHNWNiaThxS2lBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZzY0doaFltVjBLR0ZzY0doaFltVjBPaUJCVEZCSVFVSkZWQ2s2SUZObGREeHpkSEpwYm1jK0lIdGNiaUFnYzNkcGRHTm9JQ2hoYkhCb1lXSmxkQ2tnZTF4dUlDQmpZWE5sSUVGTVVFaEJRa1ZVTGtST1FUcGNiaUFnSUNCeVpYUjFjbTRnVlc1cGRITklZVzVrYkdWeUxrUnVZVVpoYzNSaFFXeHdhR0ZpWlhRN1hHNGdJR05oYzJVZ1FVeFFTRUZDUlZRdVVrNUJPbHh1SUNBZ0lISmxkSFZ5YmlCVmJtbDBjMGhoYm1Sc1pYSXVVbTVoUm1GemRHRkJiSEJvWVdKbGREdGNiaUFnWTJGelpTQkJURkJJUVVKRlZDNVFWRHBjYmlBZ0lDQnlaWFIxY200Z1ZXNXBkSE5JWVc1a2JHVnlMbEJsY0hScFpHVkdZWE4wWVVGc2NHaGhZbVYwTzF4dUlDQmtaV1poZFd4ME9seHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnVlc1emRYQndiM0owWldRZ1lXeHdhR0ZpWlhRZ0p5UjdZV3h3YUdGaVpYUjlKeTVnS1R0Y2JpQWdmVnh1ZlZ4dVhHNHZLaW9nUTJGc1kzVnNZWFJsSUhOcGJXbHNZWEpwZEhrZ2FXNGdZM1Z5Y21WdWRDQnpaWEYxWlc1alpTQmhibVFnWVd4d2FHRmlaWFF1WEc0Z0tpQkFjR0Z5WVcwZ2UwMXZibTl0WlhKR2NtVnhjMzBnWm5KbGNWeHVJQ29nUUhCaGNtRnRJSHRUWlhROGMzUnlhVzVuUG4wZ1lXeHdhR0ZpWlhSY2JpQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZTQm5ZWEJUZVcxaWIyeGNiaUFxSUVCeVpYUjFjbTRnZTI1MWJXSmxjbjBnUTI5emFXNWxJSE5wYldsc1lYSnBkSGxjYmlBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZzY0doaFltVjBVMmx0YVd4aGNtbDBlU2htY21WeE9pQk5iMjV2YldWeVJuSmxjWE1zSUdGc2NHaGhZbVYwT2lCVFpYUThjM1J5YVc1blBpd2daMkZ3VTNsdFltOXNPaUJ6ZEhKcGJtY2dQU0FuTFNjcE9pQnVkVzFpWlhJZ2UxeHVJQ0JqYjI1emRDQnJaWGx6SUQwZ2JtVjNJRk5sZER4emRISnBibWMrS0ZzdUxpNXVaWGNnVTJWMEtFOWlhbVZqZEM1clpYbHpLR1p5WlhFcEtTd2dMaTR1WVd4d2FHRmlaWFJkS1R0Y2JpQWdhMlY1Y3k1a1pXeGxkR1VvWjJGd1UzbHRZbTlzS1R0Y2JseHVJQ0JqYjI1emRDQm1jbVZ4UVRvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ1kyOXVjM1FnWVd4d2FHRmlaWFJCT2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNCbWIzSWdLR052Ym5OMElHMGdiMllnYTJWNWN5a2dlMXh1SUNBZ0lHWnlaWEZCTG5CMWMyZ29iU0JwYmlCbWNtVnhJRDhnWm5KbGNWdHRYU0E2SURBcE8xeHVJQ0FnSUdGc2NHaGhZbVYwUVM1d2RYTm9LR0ZzY0doaFltVjBMbWhoY3lodEtTQS9JREVnT2lBd0tUdGNiaUFnZlZ4dUlDQXZLaUJVYUdWeVpTQjNaWEpsSUdFZ1ptVjNJR2xrWldGek9pQmphR2t0YzNGMVlYSmxaQ3dnY0dWaGNuTnZiaUJqYjNKeVpXeGhkR2x2YmlBb2RtRnlhV0Z1WTJVL0tTd2djMk5oYkdGeUlIQnliMlIxWTNRZ0tpOWNiaUFnWTI5dWMzUWdabkpsY1ZZNklGWmxZM1J2Y2lBOUlHNWxkeUJXWldOMGIzSW9abkpsY1VFcE8xeHVJQ0JqYjI1emRDQmhiSEJvWVdKbGRGWTZJRlpsWTNSdmNpQTlJRzVsZHlCV1pXTjBiM0lvWVd4d2FHRmlaWFJCS1R0Y2JpQWdjbVYwZFhKdUlIWmxZM1J2Y2tSdmRGQnliMlIxWTNRb1puSmxjVllzSUdGc2NHaGhZbVYwVmlrZ0x5QW9kbVZqZEc5eVRHVnVaM1JvS0daeVpYRldLU0FxSUhabFkzUnZja3hsYm1kMGFDaGhiSEJvWVdKbGRGWXBLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUmxkR1ZqZEVGc2NHaGhZbVYwS0hOMFlYUnpPaUJUWlhGRGIyeFRkR0YwY3lrNklITjBjbWx1WnlCN1hHNGdJR052Ym5OMElHRnNjR2hoWW1WMFEyRnVaR2xrWVhSbGN6b2dXM04wY21sdVp5d2dVMlYwUEhOMGNtbHVaejVkVzEwZ1BTQmJYRzRnSUNBZ1cwRk1VRWhCUWtWVUxsQlVMQ0JWYm1sMGMwaGhibVJzWlhJdVVHVndkR2xrWlVaaGMzUmhRV3h3YUdGaVpYUmRMRnh1SUNBZ0lGdEJURkJJUVVKRlZDNUVUa0VzSUZWdWFYUnpTR0Z1Wkd4bGNpNUVibUZHWVhOMFlVRnNjR2hoWW1WMFhTeGNiaUFnSUNCYlFVeFFTRUZDUlZRdVVrNUJMQ0JWYm1sMGMwaGhibVJzWlhJdVVtNWhSbUZ6ZEdGQmJIQm9ZV0psZEYwc1hHNGdJRjA3WEc1Y2JpQWdMeThnUTJGc1kzVnNZWFJsSUd4cGEyVnNhV2h2YjJSeklHWnZjaUJoYkhCb1lXSmxkRjlqWVc1a2FXUmhkR1Z6WEc0Z0lHTnZibk4wSUdGc2NHaGhZbVYwUTJGdVpHbGtZWFJsYzFOcGJUb2diblZ0WW1WeVcxMGdQU0JoYkhCb1lXSmxkRU5oYm1ScFpHRjBaWE11YldGd0tGeHVJQ0FnSUNoaktTQTlQaUJuWlhSQmJIQm9ZV0psZEZOcGJXbHNZWEpwZEhrb2MzUmhkSE11Wm5KbGNTd2dZMXN4WFNrcE8xeHVJQ0JqYjI1emRDQnRZWGhEYjNNZ1BTQk5ZWFJvTG0xaGVDZ3VMaTVoYkhCb1lXSmxkRU5oYm1ScFpHRjBaWE5UYVcwcE8xeHVJQ0JqYjI1emRDQmhiSEJvWVdKbGRDQTlJRzFoZUVOdmN5QStJREF1TmpVZ1B5QmhiSEJvWVdKbGRFTmhibVJwWkdGMFpYTmJZV3h3YUdGaVpYUkRZVzVrYVdSaGRHVnpVMmx0TG1sdVpHVjRUMllvYldGNFEyOXpLVjFiTUYwZ09pQW5WVTRuTzF4dUlDQnlaWFIxY200Z1lXeHdhR0ZpWlhRN1hHNTlYRzVjYmk4cUtpQlRaV3hsWTNSeklHRWdjM1ZwZEdGaWJHVWdjR0ZzWlhSMFpTQmlZWE5sWkNCdmJpQmpiMngxYlc0Z1pHRjBZVnh1SUNvZ1FIQmhjbUZ0SUh0RVJ5NURiMngxYlc1OUlITmxjVU52YkNCRGIyeDFiVzRnZEc4Z2JHOXZheUJtYjNJZ1lTQndZV3hsZEhSbFhHNGdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdJRzFwYmt4bGJtZDBhQ0J0YVc1cGJYVnRJR3hsYm1kMGFDQnZaaUJ6WlhGMVpXNWpaU0IwYnlCa1pYUmxZM1FnY0dGc1pYUjBaU0FvWlcxd2RIa2djM1J5YVc1bmN5QmhjbVVnWVd4c2IzZGxaQ2xjYmlBcUlFQnlaWFIxY200Z2UxTmxjVkJoYkdWMGRHVjlJRkJoYkdWMGRHVWdZMjl5Y21WemNHOXVaR2x1WnlCMGJ5QjBhR1VnWVd4d2FHRmlaWFFnYjJZZ2RHaGxJSE5sY1hWbGJtTmxjeUJwYmlCMGFHVWdZMjlzZFcxdVhHNGdLaTljYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ3YVdOclZYQlFZV3hsZEhSbEtITmxjVU52YkRvZ1JFY3VRMjlzZFcxdUxDQnRhVzVNWlc1bmRHZzZJRzUxYldKbGNpQTlJRFVwT2lCVFpYRlFZV3hsZEhSbElIdGNiaUFnYkdWMElHRnNjR2hoWW1WME9pQnpkSEpwYm1jN1hHNGdJR2xtSUNoelpYRkRiMnd1YzJWdFZIbHdaU0E5UFNCRVJ5NVRSVTFVV1ZCRkxrMUJRMUpQVFU5TVJVTlZURVVwSUh0Y2JpQWdJQ0JqYjI1emRDQjFhRG9nVlc1cGRITklZVzVrYkdWeUlEMGdibVYzSUZWdWFYUnpTR0Z1Wkd4bGNpaHpaWEZEYjJ3cE8xeHVJQ0FnSUdGc2NHaGhZbVYwSUQwZ2RXZ3VZV3h3YUdGaVpYUTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdZMjl1YzNRZ2MzUmhkSE02SUZObGNVTnZiRk4wWVhSeklEMGdaMlYwVTNSaGRITW9jMlZ4UTI5c0xDQnRhVzVNWlc1bmRHZ3NJSE53YkdsMGRHVnlRWE5HWVhOMFlTazdYRzRnSUNBZ1lXeHdhR0ZpWlhRZ1BTQmtaWFJsWTNSQmJIQm9ZV0psZENoemRHRjBjeWs3WEc0Z0lIMWNibHh1SUNCamIyNXpkQ0J5WlhNZ1BTQm5aWFJRWVd4bGRIUmxRbmxVZVhCbEtHRnNjR2hoWW1WMEtUdGNiaUFnY21WMGRYSnVJSEpsY3p0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2RsZEZCaGJHVjBkR1ZDZVZSNWNHVW9jR0ZzWlhSMFpWUjVjR1U2SUhOMGNtbHVaeWs2SUZObGNWQmhiR1YwZEdVZ2UxeHVJQ0J6ZDJsMFkyZ2dLSEJoYkdWMGRHVlVlWEJsS1NCN1hHNGdJR05oYzJVZ0oxQlVKenBjYmlBZ0lDQnlaWFIxY200Z1FXMXBibTloWTJsa2MxQmhiR1YwZEdWekxrZHliMnRIY205MWNITTdYRzRnSUdOaGMyVWdKMDVVSnpwY2JpQWdZMkZ6WlNBblJFNUJKenBjYmlBZ1kyRnpaU0FuVWs1Qkp6cGNiaUFnSUNCeVpYUjFjbTRnVG5WamJHVnZkR2xrWlhOUVlXeGxkSFJsY3k1RGFISnZiV0YwYjJkeVlXMDdYRzRnSUNBZ0x5OGdiM1JvWlhKY2JpQWdaR1ZtWVhWc2REcGNiaUFnSUNCeVpYUjFjbTRnVlc1cmJtOTNibE5sY1ZCaGJHVjBkR1Z6TGtOdmJHOXlPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ3YVdOclZYQlRaWEZEYjJ3b1pHWTZJRVJITGtSaGRHRkdjbUZ0WlNrNklFUkhMa052YkhWdGJpQjhJRzUxYkd3Z2UxeHVJQ0JqYjI1emRDQnpaVzFVZVhCbFEyOXNUR2x6ZENBOUlHUm1MbU52YkhWdGJuTXVZbmxUWlcxVWVYQmxRV3hzS0VSSExsTkZUVlJaVUVVdVRVRkRVazlOVDB4RlExVk1SU2s3WEc0Z0lHeGxkQ0J5WlhORGIydzZJRVJITGtOdmJIVnRiaUI4SUc1MWJHd2dQU0J6WlcxVWVYQmxRMjlzVEdsemRDNW1hVzVrS0NoamIyd3BJRDArSUh0Y2JpQWdJQ0JqYjI1emRDQjFibWwwY3lBOUlHTnZiQzVuWlhSVVlXY29SRWN1VkVGSFV5NVZUa2xVVXlrN1hHNGdJQ0FnY21WMGRYSnVJSFZ1YVhSeklEOGdkVzVwZEhNdWFXNWtaWGhQWmlnblRWTkJKeWtnSVQwOUlDMHhJRG9nWm1Gc2MyVTdYRzRnSUgwcElEOC9JRzUxYkd3N1hHNGdJR2xtSUNnaGNtVnpRMjlzSUNZbUlITmxiVlI1Y0dWRGIyeE1hWE4wTG14bGJtZDBhQ0ErSURBcFhHNGdJQ0FnY21WelEyOXNJRDBnYzJWdFZIbHdaVU52YkV4cGMzUmJNRjA3WEc0Z0lISmxkSFZ5YmlCeVpYTkRiMnc3WEc1OVhHNGlYWDA9IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IFVuaXRzSGFuZGxlciB9IGZyb20gJy4vdW5pdHMtaGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTcGxpdHRlckZvckNvbHVtbiwgZ2V0U3RhdHMgfSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuLyoqIENsYXNzIGZvciBoYW5kbGluZyBjb252ZXJzaW9uIG9mIG5vdGF0aW9uIHN5c3RlbXMgaW4gTWFjcm9tb2xlY3VsZSBjb2x1bW5zICovXG5leHBvcnQgY2xhc3MgTm90YXRpb25Db252ZXJ0ZXIgZXh0ZW5kcyBVbml0c0hhbmRsZXIge1xuICAgIGdldCBzcGxpdHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5fc3BsaXR0ZXIgPSBnZXRTcGxpdHRlckZvckNvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGxpdHRlcjtcbiAgICB9XG4gICAgdG9GYXN0YSh0YXJnZXROb3RhdGlvbikgeyByZXR1cm4gdGFyZ2V0Tm90YXRpb24gPT09IFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLzsgfVxuICAgIHRvU2VwYXJhdG9yKHRhcmdldE5vdGF0aW9uKSB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi87IH1cbiAgICB0b0hlbG0odGFyZ2V0Tm90YXRpb24pIHsgcmV0dXJuIHRhcmdldE5vdGF0aW9uID09PSBcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovOyB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIE1hY3JvbW9sZWN1bGUgY29sdW1uIGZyb20gRkFTVEEgdG8gU0VQQVJBVE9SIG5vdGF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yICBBIHNwZWNpZmljIHNlcGFyYXRvciB0byBiZSB1c2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZhc3RhR2FwU3ltYm9sICBHYXAgc3ltYm9sIGluIEZBU1RBLCAnLScgYnkgZGVmYXVsdFxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gICAgICAgIEEgbmV3IGNvbHVtbiBpbiBTRVBBUkFUT1Igbm90YXRpb25cbiAgICAgKi9cbiAgICBjb252ZXJ0RmFzdGFUb1NlcGFyYXRvcihzZXBhcmF0b3IsIGZhc3RhR2FwU3ltYm9sID0gbnVsbCkge1xuICAgICAgICBpZiAoZmFzdGFHYXBTeW1ib2wgPT09IG51bGwpXG4gICAgICAgICAgICBmYXN0YUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICAgICAgY29uc3QgbmV3Q29sdW1uID0gdGhpcy5nZXROZXdDb2x1bW4oXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi8pO1xuICAgICAgICAvLyBhc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgbmV3bHkgY3JlYXRlZCBlbXB0eSBjb2x1bW5cbiAgICAgICAgbmV3Q29sdW1uLmluaXQoKGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmFzdGFQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAgICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXkgPSB0aGlzLnNwbGl0dGVyKGZhc3RhUG9seW1lcik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhc3RhTW9ub21lcnNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPT09IGZhc3RhR2FwU3ltYm9sKVxuICAgICAgICAgICAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFzdGFNb25vbWVyc0FycmF5LmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi8pO1xuICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKFwic2VwYXJhdG9yXCIgLyogVEFHUy5zZXBhcmF0b3IgKi8sIHNlcGFyYXRvcik7XG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd3JhcHBlciBzdHJpbmdzIGZvciBIRUxNLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlXG4gICAgICogbWFjcm9tb2xlY3VsZSAocGVwdGlkZSwgRE5BLCBSTkEpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2Ygd3JhcHBlcnNcbiAgICAgKi9cbiAgICBnZXRIZWxtV3JhcHBlcnMoKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9ICh0aGlzLmlzRG5hKCkpID8gJ0ROQTF7JyA6XG4gICAgICAgICAgICAodGhpcy5pc1JuYSgpKSA/ICdSTkExeycgOlxuICAgICAgICAgICAgICAgICh0aGlzLmlzUGVwdGlkZSgpKSA/ICdQRVBUSURFMXsnIDpcbiAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24nOyAvLyB0aGlzIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYXMgZXhjZXB0aW9uYWxcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gJ1Vua25vd24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWl0aGVyIHBlcHRpZGUsIG5vciBudWNsZW90aWRlJyk7XG4gICAgICAgIGNvbnN0IHBvc3RmaXggPSAnfSQkJCc7XG4gICAgICAgIGNvbnN0IGxlZnRXcmFwcGVyID0gKHRoaXMuaXNEbmEoKSkgPyAnRCgnIDpcbiAgICAgICAgICAgICh0aGlzLmlzUm5hKCkpID8gJ1IoJyA6ICcnOyAvLyBubyB3cmFwcGVyIGZvciBwZXB0aWRlc1xuICAgICAgICBjb25zdCByaWdodFdyYXBwZXIgPSAodGhpcy5pc0RuYSgpIHx8IHRoaXMuaXNSbmEoKSkgPyAnKVAnIDogJyc7IC8vIG5vIHdyYXBwZXIgZm9yIHBlcHRpZGVzXG4gICAgICAgIHJldHVybiBbcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4XTtcbiAgICB9XG4gICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgc3RyaW5ncyB0byBIRUxNXG4gICAgY29udmVydFRvSGVsbUhlbHBlcihzb3VyY2VQb2x5bWVyLCBzb3VyY2VHYXBTeW1ib2wsIHByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeCkge1xuICAgICAgICBjb25zdCBtb25vbWVyQXJyYXkgPSB0aGlzLnNwbGl0dGVyKHNvdXJjZVBvbHltZXIpO1xuICAgICAgICBjb25zdCBtb25vbWVySGVsbUFycmF5ID0gbW9ub21lckFycmF5Lm1hcCgobW0pID0+IHtcbiAgICAgICAgICAgIGlmIChtbSA9PT0gc291cmNlR2FwU3ltYm9sKVxuICAgICAgICAgICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsZWZ0V3JhcHBlcn0ke21tfSR7cmlnaHRXcmFwcGVyfWA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7bW9ub21lckhlbG1BcnJheS5qb2luKCcuJyl9JHtwb3N0Zml4fWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBzdHJpbmcgd2l0aCBTRVBBUkFUT1IvRkFTVEEgbm90YXRpb24gdG8gSEVMTVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBvbHltZXIgIEEgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gc291cmNlR2FwU3ltYm9sICBBbiBvcHRpb25hbCBnYXAgc3ltYm9sLCBzZXQgdG9cbiAgICAgKiBkZWZhdWx0IHZhbHVlcyAoJy0nIGZvciBGQVNUQSBhbmQgJycgZm9yIFNFUEFSQVRPUikgdW5sZXNzIHNwZWNpZmllZFxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gIFRoZSB0YXJnZXQgSEVMTSBzdHJpbmdcbiAgICAgKi9cbiAgICBjb252ZXJ0U3RyaW5nVG9IZWxtKHNvdXJjZVBvbHltZXIsIHNvdXJjZUdhcFN5bWJvbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgICAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtSGVscGVyKHNvdXJjZVBvbHltZXIsIHNvdXJjZUdhcFN5bWJvbCwgcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGNvbHVtbiB0byBIRUxNXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHNvdXJjZUdhcFN5bWJvbFxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICAgKi9cbiAgICBjb252ZXJ0VG9IZWxtKHNvdXJjZUdhcFN5bWJvbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgICAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbihcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovKTtcbiAgICAgICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgICAgICBuZXdDb2x1bW4uaW5pdCgoaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtSGVscGVyKHNvdXJjZVBvbHltZXIsIHNvdXJjZUdhcFN5bWJvbCwgcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLyk7XG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgU0VQQVJBVE9SIGNvbHVtbiB0byBGQVNUQSBub3RhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBmYXN0YUdhcFN5bWJvbCBPcHRpb25hbCBnYXAgc3ltYm9sIGZvciBGQVNUQVxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gIENvbnZlcnRlZCBjb2x1bW5cbiAgICAgKi9cbiAgICBjb252ZXJ0U2VwYXJhdG9yVG9GYXN0YShmYXN0YUdhcFN5bWJvbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKGZhc3RhR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgICAgICAgZmFzdGFHYXBTeW1ib2wgPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQTtcbiAgICAgICAgY29uc3QgbmV3Q29sdW1uID0gdGhpcy5nZXROZXdDb2x1bW4oXCJmYXN0YVwiIC8qIE5PVEFUSU9OLkZBU1RBICovKTtcbiAgICAgICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgICAgICBuZXdDb2x1bW4uaW5pdCgoaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXBhcmF0b3JQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAgICAgICAvLyBpdGVtcyBjYW4gYmUgbW9ub21lcnMgb3Igc2VwYXJhdG9yc1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9ySXRlbXNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoc2VwYXJhdG9yUG9seW1lcik7XG4gICAgICAgICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VwYXJhdG9ySXRlbXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzZXBhcmF0b3JJdGVtc0FycmF5W2ldO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChmYXN0YUdhcFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZiBhIG11bHRpLWNoYXJhY3RlciBtb25vbWVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChtb25vbWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYXN0YU1vbm9tZXJzQXJyYXkuam9pbignJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLyk7XG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDb252ZXJ0IEhFTE0gY29sdW1uIHRvIEZBU1RBL1NFUEFSQVRPUlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRndE5vdGF0aW9uICAgIFRhcmdldCBub3RhdGlvbjogRkFTVEEgb3IgU0VQQVJBVE9SXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRndFNlcGFyYXRvciAgIE9wdGlvbmFsIHRhcmdldCBzZXBhcmF0b3IgKGZvciBIRUxNIC0+XG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RHYXBTeW1ib2wgICBPcHRpb25hbCB0YXJnZXQgZ2FwIHN5bWJvbFxuICAgICAqIFNFUEFSQVRPUilcbiAgICAgKiBAcmV0dXJuIHtERy5Db2x1bW59IENvbnZlcnRlZCBjb2x1bW5cbiAgICAgKi9cbiAgICBjb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yLCB0Z3RHYXBTeW1ib2wpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjb250YWluIGNhbGxzIG9mIGlzRG5hKCkgYW5kIGlzUm5hKCksIGZvclxuICAgICAgICAvLyBzb3VyY2UgaGVsbSBjb2x1bW5zIG1heSBjb250YWluIFJOQSwgRE5BIGFuZCBQVCBhY3Jvc3MgZGlmZmVyZW50IHJvd3NcbiAgICAgICAgaWYgKCF0Z3RHYXBTeW1ib2wpIHtcbiAgICAgICAgICAgIHRndEdhcFN5bWJvbCA9ICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24pKSA/XG4gICAgICAgICAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuRkFTVEEgOlxuICAgICAgICAgICAgICAgIFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LlNFUEFSQVRPUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRndFNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGd0U2VwYXJhdG9yID0gKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikpID8gJycgOiB0aGlzLnNlcGFyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWxtV3JhcHBlcnNSZSA9IC8oUlxcKHxEXFwofFxcKXxQKS9nO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbih0Z3ROb3RhdGlvbik7XG4gICAgICAgIC8vIGFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBlbXB0eSBjb2x1bW5cbiAgICAgICAgbmV3Q29sdW1uLmluaXQoKGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGVsbVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcbiAgICAgICAgICAgIC8vIHdlIGNhbm5vdCB1c2UgaXNEbmEoKSBvciBpc1JuYSgpIGJlY2F1c2Ugc291cmNlIGhlbG0gY29sdW1ucyBjYW5cbiAgICAgICAgICAgIC8vIGNvbnRhaW4gRE5BLCBSTkEgYW5kIFBUIGluIGRpZmZlcmVudCBjZWxscywgc28gdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgIC8vIHRhZ3MgY2Fubm90IGJlIHNldCBmb3IgdGhlIHdob2xlIGNvbHVtblxuICAgICAgICAgICAgY29uc3QgaXNOdWNsZW90aWRlID0gaGVsbVBvbHltZXIuc3RhcnRzV2l0aCgnRE5BJykgfHwgaGVsbVBvbHltZXIuc3RhcnRzV2l0aCgnUk5BJyk7XG4gICAgICAgICAgICAvLyBpdGVtcyBjYW4gYmUgbW9ub21lcnMgb3IgaGVsbXNcbiAgICAgICAgICAgIGNvbnN0IGhlbG1JdGVtc0FycmF5ID0gdGhpcy5zcGxpdHRlcihoZWxtUG9seW1lcik7XG4gICAgICAgICAgICBjb25zdCB0Z3RNb25vbWVyc0FycmF5ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlbG1JdGVtc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBoZWxtSXRlbXNBcnJheVtpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdWNsZW90aWRlKVxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKGhlbG1XcmFwcGVyc1JlLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LkhFTE0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKHRndEdhcFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikgJiYgaXRlbS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjYXNlIG9mIGEgbXVsdGktY2hhcmFjdGVyIG1vbm9tZXIgY29udmVydGVkIHRvIEZBU1RBXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICB0Z3RNb25vbWVyc0FycmF5LnB1c2gobW9ub21lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0Z3RNb25vbWVyc0FycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRndE1vbm9tZXJzQXJyYXkuam9pbih0Z3RTZXBhcmF0b3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gVEFHUy5hbGlnbmVkIGlzIG1hbmRhdG9yeSBmb3IgY29sdW1ucyBvZiBOT1RBVElPTi5GQVNUQSBhbmQgTk9UQVRJT04uU0VQQVJBVE9SXG4gICAgICAgIGNvbnN0IHNwbGl0dGVyID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4obmV3Q29sdW1uKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyhuZXdDb2x1bW4sIDUsIHNwbGl0dGVyKTtcbiAgICAgICAgY29uc3QgYWxpZ25lZCA9IHN0YXRzLnNhbWVMZW5ndGggPyAnU0VRLk1TQScgOiAnU0VRJztcbiAgICAgICAgbmV3Q29sdW1uLnNldFRhZyhcImFsaWduZWRcIiAvKiBUQUdTLmFsaWduZWQgKi8sIGFsaWduZWQpO1xuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cbiAgICBjb252ZXJ0SGVsbVRvU2VwYXJhdG9yKCkge1xuICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGlvcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5ld0NvbHVtbihcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLyk7XG4gICAgfVxuICAgIC8qKiBEaXNwYXRjaGVyIG1ldGhvZCBmb3Igbm90YXRpb24gY29udmVyc2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtOT1RBVElPTn0gdGd0Tm90YXRpb24gICBOb3RhdGlvbiB3ZSB3YW50IHRvIGNvbnZlcnQgdG9cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHRndFNlcGFyYXRvciAgIFBvc3NpYmxlIHNlcGFyYXRvclxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gICAgICAgICAgICAgICAgQ29udmVydGVkIGNvbHVtblxuICAgICAqL1xuICAgIGNvbnZlcnQodGd0Tm90YXRpb24sIHRndFNlcGFyYXRvciA9IG51bGwpIHtcbiAgICAgICAgLy8gcG9zc2libGUgZXhjZXB0aW9uc1xuICAgICAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gdGd0Tm90YXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBub3RhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgICAgIGlmICh0aGlzLnRvU2VwYXJhdG9yKHRndE5vdGF0aW9uKSAmJiB0Z3RTZXBhcmF0b3IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBzZXBhcmF0b3IgaXMgbm90IHNwZWNpZmllZCcpO1xuICAgICAgICBpZiAodGhpcy5pc0Zhc3RhKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikgJiYgdGd0U2VwYXJhdG9yICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZhc3RhVG9TZXBhcmF0b3IodGd0U2VwYXJhdG9yKTtcbiAgICAgICAgZWxzZSBpZiAoKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSkgJiYgdGhpcy50b0hlbG0odGd0Tm90YXRpb24pKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRvSGVsbSgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmlzU2VwYXJhdG9yKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTZXBhcmF0b3JUb0Zhc3RhKCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSkgLy8gdGhlIGNhc2Ugb2YgSEVMTVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24pO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmlzSGVsbSgpICYmIHRoaXMudG9TZXBhcmF0b3IodGd0Tm90YXRpb24pKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24sIHRndFNlcGFyYXRvcik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBjb252ZXJzaW9uICcgK1xuICAgICAgICAgICAgICAgIGBmcm9tIHNvdXJjZSBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgdG8gdGFyZ2V0IG5vdGF0aW9uICcke3RndE5vdGF0aW9ufScuYCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGNvbCkge1xuICAgICAgICBzdXBlcihjb2wpO1xuICAgICAgICB0aGlzLl9zcGxpdHRlciA9IG51bGw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYm05MFlYUnBiMjR0WTI5dWRtVnlkR1Z5TG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhNaU9sc2libTkwWVhScGIyNHRZMjl1ZG1WeWRHVnlMblJ6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVkQkxFOUJRVThzUzBGQlN5eEZRVUZGTEUxQlFVMHNhVUpCUVdsQ0xFTkJRVU03UVVGRmRFTXNUMEZCVHl4RlFVRkRMRmxCUVZrc1JVRkJReXhOUVVGTkxHbENRVUZwUWl4RFFVRkRPMEZCUXpkRExFOUJRVThzUlVGQlF5eHZRa0ZCYjBJc1JVRkJSU3hSUVVGUkxFVkJRVFJETEUxQlFVMHNhVUpCUVdsQ0xFTkJRVU03UVVGRk1VY3NhVVpCUVdsR08wRkJRMnBHTEUxQlFVMHNUMEZCVHl4cFFrRkJhMElzVTBGQlVTeFpRVUZaTzBsQlIycEVMRWxCUVdNc1VVRkJVVHRSUVVOd1FpeEpRVUZKTEVsQlFVa3NRMEZCUXl4VFFVRlRMRXRCUVVzc1NVRkJTVHRaUVVONlFpeEpRVUZKTEVOQlFVTXNVMEZCVXl4SFFVRkhMRzlDUVVGdlFpeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOeVJDeFBRVUZQTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNN1NVRkRlRUlzUTBGQlF6dEpRVVZOTEU5QlFVOHNRMEZCUXl4alFVRjNRaXhKUVVGaExFOUJRVThzWTBGQll5eHBRMEZCYlVJc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRmVFWXNWMEZCVnl4RFFVRkRMR05CUVhkQ0xFbEJRV0VzVDBGQlR5eGpRVUZqTEhsRFFVRjFRaXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVVZvUnl4TlFVRk5MRU5CUVVNc1kwRkJkMElzU1VGQllTeFBRVUZQTEdOQlFXTXNLMEpCUVd0Q0xFTkJRVU1zUTBGQlF5eERRVUZETzBsQlJUZEdPenM3T3pzN1QwRk5SenRKUVVOTExIVkNRVUYxUWl4RFFVRkRMRk5CUVdsQ0xFVkJRVVVzYVVKQlFXZERMRWxCUVVrN1VVRkRja1lzU1VGQlNTeGpRVUZqTEV0QlFVc3NTVUZCU1R0WlFVTjZRaXhqUVVGakxFZEJRVWNzU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRE8xRkJSWHBETEUxQlFVMHNVMEZCVXl4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxITkRRVUZ2UWl4RFFVRkRPMUZCUTNoRUxITkVRVUZ6UkR0UlFVTjBSQ3hUUVVGVExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNSMEZCVnl4RlFVRkZMRVZCUVVVN1dVRkROMElzVFVGQlRTeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdXVUZETVVNc1RVRkJUU3hyUWtGQmEwSXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFsQlEzWkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJRMnhFTEVsQlFVa3NhMEpCUVd0Q0xFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NZMEZCWXp0dlFrRkRNVU1zYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzV1VGQldTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExGTkJRVk1zUTBGQlF6dGhRVU42UlR0WlFVTkVMRTlCUVU4c2EwSkJRV3RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRE8xRkJRelZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTBnc1UwRkJVeXhEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc2RVTkJRWEZDTEVOQlFVTTdVVUZEY0VRc1UwRkJVeXhEUVVGRExFMUJRVTBzYlVOQlFXbENMRk5CUVZNc1EwRkJReXhEUVVGRE8xRkJRelZETEU5QlFVOHNVMEZCVXl4RFFVRkRPMGxCUTI1Q0xFTkJRVU03U1VGRlJEczdPenM3VDBGTFJ6dEpRVU5MTEdWQlFXVTdVVUZEY2tJc1RVRkJUU3hOUVVGTkxFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdXVUZEZGtNc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03WjBKQlEzaENMRU5CUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRE8yOUNRVU5vUXl4VFFVRlRMRU5CUVVNc1EwRkJReXcyUTBGQk5rTTdVVUZGT1VRc1NVRkJTU3hOUVVGTkxFdEJRVXNzVTBGQlV6dFpRVU4wUWl4TlFVRk5MRWxCUVVrc1MwRkJTeXhEUVVGRExHbERRVUZwUXl4RFFVRkRMRU5CUVVNN1VVRkZja1FzVFVGQlRTeFBRVUZQTEVkQlFVY3NUVUZCVFN4RFFVRkRPMUZCUTNaQ0xFMUJRVTBzVjBGQlZ5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUTNwRExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc01FSkJRVEJDTzFGQlEzaEVMRTFCUVUwc1dVRkJXU3hIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETERCQ1FVRXdRanRSUVVNelJpeFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRmRCUVZjc1JVRkJSU3haUVVGWkxFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTTdTVUZEZEVRc1EwRkJRenRKUVVWRUxHMUVRVUZ0UkR0SlFVTXpReXh0UWtGQmJVSXNRMEZEZWtJc1lVRkJjVUlzUlVGRGNrSXNaVUZCZFVJc1JVRkRka0lzVFVGQll5eEZRVU5rTEZkQlFXMUNMRVZCUTI1Q0xGbEJRVzlDTEVWQlEzQkNMRTlCUVdVN1VVRkZaaXhOUVVGTkxGbEJRVmtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8xRkJRMnhFTEUxQlFVMHNaMEpCUVdkQ0xFZEJRV0VzV1VGQldTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRVZCUVZVc1JVRkJSU3hGUVVGRk8xbEJRMnBGTEVsQlFVa3NSVUZCUlN4TFFVRkxMR1ZCUVdVN1owSkJRM2hDTEU5QlFVOHNXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NRMEZCUXpzN1owSkJSV2hFTEU5QlFVOHNSMEZCUnl4WFFVRlhMRWRCUVVjc1JVRkJSU3hIUVVGSExGbEJRVmtzUlVGQlJTeERRVUZETzFGQlEyaEVMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRMGdzVDBGQlR5eEhRVUZITEUxQlFVMHNSMEZCUnl4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1QwRkJUeXhGUVVGRkxFTkJRVU03U1VGRE5VUXNRMEZCUXp0SlFVVkVPenM3T3pzN08wOUJUMGM3U1VGRFNTeHRRa0ZCYlVJc1EwRkRlRUlzWVVGQmNVSXNSVUZEY2tJc2EwSkJRV2xETEVsQlFVazdVVUZGY2tNc1NVRkJTU3hsUVVGbExFdEJRVXNzU1VGQlNUdFpRVU14UWl4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExHZENRVUZuUWl4RFFVRkRPMUZCUXpGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVWQlFVVXNWMEZCVnl4RlFVRkZMRmxCUVZrc1JVRkJSU3hQUVVGUExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1VVRkROVVVzVDBGQlR5eEpRVUZKTEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zWVVGQllTeEZRVUZGTEdWQlFXVXNSVUZCUlN4TlFVRk5MRVZCUVVVc1YwRkJWeXhGUVVGRkxGbEJRVmtzUlVGQlJTeFBRVUZQTEVOQlFVTXNRMEZCUXp0SlFVTTVSeXhEUVVGRE8wbEJSVVE3T3pzN08wOUJTMGM3U1VGRFN5eGhRVUZoTEVOQlFVTXNhMEpCUVdsRExFbEJRVWs3VVVGRGVrUXNTVUZCU1N4bFFVRmxMRXRCUVVzc1NVRkJTVHRaUVVNeFFpeGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMR2RDUVVGblFpeERRVUZETzFGQlJURkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFVkJRVVVzVjBGQlZ5eEZRVUZGTEZsQlFWa3NSVUZCUlN4UFFVRlBMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zWlVGQlpTeEZRVUZGTEVOQlFVTTdVVUZGTlVVc1RVRkJUU3hUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NORUpCUVdVc1EwRkJRenRSUVVOdVJDeDNRMEZCZDBNN1VVRkRlRU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVZjc1JVRkJSU3hGUVVGRk8xbEJRemRDTEUxQlFVMHNZVUZCWVN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUXpORExFOUJRVThzU1VGQlNTeERRVUZETEcxQ1FVRnRRaXhEUVVGRExHRkJRV0VzUlVGQlJTeGxRVUZuUWl4RlFVRkZMRTFCUVUwc1JVRkJSU3hYUVVGWExFVkJRVVVzV1VGQldTeEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPMUZCUXk5SExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEwZ3NVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NOa0pCUVdkQ0xFTkJRVU03VVVGREwwTXNUMEZCVHl4VFFVRlRMRU5CUVVNN1NVRkRia0lzUTBGQlF6dEpRVVZFT3pzN096dFBRVXRITzBsQlEwc3NkVUpCUVhWQ0xFTkJRVU1zYVVKQlFXZERMRWxCUVVrN1VVRkRiRVVzU1VGQlNTeGpRVUZqTEV0QlFVc3NTVUZCU1R0WlFVTjZRaXhqUVVGakxFZEJRVWNzV1VGQldTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExFdEJRVXNzUTBGQlF6dFJRVVUzUkN4TlFVRk5MRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTdzRRa0ZCWjBJc1EwRkJRenRSUVVOd1JDeDNRMEZCZDBNN1VVRkRlRU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVZjc1JVRkJSU3hGUVVGRk8xbEJRemRDTEUxQlFVMHNaMEpCUVdkQ0xFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRE9VTXNjME5CUVhORE8xbEJRM1JETEUxQlFVMHNiVUpCUVcxQ0xFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4blFrRkJaMElzUTBGQlF5eERRVUZETzFsQlF6VkVMRTFCUVUwc2EwSkJRV3RDTEVkQlFXRXNSVUZCUlN4RFFVRkRPMWxCUTNoRExFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXh0UWtGQmJVSXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEyNUVMRTFCUVUwc1NVRkJTU3hIUVVGSExHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU53UXl4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFdEJRVXNzUTBGQlF5eEZRVUZGTzI5Q1FVTnlRaXhyUWtGQmEwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1kwRkJaU3hEUVVGRExFTkJRVU03YVVKQlF6RkRPM0ZDUVVGTkxFbEJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRVZCUVVVN2IwSkJRekZDTEhkRFFVRjNRenR2UWtGRGVFTXNUVUZCVFN4UFFVRlBMRWRCUVVjc1IwRkJSeXhIUVVGSExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTTdiMEpCUTJwRExHdENRVUZyUWl4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dHBRa0ZEYkVNN2NVSkJRVTA3YjBKQlEwd3NhMEpCUVd0Q0xFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMmxDUVVNdlFqdGhRVU5HTzFsQlEwUXNUMEZCVHl4clFrRkJhMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNN1VVRkRja01zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEU0N4VFFVRlRMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l3clFrRkJhVUlzUTBGQlF6dFJRVU5vUkN4UFFVRlBMRk5CUVZNc1EwRkJRenRKUVVOdVFpeERRVUZETzBsQlJVUTdPenM3T3pzN08wOUJVVWM3U1VGRFN5eFhRVUZYTEVOQlFVTXNWMEZCYlVJc1JVRkJSU3haUVVGeFFpeEZRVUZGTEZsQlFYRkNPMUZCUTI1R0xHMUZRVUZ0UlR0UlFVTnVSU3gzUlVGQmQwVTdVVUZEZUVVc1NVRkJTU3hEUVVGRExGbEJRVmtzUlVGQlJUdFpRVU5xUWl4WlFVRlpMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFYVkNMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEzUkVMRmxCUVZrc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRuUWtGRE0wTXNXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEZOQlFWTXNRMEZCUXp0VFFVTnFSRHRSUVVWRUxFbEJRVWtzUTBGQlF5eFpRVUZaTEVWQlFVVTdXVUZEYWtJc1dVRkJXU3hIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRjFRaXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETzFOQlF6bEZPMUZCUlVRc1RVRkJUU3hqUVVGakxFZEJRVWNzYVVKQlFXbENMRU5CUVVNN1VVRkRla01zVFVGQlRTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhYUVVGMVFpeERRVUZETEVOQlFVTTdVVUZETjBRc2QwTkJRWGRETzFGQlEzaERMRk5CUVZNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZYTEVWQlFVVXNSVUZCUlR0WlFVTTNRaXhOUVVGTkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFpRVVY2UXl4dFJVRkJiVVU3V1VGRGJrVXNiVVZCUVcxRk8xbEJRMjVGTERCRFFVRXdRenRaUVVNeFF5eE5RVUZOTEZsQlFWa3NSMEZCUnl4WFFVRlhMRU5CUVVNc1ZVRkJWU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEZkQlFWY3NRMEZCUXl4VlFVRlZMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03V1VGRmNFWXNhVU5CUVdsRE8xbEJRMnBETEUxQlFVMHNZMEZCWXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdXVUZEYkVRc1RVRkJUU3huUWtGQlowSXNSMEZCWVN4RlFVRkZMRU5CUVVNN1dVRkRkRU1zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExHTkJRV01zUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJRemxETEVsQlFVa3NTVUZCU1N4SFFVRkhMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBJc1NVRkJTU3haUVVGWk8yOUNRVU5rTEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExHTkJRV01zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXp0blFrRkRNVU1zU1VGQlNTeEpRVUZKTEV0QlFVc3NXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NSVUZCUlR0dlFrRkRja1FzWjBKQlFXZENMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRV0VzUTBGQlF5eERRVUZETzJsQ1FVTjBRenR4UWtGQlRTeEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJkVUlzUTBGQlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhGUVVGRk8yOUNRVU51UlN3eVJFRkJNa1E3YjBKQlF6TkVMRTFCUVUwc1QwRkJUeXhIUVVGSExFZEJRVWNzUjBGQlJ5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRPMjlDUVVOcVF5eG5Ra0ZCWjBJc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdhVUpCUTJoRE8zRkNRVUZOTzI5Q1FVTk1MR2RDUVVGblFpeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRwUWtGRE4wSTdZVUZEUmp0WlFVTkVMRTlCUVU4c1owSkJRV2RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8xRkJRemRETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUlVnc2FVWkJRV2xHTzFGQlEycEdMRTFCUVUwc1VVRkJVU3hIUVVGcFFpeHZRa0ZCYjBJc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFJRVU12UkN4TlFVRk5MRXRCUVVzc1IwRkJaMElzVVVGQlVTeERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1VVRkJVU3hEUVVGRExFTkJRVU03VVVGRE5VUXNUVUZCVFN4UFFVRlBMRWRCUVVjc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNVMEZCVXl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03VVVGRGNrUXNVMEZCVXl4RFFVRkRMRTFCUVUwc0swSkJRV1VzVDBGQlR5eERRVUZETEVOQlFVTTdVVUZGZUVNc1QwRkJUeXhUUVVGVExFTkJRVU03U1VGRGJrSXNRMEZCUXp0SlFVVlBMSE5DUVVGelFqdFJRVU0xUWl4cFJFRkJhVVE3VVVGRGFrUXNUMEZCVHl4SlFVRkpMRU5CUVVNc1dVRkJXU3h6UTBGQmIwSXNRMEZCUXp0SlFVTXZReXhEUVVGRE8wbEJSVVE3T3pzN08wOUJTMGM3U1VGRFNTeFBRVUZQTEVOQlFVTXNWMEZCY1VJc1JVRkJSU3hsUVVFNFFpeEpRVUZKTzFGQlEzUkZMSE5DUVVGelFqdFJRVU4wUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxFdEJRVXNzVjBGQlZ6dFpRVU12UWl4TlFVRk5MRWxCUVVrc1MwRkJTeXhEUVVGRExIbENRVUY1UWl4RFFVRkRMRU5CUVVNN1VVRkROME1zU1VGQlNTeEpRVUZKTEVOQlFVTXNWMEZCVnl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxGbEJRVmtzUzBGQlN5eEpRVUZKTzFsQlEzaEVMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zWjBOQlFXZERMRU5CUVVNc1EwRkJRenRSUVVWd1JDeEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRVZCUVVVc1NVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRmxCUVZrc1MwRkJTeXhKUVVGSk8xbEJRekZGTEU5QlFVOHNTVUZCU1N4RFFVRkRMSFZDUVVGMVFpeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMkZCUXk5RExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVsQlFVa3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFTkJRVU03V1VGRGVrVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU03WVVGRGVrSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGRkxFbEJRVWtzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNN1dVRkRkRVFzVDBGQlR5eEpRVUZKTEVOQlFVTXNkVUpCUVhWQ0xFVkJRVVVzUTBGQlF6dGhRVU51UXl4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhGUVVGRkxHMUNRVUZ0UWp0WlFVTjBSU3hQUVVGUExFbEJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNN1lVRkRiRU1zU1VGQlNTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eFhRVUZYTEVOQlFVTTdXVUZEY2tRc1QwRkJUeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZkQlFWY3NSVUZCUlN4WlFVRmhMRU5CUVVNc1EwRkJRenM3V1VGRmNFUXNUVUZCVFN4SlFVRkpMRXRCUVVzc1EwRkJReXd5UWtGQk1rSTdaMEpCUTNwRExIbENRVUY1UWl4SlFVRkpMRU5CUVVNc1VVRkJVU3g1UWtGQmVVSXNWMEZCVnl4SlFVRkpMRU5CUVVNc1EwRkJRenRKUVVOMFJpeERRVUZETzBsQlJVUXNXVUZCYlVJc1IwRkJZenRSUVVNdlFpeExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRTNVRXdzWTBGQlV5eEhRVUYzUWl4SlFVRkpMRU5CUVVNN1NVRTRVRGxETEVOQlFVTTdRMEZEUmlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFJRVJ2SUc1dmRDQmphR0Z1WjJVZ2RHaGxjMlVnYVcxd2IzSjBJR3hwYm1WeklIUnZJRzFoZEdOb0lHVjRkR1Z5Ym1Gc0lHMXZaSFZzWlhNZ2FXNGdkMlZpY0dGamF5QmpiMjVtYVdkMWNtRjBhVzl1SUNvdlhHNXBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJSFZwSUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5MWFTYzdYRzVwYlhCdmNuUWdLaUJoY3lCRVJ5Qm1jbTl0SUNka1lYUmhaM0p2YXkxaGNHa3ZaR2NuTzF4dVhHNXBiWEJ2Y25RZ2UxVnVhWFJ6U0dGdVpHeGxjbjBnWm5KdmJTQW5MaTkxYm1sMGN5MW9ZVzVrYkdWeUp6dGNibWx0Y0c5eWRDQjdaMlYwVTNCc2FYUjBaWEpHYjNKRGIyeDFiVzRzSUdkbGRGTjBZWFJ6TENCT1QxUkJWRWxQVGl3Z1UyVnhRMjlzVTNSaGRITXNJRk53YkdsMGRHVnlSblZ1WXl3Z1ZFRkhVMzBnWm5KdmJTQW5MaTl0WVdOeWIyMXZiR1ZqZFd4bEp6dGNibHh1THlvcUlFTnNZWE56SUdadmNpQm9ZVzVrYkdsdVp5QmpiMjUyWlhKemFXOXVJRzltSUc1dmRHRjBhVzl1SUhONWMzUmxiWE1nYVc0Z1RXRmpjbTl0YjJ4bFkzVnNaU0JqYjJ4MWJXNXpJQ292WEc1bGVIQnZjblFnWTJ4aGMzTWdUbTkwWVhScGIyNURiMjUyWlhKMFpYSWdaWGgwWlc1a2N5QlZibWwwYzBoaGJtUnNaWElnZTF4dUlDQndjbWwyWVhSbElGOXpjR3hwZEhSbGNqb2dVM0JzYVhSMFpYSkdkVzVqSUh3Z2JuVnNiQ0E5SUc1MWJHdzdYRzVjYmlBZ2NISnZkR1ZqZEdWa0lHZGxkQ0J6Y0d4cGRIUmxjaWdwT2lCVGNHeHBkSFJsY2taMWJtTWdlMXh1SUNBZ0lHbG1JQ2gwYUdsekxsOXpjR3hwZEhSbGNpQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lIUm9hWE11WDNOd2JHbDBkR1Z5SUQwZ1oyVjBVM0JzYVhSMFpYSkdiM0pEYjJ4MWJXNG9kR2hwY3k1amIyeDFiVzRwTzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5emNHeHBkSFJsY2p0Y2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCMGIwWmhjM1JoS0hSaGNtZGxkRTV2ZEdGMGFXOXVPaUJPVDFSQlZFbFBUaWs2SUdKdmIyeGxZVzRnZXlCeVpYUjFjbTRnZEdGeVoyVjBUbTkwWVhScGIyNGdQVDA5SUU1UFZFRlVTVTlPTGtaQlUxUkJPeUI5WEc1Y2JpQWdjSFZpYkdsaklIUnZVMlZ3WVhKaGRHOXlLSFJoY21kbGRFNXZkR0YwYVc5dU9pQk9UMVJCVkVsUFRpazZJR0p2YjJ4bFlXNGdleUJ5WlhSMWNtNGdkR0Z5WjJWMFRtOTBZWFJwYjI0Z1BUMDlJRTVQVkVGVVNVOU9MbE5GVUVGU1FWUlBVanNnZlZ4dVhHNGdJSEIxWW14cFl5QjBiMGhsYkcwb2RHRnlaMlYwVG05MFlYUnBiMjQ2SUU1UFZFRlVTVTlPS1RvZ1ltOXZiR1ZoYmlCN0lISmxkSFZ5YmlCMFlYSm5aWFJPYjNSaGRHbHZiaUE5UFQwZ1RrOVVRVlJKVDA0dVNFVk1UVHNnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYjI1MlpYSjBJR0VnVFdGamNtOXRiMnhsWTNWc1pTQmpiMngxYlc0Z1puSnZiU0JHUVZOVVFTQjBieUJUUlZCQlVrRlVUMUlnYm05MFlYUnBiMjVjYmlBZ0lDcGNiaUFnSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhObGNHRnlZWFJ2Y2lBZ1FTQnpjR1ZqYVdacFl5QnpaWEJoY21GMGIzSWdkRzhnWW1VZ2RYTmxaRnh1SUNBZ0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WjMwZ1ptRnpkR0ZIWVhCVGVXMWliMndnSUVkaGNDQnplVzFpYjJ3Z2FXNGdSa0ZUVkVFc0lDY3RKeUJpZVNCa1pXWmhkV3gwWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJITGtOdmJIVnRibjBnSUNBZ0lDQWdJRUVnYm1WM0lHTnZiSFZ0YmlCcGJpQlRSVkJCVWtGVVQxSWdibTkwWVhScGIyNWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZMjl1ZG1WeWRFWmhjM1JoVkc5VFpYQmhjbUYwYjNJb2MyVndZWEpoZEc5eU9pQnpkSEpwYm1jc0lHWmhjM1JoUjJGd1UzbHRZbTlzT2lCemRISnBibWNnZkNCdWRXeHNJRDBnYm5Wc2JDazZJRVJITGtOdmJIVnRiaUI3WEc0Z0lDQWdhV1lnS0daaGMzUmhSMkZ3VTNsdFltOXNJRDA5UFNCdWRXeHNLVnh1SUNBZ0lDQWdabUZ6ZEdGSFlYQlRlVzFpYjJ3Z1BTQjBhR2x6TG1SbFptRjFiSFJIWVhCVGVXMWliMnc3WEc1Y2JpQWdJQ0JqYjI1emRDQnVaWGREYjJ4MWJXNGdQU0IwYUdsekxtZGxkRTVsZDBOdmJIVnRiaWhPVDFSQlZFbFBUaTVUUlZCQlVrRlVUMUlwTzF4dUlDQWdJQzh2SUdGemMybG5iaUIwYUdVZ2RtRnNkV1Z6SUhSdklIUm9aU0J1Wlhkc2VTQmpjbVZoZEdWa0lHVnRjSFI1SUdOdmJIVnRibHh1SUNBZ0lHNWxkME52YkhWdGJpNXBibWwwS0NocFpIZzZJRzUxYldKbGNpa2dQVDRnZTF4dUlDQWdJQ0FnWTI5dWMzUWdabUZ6ZEdGUWIyeDViV1Z5SUQwZ2RHaHBjeTVqYjJ4MWJXNHVaMlYwS0dsa2VDazdYRzRnSUNBZ0lDQmpiMjV6ZENCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrZ1BTQjBhR2x6TG5Od2JHbDBkR1Z5S0daaGMzUmhVRzlzZVcxbGNpazdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1poYzNSaFRXOXViMjFsY25OQmNuSmhlUzVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWm1GemRHRk5iMjV2YldWeWMwRnljbUY1VzJsZElEMDlQU0JtWVhOMFlVZGhjRk41YldKdmJDbGNiaUFnSUNBZ0lDQWdJQ0JtWVhOMFlVMXZibTl0WlhKelFYSnlZWGxiYVYwZ1BTQlZibWwwYzBoaGJtUnNaWEl1WDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDNVRSVkJCVWtGVVQxSTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z1ptRnpkR0ZOYjI1dmJXVnljMEZ5Y21GNUxtcHZhVzRvYzJWd1lYSmhkRzl5S1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J1WlhkRGIyeDFiVzR1YzJWMFZHRm5LRVJITGxSQlIxTXVWVTVKVkZNc0lFNVBWRUZVU1U5T0xsTkZVRUZTUVZSUFVpazdYRzRnSUNBZ2JtVjNRMjlzZFcxdUxuTmxkRlJoWnloVVFVZFRMbk5sY0dGeVlYUnZjaXdnYzJWd1lYSmhkRzl5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdibVYzUTI5c2RXMXVPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVkbGRDQjBhR1VnZDNKaGNIQmxjaUJ6ZEhKcGJtZHpJR1p2Y2lCSVJVeE5MQ0JrWlhCbGJtUnBibWNnYjI0Z2RHaGxJSFI1Y0dVZ2IyWWdkR2hsWEc0Z0lDQXFJRzFoWTNKdmJXOXNaV04xYkdVZ0tIQmxjSFJwWkdVc0lFUk9RU3dnVWs1QktWeHVJQ0FnS2x4dUlDQWdLaUJBY21WMGRYSnVJSHR6ZEhKcGJtZGJYWDBnUVhKeVlYa2diMllnZDNKaGNIQmxjbk5jYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnWjJWMFNHVnNiVmR5WVhCd1pYSnpLQ2s2SUhOMGNtbHVaMXRkSUh0Y2JpQWdJQ0JqYjI1emRDQndjbVZtYVhnZ1BTQW9kR2hwY3k1cGMwUnVZU2dwS1NBL0lDZEVUa0V4ZXljZ09seHVJQ0FnSUNBZ0tIUm9hWE11YVhOU2JtRW9LU2tnUHlBblVrNUJNWHNuSURwY2JpQWdJQ0FnSUNBZ0tIUm9hWE11YVhOUVpYQjBhV1JsS0NrcElEOGdKMUJGVUZSSlJFVXhleWNnT2x4dUlDQWdJQ0FnSUNBZ0lDZFZibXR1YjNkdUp6c2dMeThnZEdocGN5QmpZWE5sSUhOb2IzVnNaQ0JpWlNCb1lXNWtiR1ZrSUdGeklHVjRZMlZ3ZEdsdmJtRnNYRzVjYmlBZ0lDQnBaaUFvY0hKbFptbDRJRDA5UFNBblZXNXJibTkzYmljcFhHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjA1bGFYUm9aWElnY0dWd2RHbGtaU3dnYm05eUlHNTFZMnhsYjNScFpHVW5LVHRjYmx4dUlDQWdJR052Ym5OMElIQnZjM1JtYVhnZ1BTQW5mU1FrSkNjN1hHNGdJQ0FnWTI5dWMzUWdiR1ZtZEZkeVlYQndaWElnUFNBb2RHaHBjeTVwYzBSdVlTZ3BLU0EvSUNkRUtDY2dPbHh1SUNBZ0lDQWdLSFJvYVhNdWFYTlNibUVvS1NrZ1B5QW5VaWduSURvZ0p5YzdJQzh2SUc1dklIZHlZWEJ3WlhJZ1ptOXlJSEJsY0hScFpHVnpYRzRnSUNBZ1kyOXVjM1FnY21sbmFIUlhjbUZ3Y0dWeUlEMGdLSFJvYVhNdWFYTkVibUVvS1NCOGZDQjBhR2x6TG1selVtNWhLQ2twSUQ4Z0p5bFFKeUE2SUNjbk95QXZMeUJ1YnlCM2NtRndjR1Z5SUdadmNpQndaWEIwYVdSbGMxeHVJQ0FnSUhKbGRIVnliaUJiY0hKbFptbDRMQ0JzWldaMFYzSmhjSEJsY2l3Z2NtbG5hSFJYY21Gd2NHVnlMQ0J3YjNOMFptbDRYVHRjYmlBZ2ZWeHVYRzRnSUM4dklFRWdhR1ZzY0dWeUlHWjFibU4wYVc5dUlHWnZjaUJqYjI1MlpYSjBhVzVuSUhOMGNtbHVaM01nZEc4Z1NFVk1UVnh1SUNCd2NtbDJZWFJsSUdOdmJuWmxjblJVYjBobGJHMUlaV3h3WlhJb1hHNGdJQ0FnYzI5MWNtTmxVRzlzZVcxbGNqb2djM1J5YVc1bkxGeHVJQ0FnSUhOdmRYSmpaVWRoY0ZONWJXSnZiRG9nYzNSeWFXNW5MRnh1SUNBZ0lIQnlaV1pwZURvZ2MzUnlhVzVuTEZ4dUlDQWdJR3hsWm5SWGNtRndjR1Z5T2lCemRISnBibWNzWEc0Z0lDQWdjbWxuYUhSWGNtRndjR1Z5T2lCemRISnBibWNzWEc0Z0lDQWdjRzl6ZEdacGVEb2djM1J5YVc1blhHNGdJQ2s2SUhOMGNtbHVaeUI3WEc0Z0lDQWdZMjl1YzNRZ2JXOXViMjFsY2tGeWNtRjVJRDBnZEdocGN5NXpjR3hwZEhSbGNpaHpiM1Z5WTJWUWIyeDViV1Z5S1R0Y2JpQWdJQ0JqYjI1emRDQnRiMjV2YldWeVNHVnNiVUZ5Y21GNU9pQnpkSEpwYm1kYlhTQTlJRzF2Ym05dFpYSkJjbkpoZVM1dFlYQW9LRzF0T2lCemRISnBibWNwSUQwK0lIdGNiaUFnSUNBZ0lHbG1JQ2h0YlNBOVBUMGdjMjkxY21ObFIyRndVM2x0WW05c0tWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ZXNXBkSE5JWVc1a2JHVnlMbDlrWldaaGRXeDBSMkZ3VTNsdFltOXNjMFJwWTNRdVNFVk1UVHRjYmlBZ0lDQWdJR1ZzYzJWY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdBa2UyeGxablJYY21Gd2NHVnlmU1I3YlcxOUpIdHlhV2RvZEZkeVlYQndaWEo5WUR0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdZQ1I3Y0hKbFptbDRmU1I3Ylc5dWIyMWxja2hsYkcxQmNuSmhlUzVxYjJsdUtDY3VKeWw5Skh0d2IzTjBabWw0ZldBN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dRMjl1ZG1WeWRDQmhJSE4wY21sdVp5QjNhWFJvSUZORlVFRlNRVlJQVWk5R1FWTlVRU0J1YjNSaGRHbHZiaUIwYnlCSVJVeE5YRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0J6YjNWeVkyVlFiMng1YldWeUlDQkJJSE4wY21sdVp5QjBieUJpWlNCamIyNTJaWEowWldSY2JpQWdJQ29nUUhCaGNtRnRJSHR6ZEhKcGJtY2dmQ0J1ZFd4c2ZTQnpiM1Z5WTJWSFlYQlRlVzFpYjJ3Z0lFRnVJRzl3ZEdsdmJtRnNJR2RoY0NCemVXMWliMndzSUhObGRDQjBiMXh1SUNBZ0tpQmtaV1poZFd4MElIWmhiSFZsY3lBb0p5MG5JR1p2Y2lCR1FWTlVRU0JoYm1RZ0p5Y2dabTl5SUZORlVFRlNRVlJQVWlrZ2RXNXNaWE56SUhOd1pXTnBabWxsWkZ4dUlDQWdLaUJBY21WMGRYSnVJSHR6ZEhKcGJtZDlJQ0JVYUdVZ2RHRnlaMlYwSUVoRlRFMGdjM1J5YVc1blhHNGdJQ0FxTDF4dUlDQndkV0pzYVdNZ1kyOXVkbVZ5ZEZOMGNtbHVaMVJ2U0dWc2JTaGNiaUFnSUNCemIzVnlZMlZRYjJ4NWJXVnlPaUJ6ZEhKcGJtY3NYRzRnSUNBZ2MyOTFjbU5sUjJGd1UzbHRZbTlzT2lCemRISnBibWNnZkNCdWRXeHNJRDBnYm5Wc2JGeHVJQ0FwT2lCemRISnBibWNnZTF4dUlDQWdJR2xtSUNoemIzVnlZMlZIWVhCVGVXMWliMndnUFQwOUlHNTFiR3dwWEc0Z0lDQWdJQ0J6YjNWeVkyVkhZWEJUZVcxaWIyd2dQU0IwYUdsekxtUmxabUYxYkhSSFlYQlRlVzFpYjJ3N1hHNGdJQ0FnWTI5dWMzUWdXM0J5WldacGVDd2diR1ZtZEZkeVlYQndaWElzSUhKcFoyaDBWM0poY0hCbGNpd2djRzl6ZEdacGVGMGdQU0IwYUdsekxtZGxkRWhsYkcxWGNtRndjR1Z5Y3lncE8xeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxtTnZiblpsY25SVWIwaGxiRzFJWld4d1pYSW9jMjkxY21ObFVHOXNlVzFsY2l3Z2MyOTFjbU5sUjJGd1UzbHRZbTlzTENCd2NtVm1hWGdzSUd4bFpuUlhjbUZ3Y0dWeUxDQnlhV2RvZEZkeVlYQndaWElzSUhCdmMzUm1hWGdwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFTnZiblpsY25RZ1lTQmpiMngxYlc0Z2RHOGdTRVZNVFZ4dUlDQWdLbHh1SUNBZ0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WnlCOElHNTFiR3g5SUhOdmRYSmpaVWRoY0ZONWJXSnZiRnh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVSeTVEYjJ4MWJXNTlYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJR052Ym5abGNuUlViMGhsYkcwb2MyOTFjbU5sUjJGd1UzbHRZbTlzT2lCemRISnBibWNnZkNCdWRXeHNJRDBnYm5Wc2JDazZJRVJITGtOdmJIVnRiaUI3WEc0Z0lDQWdhV1lnS0hOdmRYSmpaVWRoY0ZONWJXSnZiQ0E5UFQwZ2JuVnNiQ2xjYmlBZ0lDQWdJSE52ZFhKalpVZGhjRk41YldKdmJDQTlJSFJvYVhNdVpHVm1ZWFZzZEVkaGNGTjViV0p2YkR0Y2JseHVJQ0FnSUdOdmJuTjBJRnR3Y21WbWFYZ3NJR3hsWm5SWGNtRndjR1Z5TENCeWFXZG9kRmR5WVhCd1pYSXNJSEJ2YzNSbWFYaGRJRDBnZEdocGN5NW5aWFJJWld4dFYzSmhjSEJsY25Nb0tUdGNibHh1SUNBZ0lHTnZibk4wSUc1bGQwTnZiSFZ0YmlBOUlIUm9hWE11WjJWMFRtVjNRMjlzZFcxdUtFNVBWRUZVU1U5T0xraEZURTBwTzF4dUlDQWdJQzh2SUdGemMybG5iaUIwYUdVZ2RtRnNkV1Z6SUhSdklIUm9aU0JsYlhCMGVTQmpiMngxYlc1Y2JpQWdJQ0J1WlhkRGIyeDFiVzR1YVc1cGRDZ29hV1I0T2lCdWRXMWlaWElwSUQwK0lIdGNiaUFnSUNBZ0lHTnZibk4wSUhOdmRYSmpaVkJ2YkhsdFpYSWdQU0IwYUdsekxtTnZiSFZ0Ymk1blpYUW9hV1I0S1R0Y2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtTnZiblpsY25SVWIwaGxiRzFJWld4d1pYSW9jMjkxY21ObFVHOXNlVzFsY2l3Z2MyOTFjbU5sUjJGd1UzbHRZbTlzSVN3Z2NISmxabWw0TENCc1pXWjBWM0poY0hCbGNpd2djbWxuYUhSWGNtRndjR1Z5TENCd2IzTjBabWw0S1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J1WlhkRGIyeDFiVzR1YzJWMFZHRm5LRVJITGxSQlIxTXVWVTVKVkZNc0lFNVBWRUZVU1U5T0xraEZURTBwTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGREYjJ4MWJXNDdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nUTI5dWRtVnlkQ0JUUlZCQlVrRlVUMUlnWTI5c2RXMXVJSFJ2SUVaQlUxUkJJRzV2ZEdGMGFXOXVYRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5JSHdnYm5Wc2JIMGdabUZ6ZEdGSFlYQlRlVzFpYjJ3Z1QzQjBhVzl1WVd3Z1oyRndJSE41YldKdmJDQm1iM0lnUmtGVFZFRmNiaUFnSUNvZ1FISmxkSFZ5YmlCN1JFY3VRMjlzZFcxdWZTQWdRMjl1ZG1WeWRHVmtJR052YkhWdGJseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmpiMjUyWlhKMFUyVndZWEpoZEc5eVZHOUdZWE4wWVNobVlYTjBZVWRoY0ZONWJXSnZiRG9nYzNSeWFXNW5JSHdnYm5Wc2JDQTlJRzUxYkd3cE9pQkVSeTVEYjJ4MWJXNGdlMXh1SUNBZ0lHbG1JQ2htWVhOMFlVZGhjRk41YldKdmJDQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lHWmhjM1JoUjJGd1UzbHRZbTlzSUQwZ1ZXNXBkSE5JWVc1a2JHVnlMbDlrWldaaGRXeDBSMkZ3VTNsdFltOXNjMFJwWTNRdVJrRlRWRUU3WEc1Y2JpQWdJQ0JqYjI1emRDQnVaWGREYjJ4MWJXNGdQU0IwYUdsekxtZGxkRTVsZDBOdmJIVnRiaWhPVDFSQlZFbFBUaTVHUVZOVVFTazdYRzRnSUNBZ0x5OGdZWE56YVdkdUlIUm9aU0IyWVd4MVpYTWdkRzhnZEdobElHVnRjSFI1SUdOdmJIVnRibHh1SUNBZ0lHNWxkME52YkhWdGJpNXBibWwwS0NocFpIZzZJRzUxYldKbGNpa2dQVDRnZTF4dUlDQWdJQ0FnWTI5dWMzUWdjMlZ3WVhKaGRHOXlVRzlzZVcxbGNpQTlJSFJvYVhNdVkyOXNkVzF1TG1kbGRDaHBaSGdwTzF4dUlDQWdJQ0FnTHk4Z2FYUmxiWE1nWTJGdUlHSmxJRzF2Ym05dFpYSnpJRzl5SUhObGNHRnlZWFJ2Y25OY2JpQWdJQ0FnSUdOdmJuTjBJSE5sY0dGeVlYUnZja2wwWlcxelFYSnlZWGtnUFNCMGFHbHpMbk53YkdsMGRHVnlLSE5sY0dGeVlYUnZjbEJ2YkhsdFpYSXBPMXh1SUNBZ0lDQWdZMjl1YzNRZ1ptRnpkR0ZOYjI1dmJXVnljMEZ5Y21GNU9pQnpkSEpwYm1kYlhTQTlJRnRkTzF4dUlDQWdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCelpYQmhjbUYwYjNKSmRHVnRjMEZ5Y21GNUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJR2wwWlcwZ1BTQnpaWEJoY21GMGIzSkpkR1Z0YzBGeWNtRjVXMmxkTzF4dUlDQWdJQ0FnSUNCcFppQW9hWFJsYlM1c1pXNW5kR2dnUFQwOUlEQXBJSHRjYmlBZ0lDQWdJQ0FnSUNCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrdWNIVnphQ2htWVhOMFlVZGhjRk41YldKdmJDRXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dsMFpXMHViR1Z1WjNSb0lENGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJSFJvWlNCallYTmxJRzltSUdFZ2JYVnNkR2t0WTJoaGNtRmpkR1Z5SUcxdmJtOXRaWEpjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J0YjI1dmJXVnlJRDBnSjFzbklDc2dhWFJsYlNBcklDZGRKenRjYmlBZ0lDQWdJQ0FnSUNCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrdWNIVnphQ2h0YjI1dmJXVnlLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrdWNIVnphQ2hwZEdWdEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwZFhKdUlHWmhjM1JoVFc5dWIyMWxjbk5CY25KaGVTNXFiMmx1S0NjbktUdGNiaUFnSUNCOUtUdGNiaUFnSUNCdVpYZERiMngxYlc0dWMyVjBWR0ZuS0VSSExsUkJSMU11VlU1SlZGTXNJRTVQVkVGVVNVOU9Ma1pCVTFSQktUdGNiaUFnSUNCeVpYUjFjbTRnYm1WM1EyOXNkVzF1TzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlDQkRiMjUyWlhKMElFaEZURTBnWTI5c2RXMXVJSFJ2SUVaQlUxUkJMMU5GVUVGU1FWUlBVbHh1SUNBZ0tseHVJQ0FnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnZEdkMFRtOTBZWFJwYjI0Z0lDQWdWR0Z5WjJWMElHNXZkR0YwYVc5dU9pQkdRVk5VUVNCdmNpQlRSVkJCVWtGVVQxSmNiaUFnSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhSbmRGTmxjR0Z5WVhSdmNpQWdJRTl3ZEdsdmJtRnNJSFJoY21kbGRDQnpaWEJoY21GMGIzSWdLR1p2Y2lCSVJVeE5JQzArWEc0Z0lDQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bklId2diblZzYkgwZ2RHZDBSMkZ3VTNsdFltOXNJQ0FnVDNCMGFXOXVZV3dnZEdGeVoyVjBJR2RoY0NCemVXMWliMnhjYmlBZ0lDb2dVMFZRUVZKQlZFOVNLVnh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVSeTVEYjJ4MWJXNTlJRU52Ym5abGNuUmxaQ0JqYjJ4MWJXNWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZMjl1ZG1WeWRFaGxiRzBvZEdkMFRtOTBZWFJwYjI0NklITjBjbWx1Wnl3Z2RHZDBVMlZ3WVhKaGRHOXlQem9nYzNSeWFXNW5MQ0IwWjNSSFlYQlRlVzFpYjJ3L09pQnpkSEpwYm1jcE9pQkVSeTVEYjJ4MWJXNGdlMXh1SUNBZ0lDOHZJRlJvYVhNZ1puVnVZM1JwYjI0Z2JYVnpkQ0J1YjNRZ1kyOXVkR0ZwYmlCallXeHNjeUJ2WmlCcGMwUnVZU2dwSUdGdVpDQnBjMUp1WVNncExDQm1iM0pjYmlBZ0lDQXZMeUJ6YjNWeVkyVWdhR1ZzYlNCamIyeDFiVzV6SUcxaGVTQmpiMjUwWVdsdUlGSk9RU3dnUkU1QklHRnVaQ0JRVkNCaFkzSnZjM01nWkdsbVptVnlaVzUwSUhKdmQzTmNiaUFnSUNCcFppQW9JWFJuZEVkaGNGTjViV0p2YkNrZ2UxeHVJQ0FnSUNBZ2RHZDBSMkZ3VTNsdFltOXNJRDBnS0hSb2FYTXVkRzlHWVhOMFlTaDBaM1JPYjNSaGRHbHZiaUJoY3lCT1QxUkJWRWxQVGlrcElEOWNiaUFnSUNBZ0lDQWdWVzVwZEhOSVlXNWtiR1Z5TGw5a1pXWmhkV3gwUjJGd1UzbHRZbTlzYzBScFkzUXVSa0ZUVkVFZ09seHVJQ0FnSUNBZ0lDQlZibWwwYzBoaGJtUnNaWEl1WDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDNVRSVkJCVWtGVVQxSTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLQ0YwWjNSVFpYQmhjbUYwYjNJcElIdGNiaUFnSUNBZ0lIUm5kRk5sY0dGeVlYUnZjaUE5SUNoMGFHbHpMblJ2Um1GemRHRW9kR2QwVG05MFlYUnBiMjRnWVhNZ1RrOVVRVlJKVDA0cEtTQS9JQ2NuSURvZ2RHaHBjeTV6WlhCaGNtRjBiM0k3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdZMjl1YzNRZ2FHVnNiVmR5WVhCd1pYSnpVbVVnUFNBdktGSmNYQ2g4UkZ4Y0tIeGNYQ2w4VUNrdlp6dGNiaUFnSUNCamIyNXpkQ0J1WlhkRGIyeDFiVzRnUFNCMGFHbHpMbWRsZEU1bGQwTnZiSFZ0YmloMFozUk9iM1JoZEdsdmJpQmhjeUJPVDFSQlZFbFBUaWs3WEc0Z0lDQWdMeThnWVhOemFXZHVJSFJvWlNCMllXeDFaWE1nZEc4Z2RHaGxJR1Z0Y0hSNUlHTnZiSFZ0Ymx4dUlDQWdJRzVsZDBOdmJIVnRiaTVwYm1sMEtDaHBaSGc2SUc1MWJXSmxjaWtnUFQ0Z2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYUdWc2JWQnZiSGx0WlhJZ1BTQjBhR2x6TG1OdmJIVnRiaTVuWlhRb2FXUjRLVHRjYmx4dUlDQWdJQ0FnTHk4Z2QyVWdZMkZ1Ym05MElIVnpaU0JwYzBSdVlTZ3BJRzl5SUdselVtNWhLQ2tnWW1WallYVnpaU0J6YjNWeVkyVWdhR1ZzYlNCamIyeDFiVzV6SUdOaGJseHVJQ0FnSUNBZ0x5OGdZMjl1ZEdGcGJpQkVUa0VzSUZKT1FTQmhibVFnVUZRZ2FXNGdaR2xtWm1WeVpXNTBJR05sYkd4ekxDQnpieUIwYUdVZ1kyOXljbVZ6Y0c5dVpHbHVaMXh1SUNBZ0lDQWdMeThnZEdGbmN5QmpZVzV1YjNRZ1ltVWdjMlYwSUdadmNpQjBhR1VnZDJodmJHVWdZMjlzZFcxdVhHNGdJQ0FnSUNCamIyNXpkQ0JwYzA1MVkyeGxiM1JwWkdVZ1BTQm9aV3h0VUc5c2VXMWxjaTV6ZEdGeWRITlhhWFJvS0NkRVRrRW5LU0I4ZkNCb1pXeHRVRzlzZVcxbGNpNXpkR0Z5ZEhOWGFYUm9LQ2RTVGtFbktUdGNibHh1SUNBZ0lDQWdMeThnYVhSbGJYTWdZMkZ1SUdKbElHMXZibTl0WlhKeklHOXlJR2hsYkcxelhHNGdJQ0FnSUNCamIyNXpkQ0JvWld4dFNYUmxiWE5CY25KaGVTQTlJSFJvYVhNdWMzQnNhWFIwWlhJb2FHVnNiVkJ2YkhsdFpYSXBPMXh1SUNBZ0lDQWdZMjl1YzNRZ2RHZDBUVzl1YjIxbGNuTkJjbkpoZVRvZ2MzUnlhVzVuVzEwZ1BTQmJYVHRjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYUdWc2JVbDBaVzF6UVhKeVlYa3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2JHVjBJR2wwWlcwZ1BTQm9aV3h0U1hSbGJYTkJjbkpoZVZ0cFhUdGNiaUFnSUNBZ0lDQWdhV1lnS0dselRuVmpiR1Z2ZEdsa1pTbGNiaUFnSUNBZ0lDQWdJQ0JwZEdWdElEMGdhWFJsYlM1eVpYQnNZV05sS0dobGJHMVhjbUZ3Y0dWeWMxSmxMQ0FuSnlrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwZEdWdElEMDlQU0JWYm1sMGMwaGhibVJzWlhJdVgyUmxabUYxYkhSSFlYQlRlVzFpYjJ4elJHbGpkQzVJUlV4TktTQjdYRzRnSUNBZ0lDQWdJQ0FnZEdkMFRXOXViMjFsY25OQmNuSmhlUzV3ZFhOb0tIUm5kRWRoY0ZONWJXSnZiQ0VwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tIUm9hWE11ZEc5R1lYTjBZU2gwWjNST2IzUmhkR2x2YmlCaGN5Qk9UMVJCVkVsUFRpa2dKaVlnYVhSbGJTNXNaVzVuZEdnZ1BpQXhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdkR2hsSUdOaGMyVWdiMllnWVNCdGRXeDBhUzFqYUdGeVlXTjBaWElnYlc5dWIyMWxjaUJqYjI1MlpYSjBaV1FnZEc4Z1JrRlRWRUZjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J0YjI1dmJXVnlJRDBnSjFzbklDc2dhWFJsYlNBcklDZGRKenRjYmlBZ0lDQWdJQ0FnSUNCMFozUk5iMjV2YldWeWMwRnljbUY1TG5CMWMyZ29iVzl1YjIxbGNpazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnZEdkMFRXOXViMjFsY25OQmNuSmhlUzV3ZFhOb0tHbDBaVzBwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdkMFRXOXViMjFsY25OQmNuSmhlUzVxYjJsdUtIUm5kRk5sY0dGeVlYUnZjaWs3WEc0Z0lDQWdmU2s3WEc1Y2JpQWdJQ0F2THlCVVFVZFRMbUZzYVdkdVpXUWdhWE1nYldGdVpHRjBiM0o1SUdadmNpQmpiMngxYlc1eklHOW1JRTVQVkVGVVNVOU9Ma1pCVTFSQklHRnVaQ0JPVDFSQlZFbFBUaTVUUlZCQlVrRlVUMUpjYmlBZ0lDQmpiMjV6ZENCemNHeHBkSFJsY2pvZ1UzQnNhWFIwWlhKR2RXNWpJRDBnWjJWMFUzQnNhWFIwWlhKR2IzSkRiMngxYlc0b2JtVjNRMjlzZFcxdUtUdGNiaUFnSUNCamIyNXpkQ0J6ZEdGMGN6b2dVMlZ4UTI5c1UzUmhkSE1nUFNCblpYUlRkR0YwY3lodVpYZERiMngxYlc0c0lEVXNJSE53YkdsMGRHVnlLVHRjYmlBZ0lDQmpiMjV6ZENCaGJHbG5ibVZrSUQwZ2MzUmhkSE11YzJGdFpVeGxibWQwYUNBL0lDZFRSVkV1VFZOQkp5QTZJQ2RUUlZFbk8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpYUlVZV2NvVkVGSFV5NWhiR2xuYm1Wa0xDQmhiR2xuYm1Wa0tUdGNibHh1SUNBZ0lISmxkSFZ5YmlCdVpYZERiMngxYlc0N1hHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHTnZiblpsY25SSVpXeHRWRzlUWlhCaGNtRjBiM0lvS1RvZ1JFY3VRMjlzZFcxdUlIdGNiaUFnSUNBdkx5QlVUMFJQT2lCcGJYQnNaVzFsYm5SaGRHbHZjbVYwZFhKdUlIUm9hWE11WjJWMFRtVjNRMjlzZFcxdUtDazdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaMlYwVG1WM1EyOXNkVzF1S0U1UFZFRlVTVTlPTGxORlVFRlNRVlJQVWlrN1hHNGdJSDFjYmx4dUlDQXZLaW9nUkdsemNHRjBZMmhsY2lCdFpYUm9iMlFnWm05eUlHNXZkR0YwYVc5dUlHTnZiblpsY25OcGIyNWNiaUFnSUNwY2JpQWdJQ29nUUhCaGNtRnRJSHRPVDFSQlZFbFBUbjBnZEdkMFRtOTBZWFJwYjI0Z0lDQk9iM1JoZEdsdmJpQjNaU0IzWVc1MElIUnZJR052Ym5abGNuUWdkRzljYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1jZ2ZDQnVkV3hzZlNCMFozUlRaWEJoY21GMGIzSWdJQ0JRYjNOemFXSnNaU0J6WlhCaGNtRjBiM0pjYmlBZ0lDb2dRSEpsZEhWeWJpQjdSRWN1UTI5c2RXMXVmU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkRiMjUyWlhKMFpXUWdZMjlzZFcxdVhHNGdJQ0FxTDF4dUlDQndkV0pzYVdNZ1kyOXVkbVZ5ZENoMFozUk9iM1JoZEdsdmJqb2dUazlVUVZSSlQwNHNJSFJuZEZObGNHRnlZWFJ2Y2pvZ2MzUnlhVzVuSUh3Z2JuVnNiQ0E5SUc1MWJHd3BPaUJFUnk1RGIyeDFiVzRnZTF4dUlDQWdJQzh2SUhCdmMzTnBZbXhsSUdWNFkyVndkR2x2Ym5OY2JpQWdJQ0JwWmlBb2RHaHBjeTV1YjNSaGRHbHZiaUE5UFQwZ2RHZDBUbTkwWVhScGIyNHBYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0ozUm5kQ0J1YjNSaGRHbHZiaUJwY3lCcGJuWmhiR2xrSnlrN1hHNGdJQ0FnYVdZZ0tIUm9hWE11ZEc5VFpYQmhjbUYwYjNJb2RHZDBUbTkwWVhScGIyNHBJQ1ltSUhSbmRGTmxjR0Z5WVhSdmNpQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnbmRHZDBJSE5sY0dGeVlYUnZjaUJwY3lCdWIzUWdjM0JsWTJsbWFXVmtKeWs3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVwYzBaaGMzUmhLQ2tnSmlZZ2RHaHBjeTUwYjFObGNHRnlZWFJ2Y2loMFozUk9iM1JoZEdsdmJpa2dKaVlnZEdkMFUyVndZWEpoZEc5eUlDRTlQU0J1ZFd4c0tWeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMjl1ZG1WeWRFWmhjM1JoVkc5VFpYQmhjbUYwYjNJb2RHZDBVMlZ3WVhKaGRHOXlLVHRjYmlBZ0lDQmxiSE5sSUdsbUlDZ29kR2hwY3k1cGMwWmhjM1JoS0NrZ2ZId2dkR2hwY3k1cGMxTmxjR0Z5WVhSdmNpZ3BLU0FtSmlCMGFHbHpMblJ2U0dWc2JTaDBaM1JPYjNSaGRHbHZiaWtwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1amIyNTJaWEowVkc5SVpXeHRLQ2s3WEc0Z0lDQWdaV3h6WlNCcFppQW9kR2hwY3k1cGMxTmxjR0Z5WVhSdmNpZ3BJQ1ltSUhSb2FYTXVkRzlHWVhOMFlTaDBaM1JPYjNSaGRHbHZiaWtwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1amIyNTJaWEowVTJWd1lYSmhkRzl5Vkc5R1lYTjBZU2dwTzF4dUlDQWdJR1ZzYzJVZ2FXWWdLSFJvYVhNdWFYTklaV3h0S0NrZ0ppWWdkR2hwY3k1MGIwWmhjM1JoS0hSbmRFNXZkR0YwYVc5dUtTa2dMeThnZEdobElHTmhjMlVnYjJZZ1NFVk1UVnh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11WTI5dWRtVnlkRWhsYkcwb2RHZDBUbTkwWVhScGIyNHBPMXh1SUNBZ0lHVnNjMlVnYVdZZ0tIUm9hWE11YVhOSVpXeHRLQ2tnSmlZZ2RHaHBjeTUwYjFObGNHRnlZWFJ2Y2loMFozUk9iM1JoZEdsdmJpa3BYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVqYjI1MlpYSjBTR1ZzYlNoMFozUk9iM1JoZEdsdmJpd2dkR2QwVTJWd1lYSmhkRzl5SVNrN1hHNGdJQ0FnWld4elpWeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkT2IzUWdjM1Z3Y0c5eWRHVmtJR052Ym5abGNuTnBiMjRnSnlBclhHNGdJQ0FnSUNBZ0lHQm1jbTl0SUhOdmRYSmpaU0J1YjNSaGRHbHZiaUFuSkh0MGFHbHpMbTV2ZEdGMGFXOXVmU2NnZEc4Z2RHRnlaMlYwSUc1dmRHRjBhVzl1SUNja2UzUm5kRTV2ZEdGMGFXOXVmU2N1WUNrN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ1kyOXVjM1J5ZFdOMGIzSW9ZMjlzT2lCRVJ5NURiMngxYlc0cElIdGNiaUFnSUNCemRYQmxjaWhqYjJ3cE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGRldGVjdEFscGhhYmV0LCBnZXRTcGxpdHRlckZvckNvbHVtbiwgZ2V0U3RhdHMsIHNwbGl0dGVyQXNGYXN0YSB9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIG5vdGF0aW9uIHVuaXRzIGluIE1hY3JvbW9sZWN1bGUgY29sdW1ucyAqL1xuZXhwb3J0IGNsYXNzIFVuaXRzSGFuZGxlciB7XG4gICAgc3RhdGljIHNldFVuaXRzVG9GYXN0YUNvbHVtbihjb2wpIHtcbiAgICAgICAgaWYgKGNvbC5zZW1UeXBlICE9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zhc3RhIGNvbHVtbiBtdXN0IGJlIE1BQ1JPTU9MRUNVTEUnKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyhjb2wsIDUsIHNwbGl0dGVyQXNGYXN0YSk7XG4gICAgICAgIGNvbnN0IGFsaWduZWQgPSBzdGF0cy5zYW1lTGVuZ3RoID8gJ1NFUS5NU0EnIDogJ1NFUSc7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0ID0gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpO1xuICAgICAgICBjb2wuc2V0VGFnKERHLlRBR1MuVU5JVFMsIFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLyk7XG4gICAgICAgIGNvbC5zZXRUYWcoXCJhbGlnbmVkXCIgLyogVEFHUy5hbGlnbmVkICovLCBhbGlnbmVkKTtcbiAgICAgICAgY29sLnNldFRhZyhcImFscGhhYmV0XCIgLyogVEFHUy5hbHBoYWJldCAqLywgYWxwaGFiZXQpO1xuICAgIH1cbiAgICBnZXQgdW5pdHMoKSB7IHJldHVybiB0aGlzLl91bml0czsgfVxuICAgIGdldCBjb2x1bW4oKSB7IHJldHVybiB0aGlzLl9jb2x1bW47IH1cbiAgICBnZXQgbm90YXRpb24oKSB7IHJldHVybiB0aGlzLl9ub3RhdGlvbjsgfVxuICAgIGdldCBkZWZhdWx0R2FwU3ltYm9sKCkgeyByZXR1cm4gdGhpcy5fZGVmYXVsdEdhcFN5bWJvbDsgfVxuICAgIGdldCBzZXBhcmF0b3IoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gKF9hID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFwic2VwYXJhdG9yXCIgLyogVEFHUy5zZXBhcmF0b3IgKi8pKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLm5vdGF0aW9uID09PSBcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLyAmJiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VwYXJhdG9yIGlzIG1hbmRhdG9yeSAgZm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nLmApO1xuICAgICAgICByZXR1cm4gc2VwYXJhdG9yO1xuICAgIH1cbiAgICBnZXQgYWxpZ25lZCgpIHtcbiAgICAgICAgY29uc3QgYWxpZ25lZCA9IHRoaXMuY29sdW1uLmdldFRhZyhcImFsaWduZWRcIiAvKiBUQUdTLmFsaWduZWQgKi8pO1xuICAgICAgICAvLyBUQUdTLmFsaWduZWQgaXMgbWFuZGF0b3J5IGZvciBjb2x1bW5zIG9mIE5PVEFUSU9OLkZBU1RBIGFuZCBOT1RBVElPTi5TRVBBUkFUT1JcbiAgICAgICAgaWYgKCFhbGlnbmVkICYmICh0aGlzLmlzRmFzdGEoKSB8fCB0aGlzLmlzU2VwYXJhdG9yKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWcgYWxpZ25lZCBub3Qgc2V0Jyk7XG4gICAgICAgIHJldHVybiBhbGlnbmVkO1xuICAgIH1cbiAgICAvKiogQWxwaGFiZXQgbmFtZSAodXBwZXIgY2FzZSkgKi9cbiAgICBnZXQgYWxwaGFiZXQoKSB7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0ID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFwiYWxwaGFiZXRcIiAvKiBUQUdTLmFscGhhYmV0ICovKTtcbiAgICAgICAgLy8gVEFHUy5hbHBoYWJldCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgICAgICBpZiAoIWFscGhhYmV0ICYmICh0aGlzLmlzRmFzdGEoKSB8fCB0aGlzLmlzU2VwYXJhdG9yKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWcgYWxwaGFiZXQgbm90IHNldCcpO1xuICAgICAgICByZXR1cm4gYWxwaGFiZXQ7XG4gICAgfVxuICAgIGdldEFscGhhYmV0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm90YXRpb24gPT0gXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLyB8fCB0aGlzLmFscGhhYmV0ID09IFwiVU5cIiAvKiBBTFBIQUJFVC5VTiAqLykge1xuICAgICAgICAgICAgY29uc3QgYWxwaGFiZXRTaXplU3RyID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFwiLmFscGhhYmV0U2l6ZVwiIC8qIFRBR1MuYWxwaGFiZXRTaXplICovKTtcbiAgICAgICAgICAgIGxldCBhbHBoYWJldFNpemU7XG4gICAgICAgICAgICBpZiAoYWxwaGFiZXRTaXplU3RyKSB7XG4gICAgICAgICAgICAgICAgYWxwaGFiZXRTaXplID0gcGFyc2VJbnQoYWxwaGFiZXRTaXplU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhbHBoYWJldFNpemUgb24gZGVtYW5kXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBnZXRTcGxpdHRlckZvckNvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyh0aGlzLmNvbHVtbiwgMSwgc3BsaXR0ZXIpO1xuICAgICAgICAgICAgICAgIGFscGhhYmV0U2l6ZSA9IE9iamVjdC5rZXlzKHN0YXRzLmZyZXEpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbHBoYWJldFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYWxwaGFiZXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFRcIiAvKiBBTFBIQUJFVC5QVCAqLzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJETkFcIiAvKiBBTFBIQUJFVC5ETkEgKi86XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJOQVwiIC8qIEFMUEhBQkVULlJOQSAqLzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnTlQnOlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJ05UJy5gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGFscGhhYmV0ICcke3RoaXMuYWxwaGFiZXR9Jy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBbHBoYWJldElzTXVsdGljaGFyKCkge1xuICAgICAgICBpZiAodGhpcy5ub3RhdGlvbiA9PSBcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovIHx8IHRoaXMuYWxwaGFiZXQgPT0gXCJVTlwiIC8qIEFMUEhBQkVULlVOICovKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmdldFRhZyhcIi5hbHBoYWJldElzTXVsdGljaGFyXCIgLyogVEFHUy5hbHBoYWJldElzTXVsdGljaGFyICovKSA9PSAndHJ1ZSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNGYXN0YSgpIHsgcmV0dXJuIHRoaXMubm90YXRpb24gPT09IFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLzsgfVxuICAgIGlzU2VwYXJhdG9yKCkgeyByZXR1cm4gdGhpcy5ub3RhdGlvbiA9PT0gXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi87IH1cbiAgICBpc0hlbG0oKSB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovOyB9XG4gICAgaXNSbmEoKSB7IHJldHVybiB0aGlzLmFscGhhYmV0ID09PSBcIlJOQVwiIC8qIEFMUEhBQkVULlJOQSAqLzsgfVxuICAgIGlzRG5hKCkgeyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gXCJETkFcIiAvKiBBTFBIQUJFVC5ETkEgKi87IH1cbiAgICBpc1BlcHRpZGUoKSB7IHJldHVybiB0aGlzLmFscGhhYmV0ID09PSBcIlBUXCIgLyogQUxQSEFCRVQuUFQgKi87IH1cbiAgICBpc01zYSgpIHsgcmV0dXJuIHRoaXMuYWxpZ25lZCA/IHRoaXMuYWxpZ25lZC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCdNU0EnKSA6IGZhbHNlOyB9XG4gICAgLyoqIEFzc29jaWF0ZSBub3RhdGlvbiB0eXBlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHVuaXRzICovXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Tk9UQVRJT059ICAgICBOb3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVuaXRzIHR5cGVcbiAgICAgKi9cbiAgICBnZXROb3RhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLykpXG4gICAgICAgICAgICByZXR1cm4gXCJmYXN0YVwiIC8qIE5PVEFUSU9OLkZBU1RBICovO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLykpXG4gICAgICAgICAgICByZXR1cm4gXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi87XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiaGVsbVwiIC8qIE5PVEFUSU9OLkhFTE0gKi8pKVxuICAgICAgICAgICAgcmV0dXJuIFwiaGVsbVwiIC8qIE5PVEFUSU9OLkhFTE0gKi87XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBoYXMgdW5leHBlY3RlZCBub3RhdGlvbiAnJHt0aGlzLnVuaXRzfScuYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gb2YgdGhlIHNwZWNpZmllZCBub3RhdGlvbiB0eXBlIGFuZCB0aGUgc2FtZVxuICAgICAqIGxlbmd0aCBhcyBjb2x1bW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tk9UQVRJT059IHRhcmdldE5vdGF0aW9uXG4gICAgICogQHJldHVybiB7REcuQ29sdW1ufVxuICAgICAqL1xuICAgIGdldE5ld0NvbHVtbih0YXJnZXROb3RhdGlvbikge1xuICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgY29uc3QgbGVuID0gY29sLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRhcmdldE5vdGF0aW9uLnRvTG93ZXJDYXNlKCkgKyAnKCcgKyBjb2wubmFtZSArICcpJztcbiAgICAgICAgY29uc3QgbmV3Q29sTmFtZSA9IGNvbC5kYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKG5hbWUpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSBERy5Db2x1bW4uZnJvbUxpc3QoJ3N0cmluZycsIG5ld0NvbE5hbWUsIG5ldyBBcnJheShsZW4pLmZpbGwoJycpKTtcbiAgICAgICAgbmV3Q29sdW1uLnNlbVR5cGUgPSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEU7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdGFyZ2V0Tm90YXRpb24pO1xuICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuQ0VMTF9SRU5ERVJFUiwgJ01hY3JvbW9sZWN1bGUnKTtcbiAgICAgICAgY29uc3Qgc3JjQWxpZ25lZCA9IGNvbC5nZXRUYWcoXCJhbGlnbmVkXCIgLyogVEFHUy5hbGlnbmVkICovKTtcbiAgICAgICAgaWYgKHNyY0FsaWduZWQpXG4gICAgICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKFwiYWxpZ25lZFwiIC8qIFRBR1MuYWxpZ25lZCAqLywgc3JjQWxpZ25lZCk7XG4gICAgICAgIGNvbnN0IHNyY0FscGhhYmV0ID0gY29sLmdldFRhZyhcImFscGhhYmV0XCIgLyogVEFHUy5hbHBoYWJldCAqLyk7XG4gICAgICAgIGlmIChzcmNBbHBoYWJldClcbiAgICAgICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoXCJhbHBoYWJldFwiIC8qIFRBR1MuYWxwaGFiZXQgKi8sIHNyY0FscGhhYmV0KTtcbiAgICAgICAgbGV0IHNyY0FscGhhYmV0U2l6ZSA9IGNvbC5nZXRUYWcoXCIuYWxwaGFiZXRTaXplXCIgLyogVEFHUy5hbHBoYWJldFNpemUgKi8pO1xuICAgICAgICBpZiAoc3JjQWxwaGFiZXRTaXplKVxuICAgICAgICAgICAgbmV3Q29sdW1uLnNldFRhZyhcIi5hbHBoYWJldFNpemVcIiAvKiBUQUdTLmFscGhhYmV0U2l6ZSAqLywgc3JjQWxwaGFiZXRTaXplKTtcbiAgICAgICAgY29uc3Qgc3JjQWxwaGFiZXRJc011bHRpY2hhciA9IGNvbC5nZXRUYWcoXCIuYWxwaGFiZXRJc011bHRpY2hhclwiIC8qIFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciAqLyk7XG4gICAgICAgIGlmIChzcmNBbHBoYWJldElzTXVsdGljaGFyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKFwiLmFscGhhYmV0SXNNdWx0aWNoYXJcIiAvKiBUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIgKi8sIHNyY0FscGhhYmV0SXNNdWx0aWNoYXIpO1xuICAgICAgICBpZiAodGFyZ2V0Tm90YXRpb24gPT0gXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLykge1xuICAgICAgICAgICAgc3JjQWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgbmV3Q29sdW1uLnNldFRhZyhcIi5hbHBoYWJldFNpemVcIiAvKiBUQUdTLmFscGhhYmV0U2l6ZSAqLywgc3JjQWxwaGFiZXRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgY29sdW1uIHVzaW5nIHRlbXBsYXRlQ29sIGFzIGEgdGVtcGxhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7REcuQ29sdW1ufSB0ZW1wbGF0ZUNvbCAgdGhlIHByb3BlcnRpZXMgYW5kIHVuaXRzIG9mIHRoaXMgY29sdW1uIGFyZSB1c2VkIGFzIGFcbiAgICAgKiB0ZW1wbGF0ZSB0byBidWlsZCB0aGUgbmV3IG9uZVxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TmV3Q29sdW1uKHRlbXBsYXRlQ29sKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IG5ldyBVbml0c0hhbmRsZXIodGVtcGxhdGVDb2wpO1xuICAgICAgICBjb25zdCB0YXJnZXROb3RhdGlvbiA9IGNvbC5ub3RhdGlvbjtcbiAgICAgICAgcmV0dXJuIGNvbC5nZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBjaGVja2luZyB0aGUgdmFsaWRpdHkgb2YgdGhlICd1bml0cycgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdHMgIHRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5pdHNTdHJpbmdJc1ZhbGlkKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gdW5pdHMudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgcHJlZml4ZXMgPSBbXCJmYXN0YVwiIC8qIE5PVEFUSU9OLkZBU1RBICovLCBcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLywgXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqL107XG4gICAgICAgIGNvbnN0IHBvc3RmaXhlcyA9IFsncm5hJywgJ2RuYScsICdwdCddO1xuICAgICAgICBjb25zdCBwcmVmaXhDcml0ZXJpb24gPSBwcmVmaXhlcy5zb21lKChwKSA9PiB1bml0cy5zdGFydHNXaXRoKHAudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgICByZXR1cm4gcHJlZml4Q3JpdGVyaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29sdW1uIG9mIHNlbWFudGljIHR5cGUgTUFDUk9NT0xFQ1VMRSBmcm9tIHRoZSBsaXN0IG9mXG4gICAgICogc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgICBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgbmFtZSAgdGhlIG5hbWUgb2YgdGhlIG5ldyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgdW5pdHMgIHRoZSB1bml0cyBvZiB0aGUgbmV3IGNvbHVtblxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TmV3Q29sdW1uRnJvbVBhcmFtcyhsZW4sIG5hbWUsIHVuaXRzKSB7XG4gICAgICAgIC8vIFdBUk5JTkc6IGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXMgaW1wb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHVuaXF1ZW5lc3NcbiAgICAgICAgLy8gb2YgdGhlIG5ldyBjb2x1bW4ncyBuYW1lXG4gICAgICAgIC8vIFRPRE86IHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgdW5pdHMgcGFyYW1ldGVyXG4gICAgICAgIGlmICghVW5pdHNIYW5kbGVyLnVuaXRzU3RyaW5nSXNWYWxpZCh1bml0cykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0IG9mIFxcJ3VuaXRzXFwnIHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSBERy5Db2x1bW4uZnJvbUxpc3QoJ3N0cmluZycsIG5hbWUsIG5ldyBBcnJheShsZW4pLmZpbGwoJycpKTtcbiAgICAgICAgbmV3Q29sdW1uLnNlbVR5cGUgPSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEU7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdW5pdHMpO1xuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihjb2wpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uID0gY29sO1xuICAgICAgICBjb25zdCB1bml0cyA9IHRoaXMuX2NvbHVtbi50YWdzW0RHLlRBR1MuVU5JVFNdO1xuICAgICAgICBpZiAodW5pdHMgIT09IG51bGwpXG4gICAgICAgICAgICB0aGlzLl91bml0cyA9IHVuaXRzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaXRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIGNvbHVtbicpO1xuICAgICAgICB0aGlzLl9ub3RhdGlvbiA9IHRoaXMuZ2V0Tm90YXRpb24oKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEdhcFN5bWJvbCA9ICh0aGlzLmlzRmFzdGEoKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQSA6XG4gICAgICAgICAgICAodGhpcy5pc0hlbG0oKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNIDpcbiAgICAgICAgICAgICAgICBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW4udGFncy5oYXMoXCJhbGlnbmVkXCIgLyogVEFHUy5hbGlnbmVkICovKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciBjb2x1bW4gJyR7dGhpcy5jb2x1bW4ubmFtZX0nIG9mIG5vdGF0aW9uICcke3RoaXMubm90YXRpb259JyBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRhZyAnJHtcImFsaWduZWRcIiAvKiBUQUdTLmFsaWduZWQgKi99JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFscGhhYmV0U2l6ZSkpIHtcbiAgICAgICAgLy8gICBpZiAodGhpcy5pc0hlbG0oKSlcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgICAgICAvLyAgICAgICBgdGFnICcke1RBR1MuYWxwaGFiZXRTaXplfScgaXMgbWFuZGF0b3J5LmApO1xuICAgICAgICAvLyAgIGVsc2UgaWYgKFsnVU4nXS5pbmNsdWRlcyh0aGlzLmFscGhhYmV0KSlcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgICAgICAvLyAgICAgICBgdGFnICcke1RBR1MuYWxwaGFiZXRTaXplfScgaXMgbWFuZGF0b3J5LmApO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW4udGFncy5oYXMoXCIuYWxwaGFiZXRJc011bHRpY2hhclwiIC8qIFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciAqLykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGVsbSgpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdGFnICcke1wiLmFscGhhYmV0SXNNdWx0aWNoYXJcIiAvKiBUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIgKi99JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICAgICAgICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBhbHBoYWJldCAnJHt0aGlzLmFscGhhYmV0fScgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0YWcgJyR7XCIuYWxwaGFiZXRJc011bHRpY2hhclwiIC8qIFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciAqL30nIGlzIG1hbmRhdG9yeS5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0ID0ge1xuICAgIEhFTE06ICcqJyxcbiAgICBTRVBBUkFUT1I6ICcnLFxuICAgIEZBU1RBOiAnLScsXG59O1xuVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0ID0gbmV3IFNldChbXG4gICAgJ0cnLCAnTCcsICdZJywgJ1MnLCAnRScsICdRJywgJ0QnLCAnTicsICdGJywgJ0EnLFxuICAgICdLJywgJ1InLCAnSCcsICdDJywgJ1YnLCAnUCcsICdXJywgJ0knLCAnTScsICdUJyxcbl0pO1xuVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0KFsnQScsICdDJywgJ0cnLCAnVCddKTtcblVuaXRzSGFuZGxlci5SbmFGYXN0YUFscGhhYmV0ID0gbmV3IFNldChbJ0EnLCAnQycsICdHJywgJ1UnXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkVzVwZEhNdGFHRnVaR3hsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJblZ1YVhSekxXaGhibVJzWlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlR5eExRVUZMTEVWQlFVVXNUVUZCVFN4cFFrRkJhVUlzUTBGQlF6dEJRVVYwUXl4UFFVRlBMRVZCUlV3c1kwRkJZeXhGUVVOa0xHOUNRVUZ2UWl4RlFVTndRaXhSUVVGUkxFVkJSMUlzWlVGQlpTeEZRVWRvUWl4TlFVRk5MR2xDUVVGcFFpeERRVUZETzBGQlJYcENMR2xGUVVGcFJUdEJRVU5xUlN4TlFVRk5MRTlCUVU4c1dVRkJXVHRKUVd0Q2FFSXNUVUZCVFN4RFFVRkRMSEZDUVVGeFFpeERRVUZETEVkQlFXTTdVVUZEYUVRc1NVRkJTU3hIUVVGSExFTkJRVU1zVDBGQlR5eExRVUZMTEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZVHRaUVVNeFF5eE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMRzlEUVVGdlF5eERRVUZETEVOQlFVTTdVVUZGZUVRc1RVRkJUU3hMUVVGTExFZEJRV2RDTEZGQlFWRXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhGUVVGRkxHVkJRV1VzUTBGQlF5eERRVUZETzFGQlF6ZEVMRTFCUVUwc1QwRkJUeXhIUVVGSExFdEJRVXNzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETzFGQlEzSkVMRTFCUVUwc1VVRkJVU3hIUVVGSExHTkJRV01zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVVjJReXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXdyUWtGQmFVSXNRMEZCUXp0UlFVTXhReXhIUVVGSExFTkJRVU1zVFVGQlRTd3JRa0ZCWlN4UFFVRlBMRU5CUVVNc1EwRkJRenRSUVVOc1F5eEhRVUZITEVOQlFVTXNUVUZCVFN4cFEwRkJaMElzVVVGQlVTeERRVUZETEVOQlFVTTdTVUZEZEVNc1EwRkJRenRKUVVWRUxFbEJRV01zUzBGQlN5eExRVUZoTEU5QlFVOHNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRmNrUXNTVUZCWXl4TlFVRk5MRXRCUVdkQ0xFOUJRVThzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkZNVVFzU1VGQlZ5eFJRVUZSTEV0QlFXVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVVV4UkN4SlFVRlhMR2RDUVVGblFpeExRVUZoTEU5QlFVOHNTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVVjRSU3hKUVVGWExGTkJRVk03TzFGQlEyeENMRTFCUVUwc1UwRkJVeXhIUVVGMVFpeE5RVUZCTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hyUTBGQlowSXNiVU5CUVVrc1UwRkJVeXhEUVVGRE8xRkJRM1JHTEVsQlFVa3NTVUZCU1N4RFFVRkRMRkZCUVZFc2VVTkJRWFZDTEVsQlFVa3NVMEZCVXl4TFFVRkxMRk5CUVZNN1dVRkRha1VzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl4MVEwRkJkVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMR3RDUVVGclFpeEpRVUZKTEVOQlFVTXNVVUZCVVN4SlFVRkpMRU5CUVVNc1EwRkJRenRSUVVNNVJ5eFBRVUZQTEZOQlFWTXNRMEZCUXp0SlFVTnVRaXhEUVVGRE8wbEJSVVFzU1VGQlZ5eFBRVUZQTzFGQlEyaENMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN3NFFrRkJZeXhEUVVGRE8xRkJSV3BFTEdsR1FVRnBSanRSUVVOcVJpeEpRVUZKTEVOQlFVTXNUMEZCVHl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUlVGQlJTeEpRVUZKTEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRaUVVOd1JDeE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMSEZDUVVGeFFpeERRVUZETEVOQlFVTTdVVUZGZWtNc1QwRkJUeXhQUVVGUExFTkJRVU03U1VGRGFrSXNRMEZCUXp0SlFVVkVMR2xEUVVGcFF6dEpRVU5xUXl4SlFVRlhMRkZCUVZFN1VVRkRha0lzVFVGQlRTeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxHZERRVUZsTEVOQlFVTTdVVUZGYmtRc2EwWkJRV3RHTzFGQlEyeEdMRWxCUVVrc1EwRkJReXhSUVVGUkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETzFsQlEzSkVMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1EwRkJRenRSUVVVeFF5eFBRVUZQTEZGQlFWRXNRMEZCUXp0SlFVTnNRaXhEUVVGRE8wbEJSVTBzWlVGQlpUdFJRVU53UWl4SlFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxEaENRVUZwUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxEQkNRVUZsTEVWQlFVVTdXVUZEYkVVc1RVRkJUU3hsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MSGxEUVVGdFFpeERRVUZETzFsQlF6bEVMRWxCUVVrc1dVRkJiMElzUTBGQlF6dFpRVU42UWl4SlFVRkpMR1ZCUVdVc1JVRkJSVHRuUWtGRGJrSXNXVUZCV1N4SFFVRkhMRkZCUVZFc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF6dGhRVU14UXp0cFFrRkJUVHRuUWtGRFRDeHRRMEZCYlVNN1owSkJRMjVETEUxQlFVMHNVVUZCVVN4SFFVRnBRaXh2UWtGQmIwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03WjBKQlEycEZMRTFCUVUwc1MwRkJTeXhIUVVGSExGRkJRVkVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hSUVVGUkxFTkJRVU1zUTBGQlF6dG5Ra0ZEYWtRc1dVRkJXU3hIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF6dGhRVU12UXp0WlFVTkVMRTlCUVU4c1dVRkJXU3hEUVVGRE8xTkJRM0pDTzJGQlFVMDdXVUZEVEN4UlFVRlJMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVVU3WjBKQlEzWkNPMjlDUVVORkxFOUJRVThzUlVGQlJTeERRVUZETzJkQ1FVTmFMRGhDUVVGclFqdG5Ra0ZEYkVJN2IwSkJRMFVzVDBGQlR5eERRVUZETEVOQlFVTTdaMEpCUTFnc1MwRkJTeXhKUVVGSk8yOUNRVU5RTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc01rSkJRVEpDTEVOQlFVTXNRMEZCUXp0dlFrRkRNVU1zVDBGQlR5eERRVUZETEVOQlFVTTdaMEpCUTFnN2IwSkJRMFVzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl4M1FrRkJkMElzU1VGQlNTeERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRMRU5CUVVNN1lVRkROVVE3VTBGRFJqdEpRVU5JTEVOQlFVTTdTVUZGVFN4elFrRkJjMEk3VVVGRE0wSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1VVRkJVU3c0UWtGQmFVSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1VVRkJVU3d3UWtGQlpUdFpRVU5vUlN4UFFVRlBMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeDFSRUZCTUVJc1NVRkJTU3hOUVVGTkxFTkJRVU03TzFsQlJUbEVMRTlCUVU4c1MwRkJTeXhEUVVGRE8wbEJRMnBDTEVOQlFVTTdTVUZGVFN4UFFVRlBMRXRCUVdNc1QwRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeHBRMEZCYlVJc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRkwwUXNWMEZCVnl4TFFVRmpMRTlCUVU4c1NVRkJTU3hEUVVGRExGRkJRVkVzZVVOQlFYVkNMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJSWFpGTEUxQlFVMHNTMEZCWXl4UFFVRlBMRWxCUVVrc1EwRkJReXhSUVVGUkxDdENRVUZyUWl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVVM1JDeExRVUZMTEV0QlFXTXNUMEZCVHl4SlFVRkpMRU5CUVVNc1VVRkJVU3cyUWtGQmFVSXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkZNMFFzUzBGQlN5eExRVUZqTEU5QlFVOHNTVUZCU1N4RFFVRkRMRkZCUVZFc05rSkJRV2xDTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUlRORUxGTkJRVk1zUzBGQll5eFBRVUZQTEVsQlFVa3NRMEZCUXl4UlFVRlJMREpDUVVGblFpeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVVTVSQ3hMUVVGTExFdEJRV01zVDBGQlR5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVWeVJ5dzBSRUZCTkVRN1NVRkROVVE3TzA5QlJVYzdTVUZEVHl4WFFVRlhPMUZCUTI1Q0xFbEJRVWtzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhWUVVGVkxEaENRVUZuUWp0WlFVTnlSQ3h2UTBGQmMwSTdZVUZEYmtJc1NVRkJTU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRlZCUVZVc2MwTkJRVzlDTzFsQlF6bEVMRFJEUVVFd1FqdGhRVU4yUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNWVUZCVlN3MFFrRkJaVHRaUVVONlJDeHJRMEZCY1VJN08xbEJSWEpDTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc1YwRkJWeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NPRUpCUVRoQ0xFbEJRVWtzUTBGQlF5eExRVUZMTEVsQlFVa3NRMEZCUXl4RFFVRkRPMGxCUXpkR0xFTkJRVU03U1VGRlJEczdPenM3TzA5QlRVYzdTVUZEVHl4WlFVRlpMRU5CUVVNc1kwRkJkMEk3VVVGRE4wTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF6dFJRVU40UWl4TlFVRk5MRWRCUVVjc1IwRkJSeXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETzFGQlEzWkNMRTFCUVUwc1NVRkJTU3hIUVVGSExHTkJRV01zUTBGQlF5eFhRVUZYTEVWQlFVVXNSMEZCUnl4SFFVRkhMRWRCUVVjc1IwRkJSeXhEUVVGRExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTTdVVUZEYWtVc1RVRkJUU3hWUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETEZOQlFWTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlF6ZEVMRTFCUVUwc1UwRkJVeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRkZCUVZFc1JVRkJSU3hWUVVGVkxFVkJRVVVzU1VGQlNTeExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VZc1UwRkJVeXhEUVVGRExFOUJRVThzUjBGQlJ5eEZRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMR0ZCUVdFc1EwRkJRenRSUVVNM1F5eFRRVUZUTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEdOQlFXTXNRMEZCUXl4RFFVRkRPMUZCUTJoRUxGTkJRVk1zUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhoUVVGaExFVkJRVVVzWlVGQlpTeERRVUZETEVOQlFVTTdVVUZGZWtRc1RVRkJUU3hWUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNPRUpCUVdNc1EwRkJRenRSUVVNMVF5eEpRVUZKTEZWQlFWVTdXVUZEV2l4VFFVRlRMRU5CUVVNc1RVRkJUU3dyUWtGQlpTeFZRVUZWTEVOQlFVTXNRMEZCUXp0UlFVVTNReXhOUVVGTkxGZEJRVmNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4blEwRkJaU3hEUVVGRE8xRkJRemxETEVsQlFVa3NWMEZCVnp0WlFVTmlMRk5CUVZNc1EwRkJReXhOUVVGTkxHbERRVUZuUWl4WFFVRlhMRU5CUVVNc1EwRkJRenRSUVVVdlF5eEpRVUZKTEdWQlFXVXNSMEZCVnl4SFFVRkhMRU5CUVVNc1RVRkJUU3g1UTBGQmJVSXNRMEZCUXp0UlFVTTFSQ3hKUVVGSkxHVkJRV1U3V1VGRGFrSXNVMEZCVXl4RFFVRkRMRTFCUVUwc01FTkJRVzlDTEdWQlFXVXNRMEZCUXl4RFFVRkRPMUZCUlhaRUxFMUJRVTBzYzBKQlFYTkNMRWRCUVZjc1IwRkJSeXhEUVVGRExFMUJRVTBzZFVSQlFUQkNMRU5CUVVNN1VVRkROVVVzU1VGQlNTeHpRa0ZCYzBJc1MwRkJTeXhUUVVGVE8xbEJRM1JETEZOQlFWTXNRMEZCUXl4TlFVRk5MSGRFUVVFeVFpeHpRa0ZCYzBJc1EwRkJReXhEUVVGRE8xRkJSWEpGTEVsQlFVa3NZMEZCWXl3NFFrRkJhVUlzUlVGQlJUdFpRVU51UXl4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExHVkJRV1VzUlVGQlJTeERRVUZETEZGQlFWRXNSVUZCUlN4RFFVRkRPMWxCUTNCRUxGTkJRVk1zUTBGQlF5eE5RVUZOTERCRFFVRnZRaXhsUVVGbExFTkJRVU1zUTBGQlF6dFRRVU4wUkR0UlFVVkVMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMjVDTEVOQlFVTTdTVUZGUkRzN096czdPMDlCVFVjN1NVRkRTU3hOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEZkQlFYTkNPMUZCUXk5RExFMUJRVTBzUjBGQlJ5eEhRVUZwUWl4SlFVRkpMRmxCUVZrc1EwRkJReXhYUVVGWExFTkJRVU1zUTBGQlF6dFJRVU40UkN4TlFVRk5MR05CUVdNc1IwRkJSeXhIUVVGSExFTkJRVU1zVVVGQlVTeERRVUZETzFGQlEzQkRMRTlCUVU4c1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eGpRVUZqTEVOQlFVTXNRMEZCUXp0SlFVTXhReXhEUVVGRE8wbEJSVVE3T3pzN08wOUJTMGM3U1VGRFNTeE5RVUZOTEVOQlFVTXNhMEpCUVd0Q0xFTkJRVU1zUzBGQllUdFJRVU0xUXl4TFFVRkxMRWRCUVVjc1MwRkJTeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETzFGQlF6VkNMRTFCUVUwc1VVRkJVU3hIUVVGSExHZEhRVUZ0UkN4RFFVRkRPMUZCUTNKRkxFMUJRVTBzVTBGQlV5eEhRVUZITEVOQlFVTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF6dFJRVVYyUXl4TlFVRk5MR1ZCUVdVc1IwRkJSeXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTXNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGFFWXNUMEZCVHl4bFFVRmxMRU5CUVVNN1NVRkRla0lzUTBGQlF6dEpRVVZFT3pzN096czdPenRQUVZGSE8wbEJRMGtzVFVGQlRTeERRVUZETEhOQ1FVRnpRaXhEUVVOc1F5eEhRVUZYTEVWQlExZ3NTVUZCV1N4RlFVTmFMRXRCUVdFN1VVRkZZaXcwUlVGQk5FVTdVVUZETlVVc01rSkJRVEpDTzFGQlF6TkNMQ3REUVVFclF6dFJRVU12UXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHdENRVUZyUWl4RFFVRkRMRXRCUVVzc1EwRkJRenRaUVVONlF5eE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMSFZEUVVGMVF5eERRVUZETEVOQlFVTTdVVUZETTBRc1RVRkJUU3hUUVVGVExFZEJRVWNzUlVGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUVVNc1VVRkJVU3hGUVVGRkxFbEJRVWtzUlVGQlJTeEpRVUZKTEV0QlFVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTTVSU3hUUVVGVExFTkJRVU1zVDBGQlR5eEhRVUZITEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRE8xRkJRemRETEZOQlFWTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRka01zVDBGQlR5eFRRVUZUTEVOQlFVTTdTVUZEYmtJc1EwRkJRenRKUVVWRUxGbEJRVzFDTEVkQlFXTTdVVUZETDBJc1NVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEhRVUZITEVOQlFVTTdVVUZEYmtJc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVTXZReXhKUVVGSkxFdEJRVXNzUzBGQlN5eEpRVUZKTzFsQlEyaENMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzUzBGQlN5eERRVUZET3p0WlFVVndRaXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEcxRFFVRnRReXhEUVVGRExFTkJRVU03VVVGRGRrUXNTVUZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTTdVVUZEY0VNc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRaUVVOeVJpeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdaMEpCUXpGRUxGbEJRVmtzUTBGQlF5eHpRa0ZCYzBJc1EwRkJReXhUUVVGVExFTkJRVU03VVVGRmJFUXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NPRUpCUVdNc1JVRkJSVHRaUVVOMlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRVZCUVVVc1NVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eEZRVUZGTzJkQ1FVTjBReXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEdWQlFXVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxHdENRVUZyUWl4SlFVRkpMRU5CUVVNc1VVRkJVU3hKUVVGSk8yOUNRVU5vUml4UlFVRlJMRFJDUVVGWkxHbENRVUZwUWl4RFFVRkRMRU5CUVVNN1UwRkROVU03VVVGRlJDeHJSRUZCYTBRN1VVRkRiRVFzZFVKQlFYVkNPMUZCUTNaQ0xESkdRVUV5Ump0UlFVTXpSaXh4UkVGQmNVUTdVVUZEY2tRc05rTkJRVFpETzFGQlF6ZERMREpHUVVFeVJqdFJRVU16Uml4eFJFRkJjVVE3VVVGRGNrUXNTVUZCU1R0UlFVVktMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMSFZFUVVFd1FpeEZRVUZGTzFsQlEyNUVMRWxCUVVrc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJUdG5Ra0ZEWml4TlFVRk5MRWxCUVVrc1MwRkJTeXhEUVVGRExHVkJRV1VzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMR3RDUVVGclFpeEpRVUZKTEVOQlFVTXNVVUZCVVN4SlFVRkpPMjlDUVVOb1JpeFJRVUZSTEhGRVFVRjNRaXhwUWtGQmFVSXNRMEZCUXl4RFFVRkRPMmxDUVVOc1JDeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTTdaMEpCUTNKRExFMUJRVTBzU1VGQlNTeExRVUZMTEVOQlFVTXNaVUZCWlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzYTBKQlFXdENMRWxCUVVrc1EwRkJReXhSUVVGUkxFbEJRVWs3YjBKQlEyaEdMRkZCUVZFc2NVUkJRWGRDTEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03VTBGRGVFUTdTVUZEU0N4RFFVRkRPenRCUVdoUmVVSXNiVU5CUVhOQ0xFZEJRVWM3U1VGRGFrUXNTVUZCU1N4RlFVRkZMRWRCUVVjN1NVRkRWQ3hUUVVGVExFVkJRVVVzUlVGQlJUdEpRVU5pTEV0QlFVc3NSVUZCUlN4SFFVRkhPME5CUTFnc1EwRkJRenRCUVVWeFFpeHBRMEZCYjBJc1IwRkJSeXhKUVVGSkxFZEJRVWNzUTBGQlV6dEpRVU0xUkN4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhPMGxCUTJoRUxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWM3UTBGRGFrUXNRMEZCUXl4RFFVRkRPMEZCUTI5Q0xEWkNRVUZuUWl4SFFVRkhMRWxCUVVrc1IwRkJSeXhEUVVGVExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU42UkN3MlFrRkJaMElzUjBGQlJ5eEpRVUZKTEVkQlFVY3NRMEZCVXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ0tpQmhjeUJFUnlCbWNtOXRJQ2RrWVhSaFozSnZheTFoY0drdlpHY25PMXh1WEc1cGJYQnZjblFnZTF4dUlDQkJURkJJUVVKRlZDeGNiaUFnWkdWMFpXTjBRV3h3YUdGaVpYUXNYRzRnSUdkbGRGTndiR2wwZEdWeVJtOXlRMjlzZFcxdUxGeHVJQ0JuWlhSVGRHRjBjeXhjYmlBZ1RrOVVRVlJKVDA0c1hHNGdJRk5sY1VOdmJGTjBZWFJ6TEZ4dUlDQnpjR3hwZEhSbGNrRnpSbUZ6ZEdFc1hHNGdJRk53YkdsMGRHVnlSblZ1WXl4Y2JpQWdWRUZIVTF4dWZTQm1jbTl0SUNjdUwyMWhZM0p2Ylc5c1pXTjFiR1VuTzF4dVhHNHZLaW9nUTJ4aGMzTWdabTl5SUdoaGJtUnNhVzVuSUc1dmRHRjBhVzl1SUhWdWFYUnpJR2x1SUUxaFkzSnZiVzlzWldOMWJHVWdZMjlzZFcxdWN5QXFMMXh1Wlhod2IzSjBJR05zWVhOeklGVnVhWFJ6U0dGdVpHeGxjaUI3WEc0Z0lIQnliM1JsWTNSbFpDQnlaV0ZrYjI1c2VTQmZZMjlzZFcxdU9pQkVSeTVEYjJ4MWJXNDdJQzh2SUhSb1pTQmpiMngxYlc0Z2RHOGdZbVVnWTI5dWRtVnlkR1ZrWEc0Z0lIQnliM1JsWTNSbFpDQmZkVzVwZEhNNklITjBjbWx1WnpzZ0x5OGdkVzVwZEhNc0lHOW1JSFJvWlNCbWIzSnRJR1poYzNSaExDQnpaWEJoY21GMGIzSmNiaUFnY0hKdmRHVmpkR1ZrSUY5dWIzUmhkR2x2YmpvZ1RrOVVRVlJKVDA0N0lDOHZJR04xY25KbGJuUWdibTkwWVhScGIyNGdLSGRwZEdodmRYUWdPbE5GVVRwT1ZDd2daWFJqTGlsY2JpQWdjSEp2ZEdWamRHVmtJRjlrWldaaGRXeDBSMkZ3VTNsdFltOXNPaUJ6ZEhKcGJtYzdYRzRnSUhCeWIzUmxZM1JsWkNCemRHRjBhV01nY21WaFpHOXViSGtnWDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDQTlJSHRjYmlBZ0lDQklSVXhOT2lBbktpY3NYRzRnSUNBZ1UwVlFRVkpCVkU5U09pQW5KeXhjYmlBZ0lDQkdRVk5VUVRvZ0p5MG5MRnh1SUNCOU8xeHVYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdjbVZoWkc5dWJIa2dVR1Z3ZEdsa1pVWmhjM1JoUVd4d2FHRmlaWFFnUFNCdVpYY2dVMlYwUEhOMGNtbHVaejRvVzF4dUlDQWdJQ2RISnl3Z0owd25MQ0FuV1Njc0lDZFRKeXdnSjBVbkxDQW5VU2NzSUNkRUp5d2dKMDRuTENBblJpY3NJQ2RCSnl4Y2JpQWdJQ0FuU3ljc0lDZFNKeXdnSjBnbkxDQW5ReWNzSUNkV0p5d2dKMUFuTENBblZ5Y3NJQ2RKSnl3Z0owMG5MQ0FuVkNjc1hHNGdJRjBwTzF4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUhKbFlXUnZibXg1SUVSdVlVWmhjM1JoUVd4d2FHRmlaWFFnUFNCdVpYY2dVMlYwUEhOMGNtbHVaejRvV3lkQkp5d2dKME1uTENBblJ5Y3NJQ2RVSjEwcE8xeHVJQ0J3ZFdKc2FXTWdjM1JoZEdsaklISmxZV1J2Ym14NUlGSnVZVVpoYzNSaFFXeHdhR0ZpWlhRZ1BTQnVaWGNnVTJWMFBITjBjbWx1Wno0b1d5ZEJKeXdnSjBNbkxDQW5SeWNzSUNkVkoxMHBPMXh1WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nYzJWMFZXNXBkSE5VYjBaaGMzUmhRMjlzZFcxdUtHTnZiRG9nUkVjdVEyOXNkVzF1S1NCN1hHNGdJQ0FnYVdZZ0tHTnZiQzV6WlcxVWVYQmxJQ0U5UFNCRVJ5NVRSVTFVV1ZCRkxrMUJRMUpQVFU5TVJVTlZURVVwWEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMFpoYzNSaElHTnZiSFZ0YmlCdGRYTjBJR0psSUUxQlExSlBUVTlNUlVOVlRFVW5LVHRjYmx4dUlDQWdJR052Ym5OMElITjBZWFJ6T2lCVFpYRkRiMnhUZEdGMGN5QTlJR2RsZEZOMFlYUnpLR052YkN3Z05Td2djM0JzYVhSMFpYSkJjMFpoYzNSaEtUdGNiaUFnSUNCamIyNXpkQ0JoYkdsbmJtVmtJRDBnYzNSaGRITXVjMkZ0WlV4bGJtZDBhQ0EvSUNkVFJWRXVUVk5CSnlBNklDZFRSVkVuTzF4dUlDQWdJR052Ym5OMElHRnNjR2hoWW1WMElEMGdaR1YwWldOMFFXeHdhR0ZpWlhRb2MzUmhkSE1wTzF4dVhHNGdJQ0FnWTI5c0xuTmxkRlJoWnloRVJ5NVVRVWRUTGxWT1NWUlRMQ0JPVDFSQlZFbFBUaTVHUVZOVVFTazdYRzRnSUNBZ1kyOXNMbk5sZEZSaFp5aFVRVWRUTG1Gc2FXZHVaV1FzSUdGc2FXZHVaV1FwTzF4dUlDQWdJR052YkM1elpYUlVZV2NvVkVGSFV5NWhiSEJvWVdKbGRDd2dZV3h3YUdGaVpYUXBPMXh1SUNCOVhHNWNiaUFnY0hKdmRHVmpkR1ZrSUdkbGRDQjFibWwwY3lncE9pQnpkSEpwYm1jZ2V5QnlaWFIxY200Z2RHaHBjeTVmZFc1cGRITTdJSDFjYmx4dUlDQndjbTkwWldOMFpXUWdaMlYwSUdOdmJIVnRiaWdwT2lCRVJ5NURiMngxYlc0Z2V5QnlaWFIxY200Z2RHaHBjeTVmWTI5c2RXMXVPeUI5WEc1Y2JpQWdjSFZpYkdsaklHZGxkQ0J1YjNSaGRHbHZiaWdwT2lCT1QxUkJWRWxQVGlCN0lISmxkSFZ5YmlCMGFHbHpMbDl1YjNSaGRHbHZianNnZlZ4dVhHNGdJSEIxWW14cFl5Qm5aWFFnWkdWbVlYVnNkRWRoY0ZONWJXSnZiQ2dwT2lCemRISnBibWNnZXlCeVpYUjFjbTRnZEdocGN5NWZaR1ZtWVhWc2RFZGhjRk41YldKdmJEc2dmVnh1WEc0Z0lIQjFZbXhwWXlCblpYUWdjMlZ3WVhKaGRHOXlLQ2s2SUhOMGNtbHVaeUI4SUhWdVpHVm1hVzVsWkNCN1hHNGdJQ0FnWTI5dWMzUWdjMlZ3WVhKaGRHOXlPaUJ6ZEhKcGJtY2dmQ0IxYm1SbFptbHVaV1FnUFNCMGFHbHpMbU52YkhWdGJpNW5aWFJVWVdjb1ZFRkhVeTV6WlhCaGNtRjBiM0lwSUQ4L0lIVnVaR1ZtYVc1bFpEdGNiaUFnSUNCcFppQW9kR2hwY3k1dWIzUmhkR2x2YmlBOVBUMGdUazlVUVZSSlQwNHVVMFZRUVZKQlZFOVNJQ1ltSUhObGNHRnlZWFJ2Y2lBOVBUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHQlRaWEJoY21GMGIzSWdhWE1nYldGdVpHRjBiM0o1SUNCbWIzSWdZMjlzZFcxdUlDY2tlM1JvYVhNdVkyOXNkVzF1TG01aGJXVjlKeUJ2WmlCdWIzUmhkR2x2YmlBbkpIdDBhR2x6TG01dmRHRjBhVzl1ZlNjdVlDazdYRzRnSUNBZ2NtVjBkWEp1SUhObGNHRnlZWFJ2Y2p0Y2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCblpYUWdZV3hwWjI1bFpDZ3BPaUJ6ZEhKcGJtY2dlMXh1SUNBZ0lHTnZibk4wSUdGc2FXZHVaV1FnUFNCMGFHbHpMbU52YkhWdGJpNW5aWFJVWVdjb1ZFRkhVeTVoYkdsbmJtVmtLVHRjYmx4dUlDQWdJQzh2SUZSQlIxTXVZV3hwWjI1bFpDQnBjeUJ0WVc1a1lYUnZjbmtnWm05eUlHTnZiSFZ0Ym5NZ2IyWWdUazlVUVZSSlQwNHVSa0ZUVkVFZ1lXNWtJRTVQVkVGVVNVOU9MbE5GVUVGU1FWUlBVbHh1SUNBZ0lHbG1JQ2doWVd4cFoyNWxaQ0FtSmlBb2RHaHBjeTVwYzBaaGMzUmhLQ2tnZkh3Z2RHaHBjeTVwYzFObGNHRnlZWFJ2Y2lncEtTbGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblZHRm5JR0ZzYVdkdVpXUWdibTkwSUhObGRDY3BPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHRnNhV2R1WldRN1hHNGdJSDFjYmx4dUlDQXZLaW9nUVd4d2FHRmlaWFFnYm1GdFpTQW9kWEJ3WlhJZ1kyRnpaU2tnS2k5Y2JpQWdjSFZpYkdsaklHZGxkQ0JoYkhCb1lXSmxkQ2dwT2lCemRISnBibWNnZTF4dUlDQWdJR052Ym5OMElHRnNjR2hoWW1WMElEMGdkR2hwY3k1amIyeDFiVzR1WjJWMFZHRm5LRlJCUjFNdVlXeHdhR0ZpWlhRcE8xeHVYRzRnSUNBZ0x5OGdWRUZIVXk1aGJIQm9ZV0psZENCcGN5QnRZVzVrWVhSdmNua2dabTl5SUdOdmJIVnRibk1nYjJZZ1RrOVVRVlJKVDA0dVJrRlRWRUVnWVc1a0lFNVBWRUZVU1U5T0xsTkZVRUZTUVZSUFVseHVJQ0FnSUdsbUlDZ2hZV3h3YUdGaVpYUWdKaVlnS0hSb2FYTXVhWE5HWVhOMFlTZ3BJSHg4SUhSb2FYTXVhWE5UWlhCaGNtRjBiM0lvS1NrcFhHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjFSaFp5QmhiSEJvWVdKbGRDQnViM1FnYzJWMEp5azdYRzVjYmlBZ0lDQnlaWFIxY200Z1lXeHdhR0ZpWlhRN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ1oyVjBRV3h3YUdGaVpYUlRhWHBsS0NrNklHNTFiV0psY2lCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11Ym05MFlYUnBiMjRnUFQwZ1RrOVVRVlJKVDA0dVNFVk1UU0I4ZkNCMGFHbHpMbUZzY0doaFltVjBJRDA5SUVGTVVFaEJRa1ZVTGxWT0tTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCaGJIQm9ZV0psZEZOcGVtVlRkSElnUFNCMGFHbHpMbU52YkhWdGJpNW5aWFJVWVdjb1ZFRkhVeTVoYkhCb1lXSmxkRk5wZW1VcE8xeHVJQ0FnSUNBZ2JHVjBJR0ZzY0doaFltVjBVMmw2WlRvZ2JuVnRZbVZ5TzF4dUlDQWdJQ0FnYVdZZ0tHRnNjR2hoWW1WMFUybDZaVk4wY2lrZ2UxeHVJQ0FnSUNBZ0lDQmhiSEJvWVdKbGRGTnBlbVVnUFNCd1lYSnpaVWx1ZENoaGJIQm9ZV0psZEZOcGVtVlRkSElwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1kyRnNZM1ZzWVhSbElHRnNjR2hoWW1WMFUybDZaU0J2YmlCa1pXMWhibVJjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjM0JzYVhSMFpYSTZJRk53YkdsMGRHVnlSblZ1WXlBOUlHZGxkRk53YkdsMGRHVnlSbTl5UTI5c2RXMXVLSFJvYVhNdVkyOXNkVzF1S1R0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYzNSaGRITWdQU0JuWlhSVGRHRjBjeWgwYUdsekxtTnZiSFZ0Yml3Z01Td2djM0JzYVhSMFpYSXBPMXh1SUNBZ0lDQWdJQ0JoYkhCb1lXSmxkRk5wZW1VZ1BTQlBZbXBsWTNRdWEyVjVjeWh6ZEdGMGN5NW1jbVZ4S1M1c1pXNW5kR2c3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZV3h3YUdGaVpYUlRhWHBsTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnpkMmwwWTJnZ0tIUm9hWE11WVd4d2FHRmlaWFFwSUh0Y2JpQWdJQ0FnSUdOaGMyVWdRVXhRU0VGQ1JWUXVVRlE2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUF5TUR0Y2JpQWdJQ0FnSUdOaGMyVWdRVXhRU0VGQ1JWUXVSRTVCT2x4dUlDQWdJQ0FnWTJGelpTQkJURkJJUVVKRlZDNVNUa0U2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUEwTzF4dUlDQWdJQ0FnWTJGelpTQW5UbFFuT2x4dUlDQWdJQ0FnSUNCamIyNXpiMnhsTG5kaGNtNG9ZRlZ1Wlhod1pXTjBaV1FnWVd4d2FHRmlaWFFnSjA1VUp5NWdLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRFE3WEc0Z0lDQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9ZRlZ1Wlhod1pXTjBaV1FnWVd4d2FHRmlaWFFnSnlSN2RHaHBjeTVoYkhCb1lXSmxkSDBuTG1BcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCblpYUkJiSEJvWVdKbGRFbHpUWFZzZEdsamFHRnlLQ2s2SUdKdmIyeGxZVzRnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbTV2ZEdGMGFXOXVJRDA5SUU1UFZFRlVTVTlPTGtoRlRFMGdmSHdnZEdocGN5NWhiSEJvWVdKbGRDQTlQU0JCVEZCSVFVSkZWQzVWVGlsY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtTnZiSFZ0Ymk1blpYUlVZV2NvVkVGSFV5NWhiSEJvWVdKbGRFbHpUWFZzZEdsamFHRnlLU0E5UFNBbmRISjFaU2M3WEc0Z0lDQWdaV3h6WlZ4dUlDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklHbHpSbUZ6ZEdFb0tUb2dZbTl2YkdWaGJpQjdJSEpsZEhWeWJpQjBhR2x6TG01dmRHRjBhVzl1SUQwOVBTQk9UMVJCVkVsUFRpNUdRVk5VUVRzZ2ZWeHVYRzRnSUhCMVlteHBZeUJwYzFObGNHRnlZWFJ2Y2lncE9pQmliMjlzWldGdUlIc2djbVYwZFhKdUlIUm9hWE11Ym05MFlYUnBiMjRnUFQwOUlFNVBWRUZVU1U5T0xsTkZVRUZTUVZSUFVqc2dmVnh1WEc0Z0lIQjFZbXhwWXlCcGMwaGxiRzBvS1RvZ1ltOXZiR1ZoYmlCN0lISmxkSFZ5YmlCMGFHbHpMbTV2ZEdGMGFXOXVJRDA5UFNCT1QxUkJWRWxQVGk1SVJVeE5PeUI5WEc1Y2JpQWdjSFZpYkdsaklHbHpVbTVoS0NrNklHSnZiMnhsWVc0Z2V5QnlaWFIxY200Z2RHaHBjeTVoYkhCb1lXSmxkQ0E5UFQwZ1FVeFFTRUZDUlZRdVVrNUJPeUI5WEc1Y2JpQWdjSFZpYkdsaklHbHpSRzVoS0NrNklHSnZiMnhsWVc0Z2V5QnlaWFIxY200Z2RHaHBjeTVoYkhCb1lXSmxkQ0E5UFQwZ1FVeFFTRUZDUlZRdVJFNUJPeUI5WEc1Y2JpQWdjSFZpYkdsaklHbHpVR1Z3ZEdsa1pTZ3BPaUJpYjI5c1pXRnVJSHNnY21WMGRYSnVJSFJvYVhNdVlXeHdhR0ZpWlhRZ1BUMDlJRUZNVUVoQlFrVlVMbEJVT3lCOVhHNWNiaUFnY0hWaWJHbGpJR2x6VFhOaEtDazZJR0p2YjJ4bFlXNGdleUJ5WlhSMWNtNGdkR2hwY3k1aGJHbG5ibVZrSUQ4Z2RHaHBjeTVoYkdsbmJtVmtMblJ2VlhCd1pYSkRZWE5sS0NrdWFXNWpiSFZrWlhNb0owMVRRU2NwSURvZ1ptRnNjMlU3SUgxY2JseHVJQ0F2S2lvZ1FYTnpiMk5wWVhSbElHNXZkR0YwYVc5dUlIUjVjR1Z6SUhkcGRHZ2dkR2hsSUdOdmNuSmxjM0J2Ym1ScGJtY2dkVzVwZEhNZ0tpOWNiaUFnTHlvcVhHNGdJQ0FxSUVCeVpYUjFjbTRnZTA1UFZFRlVTVTlPZlNBZ0lDQWdUbTkwWVhScGIyNGdZWE56YjJOcFlYUmxaQ0IzYVhSb0lIUm9aU0IxYm1sMGN5QjBlWEJsWEc0Z0lDQXFMMXh1SUNCd2NtOTBaV04wWldRZ1oyVjBUbTkwWVhScGIyNG9LVG9nVGs5VVFWUkpUMDRnZTF4dUlDQWdJR2xtSUNoMGFHbHpMblZ1YVhSekxuUnZURzkzWlhKRFlYTmxLQ2t1YzNSaGNuUnpWMmwwYUNoT1QxUkJWRWxQVGk1R1FWTlVRU2twWEc0Z0lDQWdJQ0J5WlhSMWNtNGdUazlVUVZSSlQwNHVSa0ZUVkVFN1hHNGdJQ0FnWld4elpTQnBaaUFvZEdocGN5NTFibWwwY3k1MGIweHZkMlZ5UTJGelpTZ3BMbk4wWVhKMGMxZHBkR2dvVGs5VVFWUkpUMDR1VTBWUVFWSkJWRTlTS1NsY2JpQWdJQ0FnSUhKbGRIVnliaUJPVDFSQlZFbFBUaTVUUlZCQlVrRlVUMUk3WEc0Z0lDQWdaV3h6WlNCcFppQW9kR2hwY3k1MWJtbDBjeTUwYjB4dmQyVnlRMkZ6WlNncExuTjBZWEowYzFkcGRHZ29UazlVUVZSSlQwNHVTRVZNVFNrcFhHNGdJQ0FnSUNCeVpYUjFjbTRnVGs5VVFWUkpUMDR1U0VWTVRUdGNiaUFnSUNCbGJITmxYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1lFTnZiSFZ0YmlBbkpIdDBhR2x6TG1OdmJIVnRiaTV1WVcxbGZTY2dhR0Z6SUhWdVpYaHdaV04wWldRZ2JtOTBZWFJwYjI0Z0p5UjdkR2hwY3k1MWJtbDBjMzBuTG1BcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRU55WldGMFpTQmhJRzVsZHlCbGJYQjBlU0JqYjJ4MWJXNGdiMllnZEdobElITndaV05wWm1sbFpDQnViM1JoZEdsdmJpQjBlWEJsSUdGdVpDQjBhR1VnYzJGdFpWeHVJQ0FnS2lCc1pXNW5kR2dnWVhNZ1kyOXNkVzF1WEc0Z0lDQXFYRzRnSUNBcUlFQndZWEpoYlNCN1RrOVVRVlJKVDA1OUlIUmhjbWRsZEU1dmRHRjBhVzl1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJITGtOdmJIVnRibjFjYmlBZ0lDb3ZYRzRnSUhCeWIzUmxZM1JsWkNCblpYUk9aWGREYjJ4MWJXNG9kR0Z5WjJWMFRtOTBZWFJwYjI0NklFNVBWRUZVU1U5T0tUb2dSRWN1UTI5c2RXMXVJSHRjYmlBZ0lDQmpiMjV6ZENCamIyd2dQU0IwYUdsekxtTnZiSFZ0Ymp0Y2JpQWdJQ0JqYjI1emRDQnNaVzRnUFNCamIyd3ViR1Z1WjNSb08xeHVJQ0FnSUdOdmJuTjBJRzVoYldVZ1BTQjBZWEpuWlhST2IzUmhkR2x2Ymk1MGIweHZkMlZ5UTJGelpTZ3BJQ3NnSnlnbklDc2dZMjlzTG01aGJXVWdLeUFuS1NjN1hHNGdJQ0FnWTI5dWMzUWdibVYzUTI5c1RtRnRaU0E5SUdOdmJDNWtZWFJoUm5KaGJXVXVZMjlzZFcxdWN5NW5aWFJWYm5WelpXUk9ZVzFsS0c1aGJXVXBPMXh1SUNBZ0lHTnZibk4wSUc1bGQwTnZiSFZ0YmlBOUlFUkhMa052YkhWdGJpNW1jbTl0VEdsemRDZ25jM1J5YVc1bkp5d2dibVYzUTI5c1RtRnRaU3dnYm1WM0lFRnljbUY1S0d4bGJpa3VabWxzYkNnbkp5a3BPMXh1SUNBZ0lHNWxkME52YkhWdGJpNXpaVzFVZVhCbElEMGdSRWN1VTBWTlZGbFFSUzVOUVVOU1QwMVBURVZEVlV4Rk8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpYUlVZV2NvUkVjdVZFRkhVeTVWVGtsVVV5d2dkR0Z5WjJWMFRtOTBZWFJwYjI0cE8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpYUlVZV2NvUkVjdVZFRkhVeTVEUlV4TVgxSkZUa1JGVWtWU0xDQW5UV0ZqY205dGIyeGxZM1ZzWlNjcE8xeHVYRzRnSUNBZ1kyOXVjM1FnYzNKalFXeHBaMjVsWkNBOUlHTnZiQzVuWlhSVVlXY29WRUZIVXk1aGJHbG5ibVZrS1R0Y2JpQWdJQ0JwWmlBb2MzSmpRV3hwWjI1bFpDbGNiaUFnSUNBZ0lHNWxkME52YkhWdGJpNXpaWFJVWVdjb1ZFRkhVeTVoYkdsbmJtVmtMQ0J6Y21OQmJHbG5ibVZrS1R0Y2JseHVJQ0FnSUdOdmJuTjBJSE55WTBGc2NHaGhZbVYwSUQwZ1kyOXNMbWRsZEZSaFp5aFVRVWRUTG1Gc2NHaGhZbVYwS1R0Y2JpQWdJQ0JwWmlBb2MzSmpRV3h3YUdGaVpYUXBYRzRnSUNBZ0lDQnVaWGREYjJ4MWJXNHVjMlYwVkdGbktGUkJSMU11WVd4d2FHRmlaWFFzSUhOeVkwRnNjR2hoWW1WMEtUdGNibHh1SUNBZ0lHeGxkQ0J6Y21OQmJIQm9ZV0psZEZOcGVtVTZJSE4wY21sdVp5QTlJR052YkM1blpYUlVZV2NvVkVGSFV5NWhiSEJvWVdKbGRGTnBlbVVwTzF4dUlDQWdJR2xtSUNoemNtTkJiSEJvWVdKbGRGTnBlbVVwWEc0Z0lDQWdJQ0J1WlhkRGIyeDFiVzR1YzJWMFZHRm5LRlJCUjFNdVlXeHdhR0ZpWlhSVGFYcGxMQ0J6Y21OQmJIQm9ZV0psZEZOcGVtVXBPMXh1WEc0Z0lDQWdZMjl1YzNRZ2MzSmpRV3h3YUdGaVpYUkpjMDExYkhScFkyaGhjam9nYzNSeWFXNW5JRDBnWTI5c0xtZGxkRlJoWnloVVFVZFRMbUZzY0doaFltVjBTWE5OZFd4MGFXTm9ZWElwTzF4dUlDQWdJR2xtSUNoemNtTkJiSEJvWVdKbGRFbHpUWFZzZEdsamFHRnlJQ0U5UFNCMWJtUmxabWx1WldRcFhHNGdJQ0FnSUNCdVpYZERiMngxYlc0dWMyVjBWR0ZuS0ZSQlIxTXVZV3h3YUdGaVpYUkpjMDExYkhScFkyaGhjaXdnYzNKalFXeHdhR0ZpWlhSSmMwMTFiSFJwWTJoaGNpazdYRzVjYmlBZ0lDQnBaaUFvZEdGeVoyVjBUbTkwWVhScGIyNGdQVDBnVGs5VVFWUkpUMDR1U0VWTVRTa2dlMXh1SUNBZ0lDQWdjM0pqUVd4d2FHRmlaWFJUYVhwbElEMGdkR2hwY3k1blpYUkJiSEJvWVdKbGRGTnBlbVVvS1M1MGIxTjBjbWx1WnlncE8xeHVJQ0FnSUNBZ2JtVjNRMjlzZFcxdUxuTmxkRlJoWnloVVFVZFRMbUZzY0doaFltVjBVMmw2WlN3Z2MzSmpRV3h3YUdGaVpYUlRhWHBsS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdibVYzUTI5c2RXMXVPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVOeVpXRjBaU0JoSUc1bGR5QmxiWEIwZVNCamIyeDFiVzRnZFhOcGJtY2dkR1Z0Y0d4aGRHVkRiMndnWVhNZ1lTQjBaVzF3YkdGMFpWeHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdlMFJITGtOdmJIVnRibjBnZEdWdGNHeGhkR1ZEYjJ3Z0lIUm9aU0J3Y205d1pYSjBhV1Z6SUdGdVpDQjFibWwwY3lCdlppQjBhR2x6SUdOdmJIVnRiaUJoY21VZ2RYTmxaQ0JoY3lCaFhHNGdJQ0FxSUhSbGJYQnNZWFJsSUhSdklHSjFhV3hrSUhSb1pTQnVaWGNnYjI1bFhHNGdJQ0FxSUVCeVpYUjFjbTRnZTBSSExrTnZiSFZ0Ym4xY2JpQWdJQ292WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nWjJWMFRtVjNRMjlzZFcxdUtIUmxiWEJzWVhSbFEyOXNPaUJFUnk1RGIyeDFiVzRwT2lCRVJ5NURiMngxYlc0Z2UxeHVJQ0FnSUdOdmJuTjBJR052YkRvZ1ZXNXBkSE5JWVc1a2JHVnlJRDBnYm1WM0lGVnVhWFJ6U0dGdVpHeGxjaWgwWlcxd2JHRjBaVU52YkNrN1hHNGdJQ0FnWTI5dWMzUWdkR0Z5WjJWMFRtOTBZWFJwYjI0Z1BTQmpiMnd1Ym05MFlYUnBiMjQ3WEc0Z0lDQWdjbVYwZFhKdUlHTnZiQzVuWlhST1pYZERiMngxYlc0b2RHRnlaMlYwVG05MFlYUnBiMjRwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFRWdhR1ZzY0dWeUlHWjFibU4wYVc5dUlHTm9aV05yYVc1bklIUm9aU0IyWVd4cFpHbDBlU0J2WmlCMGFHVWdKM1Z1YVhSekp5QnpkSEpwYm1kY2JpQWdJQ3BjYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlIVnVhWFJ6SUNCMGFHVWdjM1J5YVc1bklIUnZJR0psSUhaaGJHbGtZWFJsWkZ4dUlDQWdLaUJBY21WMGRYSnVJSHRpYjI5c1pXRnVmVnh1SUNBZ0tpOWNiaUFnY0hWaWJHbGpJSE4wWVhScFl5QjFibWwwYzFOMGNtbHVaMGx6Vm1Gc2FXUW9kVzVwZEhNNklITjBjbWx1WnlrNklHSnZiMnhsWVc0Z2UxeHVJQ0FnSUhWdWFYUnpJRDBnZFc1cGRITXVkRzlNYjNkbGNrTmhjMlVvS1R0Y2JpQWdJQ0JqYjI1emRDQndjbVZtYVhobGN5QTlJRnRPVDFSQlZFbFBUaTVHUVZOVVFTd2dUazlVUVZSSlQwNHVVMFZRUVZKQlZFOVNMQ0JPVDFSQlZFbFBUaTVJUlV4TlhUdGNiaUFnSUNCamIyNXpkQ0J3YjNOMFptbDRaWE1nUFNCYkozSnVZU2NzSUNka2JtRW5MQ0FuY0hRblhUdGNibHh1SUNBZ0lHTnZibk4wSUhCeVpXWnBlRU55YVhSbGNtbHZiaUE5SUhCeVpXWnBlR1Z6TG5OdmJXVW9LSEFwSUQwK0lIVnVhWFJ6TG5OMFlYSjBjMWRwZEdnb2NDNTBiMHh2ZDJWeVEyRnpaU2dwS1NrN1hHNGdJQ0FnY21WMGRYSnVJSEJ5WldacGVFTnlhWFJsY21sdmJqdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYjI1emRISjFZM1FnWVNCdVpYY2dZMjlzZFcxdUlHOW1JSE5sYldGdWRHbGpJSFI1Y0dVZ1RVRkRVazlOVDB4RlExVk1SU0JtY205dElIUm9aU0JzYVhOMElHOW1YRzRnSUNBcUlITndaV05wWm1sbFpDQndZWEpoYldWMFpYSnpYRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3Ym5WdFltVnlmU0FnSUNCc1pXNGdJSFJvWlNCc1pXNW5kR2dnYjJZZ2RHaGxJRzVsZHlCamIyeDFiVzVjYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlDQWdJRzVoYldVZ0lIUm9aU0J1WVcxbElHOW1JSFJvWlNCdVpYY2dZMjlzZFcxdVhHNGdJQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0FnSUNCMWJtbDBjeUFnZEdobElIVnVhWFJ6SUc5bUlIUm9aU0J1WlhjZ1kyOXNkVzF1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJITGtOdmJIVnRibjFjYmlBZ0lDb3ZYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdaMlYwVG1WM1EyOXNkVzF1Um5KdmJWQmhjbUZ0Y3loY2JpQWdJQ0JzWlc0NklHNTFiV0psY2l4Y2JpQWdJQ0J1WVcxbE9pQnpkSEpwYm1jc1hHNGdJQ0FnZFc1cGRITTZJSE4wY21sdVoxeHVJQ0FwT2lCRVJ5NURiMngxYlc0Z2UxeHVJQ0FnSUM4dklGZEJVazVKVGtjNklHbHVJSFJvYVhNZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYVhNZ2FYTWdhVzF3YjNOemFXSnNaU0IwYnlCMlpYSnBabmtnZEdobElIVnVhWEYxWlc1bGMzTmNiaUFnSUNBdkx5QnZaaUIwYUdVZ2JtVjNJR052YkhWdGJpZHpJRzVoYldWY2JpQWdJQ0F2THlCVVQwUlBPaUIyWlhKcFpua2dkR2hsSUhaaGJHbGthWFI1SUc5bUlIVnVhWFJ6SUhCaGNtRnRaWFJsY2x4dUlDQWdJR2xtSUNnaFZXNXBkSE5JWVc1a2JHVnlMblZ1YVhSelUzUnlhVzVuU1hOV1lXeHBaQ2gxYm1sMGN5a3BYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0owbHVkbUZzYVdRZ1ptOXliV0YwSUc5bUlGeGNKM1Z1YVhSelhGd25JSEJoY21GdFpYUmxjaWNwTzF4dUlDQWdJR052Ym5OMElHNWxkME52YkhWdGJpQTlJRVJITGtOdmJIVnRiaTVtY205dFRHbHpkQ2duYzNSeWFXNW5KeXdnYm1GdFpTd2dibVYzSUVGeWNtRjVLR3hsYmlrdVptbHNiQ2duSnlrcE8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpXMVVlWEJsSUQwZ1JFY3VVMFZOVkZsUVJTNU5RVU5TVDAxUFRFVkRWVXhGTzF4dUlDQWdJRzVsZDBOdmJIVnRiaTV6WlhSVVlXY29SRWN1VkVGSFV5NVZUa2xVVXl3Z2RXNXBkSE1wTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGREYjJ4MWJXNDdYRzRnSUgxY2JseHVJQ0J3ZFdKc2FXTWdZMjl1YzNSeWRXTjBiM0lvWTI5c09pQkVSeTVEYjJ4MWJXNHBJSHRjYmlBZ0lDQjBhR2x6TGw5amIyeDFiVzRnUFNCamIydzdYRzRnSUNBZ1kyOXVjM1FnZFc1cGRITWdQU0IwYUdsekxsOWpiMngxYlc0dWRHRm5jMXRFUnk1VVFVZFRMbFZPU1ZSVFhUdGNiaUFnSUNCcFppQW9kVzVwZEhNZ0lUMDlJRzUxYkd3cFhHNGdJQ0FnSUNCMGFHbHpMbDkxYm1sMGN5QTlJSFZ1YVhSek8xeHVJQ0FnSUdWc2MyVmNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblZXNXBkSE1nWVhKbElHNXZkQ0J6Y0dWamFXWnBaV1FnYVc0Z1kyOXNkVzF1SnlrN1hHNGdJQ0FnZEdocGN5NWZibTkwWVhScGIyNGdQU0IwYUdsekxtZGxkRTV2ZEdGMGFXOXVLQ2s3WEc0Z0lDQWdkR2hwY3k1ZlpHVm1ZWFZzZEVkaGNGTjViV0p2YkNBOUlDaDBhR2x6TG1selJtRnpkR0VvS1NrZ1B5QlZibWwwYzBoaGJtUnNaWEl1WDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDNUdRVk5VUVNBNlhHNGdJQ0FnSUNBb2RHaHBjeTVwYzBobGJHMG9LU2tnUHlCVmJtbDBjMGhoYm1Sc1pYSXVYMlJsWm1GMWJIUkhZWEJUZVcxaWIyeHpSR2xqZEM1SVJVeE5JRHBjYmlBZ0lDQWdJQ0FnVlc1cGRITklZVzVrYkdWeUxsOWtaV1poZFd4MFIyRndVM2x0WW05c2MwUnBZM1F1VTBWUVFWSkJWRTlTTzF4dVhHNGdJQ0FnYVdZZ0tDRjBhR2x6TG1OdmJIVnRiaTUwWVdkekxtaGhjeWhVUVVkVExtRnNhV2R1WldRcEtTQjdYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NXBjMFpoYzNSaEtDa2dmSHdnZEdocGN5NXBjMU5sY0dGeVlYUnZjaWdwS1Z4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUVadmNpQmpiMngxYlc0Z0p5UjdkR2hwY3k1amIyeDFiVzR1Ym1GdFpYMG5JRzltSUc1dmRHRjBhVzl1SUNja2UzUm9hWE11Ym05MFlYUnBiMjU5SnlCZ0lDdGNiaUFnSUNBZ0lDQWdJQ0JnZEdGbklDY2tlMVJCUjFNdVlXeHBaMjVsWkgwbklHbHpJRzFoYm1SaGRHOXllUzVnS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCcFppQW9JWFJvYVhNdVkyOXNkVzF1TG5SaFozTXVhR0Z6S0ZSQlIxTXVZV3h3YUdGaVpYUlRhWHBsS1NrZ2UxeHVJQ0FnSUM4dklDQWdhV1lnS0hSb2FYTXVhWE5JWld4dEtDa3BYRzRnSUNBZ0x5OGdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnUm05eUlHTnZiSFZ0YmlBbkpIdDBhR2x6TG1OdmJIVnRiaTV1WVcxbGZTY2diMllnYm05MFlYUnBiMjRnSnlSN2RHaHBjeTV1YjNSaGRHbHZibjBuSUdBZ0sxeHVJQ0FnSUM4dklDQWdJQ0FnSUdCMFlXY2dKeVI3VkVGSFV5NWhiSEJvWVdKbGRGTnBlbVY5SnlCcGN5QnRZVzVrWVhSdmNua3VZQ2s3WEc0Z0lDQWdMeThnSUNCbGJITmxJR2xtSUNoYkoxVk9KMTB1YVc1amJIVmtaWE1vZEdocGN5NWhiSEJvWVdKbGRDa3BYRzRnSUNBZ0x5OGdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnUm05eUlHTnZiSFZ0YmlBbkpIdDBhR2x6TG1OdmJIVnRiaTV1WVcxbGZTY2diMllnWVd4d2FHRmlaWFFnSnlSN2RHaHBjeTVoYkhCb1lXSmxkSDBuSUdBZ0sxeHVJQ0FnSUM4dklDQWdJQ0FnSUdCMFlXY2dKeVI3VkVGSFV5NWhiSEJvWVdKbGRGTnBlbVY5SnlCcGN5QnRZVzVrWVhSdmNua3VZQ2s3WEc0Z0lDQWdMeThnZlZ4dVhHNGdJQ0FnYVdZZ0tDRjBhR2x6TG1OdmJIVnRiaTUwWVdkekxtaGhjeWhVUVVkVExtRnNjR2hoWW1WMFNYTk5kV3gwYVdOb1lYSXBLU0I3WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTVwYzBobGJHMG9LU2xjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JHYjNJZ1kyOXNkVzF1SUNja2UzUm9hWE11WTI5c2RXMXVMbTVoYldWOUp5QnZaaUJ1YjNSaGRHbHZiaUFuSkh0MGFHbHpMbTV2ZEdGMGFXOXVmU2NnWUNBclhHNGdJQ0FnSUNBZ0lDQWdZSFJoWnlBbkpIdFVRVWRUTG1Gc2NHaGhZbVYwU1hOTmRXeDBhV05vWVhKOUp5QnBjeUJ0WVc1a1lYUnZjbmt1WUNrN1hHNGdJQ0FnSUNCbGJITmxJR2xtSUNoYkoxVk9KMTB1YVc1amJIVmtaWE1vZEdocGN5NWhiSEJvWVdKbGRDa3BYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGdSbTl5SUdOdmJIVnRiaUFuSkh0MGFHbHpMbU52YkhWdGJpNXVZVzFsZlNjZ2IyWWdZV3h3YUdGaVpYUWdKeVI3ZEdocGN5NWhiSEJvWVdKbGRIMG5JR0FnSzF4dUlDQWdJQ0FnSUNBZ0lHQjBZV2NnSnlSN1ZFRkhVeTVoYkhCb1lXSmxkRWx6VFhWc2RHbGphR0Z5ZlNjZ2FYTWdiV0Z1WkdGMGIzSjVMbUFwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVmVnh1SWwxOSIsImV4cG9ydCBmdW5jdGlvbiBlcnJvclRvQ29uc29sZShlcnIpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBlbHNlIGlmICgnJHRocm93bkpzRXJyb3InIGluIGVycikge1xuICAgICAgICByZXR1cm4gZXJyb3JUb0NvbnNvbGUoZXJyWyckdGhyb3duSnNFcnJvciddKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIChfYSA9IGVyci5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXJyLm1lc3NhZ2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdCkge1xuICAgIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkRzh0WTI5dWMyOXNaUzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkluUnZMV052Ym5OdmJHVXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUzBFc1RVRkJUU3hWUVVGVkxHTkJRV01zUTBGQlF5eEhRVUZST3p0SlFVTnlReXhKUVVGSkxFOUJRVThzUjBGQlJ5eExRVUZMTEZGQlFWRXNTVUZCU1N4SFFVRkhMRmxCUVZrc1RVRkJUU3hGUVVGRk8xRkJRM0JFTEU5QlFVOHNSMEZCWVN4RFFVRkRPMHRCUTNSQ08xTkJRVTBzU1VGQlNTeG5Ra0ZCWjBJc1NVRkJTU3hIUVVGSExFVkJRVVU3VVVGRGJFTXNUMEZCVHl4alFVRmpMRU5CUVVNc1IwRkJSeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRU5CUVVNc1EwRkJRenRMUVVNNVF6dFRRVUZOTEVsQlFVa3NSMEZCUnl4WlFVRlpMRXRCUVVzc1JVRkJSVHRSUVVNdlFpeFBRVUZQTEUxQlFVTXNSMEZCWVN4RFFVRkRMRXRCUVVzc2JVTkJRVXNzUjBGQllTeERRVUZETEU5QlFVOHNRMEZCUXp0TFFVTjJSRHRUUVVGTk8xRkJRMHdzVDBGQlR5eEhRVUZITEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNN1MwRkRka0k3UVVGRFNDeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMR0ZCUVdFc1EwRkJReXhKUVVGaE8wbEJRM3BETEU5QlFVOHNUVUZCVFN4SlFVRkpMRU5CUVVNc1EwRkJReXhQUVVGUExFbEJRVWtzUTBGQlF5eERRVUZETEU5QlFVOHNTVUZCU1N4RFFVRkRMRXRCUVVzc1QwRkJUeXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTTdRVUZEZWtVc1EwRkJReUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0FxSUdGeklIVnBJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzkxYVNjN1hHNXBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJRVJISUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5a1p5YzdYRzVjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdWeWNtOXlWRzlEYjI1emIyeGxLR1Z5Y2pvZ1lXNTVLVG9nYzNSeWFXNW5JSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQmxjbklnUFQwOUlDZHpkSEpwYm1jbklIeDhJR1Z5Y2lCcGJuTjBZVzVqWlc5bUlGTjBjbWx1WnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJsY25JZ1lYTWdjM1J5YVc1bk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0Nja2RHaHliM2R1U25ORmNuSnZjaWNnYVc0Z1pYSnlLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHVnljbTl5Vkc5RGIyNXpiMnhsS0dWeWNsc25KSFJvY205M2JrcHpSWEp5YjNJblhTazdYRzRnSUgwZ1pXeHpaU0JwWmlBb1pYSnlJR2x1YzNSaGJtTmxiMllnUlhKeWIzSXBJSHRjYmlBZ0lDQnlaWFIxY200Z0tHVnljaUJoY3lCRmNuSnZjaWt1YzNSaFkyc2dQejhnS0dWeWNpQmhjeUJGY25KdmNpa3ViV1Z6YzJGblpUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnlaWFIxY200Z1pYSnlMblJ2VTNSeWFXNW5LQ2s3WEc0Z0lIMWNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhKbFkzUlViME52Ym5OdmJHVW9jbVZqZERvZ1JFY3VVbVZqZENrNklITjBjbWx1WnlCN1hHNGdJSEpsZEhWeWJpQmdLSGc5Skh0eVpXTjBMbmg5TENCNVBTUjdjbVZqZEM1NWZTd2dkejBrZTNKbFkzUXVkMmxrZEdoOUxDQm9QU1I3Y21WamRDNW9aV2xuYUhSOUtXQTdYRzU5WEc0aVhYMD0iLCJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGZpbmRNb25vbWVycywgcGFyc2VIZWxtLCBnZXRQYXJ0cyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcHJpbnRMZWZ0T3JDZW50ZXJlZCB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy91dGlscy9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IGVycm9yVG9Db25zb2xlIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdG8tY29uc29sZSc7XG5leHBvcnQgY2xhc3MgSGVsbUNlbGxSZW5kZXJlciBleHRlbmRzIERHLkdyaWRDZWxsUmVuZGVyZXIge1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gJ2hlbG0nOyB9XG4gICAgZ2V0IGNlbGxUeXBlKCkgeyByZXR1cm4gJ2hlbG0nOyB9XG4gICAgZ2V0IGRlZmF1bHRXaWR0aCgpIHsgcmV0dXJuIDQwMDsgfVxuICAgIGdldCBkZWZhdWx0SGVpZ2h0KCkgeyByZXR1cm4gMTAwOyB9XG4gICAgb25Nb3VzZU1vdmUoZ3JpZENlbGwsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXhMZW5ndGhXb3Jkc1N1bSA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2hlbG0tc3VtLW1heExlbmd0aFdvcmRzJ107XG4gICAgICAgICAgICBjb25zdCBtYXhJbmRleCA9IE9iamVjdC52YWx1ZXMoZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnaGVsbS1tYXhMZW5ndGhXb3JkcyddKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgY29uc3QgYXJnc1ggPSBlLm9mZnNldFggLSBncmlkQ2VsbC5ncmlkQ29sdW1uLmxlZnQgKyAoZ3JpZENlbGwuZ3JpZENvbHVtbi5sZWZ0IC0gZ3JpZENlbGwuYm91bmRzLngpO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAwO1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gbWF4SW5kZXg7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIG1heExlbmd0aFdvcmRzU3VtW21heEluZGV4ICsgMV0gPSBhcmdzWCArIDE7XG4gICAgICAgICAgICBsZXQgbWlkID0gMDtcbiAgICAgICAgICAgIGlmIChhcmdzWCA+IG1heExlbmd0aFdvcmRzU3VtWzBdKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBtaWQgPSBNYXRoLmZsb29yKChyaWdodCArIGxlZnQpIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzWCA+PSBtYXhMZW5ndGhXb3Jkc1N1bVttaWRdICYmIGFyZ3NYIDw9IG1heExlbmd0aFdvcmRzU3VtW21pZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbWlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NYIDwgbWF4TGVuZ3RoV29yZHNTdW1bbWlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NYID4gbWF4TGVuZ3RoV29yZHNTdW1bbWlkICsgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZWZ0ID0gKGFyZ3NYID49IG1heExlbmd0aFdvcmRzU3VtW2xlZnRdKSA/IGxlZnQgKyAxIDogbGVmdDtcbiAgICAgICAgICAgIGNvbnN0IG1vbm9tZXJzID0gZmluZE1vbm9tZXJzKGdyaWRDZWxsLmNlbGwudmFsdWUpO1xuICAgICAgICAgICAgbGV0IHMgPSAoX2EgPSBncmlkQ2VsbC5jZWxsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgICAgIGxldCBzdWJQYXJ0cyA9IHBhcnNlSGVsbShzKTtcbiAgICAgICAgICAgIGxldCBhbGxQYXJ0cyA9IGdldFBhcnRzKHN1YlBhcnRzLCBzKTtcbiAgICAgICAgICAgIGxldCB0b29sdGlwTWVzc2FnZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChtb25vbWVycy5oYXMoYWxsUGFydHNbaV0pKVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwTWVzc2FnZVtpXSA9IHVpLmRpdlYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2VGV4dChgTW9ub21lciAke2FsbFBhcnRzW2ldfSBub3QgZm91bmQuYCksXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZUZXh0KCdPcGVuIHRoZSBDb250ZXh0IFBhbmVsLCB0aGVuIGV4cGFuZCBNYW5hZ2UgTGlicmFyaWVzJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoKCgoX2MgPSAoX2IgPSB0b29sdGlwTWVzc2FnZVtsZWZ0XSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoaWxkTm9kZXMubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwKSA+IDApKVxuICAgICAgICAgICAgICAgID8gdWkudG9vbHRpcC5zaG93KHVpLmRpdih0b29sdGlwTWVzc2FnZVtsZWZ0XSksIGUueCArIDE2LCBlLnkgKyAxNilcbiAgICAgICAgICAgICAgICA6IHVpLnRvb2x0aXAuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGVycm9yVG9Db25zb2xlKGVycik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdIZWxtOiBIZWxtQ2VsbFJlbmRlcmVyLm9uTW91c2VNb3ZlKCkgZXJyb3I6XFxuJyArIGVyck1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKGcsIHgsIHksIHcsIGgsIGdyaWRDZWxsLCBjZWxsU3R5bGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBncmlkID0gZ3JpZENlbGwuZ3JpZFJvdyAhPT0gLTEgPyBncmlkQ2VsbC5ncmlkIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB1bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcbiAgICAgICAgY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuICAgICAgICBjb25zdCBtb25vbWVycyA9IGZpbmRNb25vbWVycyhncmlkQ2VsbC5jZWxsLnZhbHVlKTtcbiAgICAgICAgbGV0IHMgPSAoX2EgPSBncmlkQ2VsbC5jZWxsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgbGV0IHN1YlBhcnRzID0gcGFyc2VIZWxtKHMpO1xuICAgICAgICBpZiAobW9ub21lcnMuc2l6ZSA9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBob3N0ID0gdWkuZGl2KFtdLCB7IHN0eWxlOiB7IHdpZHRoOiBgJHt3fXB4YCwgaGVpZ2h0OiBgJHtofXB4YCB9IH0pO1xuICAgICAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGFmb3JtYXQnLCAnaGVsbScpO1xuICAgICAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBncmlkQ2VsbC5jZWxsLnZhbHVlKTtcbiAgICAgICAgICAgIGdyaWRDZWxsLmVsZW1lbnQgPSBob3N0O1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBjYW52YXMgPSBuZXcgSlNEcmF3Mi5FZGl0b3IoaG9zdCwgeyB3aWR0aDogdywgaGVpZ2h0OiBoLCBza2luOiAndzgnLCB2aWV3b25seTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9ub21lcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHcgPSBncmlkID8gTWF0aC5taW4oZ3JpZC5jYW52YXMud2lkdGggLSB4LCB3KSA6IGcuY2FudmFzLndpZHRoIC0geDtcbiAgICAgICAgICAgIGcuc2F2ZSgpO1xuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGcucmVjdCh4LCB5LCB3LCBoKTtcbiAgICAgICAgICAgIGcuY2xpcCgpO1xuICAgICAgICAgICAgZy5mb250ID0gJzEycHggbW9ub3NwYWNlJztcbiAgICAgICAgICAgIGcudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG4gICAgICAgICAgICBsZXQgeDEgPSB4O1xuICAgICAgICAgICAgbGV0IG1heExlbmd0aFdvcmRzID0ge307XG4gICAgICAgICAgICBsZXQgbWF4TGVuZ3RoV29yZFN1bSA9IHt9O1xuICAgICAgICAgICAgbGV0IGFsbFBhcnRzID0gZ2V0UGFydHMoc3ViUGFydHMsIHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIG1heExlbmd0aFdvcmRzW2ldID0gYWxsUGFydHNbaV0ubGVuZ3RoICogNztcbiAgICAgICAgICAgICAgICBsZXQgY29sb3IgPSBtb25vbWVycy5oYXMoYWxsUGFydHNbaV0pID8gJ3JlZCcgOiBncmF5Q29sb3I7XG4gICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSB1bmRlZmluZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB4MSA9IHByaW50TGVmdE9yQ2VudGVyZWQoeDEsIHksIHcsIGgsIGcsIGFsbFBhcnRzW2ldLCBjb2xvciwgMCwgdHJ1ZSwgMS4wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heExlbmd0aFdvcmRTdW1bMF0gPSBtYXhMZW5ndGhXb3Jkc1swXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGhXb3JkU3VtW2ldID0gbWF4TGVuZ3RoV29yZFN1bVtpIC0gMV0gKyBtYXhMZW5ndGhXb3Jkc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXAgPSB7XG4gICAgICAgICAgICAgICAgJ2hlbG0tc3VtLW1heExlbmd0aFdvcmRzJzogbWF4TGVuZ3RoV29yZFN1bSxcbiAgICAgICAgICAgICAgICAnaGVsbS1tYXhMZW5ndGhXb3Jkcyc6IG1heExlbmd0aFdvcmRzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZy5yZXN0b3JlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QganNvblNkZk1vbm9tZXJMaWJEaWN0ID0ge1xuICAgIFwibW9ub21lclR5cGVcIjogbnVsbCxcbiAgICBcInNtaWxlc1wiOiBudWxsLFxuICAgIFwibmFtZVwiOiBcIk1vbm9tZXJOYW1lXCIsXG4gICAgXCJhdXRob3JcIjogbnVsbCxcbiAgICBcIm1vbGZpbGVcIjogXCJtb2xlY3VsZVwiLFxuICAgIFwibmF0dXJhbEFuYWxvZ1wiOiBcIk1vbm9tZXJOYXR1cmFsQW5hbG9nQ29kZVwiLFxuICAgIFwicmdyb3Vwc1wiOiBcIk1vbm9tZXJDYXBzXCIsXG4gICAgXCJjcmVhdGVEYXRlXCI6IG51bGwsXG4gICAgXCJpZFwiOiBudWxsLFxuICAgIFwicG9seW1lclR5cGVcIjogXCJNb25vbWVyVHlwZVwiLFxuICAgIFwic3ltYm9sXCI6IFwiTW9ub21lckNvZGVcIlxufTtcbmV4cG9ydCBjb25zdCBTTUlMRVMgPSAnc21pbGVzJztcbmV4cG9ydCBjb25zdCBSR1JPVVBTID0gXCJyZ3JvdXBzXCI7XG5leHBvcnQgY29uc3QgTU9OT01FUl9TWU1CT0wgPSBcInN5bWJvbFwiO1xuZXhwb3J0IGNvbnN0IFJHUk9VUF9DQVBfR1JPVVBfU01JTEVTID0gXCJjYXBHcm91cFNtaWxlc1wiO1xuZXhwb3J0IGNvbnN0IFJHUk9VUF9BTFRFUl9JRCA9IFwiYWx0ZXJuYXRlSWRcIjtcbmV4cG9ydCBjb25zdCBSR1JPVVBfQ0FQX0dST1VQX05BTUUgPSBcImNhcEdyb3VwTmFtZVwiO1xuZXhwb3J0IGNvbnN0IFJHUk9VUF9MQUJFTCA9IFwibGFiZWxcIjtcbmV4cG9ydCBjb25zdCBTREZfTU9OT01FUl9OQU1FID0gXCJNb25vbWVyTmFtZVwiO1xuIiwiaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmV4cG9ydCBjbGFzcyBIZWxtV2ViRWRpdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy53ID0gMjAwO1xuICAgICAgICB0aGlzLmggPSAxMDA7XG4gICAgICAgIHRoaXMuaG9zdCA9IHVpLmRpdihbXSwgeyBzdHlsZTogeyB3aWR0aDogYCR7dGhpcy53fXB4YCwgaGVpZ2h0OiBgJHt0aGlzLmh9cHhgIH0gfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yID0gbmV3IEpTRHJhdzIuRWRpdG9yKHRoaXMuaG9zdCwgeyB3aWR0aDogdGhpcy53LCBoZWlnaHQ6IHRoaXMuaCwgdmlld29ubHk6IHRydWUgfSk7XG4gICAgfVxuICAgIHJlc2l6ZUVkaXRvcih3LCBoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNpemUodywgaCk7XG4gICAgfVxuICAgIGNyZWF0ZVdlYkVkaXRvcih2YWx1ZSkge1xuICAgICAgICBjb25zdCBlZGl0b3JWaWV3ID0gdWkuZGl2KCk7XG4gICAgICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb2xWaWV3ZXIubW9sc2NhbGUgPSAwLjg7XG4gICAgICAgIGNvbnN0IHdlYkVkaXRvciA9IG5ldyBzY2lsLmhlbG0uQXBwKGVkaXRvclZpZXcsIHtcbiAgICAgICAgICAgIHNob3dhYm91dDogZmFsc2UsXG4gICAgICAgICAgICBtZXhmb250c2l6ZTogJzkwJScsXG4gICAgICAgICAgICBtZXhybmFwaW5vbnRhYjogdHJ1ZSxcbiAgICAgICAgICAgIHRvcG1hcmdpbjogMjAsXG4gICAgICAgICAgICBtZXhtb25vbWVyc3RhYjogdHJ1ZSxcbiAgICAgICAgICAgIHNlcXVlbmNldmlld29ubHk6IGZhbHNlLFxuICAgICAgICAgICAgbWV4ZmF2b3JpdGVmaXJzdDogdHJ1ZSxcbiAgICAgICAgICAgIG1leGZpbHRlcjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSB3ZWJFZGl0b3IuY2FsY3VsYXRlU2l6ZXMoKTtcbiAgICAgICAgd2ViRWRpdG9yLmNhbnZhcy5yZXNpemUoc2l6ZXMucmlnaHR3aWR0aCAtIDEwMCwgc2l6ZXMudG9waGVpZ2h0IC0gMjEwKTtcbiAgICAgICAgbGV0IHMgPSB7IHdpZHRoOiBzaXplcy5yaWdodHdpZHRoIC0gMTAwICsgJ3B4JywgaGVpZ2h0OiBzaXplcy5ib3R0b21oZWlnaHQgKyAncHgnIH07XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBzY2lsLmFwcGx5KHdlYkVkaXRvci5zZXF1ZW5jZS5zdHlsZSwgcyk7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBzY2lsLmFwcGx5KHdlYkVkaXRvci5ub3RhdGlvbi5zdHlsZSwgcyk7XG4gICAgICAgIHMgPSB7IHdpZHRoOiBzaXplcy5yaWdodHdpZHRoICsgJ3B4JywgaGVpZ2h0OiAoc2l6ZXMuYm90dG9taGVpZ2h0ICsgd2ViRWRpdG9yLnRvb2xiYXJoZWlnaHQpICsgJ3B4JyB9O1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgc2NpbC5hcHBseSh3ZWJFZGl0b3IucHJvcGVydGllcy5wYXJlbnQuc3R5bGUsIHMpO1xuICAgICAgICB3ZWJFZGl0b3Iuc3RydWN0dXJldmlldy5yZXNpemUoc2l6ZXMucmlnaHR3aWR0aCwgc2l6ZXMuYm90dG9taGVpZ2h0ICsgd2ViRWRpdG9yLnRvb2xiYXJoZWlnaHQpO1xuICAgICAgICB3ZWJFZGl0b3IubWV4LnJlc2l6ZShzaXplcy50b3BoZWlnaHQgLSA4MCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2ViRWRpdG9yLmNhbnZhcy5oZWxtLnNldFNlcXVlbmNlKHZhbHVlLCAnSEVMTScpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgICByZXR1cm4geyBlZGl0b3JEaXY6IGVkaXRvclZpZXcsIHdlYkVkaXRvcjogd2ViRWRpdG9yIH07XG4gICAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldFBhcnRzKHN1YlBhcnRzLCBzKSB7XG4gICAgbGV0IGogPSAwO1xuICAgIGxldCBhbGxQYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc3ViUGFydHMubGVuZ3RoOyArK2spIHtcbiAgICAgICAgbGV0IGluZGV4T2ZNb25vbWVyID0gcy5pbmRleE9mKHN1YlBhcnRzW2tdKTtcbiAgICAgICAgbGV0IGhlbG1CZWZvcmVNb25vbWVyID0gcy5zbGljZShqLCBpbmRleE9mTW9ub21lcik7XG4gICAgICAgIGFsbFBhcnRzLnB1c2goaGVsbUJlZm9yZU1vbm9tZXIpO1xuICAgICAgICBhbGxQYXJ0cy5wdXNoKHN1YlBhcnRzW2tdKTtcbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGluZGV4T2ZNb25vbWVyICsgc3ViUGFydHNba10ubGVuZ3RoKTtcbiAgICB9XG4gICAgYWxsUGFydHMucHVzaChzKTtcbiAgICByZXR1cm4gYWxsUGFydHM7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWxtKHMpIHtcbiAgICB2YXIgc2VjdGlvbnMgPSBzcGxpdChzLCAnJCcpO1xuICAgIHMgPSBzZWN0aW9uc1swXTtcbiAgICB2YXIgbW9ub21lcnMgPSBbXTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBpZiAoIXNjaWwuVXRpbHMuaXNOdWxsT3JFbXB0eShzKSkge1xuICAgICAgICB2YXIgc2VxcyA9IHNwbGl0KHMsICd8Jyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vxcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGUgPSBkZXRhY2hBbm5vdGF0aW9uKHNlcXNbaV0pO1xuICAgICAgICAgICAgcyA9IGUuc3RyO1xuICAgICAgICAgICAgdmFyIHAgPSBzLmluZGV4T2YoJ3snKTtcbiAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZyhwICsgMSk7XG4gICAgICAgICAgICBwID0gcy5pbmRleE9mKCd9Jyk7XG4gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcCk7XG4gICAgICAgICAgICB2YXIgc3MgPSBzcGxpdChzLCAnLicpO1xuICAgICAgICAgICAgZm9yICh2YXIgbW9ub21lciBvZiBzcykge1xuICAgICAgICAgICAgICAgIGlmIChtb25vbWVyLmluY2x1ZGVzKCcoJykgJiYgbW9ub21lci5pbmNsdWRlcygnKScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG1vbm9tZXIucmVwbGFjZSgvWygpXS9nLCAnJykuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ub21lcnMucHVzaChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9ub21lci5pbmNsdWRlcygnWycpICYmIG1vbm9tZXIuaW5jbHVkZXMoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG1vbm9tZXIubWF0Y2goLyg/PD1cXFspLio/KD89XFxdKS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIG1vbm9tZXJzLnB1c2goZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtb25vbWVycy5wdXNoKG1vbm9tZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9ub21lcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gZmluZE1vbm9tZXJzKGhlbG1TdHJpbmcpIHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBjb25zdCB0eXBlcyA9IE9iamVjdC5rZXlzKG9yZy5oZWxtLndlYmVkaXRvci5tb25vbWVyVHlwZUxpc3QoKSk7XG4gICAgY29uc3QgbW9ub21lcnMgPSBbXTtcbiAgICBjb25zdCBtb25vbWVyX25hbWVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgbW9ub21lcnMucHVzaChuZXcgc2NpbC5oZWxtLk1vbm9tZXJzLmdldE1vbm9tZXJTZXQodHlwZXNbaV0pKTtcbiAgICAgICAgT2JqZWN0LmtleXMobW9ub21lcnNbaV0pLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBtb25vbWVyX25hbWVzLnB1c2gobW9ub21lcnNbaV1ba10uaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXRfc3RyaW5nID0gcGFyc2VIZWxtKGhlbG1TdHJpbmcpO1xuICAgIHJldHVybiBuZXcgU2V0KHNwbGl0X3N0cmluZy5maWx0ZXIodmFsID0+ICFtb25vbWVyX25hbWVzLmluY2x1ZGVzKHZhbCkpKTtcbn1cbmZ1bmN0aW9uIHNwbGl0KHMsIHNlcCkge1xuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgZnJhZyA9ICcnO1xuICAgIHZhciBwYXJlbnRoZXNlcyA9IDA7XG4gICAgdmFyIGJyYWNrZXQgPSAwO1xuICAgIHZhciBicmFjZXMgPSAwO1xuICAgIHZhciBxdW90ZSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gcy5zdWJzdHJpbmcoaSwgaSArIDEpO1xuICAgICAgICBpZiAoYyA9PSBzZXAgJiYgYnJhY2tldCA9PSAwICYmIHBhcmVudGhlc2VzID09IDAgJiYgYnJhY2VzID09IDAgJiYgcXVvdGUgPT0gMCkge1xuICAgICAgICAgICAgcmV0LnB1c2goZnJhZyk7XG4gICAgICAgICAgICBmcmFnID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcmFnICs9IGM7XG4gICAgICAgICAgICBpZiAocXVvdGUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xcXFwnICYmIGkgKyAxIDwgcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYzIgPSBzLnN1YnN0cmluZyhpLCBpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGZyYWcgKz0gYzI7XG4gICAgICAgICAgICAgICAgICAgIGMgKz0gYzI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT0gJ1xcXCInKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoaSA+IDAgJiYgcy5zdWJzdHJpbmcoaSAtIDEsIGkpID09ICdcXFxcJykpXG4gICAgICAgICAgICAgICAgICAgIHF1b3RlID0gcXVvdGUgPT0gMCA/IDEgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnWycpXG4gICAgICAgICAgICAgICAgKyticmFja2V0O1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXScpXG4gICAgICAgICAgICAgICAgLS1icmFja2V0O1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnKCcpXG4gICAgICAgICAgICAgICAgKytwYXJlbnRoZXNlcztcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyknKVxuICAgICAgICAgICAgICAgIC0tcGFyZW50aGVzZXM7XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICd7JylcbiAgICAgICAgICAgICAgICArK2JyYWNlcztcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ30nKVxuICAgICAgICAgICAgICAgIC0tYnJhY2VzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldC5wdXNoKGZyYWcpO1xuICAgIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBkZXRhY2hBbm5vdGF0aW9uKHMpIHtcbiAgICB2YXIgcmV0ID0gX2RldGFjaEFwcGVuZGl4KHMsICdcXFwiJyk7XG4gICAgaWYgKHJldC50YWcgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB2YXIgciA9IF9kZXRhY2hBcHBlbmRpeChzLCAnXFwnJyk7XG4gICAgcmV0dXJuIHsgdGFnOiByZXQudGFnLCByZXBlYXQ6IHIudGFnLCBzdHI6IHIuc3RyIH07XG59XG5mdW5jdGlvbiBfZGV0YWNoQXBwZW5kaXgocywgYykge1xuICAgIHZhciB0YWcgPSBudWxsO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGlmIChzY2lsLlV0aWxzLmVuZHN3aXRoKHMsIGMpKSB7XG4gICAgICAgIHZhciBwID0gcy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAocCA+IDApIHtcbiAgICAgICAgICAgIHAgPSBzLmxhc3RJbmRleE9mKGMsIHAgLSAxKTtcbiAgICAgICAgICAgIGlmIChwIDw9IDAgfHwgcy5zdWJzdHJpbmcocCAtIDEsIHApICE9ICdcXFxcJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA+IDAgJiYgcCA8IHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGFnID0gcy5zdWJzdHJpbmcocCArIDEsIHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhZyAhPSBudWxsKVxuICAgICAgICB0YWcgPSB0YWcucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJyArIGMsICdnJyksIGMpO1xuICAgIHJldHVybiB7IHRhZzogdW5lc2NhcGUodGFnKSwgc3RyOiBzIH07XG59XG5mdW5jdGlvbiB1bmVzY2FwZShzKSB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYgKHNjaWwuVXRpbHMuaXNOdWxsT3JFbXB0eShzKSlcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvW1xcXFxdLi9nLCBmdW5jdGlvbiAobSkge1xuICAgICAgICBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1xccic7XG4gICAgICAgICAgICBjYXNlICdcXFxcbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdcXG4nO1xuICAgICAgICAgICAgY2FzZSAnXFxcXHQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnXFx0JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG0uc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IERHOyIsIm1vZHVsZS5leHBvcnRzID0gZ3JvazsiLCJtb2R1bGUuZXhwb3J0cyA9IHVpOyIsIm1vZHVsZS5leHBvcnRzID0gd3U7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMgdG8gbWF0Y2ggZXh0ZXJuYWwgbW9kdWxlcyBpbiB3ZWJwYWNrIGNvbmZpZ3VyYXRpb24gKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBSR1JPVVBfQ0FQX0dST1VQX05BTUUsIFJHUk9VUF9MQUJFTCwgU01JTEVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSGVsbVdlYkVkaXRvciB9IGZyb20gJy4vaGVsbS13ZWItZWRpdG9yJztcbmltcG9ydCB7IEhlbG1DZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXInO1xuaW1wb3J0IHsgTm90YXRpb25Db252ZXJ0ZXIgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvdXRpbHMvbm90YXRpb24tY29udmVydGVyJztcbmltcG9ydCB7IGZpbmRNb25vbWVycyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZXJyb3JUb0NvbnNvbGUgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90by1jb25zb2xlJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5sZXQgbW9ub21lckxpYiA9IG51bGw7XG4vL3RhZ3M6IGluaXRcbmV4cG9ydCBmdW5jdGlvbiBpbml0SGVsbSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW25ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZG9qby5yZWFkeShmdW5jdGlvbiAoKSB7IHJlc29sdmUobnVsbCk7IH0pO1xuICAgICAgICAgICAgfSksIHlpZWxkIGdyb2suZnVuY3Rpb25zLmNhbGwoJ0JpbzpnZXRCaW9MaWInKV0pLnRoZW4oKFtfLCBsaWJdKSA9PiB7XG4gICAgICAgICAgICBtb25vbWVyTGliID0gbGliO1xuICAgICAgICAgICAgcmV3cml0ZUxpYnJhcmllcygpOyAvLyBpbml0SGVsbSgpXG4gICAgICAgICAgICBtb25vbWVyTGliLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXdyaXRlTGlicmFyaWVzKCk7IC8vIGluaXRIZWxtKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9uVHlwZUxpc3QgPSBtb25vbWVyTGliLmdldFR5cGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZ1N0ciA9ICdNb25vbWVyIGxpYiB1cGRhdGVkOjxiciAvPicgKyAobW9uVHlwZUxpc3QubGVuZ3RoID09IDAgPyAnZW1wdHknIDogbW9uVHlwZUxpc3QubWFwKChtb25UeXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bW9uVHlwZX0gJHttb25vbWVyTGliLmdldE1vbm9tZXJOYW1lc0J5VHlwZShtb25UeXBlKS5sZW5ndGh9YDtcbiAgICAgICAgICAgICAgICAgICAgfSkuam9pbignPGJyIC8+JykpO1xuICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLmluZm8obXNnU3RyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBlcnJvclRvQ29uc29sZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdIZWxtOiBpbml0SGVsbSBtb25vbWVyTGliLm9uQ2hhbmdlZCgpIGVycm9yOlxcbicgKyBlcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlcnI7IC8vIFByZXZlbnQgZGlzYWJsaW5nIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXdyaXRlTGlicmFyaWVzKCkge1xuICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb25vbWVycy5jbGVhcigpO1xuICAgIG1vbm9tZXJMaWIuZ2V0VHlwZXMoKS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1tcyA9IG1vbm9tZXJMaWIuZ2V0TW9ub21lck5hbWVzQnlUeXBlKHR5cGUpO1xuICAgICAgICBtbXMuZm9yRWFjaCgoc3ltYm9sKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNCcm9rZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSBtb25vbWVyTGliLmdldE1vbm9tZXIodHlwZSwgc3ltYm9sKTtcbiAgICAgICAgICAgIGNvbnN0IHdlYkVkaXRvck1vbm9tZXIgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHN5bWJvbCxcbiAgICAgICAgICAgICAgICBtOiBtb25vbWVyLm1vbGZpbGUsXG4gICAgICAgICAgICAgICAgbjogbW9ub21lci5uYW1lLFxuICAgICAgICAgICAgICAgIG5hOiBtb25vbWVyLm5hdHVyYWxBbmFsb2csXG4gICAgICAgICAgICAgICAgcnM6IG1vbm9tZXIucmdyb3Vwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdHlwZTogbW9ub21lci5wb2x5bWVyVHlwZSxcbiAgICAgICAgICAgICAgICBtdDogbW9ub21lci5tb25vbWVyVHlwZSxcbiAgICAgICAgICAgICAgICBhdDoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobW9ub21lci5yZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB3ZWJFZGl0b3JNb25vbWVyLnJzID0gbW9ub21lci5yZ3JvdXBzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBhdCA9IHt9O1xuICAgICAgICAgICAgICAgIG1vbm9tZXIucmdyb3Vwcy5mb3JFYWNoKGl0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXRbaXRbUkdST1VQX0xBQkVMXV0gPSBpdFtSR1JPVVBfQ0FQX0dST1VQX05BTUVdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdlYkVkaXRvck1vbm9tZXIuYXQgPSBhdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1vbm9tZXIuZGF0YVtTTUlMRVNdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3ZWJFZGl0b3JNb25vbWVyLnJzID0gT2JqZWN0LmtleXMoZ2V0UlMobW9ub21lci5kYXRhW1NNSUxFU10udG9TdHJpbmcoKSkpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3ZWJFZGl0b3JNb25vbWVyLmF0ID0gZ2V0UlMobW9ub21lci5kYXRhW1NNSUxFU10udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpc0Jyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzQnJva2VuKVxuICAgICAgICAgICAgICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb25vbWVycy5hZGRPbmVNb25vbWVyKHdlYkVkaXRvck1vbm9tZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBPYnNvbGV0ZVxuICAgIGxldCBncmlkID0gZ3Jvay5zaGVsbC50di5ncmlkO1xuICAgIGlmIChncmlkKVxuICAgICAgICBncmlkLmludmFsaWRhdGUoKTtcbn1cbi8vbmFtZTogaGVsbUNlbGxSZW5kZXJlclxuLy90YWdzOiBjZWxsUmVuZGVyZXJcbi8vbWV0YS5jZWxsVHlwZTogaGVsbVxuLy9tZXRhLmNvbHVtblRhZ3M6IHVuaXRzPWhlbG1cbi8vb3V0cHV0OiBncmlkX2NlbGxfcmVuZGVyZXIgcmVzdWx0XG5leHBvcnQgZnVuY3Rpb24gaGVsbUNlbGxSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gbmV3IEhlbG1DZWxsUmVuZGVyZXIoKTtcbn1cbi8vdGFnczogY2VsbEVkaXRvclxuLy9kZXNjcmlwdGlvbjogTWFjcm9tb2xlY3VsZSAgXG4vL2lucHV0OiBncmlkX2NlbGwgY2VsbFxuZXhwb3J0IGZ1bmN0aW9uIGVkaXRNb2xlY3VsZUNlbGwoY2VsbCkge1xuICAgIGNvbnN0IG1vbm9tZXJzID0gZmluZE1vbm9tZXJzKGNlbGwuY2VsbC52YWx1ZSk7XG4gICAgaWYgKGNlbGwuZ3JpZENvbHVtbi5jb2x1bW4udGFnc1tERy5UQUdTLlVOSVRTXSA9PT0gJ2hlbG0nKVxuICAgICAgICBpZiAobW9ub21lcnMuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgd2ViRWRpdG9yKGNlbGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoYE1vbm9tZXJzICR7QXJyYXkuZnJvbShtb25vbWVycykuam9pbignLCAnKX0gYXJlIGFic2VudCFgKTtcbn1cbi8vbmFtZTogT3BlbiBIZWxtIFdlYiBFZGl0b3Jcbi8vZGVzY3JpcHRpb246IEFkZHMgZWRpdG9yXG4vL21ldGEuYWN0aW9uOiBPcGVuIEhlbG0gV2ViIEVkaXRvclxuLy9pbnB1dDogc3RyaW5nIG1vbCB7IHNlbVR5cGU6IE1hY3JvbW9sZWN1bGUgfVxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5FZGl0b3IobW9sKSB7XG4gICAgbGV0IGRmID0gZ3Jvay5zaGVsbC50di5ncmlkLmRhdGFGcmFtZTtcbiAgICBsZXQgY29udmVydGVyID0gbmV3IE5vdGF0aW9uQ29udmVydGVyKGRmLmNvbHVtbnMuYnlTZW1UeXBlKCdNYWNyb21vbGVjdWxlJykpO1xuICAgIGNvbnN0IHJlc1N0ciA9IGNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVG9IZWxtKG1vbCwgJy8nKTtcbiAgICBjb25zdCBtb25vbWVycyA9IGZpbmRNb25vbWVycyhyZXNTdHIpO1xuICAgIGlmIChtb25vbWVycy5zaXplID09IDApXG4gICAgICAgIHdlYkVkaXRvcih1bmRlZmluZWQsIHJlc1N0cik7XG4gICAgZWxzZVxuICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoYE1vbm9tZXJzICR7QXJyYXkuZnJvbShtb25vbWVycykuam9pbignLCAnKX0gYXJlIGFic2VudCFgKTtcbn1cbi8vbmFtZTogUHJvcGVydGllc1xuLy90YWdzOiBwYW5lbCwgd2lkZ2V0c1xuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogd2lkZ2V0IHJlc3VsdFxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnRpZXNQYW5lbChoZWxtU3RyaW5nKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGdyaWQgPSBncm9rLnNoZWxsLnR2LmdyaWQ7XG4gICAgICAgIGxldCBwYXJlbnQgPSBncmlkLnJvb3QucGFyZW50RWxlbWVudDtcbiAgICAgICAgY29uc3QgaG9zdCA9IHVpLmRpdihbXSk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChob3N0KTtcbiAgICAgICAgbGV0IGVkaXRvciA9IG5ldyBKU0RyYXcyLkVkaXRvcihob3N0LCB7IHZpZXdvbmx5OiB0cnVlIH0pO1xuICAgICAgICBob3N0LnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgICAgIGhvc3Quc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgIGVkaXRvci5zZXRIZWxtKGhlbG1TdHJpbmcpO1xuICAgICAgICBsZXQgZm9ybXVsYSA9IGVkaXRvci5nZXRGb3JtdWxhKHRydWUpO1xuICAgICAgICBsZXQgbW9sV2VpZ2h0ID0gTWF0aC5yb3VuZChlZGl0b3IuZ2V0TW9sV2VpZ2h0KCkgKiAxMDApIC8gMTAwO1xuICAgICAgICBsZXQgY29lZiA9IE1hdGgucm91bmQoZWRpdG9yLmdldEV4dGluY3Rpb25Db2VmZmljaWVudCh0cnVlKSAqIDEwMCkgLyAxMDA7XG4gICAgICAgIHBhcmVudC5sYXN0Q2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybiBuZXcgREcuV2lkZ2V0KHVpLnRhYmxlRnJvbU1hcCh7XG4gICAgICAgICAgICAnZm9ybXVsYSc6IGZvcm11bGEucmVwbGFjZSgvPHN1Yj4vZywgJycpLnJlcGxhY2UoLzxcXC9zdWI+L2csICcnKSxcbiAgICAgICAgICAgICdtb2xlY3VsYXIgd2VpZ2h0JzogbW9sV2VpZ2h0LFxuICAgICAgICAgICAgJ2V4dGluY3Rpb24gY29lZmZpY2llbnQnOiBjb2VmLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB3ZWJFZGl0b3IoY2VsbCwgdmFsdWUpIHtcbiAgICBsZXQgdmlldyA9IHVpLmRpdigpO1xuICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb2xWaWV3ZXIubW9sc2NhbGUgPSAwLjg7XG4gICAgbGV0IGFwcCA9IG5ldyBzY2lsLmhlbG0uQXBwKHZpZXcsIHtcbiAgICAgICAgc2hvd2Fib3V0OiBmYWxzZSxcbiAgICAgICAgbWV4Zm9udHNpemU6ICc5MCUnLFxuICAgICAgICBtZXhybmFwaW5vbnRhYjogdHJ1ZSxcbiAgICAgICAgdG9wbWFyZ2luOiAyMCxcbiAgICAgICAgbWV4bW9ub21lcnN0YWI6IHRydWUsXG4gICAgICAgIHNlcXVlbmNldmlld29ubHk6IGZhbHNlLFxuICAgICAgICBtZXhmYXZvcml0ZWZpcnN0OiB0cnVlLFxuICAgICAgICBtZXhmaWx0ZXI6IHRydWVcbiAgICB9KTtcbiAgICB2YXIgc2l6ZXMgPSBhcHAuY2FsY3VsYXRlU2l6ZXMoKTtcbiAgICBhcHAuY2FudmFzLnJlc2l6ZShzaXplcy5yaWdodHdpZHRoIC0gMTAwLCBzaXplcy50b3BoZWlnaHQgLSAyMTApO1xuICAgIHZhciBzID0geyB3aWR0aDogc2l6ZXMucmlnaHR3aWR0aCAtIDEwMCArICdweCcsIGhlaWdodDogc2l6ZXMuYm90dG9taGVpZ2h0ICsgJ3B4JyB9O1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIHNjaWwuYXBwbHkoYXBwLnNlcXVlbmNlLnN0eWxlLCBzKTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBzY2lsLmFwcGx5KGFwcC5ub3RhdGlvbi5zdHlsZSwgcyk7XG4gICAgcyA9IHsgd2lkdGg6IHNpemVzLnJpZ2h0d2lkdGggKyAncHgnLCBoZWlnaHQ6IChzaXplcy5ib3R0b21oZWlnaHQgKyBhcHAudG9vbGJhcmhlaWdodCkgKyAncHgnIH07XG4gICAgLy9AdHMtaWdub3JlXG4gICAgc2NpbC5hcHBseShhcHAucHJvcGVydGllcy5wYXJlbnQuc3R5bGUsIHMpO1xuICAgIGFwcC5zdHJ1Y3R1cmV2aWV3LnJlc2l6ZShzaXplcy5yaWdodHdpZHRoLCBzaXplcy5ib3R0b21oZWlnaHQgKyBhcHAudG9vbGJhcmhlaWdodCk7XG4gICAgYXBwLm1leC5yZXNpemUoc2l6ZXMudG9waGVpZ2h0IC0gODApO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNlbGwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBhcHAuY2FudmFzLmhlbG0uc2V0U2VxdWVuY2UoY2VsbC5jZWxsLnZhbHVlLCAnSEVMTScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXBwLmNhbnZhcy5oZWxtLnNldFNlcXVlbmNlKHZhbHVlLCAnSEVMTScpO1xuICAgICAgICB9XG4gICAgfSwgMjAwKTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICB1aS5kaWFsb2coeyBzaG93SGVhZGVyOiBmYWxzZSwgc2hvd0Zvb3RlcjogdHJ1ZSB9KVxuICAgICAgICAuYWRkKHZpZXcpXG4gICAgICAgIC5vbk9LKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjZWxsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY2VsbC5jZWxsLnZhbHVlID0gYXBwLmNhbnZhcy5nZXRIZWxtKHRydWUpLnJlcGxhY2UoLzxcXC9zcGFuPi9nLCAnJykucmVwbGFjZSgvPHNwYW4gc3R5bGU9J2JhY2tncm91bmQ6I2JiZjsnPi9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9KS5zaG93KHsgbW9kYWw6IHRydWUsIGZ1bGxTY3JlZW46IHRydWUgfSk7XG59XG5mdW5jdGlvbiBhY2Nlc3NTZXJ2ZXIodXJsLCBrZXkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsLCBwYXJhbXMpO1xuICAgICAgICBjb25zdCBqc29uID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICByZXR1cm4ganNvbltrZXldO1xuICAgIH0pO1xufVxuLy9uYW1lOiBoZWxtVG9GYXN0YVxuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHJlc1xuZXhwb3J0IGZ1bmN0aW9uIGhlbG1Ub0Zhc3RhKGhlbG1TdHJpbmcpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cDovL2xvY2FsaG9zdDo4MDgxL1dlYlNlcnZpY2Uvc2VydmljZS9GYXN0YS9Qcm9kdWNlLyR7aGVsbVN0cmluZ31gO1xuICAgICAgICByZXR1cm4geWllbGQgYWNjZXNzU2VydmVyKHVybCwgJ0Zhc3RhRmlsZScpO1xuICAgIH0pO1xufVxuLy9uYW1lOiBoZWxtVG9STkFcbi8vZGVzY3JpcHRpb246IGNvbnZlcnRzIHRvIHJuYSBhbmFsb2d1ZSBzZXF1ZW5jZVxuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHJlc1xuZXhwb3J0IGZ1bmN0aW9uIGhlbG1Ub1JOQShoZWxtU3RyaW5nKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9XZWJTZXJ2aWNlL3NlcnZpY2UvRmFzdGEvQ29udmVydC9STkEvJHtoZWxtU3RyaW5nfWA7XG4gICAgICAgIHJldHVybiB5aWVsZCBhY2Nlc3NTZXJ2ZXIodXJsLCAnU2VxdWVuY2UnKTtcbiAgICB9KTtcbn1cbi8vbmFtZTogaGVsbVRvUGVwdGlkZVxuLy9kZXNjcmlwdGlvbjogY29udmVydHMgdG8gcGVwdGlkZSBhbmFsb2d1ZSBzZXF1ZW5jZVxuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHJlc1xuZXhwb3J0IGZ1bmN0aW9uIGhlbG1Ub1BlcHRpZGUoaGVsbVN0cmluZykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vbG9jYWxob3N0OjgwODEvV2ViU2VydmljZS9zZXJ2aWNlL0Zhc3RhL0NvbnZlcnQvUEVQVElERS8ke2hlbG1TdHJpbmd9YDtcbiAgICAgICAgcmV0dXJuIHlpZWxkIGFjY2Vzc1NlcnZlcih1cmwsICdTZXF1ZW5jZScpO1xuICAgIH0pO1xufVxuLy9uYW1lOiBoZWxtVG9TbWlsZXNcbi8vZGVzY3JpcHRpb246IGNvbnZlcnRzIHRvIHNtaWxlc1xuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHNtaWxlcyB7c2VtVHlwZTogTW9sZWN1bGV9XG5leHBvcnQgZnVuY3Rpb24gaGVsbVRvU21pbGVzKGhlbG1TdHJpbmcpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cDovL2xvY2FsaG9zdDo4MDgxL1dlYlNlcnZpY2Uvc2VydmljZS9TTUlMRVMvJHtoZWxtU3RyaW5nfWA7XG4gICAgICAgIHJldHVybiB5aWVsZCBhY2Nlc3NTZXJ2ZXIodXJsLCAnU01JTEVTJyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRSUyhzbWlsZXMpIHtcbiAgICBjb25zdCBuZXdTID0gc21pbGVzLm1hdGNoKC8oPzw9XFxbKVteXFxdW10qKD89XSkvZ20pO1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGxldCBlbCA9ICcnO1xuICAgIGxldCBkaWdpdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG5ld1NbaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKC9cXGQvLnRlc3QobmV3U1tpXSkpIHtcbiAgICAgICAgICAgICAgICBkaWdpdCA9IG5ld1NbaV1bbmV3U1tpXS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBuZXdTW2ldID0gbmV3U1tpXS5yZXBsYWNlKC9bMC05XS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdTW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTW2ldW2pdICE9ICc6JylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsICs9IG5ld1NbaV1bal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc1snUicgKyBkaWdpdF0gPSBlbDtcbiAgICAgICAgICAgICAgICBlbCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vL25hbWU6IGdldE1vbGZpbGVzXG4vL2lucHV0OiBjb2x1bW4gY29sIHtzZW1UeXBlOiBNYWNyb21vbGVjdWxlfVxuLy9vdXRwdXQ6IGNvbHVtbiByZXMgXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9sZmlsZXMoY29sKSB7XG4gICAgbGV0IGdyaWQgPSBncm9rLnNoZWxsLnR2LmdyaWQ7XG4gICAgbGV0IHBhcmVudCA9IGdyaWQucm9vdC5wYXJlbnRFbGVtZW50O1xuICAgIGxldCByZXMgPSBERy5Db2x1bW4uc3RyaW5nKCdtb2xzJywgY29sLmxlbmd0aCk7XG4gICAgY29uc3QgaG9zdCA9IHVpLmRpdihbXSk7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGhvc3QpO1xuICAgIGxldCBlZGl0b3IgPSBuZXcgSlNEcmF3Mi5FZGl0b3IoaG9zdCwgeyB2aWV3b25seTogdHJ1ZSB9KTtcbiAgICBob3N0LnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgaG9zdC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICByZXMuaW5pdCgoaSkgPT4ge1xuICAgICAgICBlZGl0b3Iuc2V0SGVsbShjb2wuZ2V0KGkpKTtcbiAgICAgICAgbGV0IG1vbCA9IGVkaXRvci5nZXRNb2xmaWxlKCk7XG4gICAgICAgIHJldHVybiBtb2w7XG4gICAgfSk7XG4gICAgcGFyZW50Lmxhc3RDaGlsZC5yZW1vdmUoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuLy9uYW1lOiBoZWxtV2ViRWRpdG9yXG4vL291dHB1dDogb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gaGVsbVdlYkVkaXRvcigpIHtcbiAgICByZXR1cm4gbmV3IEhlbG1XZWJFZGl0b3IoKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
1
|
+
var helm;(()=>{"use strict";var t={n:e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{_package:()=>_,editMoleculeCell:()=>z,getMolfiles:()=>q,helmCellRenderer:()=>k,helmWebEditor:()=>Y,initHelm:()=>I,openEditor:()=>j,propertiesPanel:()=>B});const r=grok,n=ui,o=DG;class i{constructor(){this.w=200,this.h=100,this.host=n.div([],{style:{width:`${this.w}px`,height:`${this.h}px`}}),this.editor=new JSDraw2.Editor(this.host,{width:this.w,height:this.h,viewonly:!0})}resizeEditor(t,e){this.editor.setSize(t,e)}createWebEditor(t){const e=n.div();org.helm.webeditor.MolViewer.molscale=.8;const r=new scil.helm.App(e,{showabout:!1,mexfontsize:"90%",mexrnapinontab:!0,topmargin:20,mexmonomerstab:!0,sequenceviewonly:!1,mexfavoritefirst:!0,mexfilter:!0}),o=r.calculateSizes();r.canvas.resize(o.rightwidth-100,o.topheight-210);let i={width:o.rightwidth-100+"px",height:o.bottomheight+"px"};return scil.apply(r.sequence.style,i),scil.apply(r.notation.style,i),i={width:o.rightwidth+"px",height:o.bottomheight+r.toolbarheight+"px"},scil.apply(r.properties.parent.style,i),r.structureview.resize(o.rightwidth,o.bottomheight+r.toolbarheight),r.mex.resize(o.topheight-80),setTimeout((function(){r.canvas.helm.setSequence(t,"HELM")}),200),{editorDiv:e,webEditor:r}}}function s(t,e){let r=[];for(let n=0;n<t.length;++n){let o=e.indexOf(t[n]),i=e.slice(0,o);r.push(i),r.push(t[n]),e=e.substring(o+t[n].length)}return r.push(e),r}function l(t){t=h(t,"$")[0];var e=[];if(!scil.Utils.isNullOrEmpty(t))for(var r=h(t,"|"),n=0;n<r.length;++n){var o=(t=u(r[n]).str).indexOf("{");o=(t=t.substring(o+1)).indexOf("}");var i=h(t=t.substring(0,o),".");for(var s of i)if(s.includes("(")&&s.includes(")")){var l=s.replace(/[()]/g,"").split("");for(var a of l)e.push(a)}else if(s.includes("[")&&s.includes("]")){var c=s.match(/(?<=\[).*?(?=\])/g,"");e.push(c[0])}else e.push(s)}return e}function a(t){const e=Object.keys(org.helm.webeditor.monomerTypeList()),r=[],n=[];for(var o=0;o<e.length;o++)r.push(new scil.helm.Monomers.getMonomerSet(e[o])),Object.keys(r[o]).forEach((t=>{n.push(r[o][t].id)}));const i=l(t);return new Set(i.filter((t=>!n.includes(t))))}function h(t,e){for(var r=[],n="",o=0,i=0,s=0,l=0,a=0;a<t.length;++a){var h=t.substring(a,a+1);if(h==e&&0==i&&0==o&&0==s&&0==l)r.push(n),n="";else{if(n+=h,l>0&&"\\"==h&&a+1<t.length){++a;var u=t.substring(a,a+1);n+=u,h+=u}'"'==h?a>0&&"\\"==t.substring(a-1,a)||(l=0==l?1:0):"["==h?++i:"]"==h?--i:"("==h?++o:")"==h?--o:"{"==h?++s:"}"==h&&--s}}return r.push(n),r}function u(t){var e=c(t,'"');if(null!=e.tag)return e;var r=c(t,"'");return{tag:e.tag,repeat:r.tag,str:r.str}}function c(t,e){var r=null;if(scil.Utils.endswith(t,e)){for(var n=t.length-1;n>0&&!((n=t.lastIndexOf(e,n-1))<=0||"\\"!=t.substring(n-1,n)););n>0&&n<t.length-1&&(r=t.substring(n+1,t.length-1),t=t.substring(0,n))}return null!=r&&(r=r.replace(new RegExp("\\"+e,"g"),e)),{tag:g(r),str:t}}function g(t){return scil.Utils.isNullOrEmpty(t)?t:t.replace(/[\\]./g,(function(t){switch(t){case"\\r":return"\r";case"\\n":return"\n";case"\\t":return"\t";default:return t.substring(1)}}))}const m=wu;var p=t.n(m);class d extends Float32Array{}function C(t){let e=0;for(let r=0;r<t.length;r++)e+=t[r]*t[r];return Math.sqrt(e)}class f{static makePalette(t,e=!1,r=f){const n={};return t.forEach((t=>{const r=t[0],o=t[1];r.forEach(((t,r)=>{n[t]=this.colourPalette[o][e?0:r]}))})),new r(n)}constructor(t){this._palette=t}get(t){return this._palette[t]}}f.undefinedColor="rgb(100,100,100)",f.colourPalette={orange:["rgb(255,187,120)","rgb(245,167,100)","rgb(235,137,70)","rgb(205, 111, 71)"],all_green:["rgb(44,160,44)","rgb(74,160,74)","rgb(23,103,57)","rgb(30,110,96)","rgb(60,131,95)","rgb(24,110,79)","rgb(152,223,138)","rgb(182, 223, 138)","rgb(152, 193, 138)"],all_blue:["rgb(31,119,180)","rgb(23,190,207)","rgb(122, 102, 189)","rgb(158,218,229)","rgb(141, 124, 217)","rgb(31, 120, 150)"],magenta:["rgb(162,106,192)","rgb(197,165,224)","rgb(208,113,218)"],red:["rgb(214,39,40)","rgb(255,152,150)"],st_blue:["rgb(23,190,207)","rgb(158,218,229)","rgb(31,119,180)"],dark_blue:["rgb(31,119,180)","rgb(31, 120, 150)"],light_blue:["rgb(23,190,207)","rgb(158,218,229)","rgb(108, 218, 229)","rgb(23,190,227)"],lilac_blue:["rgb(124,102,211)","rgb(149,134,217)","rgb(97, 81, 150)"],dark_green:["rgb(23,103,57)","rgb(30,110,96)","rgb(60,131,95)","rgb(24,110,79)"],green:["rgb(44,160,44)","rgb(74,160,74)"],light_green:["rgb(152,223,138)","rgb(182, 223, 138)","rgb(152, 193, 138)"],st_green:["rgb(44,160,44)","rgb(152,223,138)","rgb(39, 174, 96)","rgb(74,160,74)"],pink:["rgb(247,182,210)"],brown:["rgb(140,86,75)","rgb(102, 62, 54)"],gray:["rgb(127,127,127)","rgb(199,199,199)","rgb(196,156,148)","rgb(222, 222, 180)"],yellow:["rgb(188,189,34)"],white:["rgb(230,230,230)"]};class b extends f{static get Lesk(){return void 0===this.lesk&&(this.lesk=this.makePalette([[["G","A","S","T"],"orange"],[["C","V","I","L","P","F","Y","M","W"],"all_green"],[["N","Q","H"],"magenta"],[["D","E"],"red"],[["K","R"],"all_blue"]],!1,b)),this.lesk}static get GrokGroups(){return void 0===this.grokGroups&&(this.grokGroups=this.makePalette([[["C","U"],"yellow"],[["G","P"],"red"],[["A","V","I","L","M","F","Y","W"],"all_green"],[["R","H","K"],"light_blue"],[["D","E"],"dark_blue"],[["S","T","N","Q"],"orange"]],!1,b)),this.grokGroups}static get RasMol(){return void 0===this.rasMol&&(this.rasMol=new b({D:"#E60A0A",E:"#E60A0A",C:"#E6E600",M:"#E6E600",K:"#145AFF",R:"#145AFF",S:"#FA9600",T:"#FA9600",F:"#3232AA",Y:"#3232AA",N:"#00DCDC",Q:"#00DCDC",G:"#EBEBEB",L:"#0F820F",V:"#0F820F",I:"#0F820F",A:"#C8C8C8",W:"#B45AB4",H:"#8282D2",P:"#DC9682",others:"#BEA06E"})),this.rasMol}get(t){const e=t in b.aaSynonyms?b.aaSynonyms[t]:t;return super.get(e)}}b.aaSynonyms={MeNle:"L",MeA:"A",MeG:"G",MeF:"F"};class w{static getPalette(t="grok"){switch(t){case"grok":return b.GrokGroups;case"lesk":return b.Lesk;default:throw new Error(`ChemPalette: scheme \`${t}\` does not exist`)}}static getInnerOuter(t){let e=0,r="",n="";for(const o of t)"("==o?e++:")"==o?e--:e?r+=o:n+=o;return isNaN(parseInt(r))?[n,r]:[n,""]}static getColorAAPivot(t="",e="grok"){var r,n,o;const i=this.getPalette(e);let[s,l]=this.getInnerOuter(t);if(s=s.length>6?`${s.slice(0,3)}...`:s,l=l.length>6?`${l.slice(0,3)}...`:l,1==t.length||"("==t[1]){const e=null===(r=t[0])||void 0===r?void 0:r.toUpperCase();return e in i?[i.get(e),e,l,1]:[this.undefinedColor,s,l,1]}if("d"==t[0]&&t[1]in i&&(2==t.length||"("==t[2])){const e=null===(n=t[1])||void 0===n?void 0:n.toUpperCase();return e in i?[i.get(e),e,l,2]:[this.undefinedColor,s,l,2]}if(t.substring(0,3)in this.AAFullNames&&(3==t.length||"("==t[3])){const e=this.AAFullNames[t.substring(0,3)];return e in i?[i.get(e),e,l,3]:[this.undefinedColor,s,l,3]}if((null===(o=t[0])||void 0===o?void 0:o.toLowerCase())==t[0]&&t.substring(1,3)in this.AAFullNames&&(4==t.length||"("==t[4])){const e=this.AAFullNames[t.substring(1,3)];return e in i?[i.get(e),e,l,4]:[this.undefinedColor,s,l,4]}return[this.undefinedColor,s,l,0]}}w.SemType="Aminoacids",w.SemTypeMultipleAlignment="AminoacidsMultipleAlignment",w.undefinedColor="rgb(100,100,100)",w.Names={G:"Glycine",L:"Leucine",Y:"Tyrosine",S:"Serine",E:"Glutamic acid",Q:"Glutamine",D:"Aspartic acid",N:"Asparagine",F:"Phenylalanine",A:"Alanine",K:"Lysine",R:"Arginine",H:"Histidine",C:"Cysteine",V:"Valine",P:"Proline",W:"Tryptophan",I:"Isoleucine",M:"Methionine",T:"Threonine"},w.AASmiles={G:"NCC(=O)O",L:"N[C@H](CC(C)C)C(=O)O",Y:"NC(CC1=CC=C(O)C=C1)C(=O)O",S:"NC(CO)C(=O)O",E:"N[C@@H](CCC(O)=O)C(=O)O",Q:"N[C@@H](CCC(N)=O)C(=O)O",D:"N[C@@H](CC(O)=O)C(=O)O",N:"N[C@@H](CC(N)=O)C(=O)O",F:"NC(CC1=CC=CC=C1)C(=O)O",A:"N[C@H](C)C(=O)O",K:"NC(CCCCN)C(=O)O",R:"N[C@H](CCCNC(=N)C)C(=O)O",H:"NC(CC1=CN=C[N]1)C(=O)O",C:"N[C@@H](CS)C(=O)O",V:"NC(C(C)C)C(=O)O",P:"N(CCC1)C1C(=O)O",W:"N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O",I:"N[C@H]([C@H](C)CC)C(=O)O",M:"NC(CCSC)C(=O)O",T:"NC(C(O)C)C(=O)O"},w.AASmilesTruncated={G:"*C*",L:"CC(C)C[C@H](*)*",Y:"C1=CC(=CC=C1CC(*)*)O",S:"OCC(*)C*",E:"*[C@@H](CCC(O)=O)*",Q:"*N[C@@H](CCC(N)=O)*",D:"*[C@@H](CC(O)=O)*",N:"*[C@@H](CC(N)=O)*",F:"C1=CC=C(C=C1)CC(*)*",A:"C[C@H](*)*",K:"C(CCN)CC(*)*",R:"*[C@H](CCCNC(=N)C)*",H:"C1=C(NC=N1)CC(*)*",C:"C([C@@H](*)*)S",V:"CC(C)C(*)*",P:"C1CCN(*)C1*",W:"*[C@@H](Cc1c2ccccc2n([H])c1)*",I:"CC[C@H](C)[C@H](*)*",M:"CSCCC(*)*",T:"CC(O)C(*)*"},w.AAFullNames={Ala:"A",Arg:"R",Asn:"N",Asp:"D",Cys:"C",Gln:"Q",Glu:"E",Gly:"G",His:"H",Ile:"I",Leu:"L",Lys:"K",Met:"M",Phe:"F",Pro:"P",Ser:"S",Thr:"T",Trp:"W",Tyr:"Y",Val:"V"};class v{}v.SemType="Nucleotides",v.SemTypeMultipleAlignment="NucleotidesMultipleAlignment",v.Names={A:"Adenine",C:"Cytosine",G:"Guanine",T:"Thymine",U:"Uracil"};class S extends class{}{static buildPalette(){return[].concat(...Object.values(f.colourPalette))}get(t){const e=class{static hashCode(t){let e=0;if(0===t.length)return e;for(let r=0;r<t.length;r++)e=(e<<5)-e+t.charCodeAt(r),e|=0;return e}}.hashCode(t)%S.palette.length;return function(t){if(null==t)return"rgb(100,100,100)";const e=o.Color.fromHtml(t),r=o.Color.g(e),n=o.Color.r(e),i=o.Color.b(e),s=Math.sqrt(Math.pow(0-n,2)+Math.pow(0-r,2)+Math.pow(0-i,2));return s>210?`rgb(${n/s*210},${r/s*210},${i/s*210})`:o.Color.toRgb(e)}(S.palette[e])}}S.palette=S.buildPalette();class T{static setUnitsToFastaColumn(t){if(t.semType!==o.SEMTYPE.MACROMOLECULE)throw new Error("Fasta column must be MACROMOLECULE");const e=A(t,5,E),r=e.sameLength?"SEQ.MSA":"SEQ",n=function(t){const e=[["PT",T.PeptideFastaAlphabet],["DNA",T.DnaFastaAlphabet],["RNA",T.RnaFastaAlphabet]],r=e.map((e=>function(t,e,r="-"){const n=new Set([...new Set(Object.keys(t)),...e]);n.delete(r);const o=[],i=[];for(const r of n)o.push(r in t?t[r]:0),i.push(e.has(r)?1:0);const s=new d(o),l=new d(i);return function(t,e){if(t.length!=e.length)throw new Error("The dimensionality of the vectors must match");let r=0;for(let n=0;n<t.length;n++)r+=t[n]*e[n];return r}(s,l)/(C(s)*C(l))}(t.freq,e[1]))),n=Math.max(...r);return n>.65?e[r.indexOf(n)][0]:"UN"}(e);t.setTag(o.TAGS.UNITS,"fasta"),t.setTag("aligned",r),t.setTag("alphabet",n)}get units(){return this._units}get column(){return this._column}get notation(){return this._notation}get defaultGapSymbol(){return this._defaultGapSymbol}get separator(){var t;const e=null!==(t=this.column.getTag("separator"))&&void 0!==t?t:void 0;if("separator"===this.notation&&void 0===e)throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);return e}get aligned(){const t=this.column.getTag("aligned");if(!t&&(this.isFasta()||this.isSeparator()))throw new Error("Tag aligned not set");return t}get alphabet(){const t=this.column.getTag("alphabet");if(!t&&(this.isFasta()||this.isSeparator()))throw new Error("Tag alphabet not set");return t}getAlphabetSize(){if("helm"==this.notation||"UN"==this.alphabet){const t=this.column.getTag(".alphabetSize");let e;if(t)e=parseInt(t);else{const t=H(this.column),r=A(this.column,1,t);e=Object.keys(r.freq).length}return e}switch(this.alphabet){case"PT":return 20;case"DNA":case"RNA":return 4;case"NT":return console.warn("Unexpected alphabet 'NT'."),4;default:throw new Error(`Unexpected alphabet '${this.alphabet}'.`)}}getAlphabetIsMultichar(){return("helm"==this.notation||"UN"==this.alphabet)&&"true"==this.column.getTag(".alphabetIsMultichar")}isFasta(){return"fasta"===this.notation}isSeparator(){return"separator"===this.notation}isHelm(){return"helm"===this.notation}isRna(){return"RNA"===this.alphabet}isDna(){return"DNA"===this.alphabet}isPeptide(){return"PT"===this.alphabet}isMsa(){return!!this.aligned&&this.aligned.toUpperCase().includes("MSA")}getNotation(){if(this.units.toLowerCase().startsWith("fasta"))return"fasta";if(this.units.toLowerCase().startsWith("separator"))return"separator";if(this.units.toLowerCase().startsWith("helm"))return"helm";throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`)}getNewColumn(t){const e=this.column,r=e.length,n=t.toLowerCase()+"("+e.name+")",i=e.dataFrame.columns.getUnusedName(n),s=o.Column.fromList("string",i,new Array(r).fill(""));s.semType=o.SEMTYPE.MACROMOLECULE,s.setTag(o.TAGS.UNITS,t),s.setTag(o.TAGS.CELL_RENDERER,"Macromolecule");const l=e.getTag("aligned");l&&s.setTag("aligned",l);const a=e.getTag("alphabet");a&&s.setTag("alphabet",a);let h=e.getTag(".alphabetSize");h&&s.setTag(".alphabetSize",h);const u=e.getTag(".alphabetIsMultichar");return void 0!==u&&s.setTag(".alphabetIsMultichar",u),"helm"==t&&(h=this.getAlphabetSize().toString(),s.setTag(".alphabetSize",h)),s}static getNewColumn(t){const e=new T(t),r=e.notation;return e.getNewColumn(r)}static unitsStringIsValid(t){return t=t.toLowerCase(),["fasta","separator","helm"].some((e=>t.startsWith(e.toLowerCase())))}static getNewColumnFromParams(t,e,r){if(!T.unitsStringIsValid(r))throw new Error("Invalid format of 'units' parameter");const n=o.Column.fromList("string",e,new Array(t).fill(""));return n.semType=o.SEMTYPE.MACROMOLECULE,n.setTag(o.TAGS.UNITS,r),n}constructor(t){this._column=t;const e=this._column.tags[o.TAGS.UNITS];if(null===e)throw new Error("Units are not specified in column");if(this._units=e,this._notation=this.getNotation(),this._defaultGapSymbol=this.isFasta()?T._defaultGapSymbolsDict.FASTA:this.isHelm()?T._defaultGapSymbolsDict.HELM:T._defaultGapSymbolsDict.SEPARATOR,!this.column.tags.has("aligned")&&(this.isFasta()||this.isSeparator()))throw new Error(`For column '${this.column.name}' of notation '${this.notation}' tag 'aligned' is mandatory.`);if(!this.column.tags.has(".alphabetIsMultichar")){if(this.isHelm())throw new Error(`For column '${this.column.name}' of notation '${this.notation}' tag '.alphabetIsMultichar' is mandatory.`);if(["UN"].includes(this.alphabet))throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' tag '.alphabetIsMultichar' is mandatory.`)}}}function A(t,e,r){const n={};let o=!0,i=null;for(const s of t.categories){const t=r(s);if(null==i?i=t.length:t.length!==i&&(o=!1),t.length>=e)for(const e of t)e in n||(n[e]=0),n[e]+=1}return{freq:n,sameLength:o}}T._defaultGapSymbolsDict={HELM:"*",SEPARATOR:"",FASTA:"-"},T.PeptideFastaAlphabet=new Set(["G","L","Y","S","E","Q","D","N","F","A","K","R","H","C","V","P","W","I","M","T"]),T.DnaFastaAlphabet=new Set(["A","C","G","T"]),T.RnaFastaAlphabet=new Set(["A","C","G","U"]);const y=/\[(\w+)\]|(\w)|(-)/g;function E(t){return p()(t.toString().matchAll(y)).map((t=>{let e;const r=t[0];return e=r.length>1?t[1]:r,e})).toArray()}const N=/(PEPTIDE1|DNA1|RNA1)\{([^}]+)}/g,M=/\[([^\[\]]+)]/g;function O(t){N.lastIndex=0;const e=N.exec(t.toString()),r=e?e[2]:null;return(r?r.split("."):[]).map((t=>{M.lastIndex=0;const e=M.exec(t);return e&&e.length>=2?e[1]:t}))}function H(t){if(t.semType!==o.SEMTYPE.MACROMOLECULE)throw new Error(`Get splitter for semType "${o.SEMTYPE.MACROMOLECULE}" only.`);return function(t,e,r){if(t.toLowerCase().startsWith("fasta"))return E;if(t.toLowerCase().startsWith("separator"))return function(t,e){return e=>e.split(t,undefined)}(e);if(t.toLowerCase().startsWith("helm"))return O;throw new Error(`Unexpected units ${t} .`)}(t.getTag(o.TAGS.UNITS),t.getTag("separator"))}const x=/(\w+)/g;var F;!function(t){t.MSA="MSA",t.classic="classic"}(F||(F={}));const L=(t,e,r,n,o,i,s="rgb(100,100,100)",l=0,a=!1,h=1,u="",c=!1,g=F.classic,m={},p=0,d=null,C=[],f=null)=>{var b,w,v;o.textAlign="start";let S=i.substring(0),T=c?"":u;g===F.MSA&&(T="");let A=!0,y=!0,E="difference";null!=d&&null!=d.cell.column&&(A=null===(b=d.cell.column.temp["color-code"])||void 0===b||b,y=null===(w=d.cell.column.temp["compare-with-current"])||void 0===w||w,E=null!==(v=d.cell.column.temp["highlight-difference"])&&void 0!==v?v:"difference");const N=C[p];y&&C.length>0&&"difference"===E&&(h=S==N?.3:h),y&&C.length>0&&"equal"===E&&(h=S!=N?.3:h),null!=f&&(S=function(t,e){var r,n;const o=t.match(x),i=t.length>e||(null!==(r=null==o?void 0:o.length)&&void 0!==r?r:0)>1,s=null!==(n=null==o?void 0:o[0])&&void 0!==n?n:" ";return i?s.substring(0,e)+"…":s}(S,f));let M=o.measureText(S+T),O=o.measureText(S).width,H=o.measureText(S).width;const L=n/2-(M.fontBoundingBoxAscent+M.fontBoundingBoxDescent)/2+1;function P(r,n){const i=A?s:"rgb(0,0,0)";o.fillStyle=i,o.globalAlpha=h,g===F.classic&&(o.fillText(S,t+r,e+L),o.fillStyle="#808080",o.fillText(T,t+n,e+L)),g===F.MSA&&(o.fillStyle=i,o.fillText(S,t+r+(m[p]-H)/2,e+L))}if(M=M.width,g===F.MSA&&(O=m[p],M=m[p]),a||M>r)return P(5,5+O),t+O+o.measureText(T).width;{const e=(r-M)/2;return P(e,e+O),t+e+O}};function P(t){var e;return"string"==typeof t||t instanceof String?t:"$thrownJsError"in t?P(t.$thrownJsError):t instanceof Error?null!==(e=t.stack)&&void 0!==e?e:t.message:t.toString()}class G extends o.GridCellRenderer{get name(){return"helm"}get cellType(){return"helm"}get defaultWidth(){return 400}get defaultHeight(){return 100}onMouseMove(t,e){var r,o,i;try{const h=t.cell.column.temp["helm-sum-maxLengthWords"],u=Object.values(t.cell.column.temp["helm-maxLengthWords"]).length-1,c=e.offsetX-t.gridColumn.left+(t.gridColumn.left-t.bounds.x);let g=0,m=u,p=!1;h[u+1]=c+1;let d=0;if(c>h[0])for(;!p;)d=Math.floor((m+g)/2),c>=h[d]&&c<=h[d+1]?(g=d,p=!0):c<h[d]?m=d-1:c>h[d+1]&&(g=d+1),g==m&&(p=!0);g=c>=h[g]?g+1:g;const C=a(t.cell.value);let f=null!==(r=t.cell.value)&&void 0!==r?r:"",b=s(l(f),f),w=[];for(let t=0;t<b.length;++t)C.has(b[t])&&(w[t]=n.divV([n.divText(`Monomer ${b[t]} not found.`),n.divText("Open the Context Panel, then expand Manage Libraries")]));(null!==(i=null===(o=w[g])||void 0===o?void 0:o.childNodes.length)&&void 0!==i?i:0)>0?n.tooltip.show(n.div(w[g]),e.x+16,e.y+16):n.tooltip.hide()}catch(t){const e=P(t);console.error("Helm: HelmCellRenderer.onMouseMove() error:\n"+e)}}render(t,e,r,o,i,h,u){var c;const g=-1!==h.gridRow?h.grid:void 0,m=a(h.cell.value);let p=null!==(c=h.cell.value)&&void 0!==c?c:"",d=l(p);if(0!=m.size){if(m.size>0){o=g?Math.min(g.canvas.width-e,o):t.canvas.width-e,t.save(),t.beginPath(),t.rect(e,r,o,i),t.clip(),t.font="12px monospace",t.textBaseline="top";let n=e,l={},a={},u=s(d,p);for(let e=0;e<u.length;++e){l[e]=7*u[e].length;let s=m.has(u[e])?"red":"#808080";t.fillStyle="rgb(100,100,100)",n=L(n,r,o,i,t,u[e],s,0,!0,1)}a[0]=l[0];for(let t=1;t<u.length;t++)a[t]=a[t-1]+l[t];return h.cell.column.temp={"helm-sum-maxLengthWords":a,"helm-maxLengthWords":l},void t.restore()}}else{const t=n.div([],{style:{width:`${o}px`,height:`${i}px`}});t.setAttribute("dataformat","helm"),t.setAttribute("data",h.cell.value),h.element=t,new JSDraw2.Editor(t,{width:o,height:i,skin:"w8",viewonly:!0})}}}class D extends T{get splitter(){return null===this._splitter&&(this._splitter=H(this.column)),this._splitter}toFasta(t){return"fasta"===t}toSeparator(t){return"separator"===t}toHelm(t){return"helm"===t}convertFastaToSeparator(t,e=null){null===e&&(e=this.defaultGapSymbol);const r=this.getNewColumn("separator");return r.init((r=>{const n=this.column.get(r),o=this.splitter(n);for(let t=0;t<o.length;t++)o[t]===e&&(o[t]=T._defaultGapSymbolsDict.SEPARATOR);return o.join(t)})),r.setTag(o.TAGS.UNITS,"separator"),r.setTag("separator",t),r}getHelmWrappers(){const t=this.isDna()?"DNA1{":this.isRna()?"RNA1{":this.isPeptide()?"PEPTIDE1{":"Unknown";if("Unknown"===t)throw new Error("Neither peptide, nor nucleotide");return[t,this.isDna()?"D(":this.isRna()?"R(":"",this.isDna()||this.isRna()?")P":"","}$$$"]}convertToHelmHelper(t,e,r,n,o,i){return`${r}${this.splitter(t).map((t=>t===e?T._defaultGapSymbolsDict.HELM:`${n}${t}${o}`)).join(".")}${i}`}convertStringToHelm(t,e=null){null===e&&(e=this.defaultGapSymbol);const[r,n,o,i]=this.getHelmWrappers();return this.convertToHelmHelper(t,e,r,n,o,i)}convertToHelm(t=null){null===t&&(t=this.defaultGapSymbol);const[e,r,n,i]=this.getHelmWrappers(),s=this.getNewColumn("helm");return s.init((o=>{const s=this.column.get(o);return this.convertToHelmHelper(s,t,e,r,n,i)})),s.setTag(o.TAGS.UNITS,"helm"),s}convertSeparatorToFasta(t=null){null===t&&(t=T._defaultGapSymbolsDict.FASTA);const e=this.getNewColumn("fasta");return e.init((e=>{const r=this.column.get(e),n=this.splitter(r),o=[];for(let e=0;e<n.length;e++){const r=n[e];if(0===r.length)o.push(t);else if(r.length>1){const t="["+r+"]";o.push(t)}else o.push(r)}return o.join("")})),e.setTag(o.TAGS.UNITS,"fasta"),e}convertHelmToFastaSeparator(t,e,r,n){n||(n=this.toFasta(e)?T._defaultGapSymbolsDict.FASTA:T._defaultGapSymbolsDict.SEPARATOR),r||(r=this.toFasta(e)?"":this.separator);const o=/(R\(|D\(|\)|P)/g,i=t.startsWith("DNA")||t.startsWith("RNA"),s=this.splitter(t),l=[];for(let t=0;t<s.length;t++){let r=s[t];if(i&&(r=r.replace(o,"")),r===T._defaultGapSymbolsDict.HELM)l.push(n);else if(this.toFasta(e)&&r.length>1){const t="["+r+"]";l.push(t)}else l.push(r)}return l.join(r)}convertHelm(t,e,r){const n=this.getNewColumn(t);n.init((n=>{const o=this.column.get(n);return this.convertHelmToFastaSeparator(o,t,e,r)}));const o=A(n,5,H(n)).sameLength?"SEQ.MSA":"SEQ";return n.setTag("aligned",o),n}convertHelmToSeparator(){return this.getNewColumn("separator")}convert(t,e=null){if(this.notation===t)throw new Error("tgt notation is invalid");if(this.toSeparator(t)&&null===e)throw new Error("tgt separator is not specified");if(this.isFasta()&&this.toSeparator(t)&&null!==e)return this.convertFastaToSeparator(e);if((this.isFasta()||this.isSeparator())&&this.toHelm(t))return this.convertToHelm();if(this.isSeparator()&&this.toFasta(t))return this.convertSeparatorToFasta();if(this.isHelm()&&this.toFasta(t))return this.convertHelm(t);if(this.isHelm()&&this.toSeparator(t))return this.convertHelm(t,e);throw new Error(`Not supported conversion from source notation '${this.notation}' to target notation '${t}'.`)}constructor(t){super(t),this._splitter=null}}var R=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{a(n.next(t))}catch(t){i(t)}}function l(t){try{a(n.throw(t))}catch(t){i(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,l)}a((n=n.apply(t,e||[])).next())}))};const _=new o.Package;let $=null;function I(){return R(this,void 0,void 0,(function*(){return Promise.all([new Promise(((t,e)=>{dojo.ready((function(){t(null)}))})),yield r.functions.call("Bio:getBioLib")]).then((([t,e])=>{$=e,U(),$.onChanged.subscribe((t=>{try{U();const t=$.getTypes(),e="Monomer lib updated:<br />"+(0==t.length?"empty":t.map((t=>`${t} ${$.getMonomerNamesByType(t).length}`)).join("<br />"));r.shell.info(e)}catch(t){const e=P(t);console.error("Helm: initHelm monomerLib.onChanged() error:\n"+e)}}))}))}))}function U(){org.helm.webeditor.Monomers.clear(),$.getTypes().forEach((t=>{$.getMonomerNamesByType(t).forEach((e=>{let r=!1;const n=$.getMonomer(t,e),o={id:e,m:n.molfile,n:n.name,na:n.naturalAnalog,rs:n.rgroups.length,type:n.polymerType,mt:n.monomerType,at:{}};if(n.rgroups.length>0){o.rs=n.rgroups.length;const t={};n.rgroups.forEach((e=>{t[e.label]=e.capGroupName})),o.at=t}else null!=n.data.smiles?(o.rs=Object.keys(V(n.data.smiles.toString())).length,o.at=V(n.data.smiles.toString())):r=!0;r||org.helm.webeditor.Monomers.addOneMonomer(o)}))}));let t=r.shell.tv.grid;t&&t.invalidate()}function k(){return new G}function W(t,e,o){const i=a(void 0===o?t.value:e);0==i.size?function(t,e,o){let i=n.div(),s=r.shell.tv.grid.dataFrame,l=new D(s.columns.bySemType("Macromolecule"));org.helm.webeditor.MolViewer.molscale=.8;let a=new scil.helm.App(i,{showabout:!1,mexfontsize:"90%",mexrnapinontab:!0,topmargin:20,mexmonomerstab:!0,sequenceviewonly:!1,mexfavoritefirst:!0,mexfilter:!0});var h=a.calculateSizes();a.canvas.resize(h.rightwidth-100,h.topheight-210);var u={width:h.rightwidth-100+"px",height:h.bottomheight+"px"};scil.apply(a.sequence.style,u),scil.apply(a.notation.style,u),u={width:h.rightwidth+"px",height:h.bottomheight+a.toolbarheight+"px"},scil.apply(a.properties.parent.style,u),a.structureview.resize(h.rightwidth,h.bottomheight+a.toolbarheight),a.mex.resize(h.topheight-80),setTimeout((function(){void 0===o?a.canvas.helm.setSequence(t.value,"HELM"):a.canvas.helm.setSequence(e,"HELM")}),200),n.dialog({showHeader:!1,showFooter:!0}).add(i).onOK((()=>{let e=a.canvas.getHelm(!0).replace(/<\/span>/g,"").replace(/<span style='background:#bbf;'>/g,"");if(void 0===o)t.value=e;else{let r=l.convertHelmToFastaSeparator(e,o);t.value=r}})).show({modal:!0,fullScreen:!0})}(t,e,o):r.shell.warning(`Monomers ${Array.from(i).join(", ")} are absent! <br/>Please, upload the monomer library! <br/><a href="https://datagrok.ai/help/domains/bio/macromolecules" target="_blank">Learn more</a>`)}function z(t){W(t.cell,void 0,void 0)}function j(t){let e=r.shell.tv.grid.dataFrame,n=e.columns.bySemType("Macromolecule");"helm"===n.getTag(o.TAGS.UNITS)&&W(e.currentCell,void 0,void 0);const i=new D(n).convertStringToHelm(t,"/");W(e.currentCell,i,n.getTag(o.TAGS.UNITS))}function B(t){return R(this,void 0,void 0,(function*(){let e=r.shell.tv.grid.root.parentElement;const i=n.div([]);e.appendChild(i);let s=new JSDraw2.Editor(i,{viewonly:!0});i.style.width="0px",i.style.height="0px",s.setHelm(t);let l=s.getFormula(!0),a=Math.round(100*s.getMolWeight())/100,h=Math.round(100*s.getExtinctionCoefficient(!0))/100;return e.lastChild.remove(),new o.Widget(n.tableFromMap({formula:l.replace(/<sub>/g,"").replace(/<\/sub>/g,""),"molecular weight":a,"extinction coefficient":h}))}))}function V(t){const e=t.match(/(?<=\[)[^\][]*(?=])/gm),r={};let n,o="";for(let t=0;t<e.length;t++)if(null!=e[t]&&/\d/.test(e[t])){n=e[t][e[t].length-1],e[t]=e[t].replace(/[0-9]/g,"");for(let r=0;r<e[t].length;r++)":"!=e[t][r]&&(o+=e[t][r]);r["R"+n]=o,o=""}return r}function q(t){let e=r.shell.tv.grid.root.parentElement,i=o.Column.string("mols",t.length);const s=n.div([]);e.appendChild(s);let l=new JSDraw2.Editor(s,{viewonly:!0});return s.style.width="0px",s.style.height="0px",i.init((e=>(l.setHelm(t.get(e)),l.getMolfile()))),e.lastChild.remove(),i}function Y(){return new i}helm=e})();
|
|
2
|
+
//# sourceMappingURL=package.js.map
|