@speleotica/frcsdata 4.0.2 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/FrcsPlotFile.d.ts +1 -1
  2. package/FrcsPlotShot.d.ts +1 -1
  3. package/FrcsShot.d.ts +1 -1
  4. package/FrcsShot.js +2 -3
  5. package/FrcsSurveyFile.d.ts +1 -1
  6. package/FrcsTrip.d.ts +2 -2
  7. package/FrcsTripSummary.d.ts +1 -1
  8. package/FrcsTripSummaryFile.d.ts +1 -1
  9. package/formatFrcsShot.js +7 -6
  10. package/index.js +11 -11
  11. package/node/index.js +6 -9
  12. package/package.json +26 -124
  13. package/parseFrcsPlotFile.js +4 -3
  14. package/parseFrcsSurveyFile.js +126 -107
  15. package/parseFrcsTripSummaryFile.js +5 -4
  16. package/string/index.js +8 -11
  17. package/es/FrcsPlotFile.js +0 -6
  18. package/es/FrcsPlotShot.js +0 -6
  19. package/es/FrcsShot.js +0 -14
  20. package/es/FrcsSurveyFile.js +0 -6
  21. package/es/FrcsTrip.js +0 -6
  22. package/es/FrcsTripSummary.js +0 -6
  23. package/es/FrcsTripSummaryFile.js +0 -6
  24. package/es/formatFrcsShot.js +0 -75
  25. package/es/formatFrcsShot.spec.js +0 -141
  26. package/es/index.js +0 -96
  27. package/es/node/index.js +0 -20
  28. package/es/node/parseFrcsPlotFile.spec.js +0 -167
  29. package/es/node/parseFrcsSurveyFile.spec.js +0 -314
  30. package/es/node/parseFrcsTripSummaryFile.spec.js +0 -78
  31. package/es/parseFrcsPlotFile.js +0 -135
  32. package/es/parseFrcsSurveyFile.js +0 -485
  33. package/es/parseFrcsTripSummaryFile.js +0 -73
  34. package/es/string/index.js +0 -21
  35. package/es/string/parseFrcsPlotFile.spec.js +0 -179
  36. package/es/string/parseFrcsSurveyFile.spec.js +0 -644
  37. package/formatFrcsShot.spec.js +0 -139
  38. package/node/parseFrcsPlotFile.spec.js +0 -181
  39. package/node/parseFrcsSurveyFile.spec.js +0 -328
  40. package/node/parseFrcsTripSummaryFile.spec.js +0 -104
  41. package/string/parseFrcsPlotFile.spec.js +0 -182
  42. package/string/parseFrcsSurveyFile.spec.js +0 -673
  43. package/yarn.lock +0 -9542
