PluginProbe ʕ •ᴥ•ʔ
JetFormBuilder — Dynamic Blocks Form Builder / 3.6.2
JetFormBuilder — Dynamic Blocks Form Builder v3.6.2
3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.10 2.1.11 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 3.0.0 3.0.0.1 3.0.0.2 3.0.0.3 3.0.1 3.0.1.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.0.1 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.3.2 3.3.3 3.3.3.1 3.3.4 3.3.4.1 3.3.4.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.5.1 3.4.5.2 3.4.6 3.4.7 3.4.7.1 3.5.0 3.5.1 3.5.1.1 3.5.1.2 3.5.2 3.5.2.1 3.5.3 3.5.4 3.5.5 3.5.6 3.5.6.1 3.5.6.2 3.5.6.3 3.6.0
jetformbuilder / assets / build / frontend / conditional.block.js
jetformbuilder / assets / build / frontend Last commit date
advanced.reporting.asset.php 1 month ago advanced.reporting.js 1 month ago calculated.field.asset.php 1 month ago calculated.field.js 1 month ago conditional.block.asset.php 1 month ago conditional.block.js 1 month ago dynamic.value.asset.php 1 month ago dynamic.value.js 1 month ago main.asset.php 1 month ago main.css 1 month ago main.js 1 month ago media.field.asset.php 1 month ago media.field.js 1 month ago media.field.restrictions.asset.php 1 month ago media.field.restrictions.js 1 month ago multi.step.asset.php 1 month ago multi.step.js 1 month ago
conditional.block.js
1072 lines
1 /******/ (() => { // webpackBootstrap
2 /******/ "use strict";
3 /******/ var __webpack_modules__ = ({
4
5 /***/ "./frontend/conditional.block/CalculatedFieldChecker.js"
6 /*!**************************************************************!*\
7 !*** ./frontend/conditional.block/CalculatedFieldChecker.js ***!
8 \**************************************************************/
9 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
10
11 __webpack_require__.r(__webpack_exports__);
12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14 /* harmony export */ });
15 /* harmony import */ var _ConditionChecker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionChecker */ "./frontend/conditional.block/ConditionChecker.js");
16
17 function CalculatedFieldChecker() {
18 _ConditionChecker__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
19 this.isSupported = function (input) {
20 return 'calculated' === input.inputType;
21 };
22
23 /**
24 * @param condition {ConditionFieldItem}
25 * @param input {InputData}
26 */
27 this.check = function (condition, input) {
28 const current = input.calcValue;
29 const conditionValue = condition.value;
30 return this.checkRaw(condition.operator, current, conditionValue);
31 };
32 }
33 CalculatedFieldChecker.prototype = Object.create(_ConditionChecker__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
34 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CalculatedFieldChecker);
35
36 /***/ },
37
38 /***/ "./frontend/conditional.block/ConditionChecker.js"
39 /*!********************************************************!*\
40 !*** ./frontend/conditional.block/ConditionChecker.js ***!
41 \********************************************************/
42 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
43
44 __webpack_require__.r(__webpack_exports__);
45 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
46 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
47 /* harmony export */ });
48 const {
49 isEmpty
50 } = JetFormBuilderFunctions;
51 function ConditionChecker() {
52 this.operators = this.getOperators();
53 }
54 ConditionChecker.prototype = {
55 /**
56 * @return {boolean}
57 */
58 isSupported: () => true,
59 operators: {},
60 getOperators() {
61 return {
62 equal: (current, conditionValue) => current === conditionValue[0],
63 empty: current => isEmpty(current),
64 greater: (current, conditionValue) => +current > +conditionValue[0],
65 greater_or_eq: (current, conditionValue) => +current >= +conditionValue[0],
66 less: (current, conditionValue) => +current < +conditionValue[0],
67 less_or_eq: (current, conditionValue) => +current <= +conditionValue[0],
68 between: (current, conditionValue) => {
69 if (!conditionValue?.length || null === current) {
70 return false;
71 }
72 return conditionValue[0] <= +current && +current <= conditionValue[1];
73 },
74 one_of: (current, conditionValue) => {
75 if (!conditionValue?.length) {
76 return false;
77 }
78 return 0 <= conditionValue.indexOf(current);
79 },
80 contain: (current, conditionValue) => {
81 if (!current) {
82 return false;
83 }
84 return 0 <= current.indexOf(conditionValue[0]);
85 }
86 };
87 },
88 /**
89 * @param condition {ConditionFieldItem}
90 * @param input {InputData}
91 */
92 check(condition, input) {
93 const current = input.value.current;
94 const conditionValue = condition.value;
95 return this.checkRaw(condition.operator, current, conditionValue);
96 },
97 checkRaw(operator, current, conditionValue) {
98 if (this.operators.hasOwnProperty(operator)) {
99 return this.operators[operator](current, conditionValue);
100 }
101 if (0 !== operator.indexOf('not_')) {
102 return false;
103 }
104 const operatorName = operator.slice(4);
105 if (!this.operators.hasOwnProperty(operatorName)) {
106 return false;
107 }
108 return !this.operators[operatorName](current, conditionValue);
109 }
110 };
111 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionChecker);
112
113 /***/ },
114
115 /***/ "./frontend/conditional.block/ConditionFieldItem.js"
116 /*!**********************************************************!*\
117 !*** ./frontend/conditional.block/ConditionFieldItem.js ***!
118 \**********************************************************/
119 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
120
121 __webpack_require__.r(__webpack_exports__);
122 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
123 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
124 /* harmony export */ });
125 /* harmony import */ var _ConditionItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionItem */ "./frontend/conditional.block/ConditionItem.js");
126
127 const {
128 CalculatedFormula
129 } = JetFormBuilderAbstract;
130 function ConditionFieldItem() {
131 _ConditionItem__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
132 this.isSupported = function (options) {
133 return !!options?.field?.length;
134 };
135 this.observe = function () {
136 var _this$list$_fields;
137 const input = this.getInput();
138 this.list._fields = (_this$list$_fields = this.list._fields) !== null && _this$list$_fields !== void 0 ? _this$list$_fields : [];
139 if (!input || this.list._fields.includes(this.field)) {
140 return;
141 }
142 this.list._fields.push(this.field);
143 input.watch(() => this.list.onChangeRelated());
144 };
145 /**
146 * @return {InputData|boolean}
147 */
148 this.getInput = function () {
149 return this.list.root.getInput(this.field);
150 };
151 this.isInputInDOM = function (input) {
152 if (!input?.nodes) {
153 return false;
154 }
155 const nodes = Array.isArray(input.nodes) ? input.nodes : Object.values(input.nodes);
156 return nodes.some(node => node && document.contains(node));
157 };
158 this.isPassed = function () {
159 const input = this.getInput();
160 if (!input) {
161 return false;
162 }
163 if (!this.isInputInDOM(input)) {
164 return false;
165 }
166 return input.checker.check(this, input);
167 };
168 this.setOptions = function (options) {
169 this.field = options.field;
170 this.operator = options.operator;
171 this.render_state = options.render_state;
172 this.use_preset = options.use_preset;
173 let value = options?.value;
174 if (!Array.isArray(value)) {
175 value = value.split(',').map(item => item.trim());
176 }
177 if (this.use_preset) {
178 this.value = value;
179 return;
180 }
181 this.value = {};
182 for (const [index, formula] of Object.entries(value)) {
183 const current = new CalculatedFormula(this.list.root);
184 current.observe(formula);
185 current.setResult = () => {
186 this.value[index] = '' + current.calculate();
187 this.list.onChangeRelated();
188 };
189 current.setResult();
190 }
191 this.value = Object.values(this.value);
192 };
193 }
194 ConditionFieldItem.prototype = Object.create(_ConditionItem__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
195 ConditionFieldItem.prototype.field = null;
196 /**
197 * @type {Array}
198 */
199 ConditionFieldItem.prototype.value = null;
200 /**
201 * @type {'equal'|'greater'|'less'|'between'|'one_of'|'contain'}
202 */
203 ConditionFieldItem.prototype.operator = null;
204 /**
205 * @type {boolean}
206 */
207 ConditionFieldItem.prototype.use_preset = null;
208 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionFieldItem);
209
210 /***/ },
211
212 /***/ "./frontend/conditional.block/ConditionItem.js"
213 /*!*****************************************************!*\
214 !*** ./frontend/conditional.block/ConditionItem.js ***!
215 \*****************************************************/
216 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
217
218 __webpack_require__.r(__webpack_exports__);
219 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
220 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
221 /* harmony export */ });
222 /**
223 * @property {ConditionsList|ConditionsBlockList} list Related list
224 */
225 function ConditionItem() {}
226
227 // eslint-disable-next-line no-unused-vars
228 ConditionItem.prototype.isSupported = function (options) {
229 return false;
230 };
231 ConditionItem.prototype.observe = function () {};
232 // eslint-disable-next-line no-unused-vars
233 ConditionItem.prototype.setOptions = function (options) {};
234 ConditionItem.prototype.isPassed = function () {
235 throw new Error('You must provide ConditionItem::isPassed function');
236 };
237 ConditionItem.prototype.setList = function (list) {
238 this.list = list;
239 };
240 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionItem);
241
242 /***/ },
243
244 /***/ "./frontend/conditional.block/ConditionRenderStateItem.js"
245 /*!****************************************************************!*\
246 !*** ./frontend/conditional.block/ConditionRenderStateItem.js ***!
247 \****************************************************************/
248 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
249
250 __webpack_require__.r(__webpack_exports__);
251 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
252 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
253 /* harmony export */ });
254 /* harmony import */ var _ConditionItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionItem */ "./frontend/conditional.block/ConditionItem.js");
255
256 function ConditionRenderStateItem() {
257 _ConditionItem__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
258 this.isSupported = function (options) {
259 return 'render_state' === options?.operator;
260 };
261
262 /**
263 * @return {InputData}
264 */
265 this.getInput = function () {
266 return this.list.root.getInput('_jfb_current_render_states');
267 };
268 this.observe = function () {
269 this.getInput().watch(() => this.list.onChangeRelated());
270 };
271 this.setOptions = function (options) {
272 var _options$render_state;
273 this.render_state = (_options$render_state = options.render_state) !== null && _options$render_state !== void 0 ? _options$render_state : [];
274 };
275 this.isPassed = function () {
276 const {
277 value
278 } = this.getInput();
279 if (!value.current?.length) {
280 return false;
281 }
282 return this.render_state.some(current => {
283 return value.current.includes(current);
284 });
285 };
286 }
287 ConditionRenderStateItem.prototype = Object.create(_ConditionItem__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
288 ConditionRenderStateItem.prototype.render_state = [];
289 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionRenderStateItem);
290
291 /***/ },
292
293 /***/ "./frontend/conditional.block/ConditionalBlock.js"
294 /*!********************************************************!*\
295 !*** ./frontend/conditional.block/ConditionalBlock.js ***!
296 \********************************************************/
297 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
298
299 __webpack_require__.r(__webpack_exports__);
300 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
301 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
302 /* harmony export */ });
303 /* harmony import */ var _ConditionsBlockList__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionsBlockList */ "./frontend/conditional.block/ConditionsBlockList.js");
304
305 const {
306 doAction
307 } = JetPlugins.hooks;
308 const {
309 ReactiveVar
310 } = JetFormBuilderAbstract;
311 const {
312 validateInputsAll
313 } = JetFormBuilderFunctions;
314 const __reInited = new WeakSet();
315 function ConditionalBlock(node, observable) {
316 this.node = node;
317 node.jfbConditional = this;
318 /**
319 * @type {Observable}
320 */
321 this.root = observable;
322 this.isObserved = false;
323
324 /**
325 * @type {ConditionsBlockList}
326 */
327 this.list = null;
328
329 /**
330 * @type {string | Object}
331 */
332 this.function = null;
333 this.settings = null;
334
335 /**
336 * @type {PageState}
337 */
338 this.page = null;
339
340 /**
341 * @type {MultiStepState}
342 */
343 this.multistep = null;
344
345 /**
346 * @type {Node}
347 */
348 this.comment = null;
349
350 /**
351 * @type {InputData[]}
352 */
353 this.inputs = [];
354 this.isRight = new ReactiveVar(null);
355 this.isRight.make();
356 this.setConditions();
357 this.setInputs();
358 this.setFunction();
359 if (!window?.JetFormBuilderSettings?.devmode) {
360 delete this.node.dataset.jfbConditional;
361 delete this.node.dataset.jfbFunc;
362 }
363 doAction('jet.fb.conditional.init', this);
364 }
365 ConditionalBlock.prototype = {
366 setConditions() {
367 const {
368 jfbConditional
369 } = this.node.dataset;
370 this.list = new _ConditionsBlockList__WEBPACK_IMPORTED_MODULE_0__["default"](jfbConditional, this.root);
371 this.list.block = this;
372 this.list.onChangeRelated = () => {
373 this.isRight.current = this.list.getResult();
374 };
375 },
376 setInputs() {
377 this.inputs = Array.from(this.node.querySelectorAll('[data-jfb-sync]')).map(item => item.jfbSync).filter(item => item);
378 },
379 insertComment() {
380 if (!this.settings?.dom) {
381 return;
382 }
383 this.comment = document.createComment('');
384
385 // insert comment after conditional block
386 this.node.parentElement.insertBefore(this.comment, this.node.nextSibling);
387 },
388 observe() {
389 if (this.isObserved) {
390 return;
391 }
392 this.isObserved = true;
393 this.insertComment();
394 this.isRight.watch(() => this.runFunction());
395 this.isRight.watch(() => this.validateInputs());
396 this.list.observe();
397 },
398 runFunction() {
399 const result = this.isRight.current;
400 switch (this.function) {
401 case 'show':
402 this.showBlock(result);
403 break;
404 case 'hide':
405 this.showBlock(!result);
406 break;
407 case 'disable':
408 this.disableBlock(result);
409 break;
410 default:
411 doAction('jet.fb.conditional.block.runFunction', this.function, result, this);
412 break;
413 }
414 },
415 /**
416 * Compatibility with Save Progress
417 * @since 3.0.1 https://github.com/Crocoblock/issues-tracker/issues/2480
418 *
419 * @see https://github.com/Crocoblock/issues-tracker/issues/1553
420 */
421 validateInputs() {
422 setTimeout(() => {
423 validateInputsAll(this.inputs, true).then(() => {}).catch(() => {});
424 });
425 },
426 showBlock(result) {
427 this.node.classList.remove('jet-form-builder--hidden');
428 if (this.settings?.dom) {
429 this.showBlockDom(result);
430 if (result) {
431 requestAnimationFrame(() => this.reinitChildren());
432 }
433 const event = new CustomEvent('jet-form-builder/conditional-block/block-toggle-hidden-dom', {
434 detail: {
435 block: this.node,
436 result: result
437 }
438 });
439 document.dispatchEvent(event);
440 return;
441 }
442 this.node.style.display = result ? 'block' : 'none';
443 if (result) {
444 requestAnimationFrame(() => this.reinitChildren());
445 }
446 },
447 notifyInputs() {
448 this.inputs.forEach(input => {
449 input.value?.notify?.();
450 });
451 },
452 clearChoiceInputs() {
453 this.inputs.forEach(input => {
454 var _input$nodes;
455 const nodes = Array.isArray(input.nodes) ? input.nodes : Object.values((_input$nodes = input.nodes) !== null && _input$nodes !== void 0 ? _input$nodes : {});
456 const isChoiceInput = nodes.some(node => {
457 if (!node) {
458 return false;
459 }
460 return 'SELECT' === node.tagName || 'checkbox' === node.type || 'radio' === node.type;
461 });
462 if (!isChoiceInput) {
463 return;
464 }
465 input.onClear?.();
466 input.value?.notify?.();
467 });
468 },
469 showBlockDom(result) {
470 const inputsList = this.root.dataInputs;
471 if (!result) {
472 this.clearChoiceInputs();
473 this.node.remove();
474 this.notifyInputs();
475 this.reCalculateFields(inputsList);
476 return;
477 }
478 this.comment.parentElement.insertBefore(this.node, this.comment);
479 this.notifyInputs();
480 this.reCalculateFields(inputsList);
481 },
482 disableBlock(result) {
483 this.node.disabled = result;
484 },
485 setFunction() {
486 this.function = this.node.dataset.jfbFunc;
487 let parsed;
488 try {
489 parsed = JSON.parse(this.function);
490 } catch (error) {
491 return;
492 }
493 const [[name, settings]] = Object.entries(parsed);
494 this.function = name;
495 this.settings = settings;
496 },
497 reinitChildren() {
498 const root = this.root;
499 const scope = this.node;
500 const nodes = scope.querySelectorAll('[data-jfb-conditional][data-jfb-func]');
501 nodes.forEach(node => {
502 if (node.jfbConditional || __reInited.has(node)) {
503 return;
504 }
505 try {
506 const child = new ConditionalBlock(node, root);
507 child.observe();
508 child.isRight.current = child.list.getResult();
509 __reInited.add(node);
510 } catch (e) {
511 if (console && console.warn) {
512 console.warn('reinitChildren: init failed', e, node);
513 }
514 }
515 });
516 },
517 /**
518 * Recalculation of formulas
519 * @param {Object} inputsList - List of fields
520 */
521 reCalculateFields(inputsList) {
522 // Get only fields that are in the current block
523 const affectedFields = this.getAffectedFields(inputsList);
524
525 // Cache for visibility checks
526 const visibilityCache = new Map();
527 affectedFields.forEach(key => {
528 if (inputsList[key] && inputsList[key].formula) {
529 const fieldNode = inputsList[key].nodes?.[0];
530
531 // Use cache for visibility checks
532 let shouldRecalculate = false;
533 if (fieldNode) {
534 const cacheKey = fieldNode;
535 if (!visibilityCache.has(cacheKey)) {
536 const isVisible = this.isFieldVisible(fieldNode);
537 const isInDOM = document.contains(fieldNode);
538 visibilityCache.set(cacheKey, isVisible || isInDOM);
539 }
540 shouldRecalculate = visibilityCache.get(cacheKey);
541 }
542 if (shouldRecalculate) {
543 try {
544 inputsList[key].reCalculateFormula();
545 } catch (error) {
546 console.warn(`Error recalculating formula for field ${key}:`, error);
547 }
548 }
549 }
550 });
551 },
552 /**
553 * Checks if field is visible on the page
554 * @param {HTMLElement} fieldNode - DOM element of the field
555 * @returns {boolean} - true if field is visible
556 */
557 isFieldVisible(fieldNode) {
558 if (!fieldNode) return false;
559
560 // Check if element is in DOM
561 if (!document.contains(fieldNode)) return false;
562
563 // Check visibility styles
564 const computedStyle = window.getComputedStyle(fieldNode);
565 if ('none' === computedStyle.display || 'hidden' === computedStyle.visibility) {
566 return false;
567 }
568
569 // Check if element is not hidden by parent elements
570 let parent = fieldNode.parentElement;
571 while (parent && parent !== document.body) {
572 const parentStyle = window.getComputedStyle(parent);
573 if ('none' === parentStyle.display || 'hidden' === parentStyle.visibility) {
574 return false;
575 }
576 parent = parent.parentElement;
577 }
578 return true;
579 },
580 /**
581 * Gets list of fields affected by current conditional block
582 * @param {Object} inputsList - List of all fields
583 * @returns {Array} - Array of affected field keys
584 */
585 getAffectedFields(inputsList) {
586 const affectedFields = [];
587
588 // Get all fields inside current block
589 const blockFields = Array.from(this.node.querySelectorAll('[data-jfb-sync]'));
590 const blockFieldNames = new Set();
591
592 // Collect field names inside block
593 blockFields.forEach(fieldNode => {
594 var _ref, _fieldNode$jfbSync$na;
595 const fieldName = (_ref = (_fieldNode$jfbSync$na = fieldNode.jfbSync?.name) !== null && _fieldNode$jfbSync$na !== void 0 ? _fieldNode$jfbSync$na : fieldNode.getAttribute('name')) !== null && _ref !== void 0 ? _ref : fieldNode.querySelector('[name]')?.getAttribute('name');
596 if (fieldName) {
597 blockFieldNames.add(fieldName);
598 }
599 });
600 Object.keys(inputsList).forEach(key => {
601 const field = inputsList[key];
602 if (!field || !field.formula) return;
603 const fieldNode = field.nodes?.[0];
604 let shouldRecalculate = false;
605
606 // 1. Field is inside the block
607 if (fieldNode && blockFields.includes(fieldNode)) {
608 shouldRecalculate = true;
609 }
610
611 // 2. Field depends on fields inside block (check formula)
612 if (!shouldRecalculate && field.formula) {
613 blockFieldNames.forEach(blockFieldName => {
614 if (field.formula.includes(`%${blockFieldName}%`)) {
615 shouldRecalculate = true;
616 }
617 });
618 }
619 if (shouldRecalculate) {
620 affectedFields.push(key);
621 }
622 });
623 return affectedFields;
624 }
625 };
626 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionalBlock);
627
628 /***/ },
629
630 /***/ "./frontend/conditional.block/ConditionsBlockList.js"
631 /*!***********************************************************!*\
632 !*** ./frontend/conditional.block/ConditionsBlockList.js ***!
633 \***********************************************************/
634 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
635
636 __webpack_require__.r(__webpack_exports__);
637 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
638 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
639 /* harmony export */ });
640 /* harmony import */ var _ConditionsList__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionsList */ "./frontend/conditional.block/ConditionsList.js");
641
642 function ConditionsBlockList(conditions, root) {
643 _ConditionsList__WEBPACK_IMPORTED_MODULE_0__["default"].call(this, conditions, root);
644 }
645 ConditionsBlockList.prototype = Object.create(_ConditionsList__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
646 /**
647 * @type {ConditionalBlock}
648 */
649 ConditionsBlockList.prototype.block = null;
650 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionsBlockList);
651
652 /***/ },
653
654 /***/ "./frontend/conditional.block/ConditionsList.js"
655 /*!******************************************************!*\
656 !*** ./frontend/conditional.block/ConditionsList.js ***!
657 \******************************************************/
658 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
659
660 __webpack_require__.r(__webpack_exports__);
661 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
662 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
663 /* harmony export */ });
664 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/conditional.block/functions.js");
665 /* harmony import */ var _OrOperatorItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./OrOperatorItem */ "./frontend/conditional.block/OrOperatorItem.js");
666
667
668 function ConditionsList(conditions, root) {
669 this.root = root;
670 this.setConditions(conditions);
671 }
672 ConditionsList.prototype = {
673 /**
674 * @type {Observable}
675 */
676 root: null,
677 conditions: [],
678 invalid: [],
679 groups: [],
680 /**
681 * You can override this callback.
682 * It used in ConditionFieldItem.
683 *
684 * Runs every time, when conditions is match
685 */
686 onChangeRelated() {
687 if (!this.getResult()) {
688 return;
689 }
690 this.onMatchConditions();
691 },
692 onMatchConditions() {},
693 observe() {
694 for (const condition of this.getConditions()) {
695 condition.observe();
696 }
697 },
698 setConditions(conditions) {
699 if ('string' === typeof conditions) {
700 conditions = JSON.parse(conditions);
701 }
702 this.conditions = conditions.map(item => (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createConditionItem)(item, this)).filter(item => item);
703 const groups = {};
704 let groupIndex = 0;
705 for (const condition of this.getConditions()) {
706 var _groups$groupIndex;
707 if (condition instanceof _OrOperatorItem__WEBPACK_IMPORTED_MODULE_1__["default"]) {
708 groupIndex++;
709 continue;
710 }
711 groups[groupIndex] = (_groups$groupIndex = groups[groupIndex]) !== null && _groups$groupIndex !== void 0 ? _groups$groupIndex : [];
712 groups[groupIndex].push(condition);
713 }
714 this.groups = Object.values(groups);
715 },
716 getResult() {
717 this.invalid = [];
718 if (!this.groups.length) {
719 return true;
720 }
721 for (const group of this.groups) {
722 if (this.isValidGroup(group)) {
723 return true;
724 }
725 }
726 return false;
727 },
728 isValidGroup(conditionsGroup) {
729 for (const condition of conditionsGroup) {
730 if (condition.isPassed()) {
731 continue;
732 }
733 this.invalid.push(condition);
734 return false;
735 }
736 return true;
737 },
738 /**
739 * @return {Array<ConditionFieldItem | ConditionPageStateItem>}
740 */
741 getConditions() {
742 return this.conditions;
743 }
744 };
745 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionsList);
746
747 /***/ },
748
749 /***/ "./frontend/conditional.block/DateTimeConditionChecker.js"
750 /*!****************************************************************!*\
751 !*** ./frontend/conditional.block/DateTimeConditionChecker.js ***!
752 \****************************************************************/
753 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
754
755 __webpack_require__.r(__webpack_exports__);
756 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
757 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
758 /* harmony export */ });
759 /* harmony import */ var _ConditionChecker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionChecker */ "./frontend/conditional.block/ConditionChecker.js");
760
761 const {
762 getTimestamp
763 } = JetFormBuilderFunctions;
764 const {
765 Min_In_Sec,
766 Milli_In_Sec
767 } = JetFormBuilderConst;
768 const offset = new Date().getTimezoneOffset();
769 function DateTimeConditionChecker() {
770 _ConditionChecker__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
771 this.isSupported = function (input) {
772 const [node] = input.nodes;
773 return ['date', 'time', 'datetime-local'].includes(node.type);
774 };
775
776 /**
777 * @param condition {ConditionFieldItem}
778 * @param input {InputData}
779 */
780 this.check = function (condition, input) {
781 const {
782 time: current
783 } = getTimestamp(input.value.current);
784 const conditionValue = condition.value.map(value => {
785 const {
786 time,
787 type
788 } = getTimestamp(value);
789 if ('number' === type && condition.use_preset) {
790 // eslint-disable-next-line camelcase
791 return time * Milli_In_Sec + offset * Min_In_Sec;
792 }
793 return time;
794 });
795 return this.checkRaw(condition.operator, current, conditionValue);
796 };
797 }
798 DateTimeConditionChecker.prototype = Object.create(_ConditionChecker__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
799 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DateTimeConditionChecker);
800
801 /***/ },
802
803 /***/ "./frontend/conditional.block/MultipleConditionChecker.js"
804 /*!****************************************************************!*\
805 !*** ./frontend/conditional.block/MultipleConditionChecker.js ***!
806 \****************************************************************/
807 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
808
809 __webpack_require__.r(__webpack_exports__);
810 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
811 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
812 /* harmony export */ });
813 /* harmony import */ var _ConditionChecker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionChecker */ "./frontend/conditional.block/ConditionChecker.js");
814
815 function MultipleConditionChecker() {
816 _ConditionChecker__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
817 this.operators.one_of = (current, conditionValues) => {
818 if (!conditionValues?.length || !current?.length) {
819 return false;
820 }
821 return current.some(val => -1 !== conditionValues.indexOf(val));
822 };
823 this.operators.contain = (current, conditionValues) => {
824 if (!current?.length) {
825 return false;
826 }
827 return current.some(val => val.indexOf(conditionValues[0]) !== -1);
828 };
829 this.isSupported = function (input) {
830 return input.isArray();
831 };
832 }
833 MultipleConditionChecker.prototype = Object.create(_ConditionChecker__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
834 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MultipleConditionChecker);
835
836 /***/ },
837
838 /***/ "./frontend/conditional.block/OrOperatorItem.js"
839 /*!******************************************************!*\
840 !*** ./frontend/conditional.block/OrOperatorItem.js ***!
841 \******************************************************/
842 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
843
844 __webpack_require__.r(__webpack_exports__);
845 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
846 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
847 /* harmony export */ });
848 /* harmony import */ var _ConditionItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionItem */ "./frontend/conditional.block/ConditionItem.js");
849
850 function OrOperatorItem() {
851 _ConditionItem__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
852 this.isSupported = function (options) {
853 var _options$or_operator;
854 return (_options$or_operator = options.or_operator) !== null && _options$or_operator !== void 0 ? _options$or_operator : false;
855 };
856 }
857 OrOperatorItem.prototype = Object.create(_ConditionItem__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
858 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OrOperatorItem);
859
860 /***/ },
861
862 /***/ "./frontend/conditional.block/functions.js"
863 /*!*************************************************!*\
864 !*** ./frontend/conditional.block/functions.js ***!
865 \*************************************************/
866 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
867
868 __webpack_require__.r(__webpack_exports__);
869 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
870 /* harmony export */ createChecker: () => (/* binding */ createChecker),
871 /* harmony export */ createConditionItem: () => (/* binding */ createConditionItem),
872 /* harmony export */ createConditionalBlock: () => (/* binding */ createConditionalBlock)
873 /* harmony export */ });
874 /* harmony import */ var _ConditionFieldItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionFieldItem */ "./frontend/conditional.block/ConditionFieldItem.js");
875 /* harmony import */ var _ConditionalBlock__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConditionalBlock */ "./frontend/conditional.block/ConditionalBlock.js");
876 /* harmony import */ var _ConditionChecker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ConditionChecker */ "./frontend/conditional.block/ConditionChecker.js");
877 /* harmony import */ var _MultipleConditionChecker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MultipleConditionChecker */ "./frontend/conditional.block/MultipleConditionChecker.js");
878 /* harmony import */ var _OrOperatorItem__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./OrOperatorItem */ "./frontend/conditional.block/OrOperatorItem.js");
879 /* harmony import */ var _DateTimeConditionChecker__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./DateTimeConditionChecker */ "./frontend/conditional.block/DateTimeConditionChecker.js");
880 /* harmony import */ var _ConditionRenderStateItem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ConditionRenderStateItem */ "./frontend/conditional.block/ConditionRenderStateItem.js");
881 /* harmony import */ var _CalculatedFieldChecker__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CalculatedFieldChecker */ "./frontend/conditional.block/CalculatedFieldChecker.js");
882
883
884
885
886
887
888
889
890 const {
891 applyFilters
892 } = JetPlugins.hooks;
893 const getItemTypes = () => applyFilters('jet.fb.conditional.types', [_ConditionRenderStateItem__WEBPACK_IMPORTED_MODULE_6__["default"], _OrOperatorItem__WEBPACK_IMPORTED_MODULE_4__["default"], _ConditionFieldItem__WEBPACK_IMPORTED_MODULE_0__["default"]]);
894 /**
895 * @type {ConditionItem[]}
896 */
897 let itemTypes = [];
898 const getCheckers = () => applyFilters('jet.fb.conditional.checkers', [_MultipleConditionChecker__WEBPACK_IMPORTED_MODULE_3__["default"], _DateTimeConditionChecker__WEBPACK_IMPORTED_MODULE_5__["default"], _CalculatedFieldChecker__WEBPACK_IMPORTED_MODULE_7__["default"], _ConditionChecker__WEBPACK_IMPORTED_MODULE_2__["default"]]);
899 let checkers = [];
900
901 /**
902 * @param options {{}}
903 * @param list {ConditionsList}
904 * @return {*}
905 */
906 function createConditionItem(options, list) {
907 if (!itemTypes.length) {
908 itemTypes = getItemTypes();
909 }
910 for (const dataType of itemTypes) {
911 /**
912 * @type {ConditionItem}
913 */
914 const current = new dataType();
915 if (!current.isSupported(options)) {
916 continue;
917 }
918 current.setList(list);
919 current.setOptions(options);
920 return current;
921 }
922 }
923
924 /**
925 * @param node
926 * @param root
927 * @return {ConditionalBlock}
928 */
929 function createConditionalBlock(node, root) {
930 if (node.hasOwnProperty('jfbConditional')) {
931 return node.jfbConditional;
932 }
933 const block = new _ConditionalBlock__WEBPACK_IMPORTED_MODULE_1__["default"](node, root);
934 block.observe();
935 block.list.onChangeRelated();
936 return block;
937 }
938
939 /**
940 * @param input {InputData}
941 */
942 function createChecker(input) {
943 if (!checkers.length) {
944 checkers = getCheckers();
945 }
946 for (const checker of checkers) {
947 const current = new checker();
948 if (!current.isSupported(input)) {
949 continue;
950 }
951 return current;
952 }
953 return null;
954 }
955
956
957 /***/ }
958
959 /******/ });
960 /************************************************************************/
961 /******/ // The module cache
962 /******/ var __webpack_module_cache__ = {};
963 /******/
964 /******/ // The require function
965 /******/ function __webpack_require__(moduleId) {
966 /******/ // Check if module is in cache
967 /******/ var cachedModule = __webpack_module_cache__[moduleId];
968 /******/ if (cachedModule !== undefined) {
969 /******/ return cachedModule.exports;
970 /******/ }
971 /******/ // Create a new module (and put it into the cache)
972 /******/ var module = __webpack_module_cache__[moduleId] = {
973 /******/ // no module.id needed
974 /******/ // no module.loaded needed
975 /******/ exports: {}
976 /******/ };
977 /******/
978 /******/ // Execute the module function
979 /******/ if (!(moduleId in __webpack_modules__)) {
980 /******/ delete __webpack_module_cache__[moduleId];
981 /******/ var e = new Error("Cannot find module '" + moduleId + "'");
982 /******/ e.code = 'MODULE_NOT_FOUND';
983 /******/ throw e;
984 /******/ }
985 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
986 /******/
987 /******/ // Return the exports of the module
988 /******/ return module.exports;
989 /******/ }
990 /******/
991 /************************************************************************/
992 /******/ /* webpack/runtime/define property getters */
993 /******/ (() => {
994 /******/ // define getter functions for harmony exports
995 /******/ __webpack_require__.d = (exports, definition) => {
996 /******/ for(var key in definition) {
997 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
998 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
999 /******/ }
1000 /******/ }
1001 /******/ };
1002 /******/ })();
1003 /******/
1004 /******/ /* webpack/runtime/hasOwnProperty shorthand */
1005 /******/ (() => {
1006 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
1007 /******/ })();
1008 /******/
1009 /******/ /* webpack/runtime/make namespace object */
1010 /******/ (() => {
1011 /******/ // define __esModule on exports
1012 /******/ __webpack_require__.r = (exports) => {
1013 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1014 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1015 /******/ }
1016 /******/ Object.defineProperty(exports, '__esModule', { value: true });
1017 /******/ };
1018 /******/ })();
1019 /******/
1020 /************************************************************************/
1021 var __webpack_exports__ = {};
1022 // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
1023 (() => {
1024 /*!********************************************!*\
1025 !*** ./frontend/conditional.block/main.js ***!
1026 \********************************************/
1027 __webpack_require__.r(__webpack_exports__);
1028 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/conditional.block/functions.js");
1029 /* harmony import */ var _ConditionalBlock__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConditionalBlock */ "./frontend/conditional.block/ConditionalBlock.js");
1030 /* harmony import */ var _ConditionItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ConditionItem */ "./frontend/conditional.block/ConditionItem.js");
1031 /* harmony import */ var _ConditionsList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ConditionsList */ "./frontend/conditional.block/ConditionsList.js");
1032 var _window$JetFormBuilde;
1033
1034
1035
1036
1037 const {
1038 addAction
1039 } = JetPlugins.hooks;
1040 addAction('jet.fb.observe.after', 'jet-form-builder/conditional-block', function (observable) {
1041 for (const node of observable.rootNode.querySelectorAll(`[data-jfb-conditional]`)) {
1042 (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createConditionalBlock)(node, observable);
1043 }
1044 }, 20);
1045 addAction('jet.fb.input.makeReactive', 'jet-form-builder/conditional-block', function (input) {
1046 input.checker = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createChecker)(input);
1047 });
1048 addAction('jet.fb.conditional.block.runFunction', 'jet-form-builder/conditional-block',
1049 /**
1050 * @param funcName
1051 * @param result
1052 * @param conditionalBlock {ConditionalBlock}
1053 */
1054 function (funcName, result, conditionalBlock) {
1055 if ('setCssClass' !== funcName || !conditionalBlock.settings?.className) {
1056 return;
1057 }
1058 conditionalBlock.node.classList.toggle(conditionalBlock.settings.className, result);
1059 });
1060 window.JetFormBuilderAbstract = {
1061 ...((_window$JetFormBuilde = window.JetFormBuilderAbstract) !== null && _window$JetFormBuilde !== void 0 ? _window$JetFormBuilde : {}),
1062 ConditionItem: _ConditionItem__WEBPACK_IMPORTED_MODULE_2__["default"],
1063 ConditionalBlock: _ConditionalBlock__WEBPACK_IMPORTED_MODULE_1__["default"],
1064 createConditionalBlock: _functions__WEBPACK_IMPORTED_MODULE_0__.createConditionalBlock,
1065 createChecker: _functions__WEBPACK_IMPORTED_MODULE_0__.createChecker,
1066 ConditionsList: _ConditionsList__WEBPACK_IMPORTED_MODULE_3__["default"]
1067 };
1068 })();
1069
1070 /******/ })()
1071 ;
1072 //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQvY29uZGl0aW9uYWwuYmxvY2suanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFJQTs7Ozs7Ozs7Ozs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ25HQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7OztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUN4QkE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUN6Q0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUN0WEE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUM3RkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFJQTs7Ozs7Ozs7Ozs7Ozs7O0FDOUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTs7Ozs7Ozs7Ozs7Ozs7O0FDaENBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBVUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7Ozs7OztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9jb25kaXRpb25hbC5ibG9jay9DYWxjdWxhdGVkRmllbGRDaGVja2VyLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2NvbmRpdGlvbmFsLmJsb2NrL0NvbmRpdGlvbkNoZWNrZXIuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvY29uZGl0aW9uYWwuYmxvY2svQ29uZGl0aW9uRmllbGRJdGVtLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2NvbmRpdGlvbmFsLmJsb2NrL0NvbmRpdGlvbkl0ZW0uanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvY29uZGl0aW9uYWwuYmxvY2svQ29uZGl0aW9uUmVuZGVyU3RhdGVJdGVtLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2NvbmRpdGlvbmFsLmJsb2NrL0NvbmRpdGlvbmFsQmxvY2suanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvY29uZGl0aW9uYWwuYmxvY2svQ29uZGl0aW9uc0Jsb2NrTGlzdC5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9jb25kaXRpb25hbC5ibG9jay9Db25kaXRpb25zTGlzdC5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9jb25kaXRpb25hbC5ibG9jay9EYXRlVGltZUNvbmRpdGlvbkNoZWNrZXIuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvY29uZGl0aW9uYWwuYmxvY2svTXVsdGlwbGVDb25kaXRpb25DaGVja2VyLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2NvbmRpdGlvbmFsLmJsb2NrL09yT3BlcmF0b3JJdGVtLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2NvbmRpdGlvbmFsLmJsb2NrL2Z1bmN0aW9ucy5qcyIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9jb25kaXRpb25hbC5ibG9jay9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb25kaXRpb25DaGVja2VyIGZyb20gJy4vQ29uZGl0aW9uQ2hlY2tlcic7XG5cbmZ1bmN0aW9uIENhbGN1bGF0ZWRGaWVsZENoZWNrZXIoKSB7XG5cdENvbmRpdGlvbkNoZWNrZXIuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRcdHJldHVybiAnY2FsY3VsYXRlZCcgPT09IGlucHV0LmlucHV0VHlwZTtcblx0fTtcblxuXHQvKipcblx0ICogQHBhcmFtIGNvbmRpdGlvbiB7Q29uZGl0aW9uRmllbGRJdGVtfVxuXHQgKiBAcGFyYW0gaW5wdXQgICAgIHtJbnB1dERhdGF9XG5cdCAqL1xuXHR0aGlzLmNoZWNrID0gZnVuY3Rpb24gKCBjb25kaXRpb24sIGlucHV0ICkge1xuXHRcdGNvbnN0IGN1cnJlbnQgICAgICAgID0gaW5wdXQuY2FsY1ZhbHVlO1xuXHRcdGNvbnN0IGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLnZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuY2hlY2tSYXcoIGNvbmRpdGlvbi5vcGVyYXRvciwgY3VycmVudCwgY29uZGl0aW9uVmFsdWUgKTtcblx0fTtcbn1cblxuQ2FsY3VsYXRlZEZpZWxkQ2hlY2tlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFxuXHRDb25kaXRpb25DaGVja2VyLnByb3RvdHlwZSxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IENhbGN1bGF0ZWRGaWVsZENoZWNrZXI7IiwiY29uc3Qge1xuXHQgICAgICBpc0VtcHR5LFxuICAgICAgfSA9IEpldEZvcm1CdWlsZGVyRnVuY3Rpb25zO1xuXG5mdW5jdGlvbiBDb25kaXRpb25DaGVja2VyKCkge1xuXHR0aGlzLm9wZXJhdG9ycyA9IHRoaXMuZ2V0T3BlcmF0b3JzKCk7XG59XG5cbkNvbmRpdGlvbkNoZWNrZXIucHJvdG90eXBlID0ge1xuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGlzU3VwcG9ydGVkOiAoKSA9PiB0cnVlLFxuXHRvcGVyYXRvcnM6IHt9LFxuXHRnZXRPcGVyYXRvcnMgKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRlcXVhbDogKCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApID0+IGN1cnJlbnQgPT09XG5cdFx0XHRcdGNvbmRpdGlvblZhbHVlWyAwIF0sXG5cdFx0XHRlbXB0eTogKCBjdXJyZW50ICkgPT4gaXNFbXB0eSggY3VycmVudCApLFxuXHRcdFx0Z3JlYXRlcjogKCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApID0+ICsoXG5cdFx0XHRcdGN1cnJlbnRcblx0XHRcdCkgPiArKFxuXHRcdFx0XHRjb25kaXRpb25WYWx1ZVsgMCBdXG5cdFx0XHQpLFxuXHRcdFx0Z3JlYXRlcl9vcl9lcTogKCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApID0+ICsoXG5cdFx0XHRcdGN1cnJlbnRcblx0XHRcdCkgPj0gKyhcblx0XHRcdFx0Y29uZGl0aW9uVmFsdWVbIDAgXVxuXHRcdFx0KSxcblx0XHRcdGxlc3M6ICggY3VycmVudCwgY29uZGl0aW9uVmFsdWUgKSA9PiArKFxuXHRcdFx0XHRjdXJyZW50XG5cdFx0XHQpIDwgKyhcblx0XHRcdFx0Y29uZGl0aW9uVmFsdWVbIDAgXVxuXHRcdFx0KSxcblx0XHRcdGxlc3Nfb3JfZXE6ICggY3VycmVudCwgY29uZGl0aW9uVmFsdWUgKSA9PiArKFxuXHRcdFx0XHRjdXJyZW50XG5cdFx0XHQpIDw9ICsoXG5cdFx0XHRcdGNvbmRpdGlvblZhbHVlWyAwIF1cblx0XHRcdCksXG5cdFx0XHRiZXR3ZWVuOiAoIGN1cnJlbnQsIGNvbmRpdGlvblZhbHVlICkgPT4ge1xuXHRcdFx0XHRpZiAoICFjb25kaXRpb25WYWx1ZT8ubGVuZ3RoIHx8IG51bGwgPT09IGN1cnJlbnQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRjb25kaXRpb25WYWx1ZVsgMCBdIDw9ICtjdXJyZW50ICYmXG5cdFx0XHRcdFx0K2N1cnJlbnQgPD0gY29uZGl0aW9uVmFsdWVbIDEgXVxuXHRcdFx0XHQpO1xuXHRcdFx0fSxcblx0XHRcdG9uZV9vZjogKCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApID0+IHtcblx0XHRcdFx0aWYgKCAhY29uZGl0aW9uVmFsdWU/Lmxlbmd0aCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMCA8PSBjb25kaXRpb25WYWx1ZS5pbmRleE9mKCBjdXJyZW50ICk7XG5cdFx0XHR9LFxuXHRcdFx0Y29udGFpbjogKCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApID0+IHtcblx0XHRcdFx0aWYgKCAhY3VycmVudCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIDAgPD0gY3VycmVudC5pbmRleE9mKCBjb25kaXRpb25WYWx1ZVsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0gY29uZGl0aW9uIHtDb25kaXRpb25GaWVsZEl0ZW19XG5cdCAqIEBwYXJhbSBpbnB1dCAgICAge0lucHV0RGF0YX1cblx0ICovXG5cdGNoZWNrICggY29uZGl0aW9uLCBpbnB1dCApIHtcblx0XHRjb25zdCBjdXJyZW50ICAgICAgICA9IGlucHV0LnZhbHVlLmN1cnJlbnQ7XG5cdFx0Y29uc3QgY29uZGl0aW9uVmFsdWUgPSBjb25kaXRpb24udmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcy5jaGVja1JhdyggY29uZGl0aW9uLm9wZXJhdG9yLCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApO1xuXHR9LFxuXHRjaGVja1JhdyAoIG9wZXJhdG9yLCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZSApIHtcblx0XHRpZiAoIHRoaXMub3BlcmF0b3JzLmhhc093blByb3BlcnR5KCBvcGVyYXRvciApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMub3BlcmF0b3JzWyBvcGVyYXRvciBdKFxuXHRcdFx0XHRjdXJyZW50LFxuXHRcdFx0XHRjb25kaXRpb25WYWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKCAwICE9PSBvcGVyYXRvci5pbmRleE9mKCAnbm90XycgKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCBvcGVyYXRvck5hbWUgPSBvcGVyYXRvci5zbGljZSggNCApO1xuXG5cdFx0aWYgKCAhdGhpcy5vcGVyYXRvcnMuaGFzT3duUHJvcGVydHkoIG9wZXJhdG9yTmFtZSApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiAhdGhpcy5vcGVyYXRvcnNbIG9wZXJhdG9yTmFtZSBdKFxuXHRcdFx0Y3VycmVudCxcblx0XHRcdGNvbmRpdGlvblZhbHVlLFxuXHRcdCk7XG5cdH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb25kaXRpb25DaGVja2VyOyIsImltcG9ydCBDb25kaXRpb25JdGVtIGZyb20gJy4vQ29uZGl0aW9uSXRlbSc7XG5cbmNvbnN0IHsgQ2FsY3VsYXRlZEZvcm11bGEgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmZ1bmN0aW9uIENvbmRpdGlvbkZpZWxkSXRlbSgpIHtcblx0Q29uZGl0aW9uSXRlbS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblx0XHRyZXR1cm4gISFvcHRpb25zPy5maWVsZD8ubGVuZ3RoO1xuXHR9O1xuXHR0aGlzLm9ic2VydmUgICAgID0gZnVuY3Rpb24gKCkge1xuXHRcdGNvbnN0IGlucHV0ICAgICAgID0gdGhpcy5nZXRJbnB1dCgpO1xuXHRcdHRoaXMubGlzdC5fZmllbGRzID0gdGhpcy5saXN0Ll9maWVsZHMgPz8gW107XG5cblx0XHRpZiAoICFpbnB1dCB8fCB0aGlzLmxpc3QuX2ZpZWxkcy5pbmNsdWRlcyggdGhpcy5maWVsZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMubGlzdC5fZmllbGRzLnB1c2goIHRoaXMuZmllbGQgKTtcblx0XHRpbnB1dC53YXRjaCggKCkgPT4gdGhpcy5saXN0Lm9uQ2hhbmdlUmVsYXRlZCgpICk7XG5cdH07XG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtJbnB1dERhdGF8Ym9vbGVhbn1cblx0ICovXG5cdHRoaXMuZ2V0SW5wdXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMubGlzdC5yb290LmdldElucHV0KCB0aGlzLmZpZWxkICk7XG5cdH07XG5cdHRoaXMuaXNJbnB1dEluRE9NID0gZnVuY3Rpb24gKGlucHV0KSB7XG5cdFx0aWYgKCFpbnB1dD8ubm9kZXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qgbm9kZXMgPSBBcnJheS5pc0FycmF5KGlucHV0Lm5vZGVzKVxuXHRcdFx0PyBpbnB1dC5ub2Rlc1xuXHRcdFx0OiBPYmplY3QudmFsdWVzKGlucHV0Lm5vZGVzKTtcblx0XHRyZXR1cm4gbm9kZXMuc29tZShub2RlID0+IG5vZGUgJiYgZG9jdW1lbnQuY29udGFpbnMobm9kZSkpO1xuXG5cdH07XG5cdHRoaXMuaXNQYXNzZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgaW5wdXQgPSB0aGlzLmdldElucHV0KCk7XG5cdFx0aWYgKCFpbnB1dCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuaXNJbnB1dEluRE9NKGlucHV0KSkge1xuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBpbnB1dC5jaGVja2VyLmNoZWNrKHRoaXMsIGlucHV0KTtcblx0fTtcblx0dGhpcy5zZXRPcHRpb25zID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdHRoaXMuZmllbGQgICAgICAgID0gb3B0aW9ucy5maWVsZDtcblx0XHR0aGlzLm9wZXJhdG9yICAgICA9IG9wdGlvbnMub3BlcmF0b3I7XG5cdFx0dGhpcy5yZW5kZXJfc3RhdGUgPSBvcHRpb25zLnJlbmRlcl9zdGF0ZTtcblx0XHR0aGlzLnVzZV9wcmVzZXQgICA9IG9wdGlvbnMudXNlX3ByZXNldDtcblx0XHRsZXQgdmFsdWUgICAgICAgICA9IG9wdGlvbnM/LnZhbHVlO1xuXG5cdFx0aWYgKCAhQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdHZhbHVlID0gdmFsdWUuc3BsaXQoICcsJyApLm1hcCggaXRlbSA9PiBpdGVtLnRyaW0oKSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy51c2VfcHJlc2V0ICkge1xuXHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy52YWx1ZSA9IHt9O1xuXG5cdFx0Zm9yICggY29uc3QgWyBpbmRleCwgZm9ybXVsYSBdIG9mIE9iamVjdC5lbnRyaWVzKCB2YWx1ZSApICkge1xuXHRcdFx0Y29uc3QgY3VycmVudCA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggdGhpcy5saXN0LnJvb3QgKTtcblxuXHRcdFx0Y3VycmVudC5vYnNlcnZlKCBmb3JtdWxhICk7XG5cdFx0XHRjdXJyZW50LnNldFJlc3VsdCA9ICgpID0+IHtcblx0XHRcdFx0dGhpcy52YWx1ZVsgaW5kZXggXSA9ICcnICsgY3VycmVudC5jYWxjdWxhdGUoKTtcblx0XHRcdFx0dGhpcy5saXN0Lm9uQ2hhbmdlUmVsYXRlZCgpO1xuXHRcdFx0fTtcblx0XHRcdGN1cnJlbnQuc2V0UmVzdWx0KCk7XG5cdFx0fVxuXG5cdFx0dGhpcy52YWx1ZSA9IE9iamVjdC52YWx1ZXMoIHRoaXMudmFsdWUgKTtcblx0fTtcbn1cblxuQ29uZGl0aW9uRmllbGRJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbmRpdGlvbkl0ZW0ucHJvdG90eXBlICk7XG5cbkNvbmRpdGlvbkZpZWxkSXRlbS5wcm90b3R5cGUuZmllbGQgPSBudWxsO1xuLyoqXG4gKiBAdHlwZSB7QXJyYXl9XG4gKi9cbkNvbmRpdGlvbkZpZWxkSXRlbS5wcm90b3R5cGUudmFsdWUgPSBudWxsO1xuLyoqXG4gKiBAdHlwZSB7J2VxdWFsJ3wnZ3JlYXRlcid8J2xlc3MnfCdiZXR3ZWVuJ3wnb25lX29mJ3wnY29udGFpbid9XG4gKi9cbkNvbmRpdGlvbkZpZWxkSXRlbS5wcm90b3R5cGUub3BlcmF0b3IgPSBudWxsO1xuLyoqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqL1xuQ29uZGl0aW9uRmllbGRJdGVtLnByb3RvdHlwZS51c2VfcHJlc2V0ID0gbnVsbDtcblxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uRmllbGRJdGVtOyIsIi8qKlxuICogQHByb3BlcnR5IHtDb25kaXRpb25zTGlzdHxDb25kaXRpb25zQmxvY2tMaXN0fSBsaXN0IFJlbGF0ZWQgbGlzdFxuICovXG5mdW5jdGlvbiBDb25kaXRpb25JdGVtKCkge1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbkNvbmRpdGlvbkl0ZW0ucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRyZXR1cm4gZmFsc2U7XG59O1xuQ29uZGl0aW9uSXRlbS5wcm90b3R5cGUub2JzZXJ2ZSAgICAgPSBmdW5jdGlvbiAoKSB7XG59O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5Db25kaXRpb25JdGVtLnByb3RvdHlwZS5zZXRPcHRpb25zICA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcbn07XG5Db25kaXRpb25JdGVtLnByb3RvdHlwZS5pc1Bhc3NlZCAgICA9IGZ1bmN0aW9uICgpIHtcblx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdCdZb3UgbXVzdCBwcm92aWRlIENvbmRpdGlvbkl0ZW06OmlzUGFzc2VkIGZ1bmN0aW9uJyxcblx0KTtcbn07XG5Db25kaXRpb25JdGVtLnByb3RvdHlwZS5zZXRMaXN0ICAgICA9IGZ1bmN0aW9uICggbGlzdCApIHtcblx0dGhpcy5saXN0ID0gbGlzdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbmRpdGlvbkl0ZW07IiwiaW1wb3J0IENvbmRpdGlvbkl0ZW0gZnJvbSAnLi9Db25kaXRpb25JdGVtJztcblxuZnVuY3Rpb24gQ29uZGl0aW9uUmVuZGVyU3RhdGVJdGVtKCkge1xuXHRDb25kaXRpb25JdGVtLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdHJldHVybiAncmVuZGVyX3N0YXRlJyA9PT0gb3B0aW9ucz8ub3BlcmF0b3I7XG5cdH07XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge0lucHV0RGF0YX1cblx0ICovXG5cdHRoaXMuZ2V0SW5wdXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMubGlzdC5yb290LmdldElucHV0KCAnX2pmYl9jdXJyZW50X3JlbmRlcl9zdGF0ZXMnICk7XG5cdH07XG5cblx0dGhpcy5vYnNlcnZlID0gZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMuZ2V0SW5wdXQoKS53YXRjaCggKCkgPT4gdGhpcy5saXN0Lm9uQ2hhbmdlUmVsYXRlZCgpICk7XG5cdH07XG5cblx0dGhpcy5zZXRPcHRpb25zID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdHRoaXMucmVuZGVyX3N0YXRlID0gb3B0aW9ucy5yZW5kZXJfc3RhdGUgPz8gW107XG5cdH07XG5cblx0dGhpcy5pc1Bhc3NlZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCB7IHZhbHVlIH0gPSB0aGlzLmdldElucHV0KCk7XG5cblx0XHRpZiAoICF2YWx1ZS5jdXJyZW50Py5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyX3N0YXRlLnNvbWUoIGN1cnJlbnQgPT4ge1xuXHRcdFx0cmV0dXJuIHZhbHVlLmN1cnJlbnQuaW5jbHVkZXMoIGN1cnJlbnQgKTtcblx0XHR9ICk7XG5cdH07XG59XG5cbkNvbmRpdGlvblJlbmRlclN0YXRlSXRlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb25kaXRpb25JdGVtLnByb3RvdHlwZSApO1xuXG5Db25kaXRpb25SZW5kZXJTdGF0ZUl0ZW0ucHJvdG90eXBlLnJlbmRlcl9zdGF0ZSA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBDb25kaXRpb25SZW5kZXJTdGF0ZUl0ZW07IiwiaW1wb3J0IENvbmRpdGlvbnNCbG9ja0xpc3QgZnJvbSAnLi9Db25kaXRpb25zQmxvY2tMaXN0JztcblxuY29uc3Qge1xuXHRkb0FjdGlvbixcbn0gPSBKZXRQbHVnaW5zLmhvb2tzO1xuY29uc3Qge1xuXHRSZWFjdGl2ZVZhcixcbn0gPSBKZXRGb3JtQnVpbGRlckFic3RyYWN0O1xuY29uc3Qge1xuXHR2YWxpZGF0ZUlucHV0c0FsbCxcbn0gPSBKZXRGb3JtQnVpbGRlckZ1bmN0aW9ucztcblxuY29uc3QgX19yZUluaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG5cbmZ1bmN0aW9uIENvbmRpdGlvbmFsQmxvY2sobm9kZSwgb2JzZXJ2YWJsZSkge1xuXHR0aGlzLm5vZGUgPSBub2RlO1xuXHRub2RlLmpmYkNvbmRpdGlvbmFsID0gdGhpcztcblx0LyoqXG5cdCAqIEB0eXBlIHtPYnNlcnZhYmxlfVxuXHQgKi9cblx0dGhpcy5yb290ID0gb2JzZXJ2YWJsZTtcblx0dGhpcy5pc09ic2VydmVkID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtDb25kaXRpb25zQmxvY2tMaXN0fVxuXHQgKi9cblx0dGhpcy5saXN0ID0gbnVsbDtcblxuXHQvKipcblx0ICogQHR5cGUge3N0cmluZyB8IE9iamVjdH1cblx0ICovXG5cdHRoaXMuZnVuY3Rpb24gPSBudWxsO1xuXHR0aGlzLnNldHRpbmdzID0gbnVsbDtcblxuXHQvKipcblx0ICogQHR5cGUge1BhZ2VTdGF0ZX1cblx0ICovXG5cdHRoaXMucGFnZSA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtNdWx0aVN0ZXBTdGF0ZX1cblx0ICovXG5cdHRoaXMubXVsdGlzdGVwID0gbnVsbDtcblxuXHQvKipcblx0ICogQHR5cGUge05vZGV9XG5cdCAqL1xuXHR0aGlzLmNvbW1lbnQgPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBAdHlwZSB7SW5wdXREYXRhW119XG5cdCAqL1xuXHR0aGlzLmlucHV0cyA9IFtdO1xuXG5cdHRoaXMuaXNSaWdodCA9IG5ldyBSZWFjdGl2ZVZhcihudWxsKTtcblx0dGhpcy5pc1JpZ2h0Lm1ha2UoKTtcblxuXHR0aGlzLnNldENvbmRpdGlvbnMoKTtcblx0dGhpcy5zZXRJbnB1dHMoKTtcblx0dGhpcy5zZXRGdW5jdGlvbigpO1xuXG5cdGlmICghd2luZG93Py5KZXRGb3JtQnVpbGRlclNldHRpbmdzPy5kZXZtb2RlKSB7XG5cdFx0ZGVsZXRlIHRoaXMubm9kZS5kYXRhc2V0LmpmYkNvbmRpdGlvbmFsO1xuXHRcdGRlbGV0ZSB0aGlzLm5vZGUuZGF0YXNldC5qZmJGdW5jO1xuXHR9XG5cblx0ZG9BY3Rpb24oJ2pldC5mYi5jb25kaXRpb25hbC5pbml0JywgdGhpcyk7XG59XG5cbkNvbmRpdGlvbmFsQmxvY2sucHJvdG90eXBlID0ge1xuXHRzZXRDb25kaXRpb25zKCkge1xuXHRcdGNvbnN0IHsgamZiQ29uZGl0aW9uYWwgfSA9IHRoaXMubm9kZS5kYXRhc2V0O1xuXG5cdFx0dGhpcy5saXN0ID0gbmV3IENvbmRpdGlvbnNCbG9ja0xpc3QoamZiQ29uZGl0aW9uYWwsIHRoaXMucm9vdCk7XG5cdFx0dGhpcy5saXN0LmJsb2NrID0gdGhpcztcblxuXHRcdHRoaXMubGlzdC5vbkNoYW5nZVJlbGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHR0aGlzLmlzUmlnaHQuY3VycmVudCA9IHRoaXMubGlzdC5nZXRSZXN1bHQoKTtcblx0XHR9O1xuXHR9LFxuXHRzZXRJbnB1dHMoKSB7XG5cdFx0dGhpcy5pbnB1dHMgPSBBcnJheS5mcm9tKFxuXHRcdFx0dGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWpmYi1zeW5jXScpLFxuXHRcdCkubWFwKFxuXHRcdFx0aXRlbSA9PiBpdGVtLmpmYlN5bmMsXG5cdFx0KS5maWx0ZXIoXG5cdFx0XHRpdGVtID0+IGl0ZW0sXG5cdFx0KTtcblx0fSxcblx0aW5zZXJ0Q29tbWVudCgpIHtcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3M/LmRvbSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY29tbWVudCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuXG5cdFx0Ly8gaW5zZXJ0IGNvbW1lbnQgYWZ0ZXIgY29uZGl0aW9uYWwgYmxvY2tcblx0XHR0aGlzLm5vZGUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoXG5cdFx0XHR0aGlzLmNvbW1lbnQsXG5cdFx0XHR0aGlzLm5vZGUubmV4dFNpYmxpbmcsXG5cdFx0KTtcblx0fSxcblx0b2JzZXJ2ZSgpIHtcblx0XHRpZiAodGhpcy5pc09ic2VydmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuaXNPYnNlcnZlZCA9IHRydWU7XG5cdFx0dGhpcy5pbnNlcnRDb21tZW50KCk7XG5cblx0XHR0aGlzLmlzUmlnaHQud2F0Y2goKCkgPT4gdGhpcy5ydW5GdW5jdGlvbigpKTtcblx0XHR0aGlzLmlzUmlnaHQud2F0Y2goKCkgPT4gdGhpcy52YWxpZGF0ZUlucHV0cygpKTtcblx0XHR0aGlzLmxpc3Qub2JzZXJ2ZSgpO1xuXHR9LFxuXHRydW5GdW5jdGlvbigpIHtcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmlzUmlnaHQuY3VycmVudDtcblxuXHRcdHN3aXRjaCAodGhpcy5mdW5jdGlvbikge1xuXHRcdFx0Y2FzZSAnc2hvdyc6XG5cdFx0XHRcdHRoaXMuc2hvd0Jsb2NrKHJlc3VsdCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnaGlkZSc6XG5cdFx0XHRcdHRoaXMuc2hvd0Jsb2NrKCFyZXN1bHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2Rpc2FibGUnOlxuXHRcdFx0XHR0aGlzLmRpc2FibGVCbG9jayhyZXN1bHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGRvQWN0aW9uKFxuXHRcdFx0XHRcdCdqZXQuZmIuY29uZGl0aW9uYWwuYmxvY2sucnVuRnVuY3Rpb24nLFxuXHRcdFx0XHRcdHRoaXMuZnVuY3Rpb24sXG5cdFx0XHRcdFx0cmVzdWx0LFxuXHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQ29tcGF0aWJpbGl0eSB3aXRoIFNhdmUgUHJvZ3Jlc3Ncblx0ICogQHNpbmNlIDMuMC4xIGh0dHBzOi8vZ2l0aHViLmNvbS9Dcm9jb2Jsb2NrL2lzc3Vlcy10cmFja2VyL2lzc3Vlcy8yNDgwXG5cdCAqXG5cdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0Nyb2NvYmxvY2svaXNzdWVzLXRyYWNrZXIvaXNzdWVzLzE1NTNcblx0ICovXG5cdHZhbGlkYXRlSW5wdXRzKCkge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dmFsaWRhdGVJbnB1dHNBbGwodGhpcy5pbnB1dHMsIHRydWUpLlxuXHRcdFx0XHR0aGVuKCgpID0+IHsgfSkuXG5cdFx0XHRcdGNhdGNoKCgpID0+IHsgfSk7XG5cdFx0fSk7XG5cdH0sXG5cdHNob3dCbG9jayhyZXN1bHQpIHtcblx0XHR0aGlzLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnamV0LWZvcm0tYnVpbGRlci0taGlkZGVuJyk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncz8uZG9tKSB7XG5cdFx0XHR0aGlzLnNob3dCbG9ja0RvbShyZXN1bHQpO1xuXHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5yZWluaXRDaGlsZHJlbigpKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdqZXQtZm9ybS1idWlsZGVyL2NvbmRpdGlvbmFsLWJsb2NrL2Jsb2NrLXRvZ2dsZS1oaWRkZW4tZG9tJywge1xuXHRcdFx0XHRkZXRhaWw6IHtcblx0XHRcdFx0XHRibG9jazogdGhpcy5ub2RlLFxuXHRcdFx0XHRcdHJlc3VsdDogcmVzdWx0XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHRcdGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5ID0gcmVzdWx0ID8gJ2Jsb2NrJyA6ICdub25lJztcblxuXHRcdGlmIChyZXN1bHQpIHtcblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnJlaW5pdENoaWxkcmVuKCkpO1xuXHRcdH1cblx0fSxcblx0bm90aWZ5SW5wdXRzKCkge1xuXHRcdHRoaXMuaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuXHRcdFx0aW5wdXQudmFsdWU/Lm5vdGlmeT8uKCk7XG5cdFx0fSk7XG5cdH0sXG5cdGNsZWFyQ2hvaWNlSW5wdXRzKCkge1xuXHRcdHRoaXMuaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuXHRcdFx0Y29uc3Qgbm9kZXMgPSBBcnJheS5pc0FycmF5KGlucHV0Lm5vZGVzKVxuXHRcdFx0XHQ/IGlucHV0Lm5vZGVzXG5cdFx0XHRcdDogT2JqZWN0LnZhbHVlcyhpbnB1dC5ub2RlcyA/PyB7fSk7XG5cdFx0XHRjb25zdCBpc0Nob2ljZUlucHV0ID0gbm9kZXMuc29tZShub2RlID0+IHtcblx0XHRcdFx0aWYgKCFub2RlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0J1NFTEVDVCcgPT09IG5vZGUudGFnTmFtZSB8fFxuXHRcdFx0XHRcdCdjaGVja2JveCcgPT09IG5vZGUudHlwZSB8fFxuXHRcdFx0XHRcdCdyYWRpbycgPT09IG5vZGUudHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoIWlzQ2hvaWNlSW5wdXQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aW5wdXQub25DbGVhcj8uKCk7XG5cdFx0XHRpbnB1dC52YWx1ZT8ubm90aWZ5Py4oKTtcblx0XHR9KTtcblx0fSxcblx0c2hvd0Jsb2NrRG9tKHJlc3VsdCkge1xuXHRcdGNvbnN0IGlucHV0c0xpc3QgPSB0aGlzLnJvb3QuZGF0YUlucHV0cztcblx0XHRpZiAoIXJlc3VsdCkge1xuXHRcdFx0dGhpcy5jbGVhckNob2ljZUlucHV0cygpO1xuXHRcdFx0dGhpcy5ub2RlLnJlbW92ZSgpO1xuXHRcdFx0dGhpcy5ub3RpZnlJbnB1dHMoKTtcblx0XHRcdHRoaXMucmVDYWxjdWxhdGVGaWVsZHMoaW5wdXRzTGlzdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuY29tbWVudC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLm5vZGUsIHRoaXMuY29tbWVudCk7XG5cdFx0dGhpcy5ub3RpZnlJbnB1dHMoKTtcblx0XHR0aGlzLnJlQ2FsY3VsYXRlRmllbGRzKGlucHV0c0xpc3QpO1xuXHR9LFxuXHRkaXNhYmxlQmxvY2socmVzdWx0KSB7XG5cdFx0dGhpcy5ub2RlLmRpc2FibGVkID0gcmVzdWx0O1xuXHR9LFxuXHRzZXRGdW5jdGlvbigpIHtcblx0XHR0aGlzLmZ1bmN0aW9uID0gdGhpcy5ub2RlLmRhdGFzZXQuamZiRnVuYztcblxuXHRcdGxldCBwYXJzZWQ7XG5cdFx0dHJ5IHtcblx0XHRcdHBhcnNlZCA9IEpTT04ucGFyc2UodGhpcy5mdW5jdGlvbik7XG5cdFx0fVxuXHRcdGNhdGNoIChlcnJvcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBbW25hbWUsIHNldHRpbmdzXV0gPSBPYmplY3QuZW50cmllcyhwYXJzZWQpO1xuXG5cdFx0dGhpcy5mdW5jdGlvbiA9IG5hbWU7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXHR9LFxuXHRyZWluaXRDaGlsZHJlbigpIHtcblx0XHRjb25zdCByb290ID0gdGhpcy5yb290O1xuXHRcdGNvbnN0IHNjb3BlID0gdGhpcy5ub2RlO1xuXG5cdFx0Y29uc3Qgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1qZmItY29uZGl0aW9uYWxdW2RhdGEtamZiLWZ1bmNdJyk7XG5cdFx0bm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0aWYgKG5vZGUuamZiQ29uZGl0aW9uYWwgfHwgX19yZUluaXRlZC5oYXMobm9kZSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBuZXcgQ29uZGl0aW9uYWxCbG9jayhub2RlLCByb290KTtcblx0XHRcdFx0Y2hpbGQub2JzZXJ2ZSgpO1xuXHRcdFx0XHRjaGlsZC5pc1JpZ2h0LmN1cnJlbnQgPSBjaGlsZC5saXN0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRfX3JlSW5pdGVkLmFkZChub2RlKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdyZWluaXRDaGlsZHJlbjogaW5pdCBmYWlsZWQnLCBlLCBub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogUmVjYWxjdWxhdGlvbiBvZiBmb3JtdWxhc1xuXHQgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRzTGlzdCAtIExpc3Qgb2YgZmllbGRzXG5cdCAqL1xuXHRyZUNhbGN1bGF0ZUZpZWxkcyhpbnB1dHNMaXN0KSB7XG5cdFx0Ly8gR2V0IG9ubHkgZmllbGRzIHRoYXQgYXJlIGluIHRoZSBjdXJyZW50IGJsb2NrXG5cdFx0Y29uc3QgYWZmZWN0ZWRGaWVsZHMgPSB0aGlzLmdldEFmZmVjdGVkRmllbGRzKGlucHV0c0xpc3QpO1xuXG5cdFx0Ly8gQ2FjaGUgZm9yIHZpc2liaWxpdHkgY2hlY2tzXG5cdFx0Y29uc3QgdmlzaWJpbGl0eUNhY2hlID0gbmV3IE1hcCgpO1xuXG5cdFx0YWZmZWN0ZWRGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuXHRcdFx0aWYgKGlucHV0c0xpc3Rba2V5XSAmJiBpbnB1dHNMaXN0W2tleV0uZm9ybXVsYSkge1xuXHRcdFx0XHRjb25zdCBmaWVsZE5vZGUgPSBpbnB1dHNMaXN0W2tleV0ubm9kZXM/LlswXTtcblxuXHRcdFx0XHQvLyBVc2UgY2FjaGUgZm9yIHZpc2liaWxpdHkgY2hlY2tzXG5cdFx0XHRcdGxldCBzaG91bGRSZWNhbGN1bGF0ZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoZmllbGROb2RlKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2FjaGVLZXkgPSBmaWVsZE5vZGU7XG5cdFx0XHRcdFx0aWYgKCF2aXNpYmlsaXR5Q2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNWaXNpYmxlID0gdGhpcy5pc0ZpZWxkVmlzaWJsZShmaWVsZE5vZGUpO1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNJbkRPTSA9IGRvY3VtZW50LmNvbnRhaW5zKGZpZWxkTm9kZSk7XG5cdFx0XHRcdFx0XHR2aXNpYmlsaXR5Q2FjaGUuc2V0KGNhY2hlS2V5LCBpc1Zpc2libGUgfHwgaXNJbkRPTSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNob3VsZFJlY2FsY3VsYXRlID0gdmlzaWJpbGl0eUNhY2hlLmdldChjYWNoZUtleSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2hvdWxkUmVjYWxjdWxhdGUpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0aW5wdXRzTGlzdFtrZXldLnJlQ2FsY3VsYXRlRm9ybXVsYSgpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oYEVycm9yIHJlY2FsY3VsYXRpbmcgZm9ybXVsYSBmb3IgZmllbGQgJHtrZXl9OmAsIGVycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBpZiBmaWVsZCBpcyB2aXNpYmxlIG9uIHRoZSBwYWdlXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGZpZWxkTm9kZSAtIERPTSBlbGVtZW50IG9mIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIGZpZWxkIGlzIHZpc2libGVcblx0ICovXG5cdGlzRmllbGRWaXNpYmxlKGZpZWxkTm9kZSkge1xuXHRcdGlmICghZmllbGROb2RlKSByZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDaGVjayBpZiBlbGVtZW50IGlzIGluIERPTVxuXHRcdGlmICghZG9jdW1lbnQuY29udGFpbnMoZmllbGROb2RlKSkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gQ2hlY2sgdmlzaWJpbGl0eSBzdHlsZXNcblx0XHRjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZmllbGROb2RlKTtcblxuXHRcdGlmICgnbm9uZScgPT09IGNvbXB1dGVkU3R5bGUuZGlzcGxheSB8fCAnaGlkZGVuJyA9PT0gY29tcHV0ZWRTdHlsZS52aXNpYmlsaXR5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgZWxlbWVudCBpcyBub3QgaGlkZGVuIGJ5IHBhcmVudCBlbGVtZW50c1xuXHRcdGxldCBwYXJlbnQgPSBmaWVsZE5vZGUucGFyZW50RWxlbWVudDtcblxuXHRcdHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG5cdFx0XHRjb25zdCBwYXJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG5cdFx0XHRpZiAoJ25vbmUnID09PSBwYXJlbnRTdHlsZS5kaXNwbGF5IHx8ICdoaWRkZW4nID09PSBwYXJlbnRTdHlsZS52aXNpYmlsaXR5KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHQvKipcblx0ICogR2V0cyBsaXN0IG9mIGZpZWxkcyBhZmZlY3RlZCBieSBjdXJyZW50IGNvbmRpdGlvbmFsIGJsb2NrXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHNMaXN0IC0gTGlzdCBvZiBhbGwgZmllbGRzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gLSBBcnJheSBvZiBhZmZlY3RlZCBmaWVsZCBrZXlzXG5cdCAqL1xuXHRnZXRBZmZlY3RlZEZpZWxkcyhpbnB1dHNMaXN0KSB7XG5cdFx0Y29uc3QgYWZmZWN0ZWRGaWVsZHMgPSBbXTtcblxuXHRcdC8vIEdldCBhbGwgZmllbGRzIGluc2lkZSBjdXJyZW50IGJsb2NrXG5cdFx0Y29uc3QgYmxvY2tGaWVsZHMgPSBBcnJheS5mcm9tKHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1qZmItc3luY10nKSk7XG5cdFx0Y29uc3QgYmxvY2tGaWVsZE5hbWVzID0gbmV3IFNldCgpO1xuXG5cdFx0Ly8gQ29sbGVjdCBmaWVsZCBuYW1lcyBpbnNpZGUgYmxvY2tcblx0XHRibG9ja0ZpZWxkcy5mb3JFYWNoKGZpZWxkTm9kZSA9PiB7XG5cdFx0XHRjb25zdCBmaWVsZE5hbWUgPSBmaWVsZE5vZGUuamZiU3luYz8ubmFtZVxuXHRcdFx0XHQ/PyBmaWVsZE5vZGUuZ2V0QXR0cmlidXRlKCduYW1lJylcblx0XHRcdFx0Pz8gZmllbGROb2RlLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lXScpPy5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblx0XHRcdGlmIChmaWVsZE5hbWUpIHtcblx0XHRcdFx0YmxvY2tGaWVsZE5hbWVzLmFkZChmaWVsZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0T2JqZWN0LmtleXMoaW5wdXRzTGlzdCkuZm9yRWFjaChrZXkgPT4ge1xuXHRcdFx0Y29uc3QgZmllbGQgPSBpbnB1dHNMaXN0W2tleV07XG5cblx0XHRcdGlmICghZmllbGQgfHwgIWZpZWxkLmZvcm11bGEpIHJldHVybjtcblxuXHRcdFx0Y29uc3QgZmllbGROb2RlID0gZmllbGQubm9kZXM/LlswXTtcblx0XHRcdGxldCBzaG91bGRSZWNhbGN1bGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHQvLyAxLiBGaWVsZCBpcyBpbnNpZGUgdGhlIGJsb2NrXG5cdFx0XHRpZiAoZmllbGROb2RlICYmIGJsb2NrRmllbGRzLmluY2x1ZGVzKGZpZWxkTm9kZSkpIHtcblx0XHRcdFx0c2hvdWxkUmVjYWxjdWxhdGUgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyAyLiBGaWVsZCBkZXBlbmRzIG9uIGZpZWxkcyBpbnNpZGUgYmxvY2sgKGNoZWNrIGZvcm11bGEpXG5cdFx0XHRpZiAoIXNob3VsZFJlY2FsY3VsYXRlICYmIGZpZWxkLmZvcm11bGEpIHtcblx0XHRcdFx0YmxvY2tGaWVsZE5hbWVzLmZvckVhY2goYmxvY2tGaWVsZE5hbWUgPT4ge1xuXHRcdFx0XHRcdGlmIChmaWVsZC5mb3JtdWxhLmluY2x1ZGVzKGAlJHtibG9ja0ZpZWxkTmFtZX0lYCkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlY2FsY3VsYXRlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc2hvdWxkUmVjYWxjdWxhdGUpIHtcblx0XHRcdFx0YWZmZWN0ZWRGaWVsZHMucHVzaChrZXkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGFmZmVjdGVkRmllbGRzO1xuXHR9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uYWxCbG9jaztcbiIsImltcG9ydCBDb25kaXRpb25zTGlzdCBmcm9tICcuL0NvbmRpdGlvbnNMaXN0JztcblxuZnVuY3Rpb24gQ29uZGl0aW9uc0Jsb2NrTGlzdCggY29uZGl0aW9ucywgcm9vdCApIHtcblx0Q29uZGl0aW9uc0xpc3QuY2FsbCggdGhpcywgY29uZGl0aW9ucywgcm9vdCApO1xufVxuXG5Db25kaXRpb25zQmxvY2tMaXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbmRpdGlvbnNMaXN0LnByb3RvdHlwZSApO1xuLyoqXG4gKiBAdHlwZSB7Q29uZGl0aW9uYWxCbG9ja31cbiAqL1xuQ29uZGl0aW9uc0Jsb2NrTGlzdC5wcm90b3R5cGUuYmxvY2sgPSBudWxsO1xuXG5leHBvcnQgZGVmYXVsdCBDb25kaXRpb25zQmxvY2tMaXN0OyIsImltcG9ydCB7IGNyZWF0ZUNvbmRpdGlvbkl0ZW0gfSBmcm9tICcuL2Z1bmN0aW9ucyc7XG5pbXBvcnQgT3JPcGVyYXRvckl0ZW0gZnJvbSAnLi9Pck9wZXJhdG9ySXRlbSc7XG5cbmZ1bmN0aW9uIENvbmRpdGlvbnNMaXN0KCBjb25kaXRpb25zLCByb290ICkge1xuXHR0aGlzLnJvb3QgPSByb290O1xuXHR0aGlzLnNldENvbmRpdGlvbnMoIGNvbmRpdGlvbnMgKTtcbn1cblxuQ29uZGl0aW9uc0xpc3QucHJvdG90eXBlID0ge1xuXHQvKipcblx0ICogQHR5cGUge09ic2VydmFibGV9XG5cdCAqL1xuXHRyb290OiBudWxsLFxuXHRjb25kaXRpb25zOiBbXSxcblx0aW52YWxpZDogW10sXG5cdGdyb3VwczogW10sXG5cdC8qKlxuXHQgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgY2FsbGJhY2suXG5cdCAqIEl0IHVzZWQgaW4gQ29uZGl0aW9uRmllbGRJdGVtLlxuXHQgKlxuXHQgKiBSdW5zIGV2ZXJ5IHRpbWUsIHdoZW4gY29uZGl0aW9ucyBpcyBtYXRjaFxuXHQgKi9cblx0b25DaGFuZ2VSZWxhdGVkKCkge1xuXHRcdGlmICggIXRoaXMuZ2V0UmVzdWx0KCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMub25NYXRjaENvbmRpdGlvbnMoKTtcblx0fSxcblx0b25NYXRjaENvbmRpdGlvbnMoKSB7fSxcblx0b2JzZXJ2ZSgpIHtcblx0XHRmb3IgKCBjb25zdCBjb25kaXRpb24gb2YgdGhpcy5nZXRDb25kaXRpb25zKCkgKSB7XG5cdFx0XHRjb25kaXRpb24ub2JzZXJ2ZSgpO1xuXHRcdH1cblx0fSxcblx0c2V0Q29uZGl0aW9ucyggY29uZGl0aW9ucyApIHtcblx0XHRpZiAoICdzdHJpbmcnID09PSB0eXBlb2YgY29uZGl0aW9ucyApIHtcblx0XHRcdGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKCBjb25kaXRpb25zICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucy5tYXAoXG5cdFx0XHRpdGVtID0+IGNyZWF0ZUNvbmRpdGlvbkl0ZW0oIGl0ZW0sIHRoaXMgKSxcblx0XHQpLmZpbHRlciggaXRlbSA9PiBpdGVtICk7XG5cblx0XHRjb25zdCBncm91cHMgICA9IHt9O1xuXHRcdGxldCBncm91cEluZGV4ID0gMDtcblxuXHRcdGZvciAoIGNvbnN0IGNvbmRpdGlvbiBvZiB0aGlzLmdldENvbmRpdGlvbnMoKSApIHtcblx0XHRcdGlmICggY29uZGl0aW9uIGluc3RhbmNlb2YgT3JPcGVyYXRvckl0ZW0gKSB7XG5cdFx0XHRcdGdyb3VwSW5kZXgrKztcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGdyb3Vwc1sgZ3JvdXBJbmRleCBdID0gZ3JvdXBzWyBncm91cEluZGV4IF0gPz8gW107XG5cdFx0XHRncm91cHNbIGdyb3VwSW5kZXggXS5wdXNoKCBjb25kaXRpb24gKTtcblx0XHR9XG5cblx0XHR0aGlzLmdyb3VwcyA9IE9iamVjdC52YWx1ZXMoIGdyb3VwcyApO1xuXHR9LFxuXHRnZXRSZXN1bHQoKSB7XG5cdFx0dGhpcy5pbnZhbGlkID0gW107XG5cblx0XHRpZiAoICF0aGlzLmdyb3Vwcy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKCBjb25zdCBncm91cCBvZiB0aGlzLmdyb3VwcyApIHtcblx0XHRcdGlmICggdGhpcy5pc1ZhbGlkR3JvdXAoIGdyb3VwICkgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0aXNWYWxpZEdyb3VwKCBjb25kaXRpb25zR3JvdXAgKSB7XG5cdFx0Zm9yICggY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnNHcm91cCApIHtcblx0XHRcdGlmICggY29uZGl0aW9uLmlzUGFzc2VkKCkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5pbnZhbGlkLnB1c2goIGNvbmRpdGlvbiApO1xuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtBcnJheTxDb25kaXRpb25GaWVsZEl0ZW0gfCBDb25kaXRpb25QYWdlU3RhdGVJdGVtPn1cblx0ICovXG5cdGdldENvbmRpdGlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uZGl0aW9ucztcblx0fSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbmRpdGlvbnNMaXN0OyIsImltcG9ydCBDb25kaXRpb25DaGVja2VyIGZyb20gJy4vQ29uZGl0aW9uQ2hlY2tlcic7XG5cbmNvbnN0IHtcblx0ICAgICAgZ2V0VGltZXN0YW1wLFxuICAgICAgfSA9IEpldEZvcm1CdWlsZGVyRnVuY3Rpb25zO1xuY29uc3Qge1xuXHQgICAgICBNaW5fSW5fU2VjLFxuXHQgICAgICBNaWxsaV9Jbl9TZWMsXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJDb25zdDtcblxuY29uc3Qgb2Zmc2V0ID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG5mdW5jdGlvbiBEYXRlVGltZUNvbmRpdGlvbkNoZWNrZXIoKSB7XG5cdENvbmRpdGlvbkNoZWNrZXIuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRcdGNvbnN0IFsgbm9kZSBdID0gaW5wdXQubm9kZXM7XG5cblx0XHRyZXR1cm4gWyAnZGF0ZScsICd0aW1lJywgJ2RhdGV0aW1lLWxvY2FsJyBdLmluY2x1ZGVzKCBub2RlLnR5cGUgKTtcblx0fTtcblxuXHQvKipcblx0ICogQHBhcmFtIGNvbmRpdGlvbiB7Q29uZGl0aW9uRmllbGRJdGVtfVxuXHQgKiBAcGFyYW0gaW5wdXQgICAgIHtJbnB1dERhdGF9XG5cdCAqL1xuXHR0aGlzLmNoZWNrID0gZnVuY3Rpb24gKCBjb25kaXRpb24sIGlucHV0ICkge1xuXHRcdGNvbnN0IHsgdGltZTogY3VycmVudCB9ID0gZ2V0VGltZXN0YW1wKCBpbnB1dC52YWx1ZS5jdXJyZW50ICk7XG5cdFx0Y29uc3QgY29uZGl0aW9uVmFsdWUgICAgICA9IGNvbmRpdGlvbi52YWx1ZS5tYXAoIHZhbHVlID0+IHtcblx0XHRcdGNvbnN0IHsgdGltZSwgdHlwZSB9ID0gZ2V0VGltZXN0YW1wKCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoICdudW1iZXInID09PSB0eXBlICYmIGNvbmRpdGlvbi51c2VfcHJlc2V0ICkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG5cdFx0XHRcdHJldHVybiB0aW1lICogTWlsbGlfSW5fU2VjICsgb2Zmc2V0ICogTWluX0luX1NlYztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRpbWU7XG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuY2hlY2tSYXcoIGNvbmRpdGlvbi5vcGVyYXRvciwgY3VycmVudCwgY29uZGl0aW9uVmFsdWUgKTtcblx0fTtcbn1cblxuRGF0ZVRpbWVDb25kaXRpb25DaGVja2VyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXG5cdENvbmRpdGlvbkNoZWNrZXIucHJvdG90eXBlLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVRpbWVDb25kaXRpb25DaGVja2VyOyIsImltcG9ydCBDb25kaXRpb25DaGVja2VyIGZyb20gJy4vQ29uZGl0aW9uQ2hlY2tlcic7XG5cbmZ1bmN0aW9uIE11bHRpcGxlQ29uZGl0aW9uQ2hlY2tlcigpIHtcblx0Q29uZGl0aW9uQ2hlY2tlci5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5vcGVyYXRvcnMub25lX29mID0gKCBjdXJyZW50LCBjb25kaXRpb25WYWx1ZXMgKSA9PiB7XG5cdFx0aWYgKCAhY29uZGl0aW9uVmFsdWVzPy5sZW5ndGggfHwgIWN1cnJlbnQ/Lmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGN1cnJlbnQuc29tZShcblx0XHRcdHZhbCA9PiAtMSAhPT0gY29uZGl0aW9uVmFsdWVzLmluZGV4T2YoIHZhbCApLFxuXHRcdCk7XG5cdH07XG5cblx0dGhpcy5vcGVyYXRvcnMuY29udGFpbiA9ICggY3VycmVudCwgY29uZGl0aW9uVmFsdWVzICkgPT4ge1xuXHRcdGlmICggIWN1cnJlbnQ/Lmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGN1cnJlbnQuc29tZShcblx0XHRcdHZhbCA9PiB2YWwuaW5kZXhPZiggY29uZGl0aW9uVmFsdWVzWyAwIF0gKSAhPT0gLTEsXG5cdFx0KTtcblx0fTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBpbnB1dCApIHtcblx0XHRyZXR1cm4gaW5wdXQuaXNBcnJheSgpO1xuXHR9O1xufVxuXG5NdWx0aXBsZUNvbmRpdGlvbkNoZWNrZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcblx0Q29uZGl0aW9uQ2hlY2tlci5wcm90b3R5cGUsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBNdWx0aXBsZUNvbmRpdGlvbkNoZWNrZXI7XG4iLCJpbXBvcnQgQ29uZGl0aW9uSXRlbSBmcm9tICcuL0NvbmRpdGlvbkl0ZW0nO1xuXG5mdW5jdGlvbiBPck9wZXJhdG9ySXRlbSgpIHtcblx0Q29uZGl0aW9uSXRlbS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b3B0aW9ucy5vcl9vcGVyYXRvciA/PyBmYWxzZVxuXHRcdCk7XG5cdH07XG59XG5cbk9yT3BlcmF0b3JJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbmRpdGlvbkl0ZW0ucHJvdG90eXBlICk7XG5cbmV4cG9ydCBkZWZhdWx0IE9yT3BlcmF0b3JJdGVtOyIsImltcG9ydCBDb25kaXRpb25GaWVsZEl0ZW0gZnJvbSAnLi9Db25kaXRpb25GaWVsZEl0ZW0nO1xuaW1wb3J0IENvbmRpdGlvbmFsQmxvY2sgZnJvbSAnLi9Db25kaXRpb25hbEJsb2NrJztcbmltcG9ydCBDb25kaXRpb25DaGVja2VyIGZyb20gJy4vQ29uZGl0aW9uQ2hlY2tlcic7XG5pbXBvcnQgTXVsdGlwbGVDb25kaXRpb25DaGVja2VyIGZyb20gJy4vTXVsdGlwbGVDb25kaXRpb25DaGVja2VyJztcbmltcG9ydCBPck9wZXJhdG9ySXRlbSBmcm9tICcuL09yT3BlcmF0b3JJdGVtJztcbmltcG9ydCBEYXRlVGltZUNvbmRpdGlvbkNoZWNrZXIgZnJvbSAnLi9EYXRlVGltZUNvbmRpdGlvbkNoZWNrZXInO1xuaW1wb3J0IENvbmRpdGlvblJlbmRlclN0YXRlSXRlbSBmcm9tICcuL0NvbmRpdGlvblJlbmRlclN0YXRlSXRlbSc7XG5pbXBvcnQgQ2FsY3VsYXRlZEZpZWxkQ2hlY2tlciBmcm9tICcuL0NhbGN1bGF0ZWRGaWVsZENoZWNrZXInO1xuXG5jb25zdCB7IGFwcGx5RmlsdGVycyB9ID0gSmV0UGx1Z2lucy5ob29rcztcblxuY29uc3QgZ2V0SXRlbVR5cGVzID0gKCkgPT4gYXBwbHlGaWx0ZXJzKFxuXHQnamV0LmZiLmNvbmRpdGlvbmFsLnR5cGVzJyxcblx0W1xuXHRcdENvbmRpdGlvblJlbmRlclN0YXRlSXRlbSxcblx0XHRPck9wZXJhdG9ySXRlbSxcblx0XHRDb25kaXRpb25GaWVsZEl0ZW0sXG5cdF0sXG4pO1xuLyoqXG4gKiBAdHlwZSB7Q29uZGl0aW9uSXRlbVtdfVxuICovXG5sZXQgaXRlbVR5cGVzICAgICAgPSBbXTtcblxuY29uc3QgZ2V0Q2hlY2tlcnMgPSAoKSA9PiBhcHBseUZpbHRlcnMoXG5cdCdqZXQuZmIuY29uZGl0aW9uYWwuY2hlY2tlcnMnLFxuXHRbXG5cdFx0TXVsdGlwbGVDb25kaXRpb25DaGVja2VyLFxuXHRcdERhdGVUaW1lQ29uZGl0aW9uQ2hlY2tlcixcblx0XHRDYWxjdWxhdGVkRmllbGRDaGVja2VyLFxuXHRcdENvbmRpdGlvbkNoZWNrZXIsXG5cdF0sXG4pO1xuXG5sZXQgY2hlY2tlcnMgPSBbXTtcblxuLyoqXG4gKiBAcGFyYW0gIG9wdGlvbnMge3t9fVxuICogQHBhcmFtICBsaXN0ICAgIHtDb25kaXRpb25zTGlzdH1cbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbmRpdGlvbkl0ZW0oIG9wdGlvbnMsIGxpc3QgKSB7XG5cdGlmICggIWl0ZW1UeXBlcy5sZW5ndGggKSB7XG5cdFx0aXRlbVR5cGVzID0gZ2V0SXRlbVR5cGVzKCk7XG5cdH1cblxuXHRmb3IgKCBjb25zdCBkYXRhVHlwZSBvZiBpdGVtVHlwZXMgKSB7XG5cdFx0LyoqXG5cdFx0ICogQHR5cGUge0NvbmRpdGlvbkl0ZW19XG5cdFx0ICovXG5cdFx0Y29uc3QgY3VycmVudCA9IG5ldyBkYXRhVHlwZSgpO1xuXG5cdFx0aWYgKCAhY3VycmVudC5pc1N1cHBvcnRlZCggb3B0aW9ucyApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGN1cnJlbnQuc2V0TGlzdCggbGlzdCApO1xuXHRcdGN1cnJlbnQuc2V0T3B0aW9ucyggb3B0aW9ucyApO1xuXG5cdFx0cmV0dXJuIGN1cnJlbnQ7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gIG5vZGVcbiAqIEBwYXJhbSAgcm9vdFxuICogQHJldHVybiB7Q29uZGl0aW9uYWxCbG9ja31cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29uZGl0aW9uYWxCbG9jayggbm9kZSwgcm9vdCApIHtcblx0aWYgKCBub2RlLmhhc093blByb3BlcnR5KCAnamZiQ29uZGl0aW9uYWwnICkgKSB7XG5cdFx0cmV0dXJuIG5vZGUuamZiQ29uZGl0aW9uYWw7XG5cdH1cblx0Y29uc3QgYmxvY2sgPSBuZXcgQ29uZGl0aW9uYWxCbG9jayggbm9kZSwgcm9vdCApO1xuXG5cdGJsb2NrLm9ic2VydmUoKTtcblx0YmxvY2subGlzdC5vbkNoYW5nZVJlbGF0ZWQoKTtcblxuXHRyZXR1cm4gYmxvY2s7XG59XG5cbi8qKlxuICogQHBhcmFtIGlucHV0IHtJbnB1dERhdGF9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNoZWNrZXIoIGlucHV0ICkge1xuXHRpZiAoICFjaGVja2Vycy5sZW5ndGggKSB7XG5cdFx0Y2hlY2tlcnMgPSBnZXRDaGVja2VycygpO1xuXHR9XG5cblx0Zm9yICggY29uc3QgY2hlY2tlciBvZiBjaGVja2VycyApIHtcblx0XHRjb25zdCBjdXJyZW50ID0gbmV3IGNoZWNrZXIoKTtcblxuXHRcdGlmICggIWN1cnJlbnQuaXNTdXBwb3J0ZWQoIGlucHV0ICkgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY3VycmVudDtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5leHBvcnQge1xuXHRjcmVhdGVDb25kaXRpb25JdGVtLFxuXHRjcmVhdGVDb25kaXRpb25hbEJsb2NrLFxuXHRjcmVhdGVDaGVja2VyLFxufTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgY3JlYXRlQ2hlY2tlciwgY3JlYXRlQ29uZGl0aW9uYWxCbG9jayB9IGZyb20gJy4vZnVuY3Rpb25zJztcbmltcG9ydCBDb25kaXRpb25hbEJsb2NrIGZyb20gJy4vQ29uZGl0aW9uYWxCbG9jayc7XG5pbXBvcnQgQ29uZGl0aW9uSXRlbSBmcm9tICcuL0NvbmRpdGlvbkl0ZW0nO1xuaW1wb3J0IENvbmRpdGlvbnNMaXN0IGZyb20gJy4vQ29uZGl0aW9uc0xpc3QnO1xuXG5jb25zdCB7IGFkZEFjdGlvbiB9ID0gSmV0UGx1Z2lucy5ob29rcztcblxuYWRkQWN0aW9uKFxuXHQnamV0LmZiLm9ic2VydmUuYWZ0ZXInLFxuXHQnamV0LWZvcm0tYnVpbGRlci9jb25kaXRpb25hbC1ibG9jaycsXG5cdGZ1bmN0aW9uICggb2JzZXJ2YWJsZSApIHtcblx0XHRmb3IgKCBjb25zdCBub2RlIG9mIG9ic2VydmFibGUucm9vdE5vZGUucXVlcnlTZWxlY3RvckFsbChcblx0XHRcdGBbZGF0YS1qZmItY29uZGl0aW9uYWxdYCxcblx0XHQpICkge1xuXHRcdFx0Y3JlYXRlQ29uZGl0aW9uYWxCbG9jayggbm9kZSwgb2JzZXJ2YWJsZSApO1xuXHRcdH1cblx0fSxcblx0MjAsXG4pO1xuXG5hZGRBY3Rpb24oXG5cdCdqZXQuZmIuaW5wdXQubWFrZVJlYWN0aXZlJyxcblx0J2pldC1mb3JtLWJ1aWxkZXIvY29uZGl0aW9uYWwtYmxvY2snLFxuXHRmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRcdGlucHV0LmNoZWNrZXIgPSBjcmVhdGVDaGVja2VyKCBpbnB1dCApO1xuXHR9LFxuKTtcblxuYWRkQWN0aW9uKFxuXHQnamV0LmZiLmNvbmRpdGlvbmFsLmJsb2NrLnJ1bkZ1bmN0aW9uJyxcblx0J2pldC1mb3JtLWJ1aWxkZXIvY29uZGl0aW9uYWwtYmxvY2snLFxuXHQvKipcblx0ICogQHBhcmFtIGZ1bmNOYW1lXG5cdCAqIEBwYXJhbSByZXN1bHRcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsQmxvY2sge0NvbmRpdGlvbmFsQmxvY2t9XG5cdCAqL1xuXHRmdW5jdGlvbiAoIGZ1bmNOYW1lLCByZXN1bHQsIGNvbmRpdGlvbmFsQmxvY2sgKSB7XG5cdFx0aWYgKFxuXHRcdFx0J3NldENzc0NsYXNzJyAhPT0gZnVuY05hbWUgfHxcblx0XHRcdCFjb25kaXRpb25hbEJsb2NrLnNldHRpbmdzPy5jbGFzc05hbWVcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25kaXRpb25hbEJsb2NrLm5vZGUuY2xhc3NMaXN0LnRvZ2dsZShcblx0XHRcdGNvbmRpdGlvbmFsQmxvY2suc2V0dGluZ3MuY2xhc3NOYW1lLFxuXHRcdFx0cmVzdWx0LFxuXHRcdCk7XG5cdH0sXG4pO1xuXG53aW5kb3cuSmV0Rm9ybUJ1aWxkZXJBYnN0cmFjdCA9IHtcblx0Li4uKFxuXHRcdHdpbmRvdy5KZXRGb3JtQnVpbGRlckFic3RyYWN0ID8/IHt9XG5cdCksXG5cdENvbmRpdGlvbkl0ZW0sXG5cdENvbmRpdGlvbmFsQmxvY2ssXG5cdGNyZWF0ZUNvbmRpdGlvbmFsQmxvY2ssXG5cdGNyZWF0ZUNoZWNrZXIsXG5cdENvbmRpdGlvbnNMaXN0LFxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==