@@ -1,485 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = parseFrcsSurveyFile;
7
- var _parseSegment = require("parse-segment");
8
- var _unitized = require("@speleotica/unitized");
9
- var _FrcsShot = require("./FrcsShot");
10
- function parseNumber(s, unit) {
11
- const value = parseFloat(s);
12
- if (isNaN(value)) return null;
13
- return new _unitized.UnitizedNumber(value, unit);
14
- }
15
- function parseAzimuth(s, unit) {
16
- const parsed = parseNumber(s, unit);
17
- return (parsed === null || parsed === void 0 ? void 0 : parsed.get(_unitized.Angle.degrees)) === 360 ? _unitized.Unitize.degrees(0) : parsed;
18
- }
19
- function parseKind(kind) {
20
- switch (kind) {
21
- case 'H':
22
- return _FrcsShot.FrcsShotKind.Horizontal;
23
- case 'D':
24
- return _FrcsShot.FrcsShotKind.Diagonal;
25
- default:
26
- return _FrcsShot.FrcsShotKind.Normal;
27
- }
28
- }
29
- function parseLengthUnit(unit) {
30
- switch (unit) {
31
- case 'FI':
32
- return _unitized.Length.inches;
33
- case 'FF':
34
- case 'FT':
35
- return _unitized.Length.feet;
36
- case 'MT':
37
- case 'M ':
38
- return _unitized.Length.meters;
39
- }
40
- return null;
41
- }
42
- function parseAngleUnit(unit) {
43
- switch (unit) {
44
- case 'D':
45
- return _unitized.Angle.degrees;
46
- case 'G':
47
- return _unitized.Angle.gradians;
48
- case 'M':
49
- return _unitized.Angle.milsNATO;
50
- }
51
- return null;
52
- }
53
-
54
- // determines if a cell contains a valid station name.
55
- function isValidStation(s) {
56
- return /^\s*\S+\s*$/.test(s);
57
- }
58
- // determines if a cell contains a valid unsigned integer.
59
- function isValidUInt(s) {
60
- return /^\s*[0-9]+\s*$/.test(s);
61
- }
62
- // determines if a cell contains a valid float.
63
- function isValidFloat(s) {
64
- return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
65
- }
66
- // determines if a cell contains a valid unsigned float or whitespace.
67
- function isValidOptFloat(s) {
68
- return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
69
- }
70
- // determines if a cell contains a valid unsigned float or whitespace.
71
- function isValidOptUFloat(s) {
72
- return /^\s*[0-9]*(\.[0-9]*)?\s*$/.test(s);
73
- }
74
- // determines if a cell contains a valid unsigned float.
75
- function isValidUFloat(s) {
76
- return /^\s*([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
77
- }
78
- // determines if a cell contains a valid inclination or whitespace.
79
- function isValidOptInclination(s) {
80
- return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
81
- }
82
- function parseLrud(s, unit) {
83
- const value = parseFloat(s);
84
- return !Number.isFinite(value) || value < 0 ? null : new _unitized.UnitizedNumber(value, unit);
85
- }
86
-
87
- /**
88
- * Parses a raw cdata.fr survey file. These look like so:
89
- *
90
- <pre> Fisher Ridge Cave System, Hart Co., KY
91
- ENTRANCE DROPS, JOE'S "I LOVE MY WIFE TRAVERSE", TRICKY TRAVERSE
92
- PETER QUICK, KEITH ORTIZ - 2-15-81
93
- This File has Crumps test connected. 11/20/12
94
- *
95
- FT C DD A
96
- AE20 0 1 3 0 2
97
- * %FS
98
- * AE20 0 0 0 Bug-can't put before so put after-so can't make 2 fixed 10/28/12
99
- AE19 AE20 9.3 60.0 60.0-36.0 2 12 0 20
100
- AE18 AE19 24.5 0.0 0.0-90.0 6 10 25 0
101
- AE17 AE18 8.0 350.5 350.5 17.0 3 5 0 0
102
- AE16 AE17 6.7 0.0 0.0-90.0 3 5 6 1
103
- AE15 AE16 12.6 70.5 71.0-18.0 4 0 2 1
104
- AE14 AE15 10.0 21.5 20.0 6.0 5 5 0 3
105
- AE13 AE14 26.8 288.0 286.0-50.0 0 7 20 5
106
- *
107
- *SHORT CANYON AT THE BASE OF THE SECOND DROP
108
- AE12 AE13 20.7 236.0 236.0 34.0 3 5 4 4
109
- AE11 AE12 12.4 210.0 210.0 35.0 7 4 5 1
110
- AE10 AE13 25.7 40.0 40.0 -9.0 2 2 3 6
111
- *
112
- *AE10 AT JOE'S " I LOVE MY WIFE TRAVERSE "
113
- AE9 AE10 17.8 32.5 31.0 23.0 4 5 20 15
114
- AE1 AE9 13.7 82.0 82.0-13.0
115
- A1 AE1 34.3 46.0 48.0-17.5
116
- *
117
- *SURVEY TO DOME NEAR THE ENTRANCE DOME (ABOVE THE SECOND DROP)
118
- AD1 AE15 8.0 200.0 200.0 0.0 3 1 1 1
119
- AD2 AD1 17.7 161.0 161.0 7.0 1 4 25 1
120
- AD3 AD2 10.4 180.0 180.0 50.0 4 1 15 5
121
- *
122
- TRICKY TRAVERSE AND THEN FIRST SURVEY IN UPPER CROWLWAY
123
- DAN CROWL, KEITH ORTIZ, CHIP HOPPER, PETER QUICK, LARRY BEAN 14 FEB 1981
124
- *
125
- FI B DD
126
- A2 A1 48 10 292.0 110.0-42.0 5 10 35 5
127
- A3 A2 12 5 333.5 153.5 35.0 3 1 15 5
128
- A4 A3 4 2 0.0 0.0 90.0 3 1 10 10
129
- ...</pre>
130
- *
131
- */
132
- async function parseFrcsSurveyFile(file,
133
- // eslint-disable-line @typescript-eslint/no-explicit-any
134
- lines) {
135
- let cave = null;
136
- let location = null;
137
- const trips = [];
138
- const errors = [];
139
- let tripName;
140
- let tripTeam;
141
- let tripDate;
142
- let inTripComment = true;
143
- let tripCommentStartLine = 1;
144
- let tripCommentEndLine = -1;
145
- let tripComment = [];
146
- let commentLines = null;
147
- let trip = null;
148
- let inBlockComment = false;
149
- let section;
150
- function getComment() {
151
- if (!commentLines) return null;
152
- const comment = commentLines.join('\n').trim();
153
- commentLines = null;
154
- return comment || null;
155
- }
156
- let lineNumber = 0;
157
- for await (const line of lines) {
158
- let errored = false;
159
- const thisLineNumber = lineNumber;
160
- const error = (message, startColumn, endColumn) => {
161
- errored = true;
162
- errors.push(new _parseSegment.SegmentParseError(message, new _parseSegment.Segment({
163
- value: line,
164
- source: file,
165
- startLine: thisLineNumber,
166
- startCol: 0
167
- }).substring(startColumn, endColumn)));
168
- };
169
- const validate = (startColumn, endColumn, fieldName, validator) => {
170
- const field = line.substring(startColumn, endColumn);
171
- if (!validator(field)) {
172
- error((field.trim() ? 'Invalid ' : 'Missing ') + fieldName, startColumn, endColumn);
173
- }
174
- return field;
175
- };
176
- lineNumber++;
177
- if (lineNumber === 1) {
178
- const match = /^\s*([^,]+)(,(.*))?/.exec(line);
179
- if (match) {
180
- cave = match[1].trim();
181
- if (match[3]) {
182
- location = match[3].trim();
183
- }
184
- }
185
- }
186
- if (line.charAt(0) === ' ' && line.charAt(1) === '*') {
187
- inTripComment = !inTripComment;
188
- if (inTripComment) {
189
- section = undefined;
190
- tripComment = [];
191
- tripCommentStartLine = lineNumber;
192
- } else {
193
- tripCommentEndLine = lineNumber;
194
- }
195
- } else if (inTripComment) {
196
- if (lineNumber === tripCommentStartLine + 1) {
197
- tripName = line && line.trim();
198
- } else if (lineNumber === tripCommentStartLine + 2) {
199
- const match = /^(.+?)\s*[-.]\s*(\d+)\/(\d+)\/(\d+)$/.exec(line && line.trim());
200
- if (match) {
201
- let k = 1;
202
- const team = match[k++];
203
- const month = parseInt(match[k++]);
204
- const day = parseInt(match[k++]);
205
- const year = parseInt(match[k++]);
206
- tripDate = new Date(year < 70 ? year + 2000 : year, month - 1, day);
207
- tripTeam = team.split(team.indexOf(';') >= 0 ? /\s*;\s*/g : /\s*,\s*/g);
208
- }
209
- } else if (lineNumber > 1) {
210
- tripComment.push(line);
211
- }
212
- const match = /^\*\*\*([^*])\*\*\*/.exec(line);
213
- if (match) {
214
- section = match[1].trim();
215
- }
216
- } else if (line.charAt(0) === '*') {
217
- inBlockComment = !inBlockComment;
218
- if (inBlockComment) commentLines = [];else if (commentLines) {
219
- const part = line.substring(1).trim();
220
- if (part && commentLines) commentLines.push(part);
221
- }
222
- } else if (inBlockComment) {
223
- if (commentLines) commentLines.push(line);
224
- } else if (lineNumber === tripCommentEndLine + 1) {
225
- // FT CC DD
226
- // 01234567
227
- let distanceUnit = parseLengthUnit(line.slice(0, 2));
228
- if (!distanceUnit) {
229
- distanceUnit = _unitized.Length.feet;
230
- error('Invalid distance unit', 0, 2);
231
- }
232
- let azimuthUnit = parseAngleUnit(line[6]);
233
- if (!azimuthUnit) {
234
- azimuthUnit = _unitized.Angle.degrees;
235
- error('Invalid azimuth unit', 6, 7);
236
- }
237
- let inclinationUnit = parseAngleUnit(line[7]);
238
- if (!inclinationUnit) {
239
- inclinationUnit = _unitized.Angle.degrees;
240
- error('Invalid inclination unit', 7, 8);
241
- }
242
- const backsightAzimuthCorrected = line[3] === 'C';
243
- const backsightInclinationCorrected = line[4] === 'C';
244
- const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-';
245
- const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-';
246
- if (!/[-CB ]/.test(line[3])) {
247
- error('Invalid backsight azimuth type', 3, 4);
248
- }
249
- if (!/[-CB ]/.test(line[4])) {
250
- error('Invalid backsight inclination type', 4, 5);
251
- }
252
- trip = {
253
- header: {
254
- name: tripName || '',
255
- comment: tripComment && tripComment.join('\n') || null,
256
- section,
257
- date: tripDate,
258
- team: tripTeam,
259
- distanceUnit,
260
- azimuthUnit,
261
- inclinationUnit,
262
- backsightAzimuthCorrected,
263
- backsightInclinationCorrected,
264
- hasBacksightAzimuth,
265
- hasBacksightInclination
266
- },
267
- shots: []
268
- };
269
- trips.push(trip);
270
- } else if (trip) {
271
- var _exec;
272
- const {
273
- shots,
274
- header: {
275
- azimuthUnit,
276
- inclinationUnit
277
- }
278
- } = trip;
279
- let {
280
- distanceUnit
281
- } = trip.header;
282
- const inches = distanceUnit === _unitized.Length.inches;
283
- if (inches) distanceUnit = _unitized.Length.feet;
284
-
285
- // rigorously check the values in all the columns to make sure this
286
- // is really a survey shot line, just in case any stray comments are
287
- // not properly delimited.
288
-
289
- // from station name
290
- if (!/\S/.test(line.substring(5, 10))) continue;
291
- const fromStr = validate(5, 10, 'from station', isValidStation);
292
-
293
- // Sadly I have found negative LRUD values in Chip's format and apparently
294
- // his program doesn't fail on them, so I have to accept them here
295
- // isValidOptFloat instead of isValidOptUFloat
296
- const lStr = validate(40, 43, 'left', isValidOptFloat);
297
- const rStr = validate(43, 46, 'right', isValidOptFloat);
298
- const uStr = validate(46, 49, 'up', isValidOptFloat);
299
- const dStr = validate(49, 52, 'down', isValidOptFloat);
300
- if (errored) continue;
301
- const up = parseLrud(uStr, distanceUnit);
302
- const down = parseLrud(dStr, distanceUnit);
303
- const left = parseLrud(lStr, distanceUnit);
304
- const right = parseLrud(rStr, distanceUnit);
305
-
306
- // to station name
307
- const toStr = line.substring(0, 5);
308
- if (!toStr.trim()) {
309
- const shot = {
310
- from: fromStr.trim(),
311
- to: null,
312
- kind: _FrcsShot.FrcsShotKind.Normal,
313
- distance: new _unitized.UnitizedNumber(0, distanceUnit),
314
- frontsightAzimuth: null,
315
- backsightAzimuth: null,
316
- frontsightInclination: null,
317
- backsightInclination: null,
318
- fromLruds: {
319
- left,
320
- right,
321
- up,
322
- down
323
- },
324
- excludeDistance: true,
325
- comment: getComment()
326
- };
327
- shots.push(shot);
328
- continue;
329
- }
330
- if (!isValidStation(toStr)) {
331
- error('Invalid station name', 0, 5);
332
- }
333
- const fromLrudMatch = new RegExp(`^\\s+${fromStr.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}((\\s+(\\d+(\\.\\d*)?|\\.\\d+)){4})`).exec(line.substring(52));
334
- let fromLruds;
335
- if (fromLrudMatch) {
336
- const [left, right, up, down] = fromLrudMatch[1].trim().split(/\s+/g).map(s => parseLrud(s, distanceUnit));
337
- fromLruds = {
338
- left,
339
- right,
340
- up,
341
- down
342
- };
343
- }
344
- let comment = getComment();
345
- let fromLrudComment = comment;
346
- const commentFromStr = comment ? (_exec = /^\S{1,5}/.exec(comment)) === null || _exec === void 0 ? void 0 : _exec[0] : null;
347
- if (commentFromStr) {
348
- const fromStr = commentFromStr;
349
- fromLrudComment = ' '.repeat(5 - fromStr.length) + fromLrudComment;
350
- const gap = fromLrudComment.substring(5, 40);
351
- const lrudStr = fromLrudComment.substring(40, 52);
352
- const lStr = fromLrudComment.substring(40, 43);
353
- const rStr = fromLrudComment.substring(43, 46);
354
- const uStr = fromLrudComment.substring(46, 49);
355
- const dStr = fromLrudComment.substring(49, 52);
356
- if (/^\s*\S+$/.test(fromStr) && !gap.trim() && isValidOptFloat(lStr) && isValidOptFloat(rStr) && isValidOptFloat(uStr) && isValidOptFloat(dStr) && /\d/.test(lrudStr)) {
357
- const up = parseLrud(uStr, distanceUnit);
358
- const down = parseLrud(dStr, distanceUnit);
359
- const left = parseLrud(lStr, distanceUnit);
360
- const right = parseLrud(rStr, distanceUnit);
361
- fromLruds = {
362
- left,
363
- right,
364
- up,
365
- down
366
- };
367
- comment = null;
368
- }
369
- }
370
-
371
- // azimuth and inclination
372
- const azmFsStr = validate(19, 25, 'azimuth', isValidOptUFloat);
373
- const azmBsStr = validate(25, 30, 'azimuth', isValidOptUFloat);
374
- const incFsStr = line.substring(30, 35);
375
- const incBsStr = line.substring(35, 40);
376
- if (errored) continue;
377
- let kind;
378
- let distance;
379
- let horizontalDistance;
380
- let verticalDistance;
381
- let frontsightInclination;
382
- let backsightInclination;
383
- let excludeDistance;
384
- let isSplay;
385
-
386
- // parse distance
387
- if (inches) {
388
- const feetStr = line.substring(10, 14);
389
- const inchesStr = line.substring(14, 17);
390
- // feet and inches are not both optional
391
- if (!isValidUInt(feetStr) && !isValidUInt(inchesStr)) {
392
- const invalid = feetStr.trim() || inchesStr.trim();
393
- error(invalid ? 'Invalid distance' : 'Missing distance', 10, 17);
394
- continue;
395
- }
396
-
397
- // sometimes inches are omitted, hence the || 0...I'm assuming it's possible
398
- // for feet to be omitted as well
399
- distance = _unitized.Unitize.inches(parseFloat(inchesStr) || 0).add(_unitized.Unitize.feet(parseFloat(feetStr) || 0));
400
- kind = parseKind(line[17]);
401
- // NOTE there are two columns around here that can contain a *.
402
- // I think they might represent different values, but thisis confused by
403
- // the fact that for ft/in shots, if there is a D or H flag it occupies the
404
- // first column that can contain a * for decimal feet shots
405
- excludeDistance = line[18] === '*' || line[18] === 's';
406
- isSplay = line[18] === 's';
407
- } else {
408
- // decimal feet are not optional
409
- const feetStr = validate(10, 16, 'distance', isValidUFloat);
410
- distance = new _unitized.UnitizedNumber(parseFloat(feetStr), distanceUnit);
411
- kind = parseKind(line[16]);
412
- excludeDistance = line[17] === '*' || line[17] === 's';
413
- isSplay = line[17] === 's';
414
- }
415
- if (kind !== _FrcsShot.FrcsShotKind.Normal) {
416
- validate(30, 35, 'vertical-distance', isValidFloat);
417
- }
418
-
419
- // convert horizontal and diagonal shots to standard
420
- // in this case incFs is the vertical offset between stations
421
- // fortunately it appears we can always count on incFs being specified
422
- // and incBs not being specified for these types of shots
423
- if (kind === _FrcsShot.FrcsShotKind.Horizontal) {
424
- // distance is horizontal offset and incFsStr is vertical offset
425
- horizontalDistance = distance;
426
- const h = horizontalDistance.get(distanceUnit);
427
- const v = parseFloat(incFsStr);
428
- verticalDistance = new _unitized.UnitizedNumber(v, distanceUnit);
429
- distance = new _unitized.UnitizedNumber(Math.sqrt(h * h + v * v), distanceUnit);
430
- frontsightInclination = _unitized.Angle.atan2(verticalDistance, horizontalDistance);
431
- backsightInclination = null;
432
- } else if (kind === _FrcsShot.FrcsShotKind.Diagonal) {
433
- // distance is as usual, but incFsStr is vertical offset
434
- const d = distance.get(distanceUnit);
435
- const v = parseFloat(incFsStr);
436
- verticalDistance = new _unitized.UnitizedNumber(v, distanceUnit);
437
- frontsightInclination = _unitized.Angle.asin(v / d);
438
- backsightInclination = null;
439
- } else {
440
- // frontsight inclination
441
- validate(30, 35, 'inclination', isValidOptInclination);
442
- // frontsight inclination
443
- validate(35, 40, 'inclination', isValidOptInclination);
444
- frontsightInclination = parseNumber(incFsStr, inclinationUnit);
445
- backsightInclination = parseNumber(incBsStr, inclinationUnit);
446
- }
447
- if (errored) continue;
448
- const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit);
449
- const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit);
450
- if (!frontsightInclination && !backsightInclination) {
451
- frontsightInclination = _unitized.Unitize.degrees(0);
452
- }
453
- const shot = {
454
- from: fromStr.trim(),
455
- to: toStr.trim(),
456
- kind,
457
- distance,
458
- frontsightAzimuth,
459
- backsightAzimuth,
460
- frontsightInclination,
461
- backsightInclination,
462
- toLruds: {
463
- left,
464
- right,
465
- up,
466
- down
467
- },
468
- excludeDistance,
469
- comment
470
- };
471
- if (isSplay) shot.isSplay = true;
472
- if (fromLruds) shot.fromLruds = fromLruds;
473
- if (horizontalDistance) shot.horizontalDistance = horizontalDistance;
474
- if (verticalDistance) shot.verticalDistance = verticalDistance;
475
- shots.push(shot);
476
- }
477
- }
478
- return {
479
- cave,
480
- location,
481
- trips,
482
- errors
483
- };
484
- }
485
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGFyc2VTZWdtZW50IiwicmVxdWlyZSIsIl91bml0aXplZCIsIl9GcmNzU2hvdCIsInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJfZXhlYyIsImZyb21TdHIiLCJsU3RyIiwiclN0ciIsInVTdHIiLCJkU3RyIiwidXAiLCJkb3duIiwibGVmdCIsInJpZ2h0IiwidG9TdHIiLCJzaG90IiwiZnJvbSIsInRvIiwiZGlzdGFuY2UiLCJmcm9udHNpZ2h0QXppbXV0aCIsImJhY2tzaWdodEF6aW11dGgiLCJmcm9udHNpZ2h0SW5jbGluYXRpb24iLCJiYWNrc2lnaHRJbmNsaW5hdGlvbiIsImZyb21McnVkcyIsImV4Y2x1ZGVEaXN0YW5jZSIsImZyb21McnVkTWF0Y2giLCJSZWdFeHAiLCJyZXBsYWNlIiwibWFwIiwiZnJvbUxydWRDb21tZW50IiwiY29tbWVudEZyb21TdHIiLCJyZXBlYXQiLCJsZW5ndGgiLCJnYXAiLCJscnVkU3RyIiwiYXptRnNTdHIiLCJhem1Cc1N0ciIsImluY0ZzU3RyIiwiaW5jQnNTdHIiLCJob3Jpem9udGFsRGlzdGFuY2UiLCJ2ZXJ0aWNhbERpc3RhbmNlIiwiaXNTcGxheSIsImZlZXRTdHIiLCJpbmNoZXNTdHIiLCJpbnZhbGlkIiwiYWRkIiwiaCIsInYiLCJNYXRoIiwic3FydCIsImF0YW4yIiwiZCIsImFzaW4iLCJ0b0xydWRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlRnJjc1N1cnZleUZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRnJjc1N1cnZleUZpbGUgfSBmcm9tICcuL0ZyY3NTdXJ2ZXlGaWxlJ1xuaW1wb3J0IHsgRnJjc1RyaXAgfSBmcm9tICcuL0ZyY3NUcmlwJ1xuaW1wb3J0IHsgU2VnbWVudCwgU2VnbWVudFBhcnNlRXJyb3IgfSBmcm9tICdwYXJzZS1zZWdtZW50J1xuaW1wb3J0IHtcbiAgQW5nbGUsXG4gIExlbmd0aCxcbiAgVW5pdCxcbiAgVW5pdGl6ZWROdW1iZXIsXG4gIFVuaXRUeXBlLFxuICBVbml0aXplLFxufSBmcm9tICdAc3BlbGVvdGljYS91bml0aXplZCdcbmltcG9ydCB7IEZyY3NTaG90LCBGcmNzU2hvdEtpbmQgfSBmcm9tICcuL0ZyY3NTaG90J1xuXG5mdW5jdGlvbiBwYXJzZU51bWJlcjxUIGV4dGVuZHMgVW5pdFR5cGU8VD4+KFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8VD5cbik6IFVuaXRpemVkTnVtYmVyPFQ+IHwgbnVsbCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChzKVxuICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gbnVsbFxuICByZXR1cm4gbmV3IFVuaXRpemVkTnVtYmVyKHZhbHVlLCB1bml0KVxufVxuXG5mdW5jdGlvbiBwYXJzZUF6aW11dGgoXG4gIHM6IHN0cmluZyxcbiAgdW5pdDogVW5pdDxBbmdsZT5cbik6IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGwge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU51bWJlcihzLCB1bml0KVxuICByZXR1cm4gcGFyc2VkPy5nZXQoQW5nbGUuZGVncmVlcykgPT09IDM2MCA/IFVuaXRpemUuZGVncmVlcygwKSA6IHBhcnNlZFxufVxuXG5mdW5jdGlvbiBwYXJzZUtpbmQoa2luZDogc3RyaW5nKTogRnJjc1Nob3RLaW5kIHtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAnSCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkhvcml6b250YWxcbiAgICBjYXNlICdEJzpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuRGlhZ29uYWxcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ob3JtYWxcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxlbmd0aFVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxMZW5ndGg+IHwgbnVsbCB7XG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ0ZJJzpcbiAgICAgIHJldHVybiBMZW5ndGguaW5jaGVzXG4gICAgY2FzZSAnRkYnOlxuICAgIGNhc2UgJ0ZUJzpcbiAgICAgIHJldHVybiBMZW5ndGguZmVldFxuICAgIGNhc2UgJ01UJzpcbiAgICBjYXNlICdNICc6XG4gICAgICByZXR1cm4gTGVuZ3RoLm1ldGVyc1xuICB9XG4gIHJldHVybiBudWxsXG59XG5mdW5jdGlvbiBwYXJzZUFuZ2xlVW5pdCh1bml0OiBzdHJpbmcpOiBVbml0PEFuZ2xlPiB8IG51bGwge1xuICBzd2l0Y2ggKHVuaXQpIHtcbiAgICBjYXNlICdEJzpcbiAgICAgIHJldHVybiBBbmdsZS5kZWdyZWVzXG4gICAgY2FzZSAnRyc6XG4gICAgICByZXR1cm4gQW5nbGUuZ3JhZGlhbnNcbiAgICBjYXNlICdNJzpcbiAgICAgIHJldHVybiBBbmdsZS5taWxzTkFUT1xuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgc3RhdGlvbiBuYW1lLlxuZnVuY3Rpb24gaXNWYWxpZFN0YXRpb24oczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypcXFMrXFxzKiQvLnRlc3Qocylcbn1cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgdW5zaWduZWQgaW50ZWdlci5cbmZ1bmN0aW9uIGlzVmFsaWRVSW50KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWzAtOV0rXFxzKiQvLnRlc3Qocylcbn1cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgZmxvYXQuXG5mdW5jdGlvbiBpc1ZhbGlkRmxvYXQoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdPyhbMC05XSsoXFwuWzAtOV0qKT98XFwuWzAtOV0rKVxccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0IG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0RmxvYXQoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdP1swLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0IG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0VUZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWzAtOV0qKFxcLlswLTldKik/XFxzKiQvLnRlc3Qocylcbn1cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgdW5zaWduZWQgZmxvYXQuXG5mdW5jdGlvbiBpc1ZhbGlkVUZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqKFswLTldKyhcXC5bMC05XSopP3xcXC5bMC05XSspXFxzKiQvLnRlc3Qocylcbn1cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgaW5jbGluYXRpb24gb3Igd2hpdGVzcGFjZS5cbmZ1bmN0aW9uIGlzVmFsaWRPcHRJbmNsaW5hdGlvbihzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlstK10/WzAtOV0qKFxcLlswLTldKik/XFxzKiQvLnRlc3Qocylcbn1cbmZ1bmN0aW9uIHBhcnNlTHJ1ZDxUIGV4dGVuZHMgVW5pdFR5cGU8VD4+KFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8TGVuZ3RoPlxuKTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQocylcbiAgcmV0dXJuICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDwgMFxuICAgID8gbnVsbFxuICAgIDogbmV3IFVuaXRpemVkTnVtYmVyKHZhbHVlLCB1bml0KVxufVxuXG4vKipcbiAqIFBhcnNlcyBhIHJhdyBjZGF0YS5mciBzdXJ2ZXkgZmlsZS4gIFRoZXNlIGxvb2sgbGlrZSBzbzpcbiAqXG48cHJlPiAgICAgIEZpc2hlciBSaWRnZSBDYXZlIFN5c3RlbSwgSGFydCBDby4sIEtZXG5FTlRSQU5DRSBEUk9QUywgSk9FJ1MgXCJJIExPVkUgTVkgV0lGRSBUUkFWRVJTRVwiLCBUUklDS1kgVFJBVkVSU0VcblBFVEVSIFFVSUNLLCBLRUlUSCBPUlRJWiAgIC0gIDItMTUtODFcblRoaXMgRmlsZSBoYXMgQ3J1bXBzIHRlc3QgY29ubmVjdGVkLiAgMTEvMjAvMTJcbiAqXG5GVCBDICBERCAgICBBXG4gICAgICBBRTIwICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAxICAzICAwICAyXG4qICAgICAgJUZTXG4qICAgICBBRTIwICAgICAwICAgICAgICAwICAgICAgICAwICAgICAgICBCdWctY2FuJ3QgcHV0IGJlZm9yZSBzbyBwdXQgYWZ0ZXItc28gY2FuJ3QgbWFrZSAyIGZpeGVkIDEwLzI4LzEyXG4gQUUxOSBBRTIwICAgOS4zICAgIDYwLjAgIDYwLjAtMzYuMCAgICAgICAyIDEyICAwIDIwXG4gQUUxOCBBRTE5ICAyNC41ICAgICAwLjAgICAwLjAtOTAuMCAgICAgICA2IDEwIDI1ICAwXG4gQUUxNyBBRTE4ICAgOC4wICAgMzUwLjUgMzUwLjUgMTcuMCAgICAgICAzICA1ICAwICAwXG4gQUUxNiBBRTE3ICAgNi43ICAgICAwLjAgICAwLjAtOTAuMCAgICAgICAzICA1ICA2ICAxXG4gQUUxNSBBRTE2ICAxMi42ICAgIDcwLjUgIDcxLjAtMTguMCAgICAgICA0ICAwICAyICAxXG4gQUUxNCBBRTE1ICAxMC4wICAgIDIxLjUgIDIwLjAgIDYuMCAgICAgICA1ICA1ICAwICAzXG4gQUUxMyBBRTE0ICAyNi44ICAgMjg4LjAgMjg2LjAtNTAuMCAgICAgICAwICA3IDIwICA1XG4qXG4qU0hPUlQgQ0FOWU9OIEFUIFRIRSBCQVNFIE9GIFRIRSBTRUNPTkQgRFJPUFxuIEFFMTIgQUUxMyAgMjAuNyAgIDIzNi4wIDIzNi4wIDM0LjAgICAgICAgMyAgNSAgNCAgNFxuIEFFMTEgQUUxMiAgMTIuNCAgIDIxMC4wIDIxMC4wIDM1LjAgICAgICAgNyAgNCAgNSAgMVxuIEFFMTAgQUUxMyAgMjUuNyAgICA0MC4wICA0MC4wIC05LjAgICAgICAgMiAgMiAgMyAgNlxuKlxuKkFFMTAgQVQgSk9FJ1MgXCIgSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0UgXCJcbiAgQUU5IEFFMTAgIDE3LjggICAgMzIuNSAgMzEuMCAyMy4wICAgICAgIDQgIDUgMjAgMTVcbiAgQUUxICBBRTkgIDEzLjcgICAgODIuMCAgODIuMC0xMy4wXG4gICBBMSAgQUUxICAzNC4zICAgIDQ2LjAgIDQ4LjAtMTcuNVxuKlxuKlNVUlZFWSBUTyBET01FIE5FQVIgVEhFIEVOVFJBTkNFIERPTUUgKEFCT1ZFIFRIRSBTRUNPTkQgRFJPUClcbiAgQUQxIEFFMTUgICA4LjAgICAyMDAuMCAyMDAuMCAgMC4wICAgICAgIDMgIDEgIDEgIDFcbiAgQUQyICBBRDEgIDE3LjcgICAxNjEuMCAxNjEuMCAgNy4wICAgICAgIDEgIDQgMjUgIDFcbiAgQUQzICBBRDIgIDEwLjQgICAxODAuMCAxODAuMCA1MC4wICAgICAgIDQgIDEgMTUgIDVcbiAqXG5UUklDS1kgVFJBVkVSU0UgQU5EIFRIRU4gRklSU1QgU1VSVkVZIElOIFVQUEVSIENST1dMV0FZXG5EQU4gQ1JPV0wsIEtFSVRIIE9SVElaLCBDSElQIEhPUFBFUiwgUEVURVIgUVVJQ0ssIExBUlJZIEJFQU4gICAgMTQgRkVCIDE5ODFcbiAqXG5GSSBCICBERFxuICAgQTIgICBBMSAgNDggMTAgIDI5Mi4wIDExMC4wLTQyLjAgICAgICAgNSAxMCAzNSAgNVxuICAgQTMgICBBMiAgMTIgIDUgIDMzMy41IDE1My41IDM1LjAgICAgICAgMyAgMSAxNSAgNVxuICAgQTQgICBBMyAgIDQgIDIgICAgMC4wICAgMC4wIDkwLjAgICAgICAgMyAgMSAxMCAxMFxuLi4uPC9wcmU+XG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBwYXJzZUZyY3NTdXJ2ZXlGaWxlKFxuICBmaWxlOiBhbnksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBsaW5lczogQXN5bmNJdGVyYWJsZTxzdHJpbmc+XG4pOiBQcm9taXNlPEZyY3NTdXJ2ZXlGaWxlPiB7XG4gIGxldCBjYXZlOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgbG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGNvbnN0IHRyaXBzOiBBcnJheTxGcmNzVHJpcD4gPSBbXVxuICBjb25zdCBlcnJvcnM6IEFycmF5PFNlZ21lbnRQYXJzZUVycm9yPiA9IFtdXG5cbiAgbGV0IHRyaXBOYW1lXG4gIGxldCB0cmlwVGVhbVxuICBsZXQgdHJpcERhdGVcbiAgbGV0IGluVHJpcENvbW1lbnQgPSB0cnVlXG4gIGxldCB0cmlwQ29tbWVudFN0YXJ0TGluZSA9IDFcbiAgbGV0IHRyaXBDb21tZW50RW5kTGluZSA9IC0xXG4gIGxldCB0cmlwQ29tbWVudDogQXJyYXk8c3RyaW5nPiA9IFtdXG4gIGxldCBjb21tZW50TGluZXM6IEFycmF5PHN0cmluZz4gfCBudWxsID0gbnVsbFxuICBsZXQgdHJpcDogRnJjc1RyaXAgfCBudWxsID0gbnVsbFxuICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZVxuICBsZXQgc2VjdGlvblxuXG4gIGZ1bmN0aW9uIGdldENvbW1lbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb21tZW50TGluZXMpIHJldHVybiBudWxsXG4gICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRMaW5lcy5qb2luKCdcXG4nKS50cmltKClcbiAgICBjb21tZW50TGluZXMgPSBudWxsXG4gICAgcmV0dXJuIGNvbW1lbnQgfHwgbnVsbFxuICB9XG5cbiAgbGV0IGxpbmVOdW1iZXIgPSAwXG5cbiAgZm9yIGF3YWl0IChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgbGV0IGVycm9yZWQgPSBmYWxzZVxuXG4gICAgY29uc3QgdGhpc0xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyXG5cbiAgICBjb25zdCBlcnJvciA9IChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBlbmRDb2x1bW46IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgZXJyb3JlZCA9IHRydWVcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBuZXcgU2VnbWVudFBhcnNlRXJyb3IoXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBuZXcgU2VnbWVudCh7XG4gICAgICAgICAgICB2YWx1ZTogbGluZSxcbiAgICAgICAgICAgIHNvdXJjZTogZmlsZSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogdGhpc0xpbmVOdW1iZXIsXG4gICAgICAgICAgICBzdGFydENvbDogMCxcbiAgICAgICAgICB9KS5zdWJzdHJpbmcoc3RhcnRDb2x1bW4sIGVuZENvbHVtbilcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlID0gKFxuICAgICAgc3RhcnRDb2x1bW46IG51bWJlcixcbiAgICAgIGVuZENvbHVtbjogbnVtYmVyLFxuICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICB2YWxpZGF0b3I6ICh2YWx1ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gICAgKTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gbGluZS5zdWJzdHJpbmcoc3RhcnRDb2x1bW4sIGVuZENvbHVtbilcbiAgICAgIGlmICghdmFsaWRhdG9yKGZpZWxkKSkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICAoZmllbGQudHJpbSgpID8gJ0ludmFsaWQgJyA6ICdNaXNzaW5nICcpICsgZmllbGROYW1lLFxuICAgICAgICAgIHN0YXJ0Q29sdW1uLFxuICAgICAgICAgIGVuZENvbHVtblxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmllbGRcbiAgICB9XG5cbiAgICBsaW5lTnVtYmVyKytcblxuICAgIGlmIChsaW5lTnVtYmVyID09PSAxKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IC9eXFxzKihbXixdKykoLCguKikpPy8uZXhlYyhsaW5lKVxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNhdmUgPSBtYXRjaFsxXS50cmltKClcbiAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSBtYXRjaFszXS50cmltKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gJyAnICYmIGxpbmUuY2hhckF0KDEpID09PSAnKicpIHtcbiAgICAgIGluVHJpcENvbW1lbnQgPSAhaW5UcmlwQ29tbWVudFxuICAgICAgaWYgKGluVHJpcENvbW1lbnQpIHtcbiAgICAgICAgc2VjdGlvbiA9IHVuZGVmaW5lZFxuICAgICAgICB0cmlwQ29tbWVudCA9IFtdXG4gICAgICAgIHRyaXBDb21tZW50U3RhcnRMaW5lID0gbGluZU51bWJlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpcENvbW1lbnRFbmRMaW5lID0gbGluZU51bWJlclxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5UcmlwQ29tbWVudCkge1xuICAgICAgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50U3RhcnRMaW5lICsgMSkge1xuICAgICAgICB0cmlwTmFtZSA9IGxpbmUgJiYgbGluZS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZU51bWJlciA9PT0gdHJpcENvbW1lbnRTdGFydExpbmUgKyAyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL14oLis/KVxccypbLS5dXFxzKihcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSQvLmV4ZWMoXG4gICAgICAgICAgbGluZSAmJiBsaW5lLnRyaW0oKVxuICAgICAgICApXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGxldCBrID0gMVxuICAgICAgICAgIGNvbnN0IHRlYW0gPSBtYXRjaFtrKytdXG4gICAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KG1hdGNoW2srK10pXG4gICAgICAgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoW2srK10pXG4gICAgICAgICAgdHJpcERhdGUgPSBuZXcgRGF0ZSh5ZWFyIDwgNzAgPyB5ZWFyICsgMjAwMCA6IHllYXIsIG1vbnRoIC0gMSwgZGF5KVxuICAgICAgICAgIHRyaXBUZWFtID0gdGVhbS5zcGxpdChcbiAgICAgICAgICAgIHRlYW0uaW5kZXhPZignOycpID49IDAgPyAvXFxzKjtcXHMqL2cgOiAvXFxzKixcXHMqL2dcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGluZU51bWJlciA+IDEpIHtcbiAgICAgICAgdHJpcENvbW1lbnQucHVzaChsaW5lKVxuICAgICAgfVxuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxcKlxcKlxcKihbXipdKVxcKlxcKlxcKi8uZXhlYyhsaW5lKVxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHNlY3Rpb24gPSBtYXRjaFsxXS50cmltKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxpbmUuY2hhckF0KDApID09PSAnKicpIHtcbiAgICAgIGluQmxvY2tDb21tZW50ID0gIWluQmxvY2tDb21tZW50XG4gICAgICBpZiAoaW5CbG9ja0NvbW1lbnQpIGNvbW1lbnRMaW5lcyA9IFtdXG4gICAgICBlbHNlIGlmIChjb21tZW50TGluZXMpIHtcbiAgICAgICAgY29uc3QgcGFydCA9IGxpbmUuc3Vic3RyaW5nKDEpLnRyaW0oKVxuICAgICAgICBpZiAocGFydCAmJiBjb21tZW50TGluZXMpIGNvbW1lbnRMaW5lcy5wdXNoKHBhcnQpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbkJsb2NrQ29tbWVudCkge1xuICAgICAgaWYgKGNvbW1lbnRMaW5lcykgY29tbWVudExpbmVzLnB1c2gobGluZSlcbiAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50RW5kTGluZSArIDEpIHtcbiAgICAgIC8vIEZUIENDIEREXG4gICAgICAvLyAwMTIzNDU2N1xuICAgICAgbGV0IGRpc3RhbmNlVW5pdCA9IHBhcnNlTGVuZ3RoVW5pdChsaW5lLnNsaWNlKDAsIDIpKVxuICAgICAgaWYgKCFkaXN0YW5jZVVuaXQpIHtcbiAgICAgICAgZGlzdGFuY2VVbml0ID0gTGVuZ3RoLmZlZXRcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZGlzdGFuY2UgdW5pdCcsIDAsIDIpXG4gICAgICB9XG4gICAgICBsZXQgYXppbXV0aFVuaXQgPSBwYXJzZUFuZ2xlVW5pdChsaW5lWzZdKVxuICAgICAgaWYgKCFhemltdXRoVW5pdCkge1xuICAgICAgICBhemltdXRoVW5pdCA9IEFuZ2xlLmRlZ3JlZXNcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYXppbXV0aCB1bml0JywgNiwgNylcbiAgICAgIH1cbiAgICAgIGxldCBpbmNsaW5hdGlvblVuaXQgPSBwYXJzZUFuZ2xlVW5pdChsaW5lWzddKVxuICAgICAgaWYgKCFpbmNsaW5hdGlvblVuaXQpIHtcbiAgICAgICAgaW5jbGluYXRpb25Vbml0ID0gQW5nbGUuZGVncmVlc1xuICAgICAgICBlcnJvcignSW52YWxpZCBpbmNsaW5hdGlvbiB1bml0JywgNywgOClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQgPSBsaW5lWzNdID09PSAnQydcbiAgICAgIGNvbnN0IGJhY2tzaWdodEluY2xpbmF0aW9uQ29ycmVjdGVkID0gbGluZVs0XSA9PT0gJ0MnXG4gICAgICBjb25zdCBoYXNCYWNrc2lnaHRBemltdXRoID0gbGluZVszXSAhPT0gJyAnICYmIGxpbmVbM10gIT09ICctJ1xuICAgICAgY29uc3QgaGFzQmFja3NpZ2h0SW5jbGluYXRpb24gPSBsaW5lWzRdICE9PSAnICcgJiYgbGluZVs0XSAhPT0gJy0nXG5cbiAgICAgIGlmICghL1stQ0IgXS8udGVzdChsaW5lWzNdKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBiYWNrc2lnaHQgYXppbXV0aCB0eXBlJywgMywgNClcbiAgICAgIH1cbiAgICAgIGlmICghL1stQ0IgXS8udGVzdChsaW5lWzRdKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBiYWNrc2lnaHQgaW5jbGluYXRpb24gdHlwZScsIDQsIDUpXG4gICAgICB9XG5cbiAgICAgIHRyaXAgPSB7XG4gICAgICAgIGhlYWRlcjoge1xuICAgICAgICAgIG5hbWU6IHRyaXBOYW1lIHx8ICcnLFxuICAgICAgICAgIGNvbW1lbnQ6ICh0cmlwQ29tbWVudCAmJiB0cmlwQ29tbWVudC5qb2luKCdcXG4nKSkgfHwgbnVsbCxcbiAgICAgICAgICBzZWN0aW9uLFxuICAgICAgICAgIGRhdGU6IHRyaXBEYXRlLFxuICAgICAgICAgIHRlYW06IHRyaXBUZWFtLFxuICAgICAgICAgIGRpc3RhbmNlVW5pdCxcbiAgICAgICAgICBhemltdXRoVW5pdCxcbiAgICAgICAgICBpbmNsaW5hdGlvblVuaXQsXG4gICAgICAgICAgYmFja3NpZ2h0QXppbXV0aENvcnJlY3RlZCxcbiAgICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCxcbiAgICAgICAgICBoYXNCYWNrc2lnaHRBemltdXRoLFxuICAgICAgICAgIGhhc0JhY2tzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICB9LFxuICAgICAgICBzaG90czogW10sXG4gICAgICB9XG4gICAgICB0cmlwcy5wdXNoKHRyaXApXG4gICAgfSBlbHNlIGlmICh0cmlwKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNob3RzLFxuICAgICAgICBoZWFkZXI6IHsgYXppbXV0aFVuaXQsIGluY2xpbmF0aW9uVW5pdCB9LFxuICAgICAgfSA9IHRyaXBcbiAgICAgIGxldCB7IGRpc3RhbmNlVW5pdCB9ID0gdHJpcC5oZWFkZXJcblxuICAgICAgY29uc3QgaW5jaGVzID0gZGlzdGFuY2VVbml0ID09PSBMZW5ndGguaW5jaGVzXG4gICAgICBpZiAoaW5jaGVzKSBkaXN0YW5jZVVuaXQgPSBMZW5ndGguZmVldFxuXG4gICAgICAvLyByaWdvcm91c2x5IGNoZWNrIHRoZSB2YWx1ZXMgaW4gYWxsIHRoZSBjb2x1bW5zIHRvIG1ha2Ugc3VyZSB0aGlzXG4gICAgICAvLyBpcyByZWFsbHkgYSBzdXJ2ZXkgc2hvdCBsaW5lLCBqdXN0IGluIGNhc2UgYW55IHN0cmF5IGNvbW1lbnRzIGFyZVxuICAgICAgLy8gbm90IHByb3Blcmx5IGRlbGltaXRlZC5cblxuICAgICAgLy8gZnJvbSBzdGF0aW9uIG5hbWVcbiAgICAgIGlmICghL1xcUy8udGVzdChsaW5lLnN1YnN0cmluZyg1LCAxMCkpKSBjb250aW51ZVxuICAgICAgY29uc3QgZnJvbVN0ciA9IHZhbGlkYXRlKDUsIDEwLCAnZnJvbSBzdGF0aW9uJywgaXNWYWxpZFN0YXRpb24pXG5cbiAgICAgIC8vIFNhZGx5IEkgaGF2ZSBmb3VuZCBuZWdhdGl2ZSBMUlVEIHZhbHVlcyBpbiBDaGlwJ3MgZm9ybWF0IGFuZCBhcHBhcmVudGx5XG4gICAgICAvLyBoaXMgcHJvZ3JhbSBkb2Vzbid0IGZhaWwgb24gdGhlbSwgc28gSSBoYXZlIHRvIGFjY2VwdCB0aGVtIGhlcmVcbiAgICAgIC8vIGlzVmFsaWRPcHRGbG9hdCBpbnN0ZWFkIG9mIGlzVmFsaWRPcHRVRmxvYXRcbiAgICAgIGNvbnN0IGxTdHIgPSB2YWxpZGF0ZSg0MCwgNDMsICdsZWZ0JywgaXNWYWxpZE9wdEZsb2F0KVxuICAgICAgY29uc3QgclN0ciA9IHZhbGlkYXRlKDQzLCA0NiwgJ3JpZ2h0JywgaXNWYWxpZE9wdEZsb2F0KVxuICAgICAgY29uc3QgdVN0ciA9IHZhbGlkYXRlKDQ2LCA0OSwgJ3VwJywgaXNWYWxpZE9wdEZsb2F0KVxuICAgICAgY29uc3QgZFN0ciA9IHZhbGlkYXRlKDQ5LCA1MiwgJ2Rvd24nLCBpc1ZhbGlkT3B0RmxvYXQpXG5cbiAgICAgIGlmIChlcnJvcmVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCB1cCA9IHBhcnNlTHJ1ZCh1U3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCBkb3duID0gcGFyc2VMcnVkKGRTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IGxlZnQgPSBwYXJzZUxydWQobFN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgcmlnaHQgPSBwYXJzZUxydWQoclN0ciwgZGlzdGFuY2VVbml0KVxuXG4gICAgICAvLyB0byBzdGF0aW9uIG5hbWVcbiAgICAgIGNvbnN0IHRvU3RyID0gbGluZS5zdWJzdHJpbmcoMCwgNSlcbiAgICAgIGlmICghdG9TdHIudHJpbSgpKSB7XG4gICAgICAgIGNvbnN0IHNob3Q6IEZyY3NTaG90ID0ge1xuICAgICAgICAgIGZyb206IGZyb21TdHIudHJpbSgpLFxuICAgICAgICAgIHRvOiBudWxsLFxuICAgICAgICAgIGtpbmQ6IEZyY3NTaG90S2luZC5Ob3JtYWwsXG4gICAgICAgICAgZGlzdGFuY2U6IG5ldyBVbml0aXplZE51bWJlcigwLCBkaXN0YW5jZVVuaXQpLFxuICAgICAgICAgIGZyb250c2lnaHRBemltdXRoOiBudWxsLFxuICAgICAgICAgIGJhY2tzaWdodEF6aW11dGg6IG51bGwsXG4gICAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uOiBudWxsLFxuICAgICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uOiBudWxsLFxuICAgICAgICAgIGZyb21McnVkczoge1xuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgdXAsXG4gICAgICAgICAgICBkb3duLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXhjbHVkZURpc3RhbmNlOiB0cnVlLFxuICAgICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgICAgfVxuICAgICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoIWlzVmFsaWRTdGF0aW9uKHRvU3RyKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBzdGF0aW9uIG5hbWUnLCAwLCA1KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcm9tTHJ1ZE1hdGNoID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF5cXFxccyske2Zyb21TdHJcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csXG4gICAgICAgICAgICAnXFxcXCQmJ1xuICAgICAgICAgICl9KChcXFxccysoXFxcXGQrKFxcXFwuXFxcXGQqKT98XFxcXC5cXFxcZCspKXs0fSlgXG4gICAgICApLmV4ZWMobGluZS5zdWJzdHJpbmcoNTIpKVxuICAgICAgbGV0IGZyb21McnVkc1xuICAgICAgaWYgKGZyb21McnVkTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0LCB1cCwgZG93bl0gPSBmcm9tTHJ1ZE1hdGNoWzFdXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdCgvXFxzKy9nKVxuICAgICAgICAgIC5tYXAocyA9PiBwYXJzZUxydWQocywgZGlzdGFuY2VVbml0KSlcbiAgICAgICAgZnJvbUxydWRzID0geyBsZWZ0LCByaWdodCwgdXAsIGRvd24gfVxuICAgICAgfVxuXG4gICAgICBsZXQgY29tbWVudCA9IGdldENvbW1lbnQoKVxuICAgICAgbGV0IGZyb21McnVkQ29tbWVudCA9IGNvbW1lbnRcbiAgICAgIGNvbnN0IGNvbW1lbnRGcm9tU3RyID0gY29tbWVudCA/IC9eXFxTezEsNX0vLmV4ZWMoY29tbWVudCk/LlswXSA6IG51bGxcbiAgICAgIGlmIChjb21tZW50RnJvbVN0cikge1xuICAgICAgICBjb25zdCBmcm9tU3RyID0gY29tbWVudEZyb21TdHJcbiAgICAgICAgZnJvbUxydWRDb21tZW50ID0gJyAnLnJlcGVhdCg1IC0gZnJvbVN0ci5sZW5ndGgpICsgZnJvbUxydWRDb21tZW50XG4gICAgICAgIGNvbnN0IGdhcCA9IGZyb21McnVkQ29tbWVudC5zdWJzdHJpbmcoNSwgNDApXG4gICAgICAgIGNvbnN0IGxydWRTdHIgPSBmcm9tTHJ1ZENvbW1lbnQuc3Vic3RyaW5nKDQwLCA1MilcbiAgICAgICAgY29uc3QgbFN0ciA9IGZyb21McnVkQ29tbWVudC5zdWJzdHJpbmcoNDAsIDQzKVxuICAgICAgICBjb25zdCByU3RyID0gZnJvbUxydWRDb21tZW50LnN1YnN0cmluZyg0MywgNDYpXG4gICAgICAgIGNvbnN0IHVTdHIgPSBmcm9tTHJ1ZENvbW1lbnQuc3Vic3RyaW5nKDQ2LCA0OSlcbiAgICAgICAgY29uc3QgZFN0ciA9IGZyb21McnVkQ29tbWVudC5zdWJzdHJpbmcoNDksIDUyKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgL15cXHMqXFxTKyQvLnRlc3QoZnJvbVN0cikgJiZcbiAgICAgICAgICAhZ2FwLnRyaW0oKSAmJlxuICAgICAgICAgIGlzVmFsaWRPcHRGbG9hdChsU3RyKSAmJlxuICAgICAgICAgIGlzVmFsaWRPcHRGbG9hdChyU3RyKSAmJlxuICAgICAgICAgIGlzVmFsaWRPcHRGbG9hdCh1U3RyKSAmJlxuICAgICAgICAgIGlzVmFsaWRPcHRGbG9hdChkU3RyKSAmJlxuICAgICAgICAgIC9cXGQvLnRlc3QobHJ1ZFN0cilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdXAgPSBwYXJzZUxydWQodVN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgICAgIGNvbnN0IGRvd24gPSBwYXJzZUxydWQoZFN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgICAgIGNvbnN0IGxlZnQgPSBwYXJzZUxydWQobFN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VMcnVkKHJTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgICAgICBmcm9tTHJ1ZHMgPSB7IGxlZnQsIHJpZ2h0LCB1cCwgZG93biB9XG4gICAgICAgICAgY29tbWVudCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhemltdXRoIGFuZCBpbmNsaW5hdGlvblxuICAgICAgY29uc3QgYXptRnNTdHIgPSB2YWxpZGF0ZSgxOSwgMjUsICdhemltdXRoJywgaXNWYWxpZE9wdFVGbG9hdClcbiAgICAgIGNvbnN0IGF6bUJzU3RyID0gdmFsaWRhdGUoMjUsIDMwLCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBpbmNGc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDMwLCAzNSlcbiAgICAgIGNvbnN0IGluY0JzU3RyID0gbGluZS5zdWJzdHJpbmcoMzUsIDQwKVxuXG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgbGV0IGtpbmQ6IEZyY3NTaG90S2luZFxuICAgICAgbGV0IGRpc3RhbmNlOiBVbml0aXplZE51bWJlcjxMZW5ndGg+XG4gICAgICBsZXQgaG9yaXpvbnRhbERpc3RhbmNlOiBVbml0aXplZE51bWJlcjxMZW5ndGg+IHwgdW5kZWZpbmVkXG4gICAgICBsZXQgdmVydGljYWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IGZyb250c2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGJhY2tzaWdodEluY2xpbmF0aW9uOiBVbml0aXplZE51bWJlcjxBbmdsZT4gfCBudWxsXG4gICAgICBsZXQgZXhjbHVkZURpc3RhbmNlOiBib29sZWFuXG4gICAgICBsZXQgaXNTcGxheTogYm9vbGVhblxuXG4gICAgICAvLyBwYXJzZSBkaXN0YW5jZVxuICAgICAgaWYgKGluY2hlcykge1xuICAgICAgICBjb25zdCBmZWV0U3RyID0gbGluZS5zdWJzdHJpbmcoMTAsIDE0KVxuICAgICAgICBjb25zdCBpbmNoZXNTdHIgPSBsaW5lLnN1YnN0cmluZygxNCwgMTcpXG4gICAgICAgIC8vIGZlZXQgYW5kIGluY2hlcyBhcmUgbm90IGJvdGggb3B0aW9uYWxcbiAgICAgICAgaWYgKCFpc1ZhbGlkVUludChmZWV0U3RyKSAmJiAhaXNWYWxpZFVJbnQoaW5jaGVzU3RyKSkge1xuICAgICAgICAgIGNvbnN0IGludmFsaWQgPSBmZWV0U3RyLnRyaW0oKSB8fCBpbmNoZXNTdHIudHJpbSgpXG4gICAgICAgICAgZXJyb3IoaW52YWxpZCA/ICdJbnZhbGlkIGRpc3RhbmNlJyA6ICdNaXNzaW5nIGRpc3RhbmNlJywgMTAsIDE3KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb21ldGltZXMgaW5jaGVzIGFyZSBvbWl0dGVkLCBoZW5jZSB0aGUgfHwgMC4uLkknbSBhc3N1bWluZyBpdCdzIHBvc3NpYmxlXG4gICAgICAgIC8vIGZvciBmZWV0IHRvIGJlIG9taXR0ZWQgYXMgd2VsbFxuICAgICAgICBkaXN0YW5jZSA9IFVuaXRpemUuaW5jaGVzKHBhcnNlRmxvYXQoaW5jaGVzU3RyKSB8fCAwKS5hZGQoXG4gICAgICAgICAgVW5pdGl6ZS5mZWV0KHBhcnNlRmxvYXQoZmVldFN0cikgfHwgMClcbiAgICAgICAgKVxuXG4gICAgICAgIGtpbmQgPSBwYXJzZUtpbmQobGluZVsxN10pXG4gICAgICAgIC8vIE5PVEUgdGhlcmUgYXJlIHR3byBjb2x1bW5zIGFyb3VuZCBoZXJlIHRoYXQgY2FuIGNvbnRhaW4gYSAqLlxuICAgICAgICAvLyBJIHRoaW5rIHRoZXkgbWlnaHQgcmVwcmVzZW50IGRpZmZlcmVudCB2YWx1ZXMsIGJ1dCB0aGlzaXMgY29uZnVzZWQgYnlcbiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCBmb3IgZnQvaW4gc2hvdHMsIGlmIHRoZXJlIGlzIGEgRCBvciBIIGZsYWcgaXQgb2NjdXBpZXMgdGhlXG4gICAgICAgIC8vIGZpcnN0IGNvbHVtbiB0aGF0IGNhbiBjb250YWluIGEgKiBmb3IgZGVjaW1hbCBmZWV0IHNob3RzXG4gICAgICAgIGV4Y2x1ZGVEaXN0YW5jZSA9IGxpbmVbMThdID09PSAnKicgfHwgbGluZVsxOF0gPT09ICdzJ1xuICAgICAgICBpc1NwbGF5ID0gbGluZVsxOF0gPT09ICdzJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGVjaW1hbCBmZWV0IGFyZSBub3Qgb3B0aW9uYWxcbiAgICAgICAgY29uc3QgZmVldFN0ciA9IHZhbGlkYXRlKDEwLCAxNiwgJ2Rpc3RhbmNlJywgaXNWYWxpZFVGbG9hdClcbiAgICAgICAgZGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIocGFyc2VGbG9hdChmZWV0U3RyKSwgZGlzdGFuY2VVbml0KVxuICAgICAgICBraW5kID0gcGFyc2VLaW5kKGxpbmVbMTZdKVxuICAgICAgICBleGNsdWRlRGlzdGFuY2UgPSBsaW5lWzE3XSA9PT0gJyonIHx8IGxpbmVbMTddID09PSAncydcbiAgICAgICAgaXNTcGxheSA9IGxpbmVbMTddID09PSAncydcbiAgICAgIH1cblxuICAgICAgaWYgKGtpbmQgIT09IEZyY3NTaG90S2luZC5Ob3JtYWwpIHtcbiAgICAgICAgdmFsaWRhdGUoMzAsIDM1LCAndmVydGljYWwtZGlzdGFuY2UnLCBpc1ZhbGlkRmxvYXQpXG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnZlcnQgaG9yaXpvbnRhbCBhbmQgZGlhZ29uYWwgc2hvdHMgdG8gc3RhbmRhcmRcbiAgICAgIC8vIGluIHRoaXMgY2FzZSBpbmNGcyBpcyB0aGUgdmVydGljYWwgb2Zmc2V0IGJldHdlZW4gc3RhdGlvbnNcbiAgICAgIC8vIGZvcnR1bmF0ZWx5IGl0IGFwcGVhcnMgd2UgY2FuIGFsd2F5cyBjb3VudCBvbiBpbmNGcyBiZWluZyBzcGVjaWZpZWRcbiAgICAgIC8vIGFuZCBpbmNCcyBub3QgYmVpbmcgc3BlY2lmaWVkIGZvciB0aGVzZSB0eXBlcyBvZiBzaG90c1xuICAgICAgaWYgKGtpbmQgPT09IEZyY3NTaG90S2luZC5Ib3Jpem9udGFsKSB7XG4gICAgICAgIC8vIGRpc3RhbmNlIGlzIGhvcml6b250YWwgb2Zmc2V0IGFuZCBpbmNGc1N0ciBpcyB2ZXJ0aWNhbCBvZmZzZXRcbiAgICAgICAgaG9yaXpvbnRhbERpc3RhbmNlID0gZGlzdGFuY2VcbiAgICAgICAgY29uc3QgaCA9IGhvcml6b250YWxEaXN0YW5jZS5nZXQoZGlzdGFuY2VVbml0KVxuICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChpbmNGc1N0cilcbiAgICAgICAgdmVydGljYWxEaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcih2LCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKE1hdGguc3FydChoICogaCArIHYgKiB2KSwgZGlzdGFuY2VVbml0KVxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24gPSBBbmdsZS5hdGFuMihcbiAgICAgICAgICB2ZXJ0aWNhbERpc3RhbmNlLFxuICAgICAgICAgIGhvcml6b250YWxEaXN0YW5jZVxuICAgICAgICApXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChraW5kID09PSBGcmNzU2hvdEtpbmQuRGlhZ29uYWwpIHtcbiAgICAgICAgLy8gZGlzdGFuY2UgaXMgYXMgdXN1YWwsIGJ1dCBpbmNGc1N0ciBpcyB2ZXJ0aWNhbCBvZmZzZXRcbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlLmdldChkaXN0YW5jZVVuaXQpXG4gICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGluY0ZzU3RyKVxuICAgICAgICB2ZXJ0aWNhbERpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHYsIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gQW5nbGUuYXNpbih2IC8gZClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBudWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmcm9udHNpZ2h0IGluY2xpbmF0aW9uXG4gICAgICAgIHZhbGlkYXRlKDMwLCAzNSwgJ2luY2xpbmF0aW9uJywgaXNWYWxpZE9wdEluY2xpbmF0aW9uKVxuICAgICAgICAvLyBmcm9udHNpZ2h0IGluY2xpbmF0aW9uXG4gICAgICAgIHZhbGlkYXRlKDM1LCA0MCwgJ2luY2xpbmF0aW9uJywgaXNWYWxpZE9wdEluY2xpbmF0aW9uKVxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24gPSBwYXJzZU51bWJlcihpbmNGc1N0ciwgaW5jbGluYXRpb25Vbml0KVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IHBhcnNlTnVtYmVyKGluY0JzU3RyLCBpbmNsaW5hdGlvblVuaXQpXG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgY29uc3QgZnJvbnRzaWdodEF6aW11dGggPSBwYXJzZUF6aW11dGgoYXptRnNTdHIsIGF6aW11dGhVbml0KVxuICAgICAgY29uc3QgYmFja3NpZ2h0QXppbXV0aCA9IHBhcnNlQXppbXV0aChhem1Cc1N0ciwgYXppbXV0aFVuaXQpXG5cbiAgICAgIGlmICghZnJvbnRzaWdodEluY2xpbmF0aW9uICYmICFiYWNrc2lnaHRJbmNsaW5hdGlvbikge1xuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24gPSBVbml0aXplLmRlZ3JlZXMoMClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2hvdDogRnJjc1Nob3QgPSB7XG4gICAgICAgIGZyb206IGZyb21TdHIudHJpbSgpLFxuICAgICAgICB0bzogdG9TdHIudHJpbSgpLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaXN0YW5jZSxcbiAgICAgICAgZnJvbnRzaWdodEF6aW11dGgsXG4gICAgICAgIGJhY2tzaWdodEF6aW11dGgsXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIHRvTHJ1ZHM6IHtcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgIHVwLFxuICAgICAgICAgIGRvd24sXG4gICAgICAgIH0sXG4gICAgICAgIGV4Y2x1ZGVEaXN0YW5jZSxcbiAgICAgICAgY29tbWVudCxcbiAgICAgIH1cbiAgICAgIGlmIChpc1NwbGF5KSBzaG90LmlzU3BsYXkgPSB0cnVlXG4gICAgICBpZiAoZnJvbUxydWRzKSBzaG90LmZyb21McnVkcyA9IGZyb21McnVkc1xuICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSkgc2hvdC5ob3Jpem9udGFsRGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgIGlmICh2ZXJ0aWNhbERpc3RhbmNlKSBzaG90LnZlcnRpY2FsRGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlXG4gICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXZlLFxuICAgIGxvY2F0aW9uLFxuICAgIHRyaXBzLFxuICAgIGVycm9ycyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFRQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQSxTQUFTRyxXQUFXQSxDQUNsQkMsQ0FBUyxFQUNUQyxJQUFhLEVBQ2E7RUFDMUIsTUFBTUMsS0FBSyxHQUFHQyxVQUFVLENBQUNILENBQUMsQ0FBQztF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
@@ -1,73 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = parseFrcsTripSummaryFile;
7
- var _unitized = require("@speleotica/unitized");
8
- const tripSummaryRegex = /^\s*(\d+)\s+(\d{1,2})\/(\s\d|\d\d)\/(\d{2,4})\s+(\d+(?:\.\d*)?)\s+(\d+)\s+(\S.*)EXCLUDED:\s+(\d+(?:\.\d*)?)\s+(\d+)/;
9
- /**
10
- * Parses data from a STAT_sum.txt file. Here is an excerpt of the format:
11
- <pre> 1 2/15/81 258.60 17 ENTRANCE DROPS, JOE'S "I LOVE MY WIFE TRAVERSE", TRICKY TRAVERSE EXCLUDED: 0.00 0
12
- Peter Quick Keith Ortiz
13
- A1 AD1-AD3 AE1 AE1 SIDE
14
- AE9 SIDE AE10-AE9 AE13 SIDE AE15 SIDE
15
- AE20-AE11
16
-
17
- 3 3/ 6/81 2371.20 61 DOUG'S DEMISE (50 FT DROP), CHRIS CROSS, CRAWL ABOVE DROP EXCLUDED: 0.00 0
18
- Peter Quick Chris Gerace Phil Oden Chip Hopper
19
- A13 SIDE B1-B5 B2 SIDE B3 SIDE
20
- B6-B18 B17 SIDE B19-B38 B32 SIDE
21
- BS1-BS5 C1-C18 </pre>
22
- */
23
- async function parseFrcsTripSummaryFile(file, lines) {
24
- const errors = [];
25
- const tripSummaries = [];
26
- let tripStartLine = -2;
27
- let lineNumber = 0;
28
- let team = [];
29
- let shots = [];
30
- for await (const line of lines) {
31
- lineNumber++;
32
- const match = tripSummaryRegex.exec(line);
33
- if (match) {
34
- tripStartLine = lineNumber;
35
- const tripNumber = parseInt(match[1]);
36
- const tripIndex = tripNumber - 1;
37
- let year = parseInt(match[4]);
38
- if (year < 1000) year += 1900;
39
- const date = new Date(year, parseInt(match[2]) - 1, parseInt(match[3]));
40
- const totalLength = _unitized.Unitize.feet(parseFloat(match[5]));
41
- const numShots = parseInt(match[6]);
42
- const name = match[7].trim();
43
- const excludedLength = _unitized.Unitize.feet(parseFloat(match[8]));
44
- const numExcludedShots = parseInt(match[9]);
45
- team = [];
46
- shots = [];
47
- tripSummaries[tripIndex] = {
48
- tripNumber,
49
- tripIndex,
50
- date,
51
- totalLength,
52
- numShots,
53
- name,
54
- excludedLength,
55
- numExcludedShots,
56
- team,
57
- shots
58
- };
59
- continue;
60
- }
61
- if (lineNumber === tripStartLine + 1) {
62
- team.push(...line.trim().split(/\s\s+|\t+/g));
63
- } else {
64
- const trimmed = line.trim();
65
- if (trimmed) shots.push(...trimmed.split(/\s\s+|\t+/));
66
- }
67
- }
68
- return {
69
- errors,
70
- tripSummaries
71
- };
72
- }
73
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pdGl6ZWQiLCJyZXF1aXJlIiwidHJpcFN1bW1hcnlSZWdleCIsInBhcnNlRnJjc1RyaXBTdW1tYXJ5RmlsZSIsImZpbGUiLCJsaW5lcyIsImVycm9ycyIsInRyaXBTdW1tYXJpZXMiLCJ0cmlwU3RhcnRMaW5lIiwibGluZU51bWJlciIsInRlYW0iLCJzaG90cyIsImxpbmUiLCJtYXRjaCIsImV4ZWMiLCJ0cmlwTnVtYmVyIiwicGFyc2VJbnQiLCJ0cmlwSW5kZXgiLCJ5ZWFyIiwiZGF0ZSIsIkRhdGUiLCJ0b3RhbExlbmd0aCIsIlVuaXRpemUiLCJmZWV0IiwicGFyc2VGbG9hdCIsIm51bVNob3RzIiwibmFtZSIsInRyaW0iLCJleGNsdWRlZExlbmd0aCIsIm51bUV4Y2x1ZGVkU2hvdHMiLCJwdXNoIiwic3BsaXQiLCJ0cmltbWVkIl0sInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlRnJjc1RyaXBTdW1tYXJ5RmlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGcmNzVHJpcFN1bW1hcnkgfSBmcm9tICcuL0ZyY3NUcmlwU3VtbWFyeSdcbmltcG9ydCB7IEZyY3NUcmlwU3VtbWFyeUZpbGUgfSBmcm9tICcuL0ZyY3NUcmlwU3VtbWFyeUZpbGUnXG5pbXBvcnQgeyBTZWdtZW50UGFyc2VFcnJvciB9IGZyb20gJ3BhcnNlLXNlZ21lbnQnXG5pbXBvcnQgeyBVbml0aXplIH0gZnJvbSAnQHNwZWxlb3RpY2EvdW5pdGl6ZWQnXG5cbmNvbnN0IHRyaXBTdW1tYXJ5UmVnZXggPSAvXlxccyooXFxkKylcXHMrKFxcZHsxLDJ9KVxcLyhcXHNcXGR8XFxkXFxkKVxcLyhcXGR7Miw0fSlcXHMrKFxcZCsoPzpcXC5cXGQqKT8pXFxzKyhcXGQrKVxccysoXFxTLiopRVhDTFVERUQ6XFxzKyhcXGQrKD86XFwuXFxkKik/KVxccysoXFxkKykvXG4vKipcbiAqIFBhcnNlcyBkYXRhIGZyb20gYSBTVEFUX3N1bS50eHQgZmlsZS4gIEhlcmUgaXMgYW4gZXhjZXJwdCBvZiB0aGUgZm9ybWF0OlxuPHByZT4gIDEgICAyLzE1LzgxICAgIDI1OC42MCAgIDE3ICAgRU5UUkFOQ0UgRFJPUFMsIEpPRSdTIFwiSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0VcIiwgVFJJQ0tZIFRSQVZFUlNFICAgICAgICAgICAgICAgIEVYQ0xVREVEOiAgIDAuMDAgIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBRdWljayAgS2VpdGggT3J0aXpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEExICAgICAgICAgICBBRDEtQUQzICAgICAgQUUxICAgICAgICAgIEFFMSBTSURFXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRTkgU0lERSAgICAgQUUxMC1BRTkgICAgIEFFMTMgU0lERSAgICBBRTE1IFNJREVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFMjAtQUUxMVxuXG4gIDMgICAzLyA2LzgxICAgMjM3MS4yMCAgIDYxICAgRE9VRydTIERFTUlTRSAoNTAgRlQgRFJPUCksIENIUklTIENST1NTLCBDUkFXTCBBQk9WRSBEUk9QICAgICAgICAgICAgICAgICAgICAgICBFWENMVURFRDogICAwLjAwICAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGV0ZXIgUXVpY2sgIENocmlzIEdlcmFjZSAgUGhpbCBPZGVuICBDaGlwIEhvcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTEzIFNJREUgICAgIEIxLUI1ICAgICAgICBCMiBTSURFICAgICAgQjMgU0lERVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQjYtQjE4ICAgICAgIEIxNyBTSURFICAgICBCMTktQjM4ICAgICAgQjMyIFNJREVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTMS1CUzUgICAgICBDMS1DMTggICAgICAgPC9wcmU+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlRnJjc1RyaXBTdW1tYXJ5RmlsZShcbiAgZmlsZTogc3RyaW5nLFxuICBsaW5lczogQXN5bmNJdGVyYWJsZTxzdHJpbmc+XG4pOiBQcm9taXNlPEZyY3NUcmlwU3VtbWFyeUZpbGU+IHtcbiAgY29uc3QgZXJyb3JzOiBBcnJheTxTZWdtZW50UGFyc2VFcnJvcj4gPSBbXVxuICBjb25zdCB0cmlwU3VtbWFyaWVzOiBBcnJheTxGcmNzVHJpcFN1bW1hcnkgfCB1bmRlZmluZWQ+ID0gW11cblxuICBsZXQgdHJpcFN0YXJ0TGluZSA9IC0yXG4gIGxldCBsaW5lTnVtYmVyID0gMFxuXG4gIGxldCB0ZWFtOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgbGV0IHNob3RzOiBBcnJheTxzdHJpbmc+ID0gW11cblxuICBmb3IgYXdhaXQgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBsaW5lTnVtYmVyKytcblxuICAgIGNvbnN0IG1hdGNoID0gdHJpcFN1bW1hcnlSZWdleC5leGVjKGxpbmUpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB0cmlwU3RhcnRMaW5lID0gbGluZU51bWJlclxuICAgICAgY29uc3QgdHJpcE51bWJlciA9IHBhcnNlSW50KG1hdGNoWzFdKVxuICAgICAgY29uc3QgdHJpcEluZGV4ID0gdHJpcE51bWJlciAtIDFcbiAgICAgIGxldCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hbNF0pXG4gICAgICBpZiAoeWVhciA8IDEwMDApIHllYXIgKz0gMTkwMFxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIHBhcnNlSW50KG1hdGNoWzJdKSAtIDEsIHBhcnNlSW50KG1hdGNoWzNdKSlcbiAgICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gVW5pdGl6ZS5mZWV0KHBhcnNlRmxvYXQobWF0Y2hbNV0pKVxuICAgICAgY29uc3QgbnVtU2hvdHMgPSBwYXJzZUludChtYXRjaFs2XSlcbiAgICAgIGNvbnN0IG5hbWUgPSBtYXRjaFs3XS50cmltKClcbiAgICAgIGNvbnN0IGV4Y2x1ZGVkTGVuZ3RoID0gVW5pdGl6ZS5mZWV0KHBhcnNlRmxvYXQobWF0Y2hbOF0pKVxuICAgICAgY29uc3QgbnVtRXhjbHVkZWRTaG90cyA9IHBhcnNlSW50KG1hdGNoWzldKVxuICAgICAgdGVhbSA9IFtdXG4gICAgICBzaG90cyA9IFtdXG4gICAgICB0cmlwU3VtbWFyaWVzW3RyaXBJbmRleF0gPSB7XG4gICAgICAgIHRyaXBOdW1iZXIsXG4gICAgICAgIHRyaXBJbmRleCxcbiAgICAgICAgZGF0ZSxcbiAgICAgICAgdG90YWxMZW5ndGgsXG4gICAgICAgIG51bVNob3RzLFxuICAgICAgICBuYW1lLFxuICAgICAgICBleGNsdWRlZExlbmd0aCxcbiAgICAgICAgbnVtRXhjbHVkZWRTaG90cyxcbiAgICAgICAgdGVhbSxcbiAgICAgICAgc2hvdHMsXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAobGluZU51bWJlciA9PT0gdHJpcFN0YXJ0TGluZSArIDEpIHtcbiAgICAgIHRlYW0ucHVzaCguLi5saW5lLnRyaW0oKS5zcGxpdCgvXFxzXFxzK3xcXHQrL2cpKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKClcbiAgICAgIGlmICh0cmltbWVkKSBzaG90cy5wdXNoKC4uLnRyaW1tZWQuc3BsaXQoL1xcc1xccyt8XFx0Ky8pKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9ycywgdHJpcFN1bW1hcmllcyB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQUVBLE1BQU1DLGdCQUFnQixHQUFHLHFIQUFxSDtBQUM5STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsZUFBZUMsd0JBQXdCQSxDQUNwREMsSUFBWSxFQUNaQyxLQUE0QixFQUNFO0VBQzlCLE1BQU1DLE1BQWdDLEdBQUcsRUFBRTtFQUMzQyxNQUFNQyxh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