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
multi.step.js
723 lines
| 1 | /******/ (() => { // webpackBootstrap |
| 2 | /******/ "use strict"; |
| 3 | /******/ var __webpack_modules__ = ({ |
| 4 | |
| 5 | /***/ "./frontend/multi.step/ConditionPageStateItem.js" |
| 6 | /*!*******************************************************!*\ |
| 7 | !*** ./frontend/multi.step/ConditionPageStateItem.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 | const { |
| 16 | ConditionItem |
| 17 | } = JetFormBuilderAbstract; |
| 18 | function ConditionPageStateItem() { |
| 19 | ConditionItem.call(this); |
| 20 | this.isSupported = function (options) { |
| 21 | return !!options?.page_state?.length; |
| 22 | }; |
| 23 | this.setOptions = function ({ |
| 24 | page_state: pageState |
| 25 | }) { |
| 26 | this.pageState = pageState; |
| 27 | }; |
| 28 | this.isPassed = function () { |
| 29 | const canSwitch = this.list?.block?.page?.canSwitch?.current; |
| 30 | switch (this.pageState) { |
| 31 | case 'active': |
| 32 | return !canSwitch; |
| 33 | default: |
| 34 | return false; |
| 35 | } |
| 36 | }; |
| 37 | } |
| 38 | ConditionPageStateItem.prototype = Object.create(ConditionItem.prototype); |
| 39 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionPageStateItem); |
| 40 | |
| 41 | /***/ }, |
| 42 | |
| 43 | /***/ "./frontend/multi.step/MultiStepState.js" |
| 44 | /*!***********************************************!*\ |
| 45 | !*** ./frontend/multi.step/MultiStepState.js ***! |
| 46 | \***********************************************/ |
| 47 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 48 | |
| 49 | __webpack_require__.r(__webpack_exports__); |
| 50 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 51 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 52 | /* harmony export */ }); |
| 53 | /* harmony import */ var _PageState__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PageState */ "./frontend/multi.step/PageState.js"); |
| 54 | /* harmony import */ var _ProgressBar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ProgressBar */ "./frontend/multi.step/ProgressBar.js"); |
| 55 | |
| 56 | |
| 57 | const { |
| 58 | ConditionalBlock, |
| 59 | ReactiveVar |
| 60 | } = JetFormBuilderAbstract; |
| 61 | const { |
| 62 | doAction |
| 63 | } = JetPlugins.hooks; |
| 64 | |
| 65 | // eslint-disable-next-line max-lines-per-function |
| 66 | function MultiStepState() { |
| 67 | /** |
| 68 | * @type {Observable} |
| 69 | */ |
| 70 | this.root = null; |
| 71 | |
| 72 | /** |
| 73 | * @type {ConditionalBlock} |
| 74 | */ |
| 75 | this.block = null; |
| 76 | |
| 77 | /** |
| 78 | * Current page index |
| 79 | * @type {ReactiveVar} |
| 80 | */ |
| 81 | this.index = null; |
| 82 | |
| 83 | /** |
| 84 | * Node elements of pages |
| 85 | * @type {Array<PageState> | *} |
| 86 | */ |
| 87 | this.elements = []; |
| 88 | this.setScope = function (rootOrBlock) { |
| 89 | if (rootOrBlock instanceof ConditionalBlock) { |
| 90 | this.block = rootOrBlock; |
| 91 | } else { |
| 92 | this.root = rootOrBlock; |
| 93 | } |
| 94 | }; |
| 95 | this.setProgress = function () { |
| 96 | this.index = new ReactiveVar(1); |
| 97 | this.index.make(); |
| 98 | this.index.watch(this.onChangeIndex.bind(this)); |
| 99 | for (const child of this.getScopeNode().children) { |
| 100 | if (!child.matches('.jet-form-builder-progress-pages')) { |
| 101 | continue; |
| 102 | } |
| 103 | this.progress = new _ProgressBar__WEBPACK_IMPORTED_MODULE_1__["default"](child, this); |
| 104 | } |
| 105 | }; |
| 106 | /** |
| 107 | * @param pages {Element[]} |
| 108 | */ |
| 109 | this.setPages = function (pages) { |
| 110 | /** |
| 111 | * Multistep is initializing for all form or |
| 112 | * specific conditional block. |
| 113 | * |
| 114 | * We need to separate global & block multistep |
| 115 | */ |
| 116 | this.elements = pages.map(page => new _PageState__WEBPACK_IMPORTED_MODULE_0__["default"](page, this)); |
| 117 | this.elements.forEach(page => page.observe()); |
| 118 | /** |
| 119 | * We should run this method separately, because it initializes |
| 120 | * conditional blocks, which could remove some part of nodes from DOM |
| 121 | * |
| 122 | * And this breaks logic of the other modules |
| 123 | * (switch-page-on-change for example) |
| 124 | */ |
| 125 | this.elements.forEach(page => page.observeConditionalBlocks()); |
| 126 | const { |
| 127 | submitter |
| 128 | } = this.getRoot().getSubmit(); |
| 129 | // is ajax |
| 130 | if (!submitter.hasOwnProperty('status')) { |
| 131 | return; |
| 132 | } |
| 133 | submitter.watchReset(() => { |
| 134 | this.index.current = 1; |
| 135 | }); |
| 136 | }; |
| 137 | this.onChangeIndex = function () { |
| 138 | for (const page of this.getPages()) { |
| 139 | page.isShow.current = page.index === this.index.current; |
| 140 | } |
| 141 | window?.jQuery(document)?.trigger('jet-form-builder/switch-page'); |
| 142 | }; |
| 143 | this.getCurrentPage = function () { |
| 144 | for (const page of this.getPages()) { |
| 145 | if (page.isShow.current) { |
| 146 | return page; |
| 147 | } |
| 148 | } |
| 149 | return false; |
| 150 | }; |
| 151 | /** |
| 152 | * @return {Array<PageState>} |
| 153 | */ |
| 154 | this.getPages = function () { |
| 155 | return this.elements; |
| 156 | }; |
| 157 | /** |
| 158 | * @return {HTMLElement|HTMLFormElement} |
| 159 | */ |
| 160 | this.getScopeNode = function () { |
| 161 | var _this$block$node; |
| 162 | return (_this$block$node = this.block?.node) !== null && _this$block$node !== void 0 ? _this$block$node : this.root.rootNode; |
| 163 | }; |
| 164 | /** |
| 165 | * @return {Observable} |
| 166 | */ |
| 167 | this.getRoot = function () { |
| 168 | var _this$block$root; |
| 169 | return (_this$block$root = this.block?.root) !== null && _this$block$root !== void 0 ? _this$block$root : this.root; |
| 170 | }; |
| 171 | |
| 172 | /** |
| 173 | * @param page {PageState} |
| 174 | */ |
| 175 | this.isLastPage = function (page) { |
| 176 | return this.elements.at(-1) === page; |
| 177 | }; |
| 178 | |
| 179 | /** |
| 180 | * @since 3.0.5 |
| 181 | * |
| 182 | * @param page |
| 183 | * @return {boolean} |
| 184 | */ |
| 185 | this.isFirstPage = function (page) { |
| 186 | return this.elements[0] === page; |
| 187 | }; |
| 188 | this.onReady = function () { |
| 189 | doAction('jet.fb.multistep.init', this); |
| 190 | }; |
| 191 | } |
| 192 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MultiStepState); |
| 193 | |
| 194 | /***/ }, |
| 195 | |
| 196 | /***/ "./frontend/multi.step/PageState.js" |
| 197 | /*!******************************************!*\ |
| 198 | !*** ./frontend/multi.step/PageState.js ***! |
| 199 | \******************************************/ |
| 200 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 201 | |
| 202 | __webpack_require__.r(__webpack_exports__); |
| 203 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 204 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 205 | /* harmony export */ }); |
| 206 | /* harmony import */ var _ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionPageStateItem */ "./frontend/multi.step/ConditionPageStateItem.js"); |
| 207 | |
| 208 | const { |
| 209 | ReactiveVar, |
| 210 | createConditionalBlock |
| 211 | } = JetFormBuilderAbstract; |
| 212 | const { |
| 213 | validateInputs, |
| 214 | getOffsetTop, |
| 215 | focusOnInvalidInput, |
| 216 | populateInputs |
| 217 | } = JetFormBuilderFunctions; |
| 218 | const { |
| 219 | addAction, |
| 220 | doAction |
| 221 | } = JetPlugins.hooks; |
| 222 | |
| 223 | /** |
| 224 | * @property {InputData[]} inputs Inner inputs |
| 225 | * @property {MultiStepState} state Multistep state |
| 226 | * @property {Element} node Related node, element |
| 227 | * @param {Element} node Related node, element |
| 228 | * @param {MultiStepState} state Multistep state |
| 229 | */ |
| 230 | function PageState(node, state) { |
| 231 | this.node = node; |
| 232 | this.index = +node.dataset.page; |
| 233 | this.offset = +node.dataset.pageOffset; |
| 234 | this.state = state; |
| 235 | this.inputs = []; |
| 236 | this.inputBindings = new Map(); |
| 237 | this.canSwitch = new ReactiveVar(null); |
| 238 | this.isShow = new ReactiveVar(1 === this.index); |
| 239 | |
| 240 | /** |
| 241 | * @since 3.0.1 |
| 242 | */ |
| 243 | this.autoFocus = window.JetFormBuilderSettings?.auto_focus; |
| 244 | |
| 245 | /** |
| 246 | * @since 3.0.5 |
| 247 | * @type {boolean} |
| 248 | */ |
| 249 | this.initialObserveState = false; |
| 250 | } |
| 251 | PageState.prototype.observe = function () { |
| 252 | if (!this.isLast()) { |
| 253 | this.observeInputs(); |
| 254 | } |
| 255 | this.canSwitch.make(); |
| 256 | this.isShow.make(); |
| 257 | this.isShow.watch(() => { |
| 258 | // eslint-disable-next-line no-unused-expressions |
| 259 | this.isShow.current ? this.onShow() : this.onHide(); |
| 260 | }); |
| 261 | this.addButtonsListeners(); |
| 262 | |
| 263 | /** |
| 264 | * We check the fields only for the first page. |
| 265 | * And for the following, we do it when switching pages |
| 266 | * (in the `onShow` method) |
| 267 | * |
| 268 | * We do this because on other pages the fields are always |
| 269 | * checked with a successful result due to the check on `isVisible` |
| 270 | * |
| 271 | * @since 3.0.5 |
| 272 | * |
| 273 | * @see https://github.com/Crocoblock/issues-tracker/issues/2781#issuecomment-1517928213 |
| 274 | * @see PageState.onShow |
| 275 | * @see InputData.isVisible |
| 276 | */ |
| 277 | if (this.isFirst()) { |
| 278 | this.initialObserveState = true; |
| 279 | this.updateStateAsync().then(() => {}).catch(() => {}); |
| 280 | } |
| 281 | this.updateOffsetByProgress(); |
| 282 | addAction('jet.fb.observe.input.manual', 'jet-form-builder/page-state', input => this.observeInput(input.nodes[0])); |
| 283 | doAction('jet.fb.multistep.page.init', this); |
| 284 | }; |
| 285 | PageState.prototype.observeInputs = function () { |
| 286 | for (const node of this.node.querySelectorAll('[data-jfb-sync]')) { |
| 287 | const input = this.observeInput(node); |
| 288 | |
| 289 | // eslint-disable-next-line no-unused-expressions |
| 290 | input && doAction('jet.fb.multistep.page.observed.input', input, this); |
| 291 | } |
| 292 | }; |
| 293 | |
| 294 | /** |
| 295 | * @param node {Element} |
| 296 | */ |
| 297 | PageState.prototype.observeInput = function (node) { |
| 298 | if (!this.isNodeBelongThis(node) || !node.hasOwnProperty('jfbSync') || node.jfbSync.hasParent()) { |
| 299 | return false; |
| 300 | } |
| 301 | |
| 302 | /** |
| 303 | * @type {InputData} |
| 304 | */ |
| 305 | const input = node.jfbSync; |
| 306 | return this.registerInput(input); |
| 307 | }; |
| 308 | /** |
| 309 | * Buttons for switching between pages are hidden conditional blocks |
| 310 | * that perform their function (disable) |
| 311 | * if all required fields are filled in the page. |
| 312 | */ |
| 313 | PageState.prototype.observeConditionalBlocks = function () { |
| 314 | if (this.isLast()) { |
| 315 | return; |
| 316 | } |
| 317 | for (const node of this.node.querySelectorAll('[data-jfb-conditional]')) { |
| 318 | if (!this.isNodeBelongThis(node)) { |
| 319 | continue; |
| 320 | } |
| 321 | const block = createConditionalBlock(node, this.state.getRoot()); |
| 322 | for (const condition of block.list.getConditions()) { |
| 323 | // eslint-disable-next-line max-depth |
| 324 | if (condition instanceof _ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_0__["default"]) { |
| 325 | block.page = this; |
| 326 | this.canSwitch.watch(() => block.list.onChangeRelated()); |
| 327 | break; |
| 328 | } |
| 329 | } |
| 330 | } |
| 331 | }; |
| 332 | |
| 333 | /** |
| 334 | * @since 3.0.5 We check the fields if this is done for the first time |
| 335 | * @since 3.0.0 Introduced |
| 336 | */ |
| 337 | PageState.prototype.onShow = function () { |
| 338 | this.node.classList.remove('jet-form-builder-page--hidden'); |
| 339 | if (this.initialObserveState) { |
| 340 | return; |
| 341 | } |
| 342 | this.initialObserveState = true; |
| 343 | this.updateStateAsync().then(() => {}).catch(() => {}); |
| 344 | }; |
| 345 | PageState.prototype.onHide = function () { |
| 346 | this.node.classList.add('jet-form-builder-page--hidden'); |
| 347 | }; |
| 348 | PageState.prototype.updateState = function () { |
| 349 | for (const input of this.getInputs()) { |
| 350 | if (input.reporting.validityState.current || null === input.reporting.validityState.current) { |
| 351 | continue; |
| 352 | } |
| 353 | this.canSwitch.current = false; |
| 354 | return; |
| 355 | } |
| 356 | this.canSwitch.current = true; |
| 357 | }; |
| 358 | PageState.prototype.updateStateAsync = async function (silence = true) { |
| 359 | try { |
| 360 | await validateInputs(this.getInputs(), silence); |
| 361 | this.canSwitch.current = true; |
| 362 | } catch (error) { |
| 363 | this.canSwitch.current = false; |
| 364 | } |
| 365 | }; |
| 366 | PageState.prototype.addButtonsListeners = function () { |
| 367 | const switchButtons = this.node.querySelectorAll('.jet-form-builder__next-page, .jet-form-builder__prev-page'); |
| 368 | for (const switchButton of switchButtons) { |
| 369 | if (!this.isNodeBelongThis(switchButton)) { |
| 370 | continue; |
| 371 | } |
| 372 | const isPrev = switchButton.classList.contains('jet-form-builder__prev-page'); |
| 373 | switchButton.addEventListener('click', () => this.changePage(isPrev)); |
| 374 | } |
| 375 | }; |
| 376 | PageState.prototype.changePage = async function (isBack) { |
| 377 | if (isBack) { |
| 378 | this.state.index.current = this.index - 1; |
| 379 | return; |
| 380 | } |
| 381 | if (this.isLast()) { |
| 382 | return; |
| 383 | } |
| 384 | if (this.getLockState().current) { |
| 385 | return; |
| 386 | } |
| 387 | await this.updateStateAsync(false); |
| 388 | if (this.canSwitch.current) { |
| 389 | this.state.index.current = this.index + 1; |
| 390 | return; |
| 391 | } |
| 392 | |
| 393 | // eslint-disable-next-line no-unused-expressions |
| 394 | this.autoFocus && focusOnInvalidInput(this.getInputs()); |
| 395 | }; |
| 396 | PageState.prototype.isNodeBelongThis = function (node) { |
| 397 | const parentPage = node.closest('.jet-form-builder-page'); |
| 398 | return parentPage ? parentPage.isEqualNode(this.node) : false; |
| 399 | }; |
| 400 | /** |
| 401 | * @return {Array<InputData> | *} |
| 402 | */ |
| 403 | PageState.prototype.getInputs = function () { |
| 404 | return populateInputs(this.inputs); |
| 405 | }; |
| 406 | |
| 407 | /** |
| 408 | * @return {LoadingReactiveVar} |
| 409 | */ |
| 410 | PageState.prototype.getLockState = function () { |
| 411 | var _root$parent$root$for; |
| 412 | /** |
| 413 | * @type {Observable} |
| 414 | */ |
| 415 | const root = this.state.getRoot(); |
| 416 | const form = (_root$parent$root$for = root?.parent?.root?.form) !== null && _root$parent$root$for !== void 0 ? _root$parent$root$for : root.form; |
| 417 | return form.lockState; |
| 418 | }; |
| 419 | PageState.prototype.isLast = function () { |
| 420 | return this.state.isLastPage(this); |
| 421 | }; |
| 422 | |
| 423 | /** |
| 424 | * @since 3.0.5 |
| 425 | * |
| 426 | * @return {boolean} |
| 427 | */ |
| 428 | PageState.prototype.isFirst = function () { |
| 429 | return this.state.isFirstPage(this); |
| 430 | }; |
| 431 | |
| 432 | /** |
| 433 | * @param input {InputData|RepeaterData} |
| 434 | */ |
| 435 | PageState.prototype.handleInputEnter = function (input) { |
| 436 | input?.enterKey?.addFilter(() => { |
| 437 | const form = input.root.form; |
| 438 | if (form) { |
| 439 | if (true === form.canTriggerEnterSubmit) { |
| 440 | this.changePage().then(() => {}).catch(() => {}); |
| 441 | } |
| 442 | } else { |
| 443 | this.changePage().then(() => {}).catch(() => {}); |
| 444 | } |
| 445 | |
| 446 | // prevent submit |
| 447 | return false; |
| 448 | }); |
| 449 | }; |
| 450 | PageState.prototype.registerInput = function (input, { |
| 451 | includeInValidation = true |
| 452 | } = {}) { |
| 453 | if (!input || this.inputBindings.has(input)) { |
| 454 | return input; |
| 455 | } |
| 456 | this.handleInputEnter(input); |
| 457 | const clearLoadingWatch = input.loading.watch(() => { |
| 458 | if (input.loading.current) { |
| 459 | this.canSwitch.current = false; |
| 460 | } else { |
| 461 | this.updateState(); |
| 462 | } |
| 463 | }); |
| 464 | const binding = { |
| 465 | clearLoadingWatch, |
| 466 | clearValidityWatch: null |
| 467 | }; |
| 468 | if (input.reporting.restrictions.length) { |
| 469 | this.inputs.push(input); |
| 470 | binding.clearValidityWatch = input.watchValidity(() => this.updateState()); |
| 471 | if (!includeInValidation) { |
| 472 | this.inputs = this.inputs.filter(current => current !== input); |
| 473 | } |
| 474 | } |
| 475 | this.inputBindings.set(input, binding); |
| 476 | return input; |
| 477 | }; |
| 478 | PageState.prototype.unregisterInput = function (input) { |
| 479 | if (!this.inputBindings.has(input)) { |
| 480 | return; |
| 481 | } |
| 482 | const binding = this.inputBindings.get(input); |
| 483 | binding?.clearLoadingWatch?.(); |
| 484 | binding?.clearValidityWatch?.(); |
| 485 | this.inputBindings.delete(input); |
| 486 | this.inputs = this.inputs.filter(current => current !== input); |
| 487 | }; |
| 488 | PageState.prototype.getTrackedInputs = function () { |
| 489 | return Array.from(this.inputBindings.keys()); |
| 490 | }; |
| 491 | PageState.prototype.getOffsetTop = function () { |
| 492 | return getOffsetTop(this.node) - this.offset; |
| 493 | }; |
| 494 | |
| 495 | /** |
| 496 | * @since 3.2.3 |
| 497 | */ |
| 498 | PageState.prototype.updateOffsetByProgress = function () { |
| 499 | if (!this.state?.progress?.node) { |
| 500 | return; |
| 501 | } |
| 502 | this.offset += +this.state.progress.node.clientHeight; |
| 503 | }; |
| 504 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PageState); |
| 505 | |
| 506 | /***/ }, |
| 507 | |
| 508 | /***/ "./frontend/multi.step/ProgressBar.js" |
| 509 | /*!********************************************!*\ |
| 510 | !*** ./frontend/multi.step/ProgressBar.js ***! |
| 511 | \********************************************/ |
| 512 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 513 | |
| 514 | __webpack_require__.r(__webpack_exports__); |
| 515 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 516 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 517 | /* harmony export */ }); |
| 518 | function ProgressBar(node, state) { |
| 519 | /** |
| 520 | * @param node {HTMLElement} |
| 521 | * @param state {MultiStepState} |
| 522 | */ |
| 523 | this.node = node; |
| 524 | this.state = state; |
| 525 | this.state.index.watch(() => this.updateItems()); |
| 526 | this.updateItems = function () { |
| 527 | const { |
| 528 | current |
| 529 | } = this.state.index; |
| 530 | for (const item of this.node.children) { |
| 531 | const pageIndex = +item.dataset.page; |
| 532 | if (pageIndex < current) { |
| 533 | this.makePassed(item); |
| 534 | } else if (current === pageIndex) { |
| 535 | this.makeActive(item); |
| 536 | } else { |
| 537 | this.makeNotPassed(item); |
| 538 | } |
| 539 | } |
| 540 | }; |
| 541 | |
| 542 | /** |
| 543 | * @param element {HTMLElement} |
| 544 | */ |
| 545 | this.makeActive = function (element) { |
| 546 | element.classList.remove('passed-page'); |
| 547 | element.classList.add('active-page'); |
| 548 | }; |
| 549 | |
| 550 | /** |
| 551 | * @param element {HTMLElement} |
| 552 | */ |
| 553 | this.makePassed = function (element) { |
| 554 | element.classList.add('passed-page'); |
| 555 | element.classList.remove('active-page'); |
| 556 | }; |
| 557 | this.makeNotPassed = function (element) { |
| 558 | element.classList.remove('active-page', 'passed-page'); |
| 559 | }; |
| 560 | } |
| 561 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProgressBar); |
| 562 | |
| 563 | /***/ }, |
| 564 | |
| 565 | /***/ "./frontend/multi.step/functions.js" |
| 566 | /*!******************************************!*\ |
| 567 | !*** ./frontend/multi.step/functions.js ***! |
| 568 | \******************************************/ |
| 569 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 570 | |
| 571 | __webpack_require__.r(__webpack_exports__); |
| 572 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 573 | /* harmony export */ createMultiStep: () => (/* binding */ createMultiStep) |
| 574 | /* harmony export */ }); |
| 575 | /* harmony import */ var _MultiStepState__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MultiStepState */ "./frontend/multi.step/MultiStepState.js"); |
| 576 | |
| 577 | function createMultiStep(rootOrBlock) { |
| 578 | const multistep = new _MultiStepState__WEBPACK_IMPORTED_MODULE_0__["default"](); |
| 579 | multistep.setScope(rootOrBlock); |
| 580 | const pages = []; |
| 581 | for (const child of multistep.getScopeNode().childNodes) { |
| 582 | if (!child?.classList?.contains('jet-form-builder-page')) { |
| 583 | continue; |
| 584 | } |
| 585 | pages.push(child); |
| 586 | } |
| 587 | if (!pages.length) { |
| 588 | return multistep; |
| 589 | } |
| 590 | multistep.setProgress(); |
| 591 | multistep.setPages(pages); |
| 592 | return multistep; |
| 593 | } |
| 594 | |
| 595 | |
| 596 | /***/ } |
| 597 | |
| 598 | /******/ }); |
| 599 | /************************************************************************/ |
| 600 | /******/ // The module cache |
| 601 | /******/ var __webpack_module_cache__ = {}; |
| 602 | /******/ |
| 603 | /******/ // The require function |
| 604 | /******/ function __webpack_require__(moduleId) { |
| 605 | /******/ // Check if module is in cache |
| 606 | /******/ var cachedModule = __webpack_module_cache__[moduleId]; |
| 607 | /******/ if (cachedModule !== undefined) { |
| 608 | /******/ return cachedModule.exports; |
| 609 | /******/ } |
| 610 | /******/ // Create a new module (and put it into the cache) |
| 611 | /******/ var module = __webpack_module_cache__[moduleId] = { |
| 612 | /******/ // no module.id needed |
| 613 | /******/ // no module.loaded needed |
| 614 | /******/ exports: {} |
| 615 | /******/ }; |
| 616 | /******/ |
| 617 | /******/ // Execute the module function |
| 618 | /******/ if (!(moduleId in __webpack_modules__)) { |
| 619 | /******/ delete __webpack_module_cache__[moduleId]; |
| 620 | /******/ var e = new Error("Cannot find module '" + moduleId + "'"); |
| 621 | /******/ e.code = 'MODULE_NOT_FOUND'; |
| 622 | /******/ throw e; |
| 623 | /******/ } |
| 624 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); |
| 625 | /******/ |
| 626 | /******/ // Return the exports of the module |
| 627 | /******/ return module.exports; |
| 628 | /******/ } |
| 629 | /******/ |
| 630 | /************************************************************************/ |
| 631 | /******/ /* webpack/runtime/define property getters */ |
| 632 | /******/ (() => { |
| 633 | /******/ // define getter functions for harmony exports |
| 634 | /******/ __webpack_require__.d = (exports, definition) => { |
| 635 | /******/ for(var key in definition) { |
| 636 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { |
| 637 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); |
| 638 | /******/ } |
| 639 | /******/ } |
| 640 | /******/ }; |
| 641 | /******/ })(); |
| 642 | /******/ |
| 643 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ |
| 644 | /******/ (() => { |
| 645 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) |
| 646 | /******/ })(); |
| 647 | /******/ |
| 648 | /******/ /* webpack/runtime/make namespace object */ |
| 649 | /******/ (() => { |
| 650 | /******/ // define __esModule on exports |
| 651 | /******/ __webpack_require__.r = (exports) => { |
| 652 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
| 653 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
| 654 | /******/ } |
| 655 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); |
| 656 | /******/ }; |
| 657 | /******/ })(); |
| 658 | /******/ |
| 659 | /************************************************************************/ |
| 660 | var __webpack_exports__ = {}; |
| 661 | // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. |
| 662 | (() => { |
| 663 | /*!*************************************!*\ |
| 664 | !*** ./frontend/multi.step/main.js ***! |
| 665 | \*************************************/ |
| 666 | __webpack_require__.r(__webpack_exports__); |
| 667 | /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/multi.step/functions.js"); |
| 668 | /* harmony import */ var _ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConditionPageStateItem */ "./frontend/multi.step/ConditionPageStateItem.js"); |
| 669 | |
| 670 | |
| 671 | const { |
| 672 | addAction, |
| 673 | addFilter |
| 674 | } = JetPlugins.hooks; |
| 675 | const { |
| 676 | getScrollParent |
| 677 | } = JetFormBuilderFunctions; |
| 678 | addAction('jet.fb.observe.after', 'jet-form-builder/multi-step', function (observable) { |
| 679 | const multistep = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createMultiStep)(observable); |
| 680 | if (!multistep.getPages()?.length) { |
| 681 | return; |
| 682 | } |
| 683 | observable.multistep = multistep; |
| 684 | multistep.onReady(); |
| 685 | }, 15); |
| 686 | addAction('jet.fb.conditional.init', 'jet-form-builder/multi-step', function (block) { |
| 687 | const multistep = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createMultiStep)(block); |
| 688 | if (!multistep.getPages()?.length) { |
| 689 | return; |
| 690 | } |
| 691 | block.multistep = multistep; |
| 692 | multistep.onReady(); |
| 693 | }); |
| 694 | addFilter('jet.fb.conditional.types', 'jet-form-builder/multi-step', function (items) { |
| 695 | items = [_ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_1__["default"], ...items]; |
| 696 | return items; |
| 697 | }); |
| 698 | addAction('jet.fb.multistep.init', 'jet-form-builder/multi-step/autoscroll', |
| 699 | /** |
| 700 | * @param multistep {MultiStepState} |
| 701 | */ |
| 702 | function (multistep) { |
| 703 | if (!window?.JetFormBuilderSettings?.scroll_on_next) { |
| 704 | return; |
| 705 | } |
| 706 | multistep.index.watch(() => { |
| 707 | /** |
| 708 | * @type {PageState|boolean} |
| 709 | */ |
| 710 | const page = multistep.getCurrentPage(); |
| 711 | const parent = getScrollParent(page.node); |
| 712 | const top = page.getOffsetTop(); |
| 713 | parent?.scrollTo?.({ |
| 714 | top, |
| 715 | behavior: 'smooth' |
| 716 | }); |
| 717 | }); |
| 718 | }); |
| 719 | })(); |
| 720 | |
| 721 | /******/ })() |
| 722 | ; |
| 723 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQvbXVsdGkuc3RlcC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDMUpBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFLQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUNsWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ2pEQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBSUE7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvbXVsdGkuc3RlcC9Db25kaXRpb25QYWdlU3RhdGVJdGVtLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL211bHRpLnN0ZXAvTXVsdGlTdGVwU3RhdGUuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvbXVsdGkuc3RlcC9QYWdlU3RhdGUuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvbXVsdGkuc3RlcC9Qcm9ncmVzc0Jhci5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9tdWx0aS5zdGVwL2Z1bmN0aW9ucy5qcyIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9tdWx0aS5zdGVwL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyBDb25kaXRpb25JdGVtIH0gPSBKZXRGb3JtQnVpbGRlckFic3RyYWN0O1xuXG5mdW5jdGlvbiBDb25kaXRpb25QYWdlU3RhdGVJdGVtKCkge1xuXHRDb25kaXRpb25JdGVtLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdHJldHVybiAhIW9wdGlvbnM/LnBhZ2Vfc3RhdGU/Lmxlbmd0aDtcblx0fTtcblx0dGhpcy5zZXRPcHRpb25zICA9IGZ1bmN0aW9uICggeyBwYWdlX3N0YXRlOiBwYWdlU3RhdGUgfSApIHtcblx0XHR0aGlzLnBhZ2VTdGF0ZSA9IHBhZ2VTdGF0ZTtcblx0fTtcblx0dGhpcy5pc1Bhc3NlZCAgICA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCBjYW5Td2l0Y2ggPSB0aGlzLmxpc3Q/LmJsb2NrPy5wYWdlPy5jYW5Td2l0Y2g/LmN1cnJlbnQ7XG5cblx0XHRzd2l0Y2ggKCB0aGlzLnBhZ2VTdGF0ZSApIHtcblx0XHRcdGNhc2UgJ2FjdGl2ZSc6XG5cdFx0XHRcdHJldHVybiAhY2FuU3dpdGNoO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcbn1cblxuQ29uZGl0aW9uUGFnZVN0YXRlSXRlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb25kaXRpb25JdGVtLnByb3RvdHlwZSApO1xuXG5leHBvcnQgZGVmYXVsdCBDb25kaXRpb25QYWdlU3RhdGVJdGVtOyIsImltcG9ydCBQYWdlU3RhdGUgZnJvbSAnLi9QYWdlU3RhdGUnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJy4vUHJvZ3Jlc3NCYXInO1xuXG5jb25zdCB7XG5cdCAgICAgIENvbmRpdGlvbmFsQmxvY2ssXG5cdCAgICAgIFJlYWN0aXZlVmFyLFxuICAgICAgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmNvbnN0IHtcblx0ICAgICAgZG9BY3Rpb24sXG4gICAgICB9ID0gSmV0UGx1Z2lucy5ob29rcztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb25cbmZ1bmN0aW9uIE11bHRpU3RlcFN0YXRlKCkge1xuXG5cdC8qKlxuXHQgKiBAdHlwZSB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdHRoaXMucm9vdCA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtDb25kaXRpb25hbEJsb2NrfVxuXHQgKi9cblx0dGhpcy5ibG9jayA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEN1cnJlbnQgcGFnZSBpbmRleFxuXHQgKiBAdHlwZSB7UmVhY3RpdmVWYXJ9XG5cdCAqL1xuXHR0aGlzLmluZGV4ID0gbnVsbDtcblxuXHQvKipcblx0ICogTm9kZSBlbGVtZW50cyBvZiBwYWdlc1xuXHQgKiBAdHlwZSB7QXJyYXk8UGFnZVN0YXRlPiB8ICp9XG5cdCAqL1xuXHR0aGlzLmVsZW1lbnRzID0gW107XG5cblx0dGhpcy5zZXRTY29wZSAgICA9IGZ1bmN0aW9uICggcm9vdE9yQmxvY2sgKSB7XG5cdFx0aWYgKCByb290T3JCbG9jayBpbnN0YW5jZW9mIENvbmRpdGlvbmFsQmxvY2sgKSB7XG5cdFx0XHR0aGlzLmJsb2NrID0gcm9vdE9yQmxvY2s7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5yb290ID0gcm9vdE9yQmxvY2s7XG5cdFx0fVxuXHR9O1xuXHR0aGlzLnNldFByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMuaW5kZXggPSBuZXcgUmVhY3RpdmVWYXIoIDEgKTtcblx0XHR0aGlzLmluZGV4Lm1ha2UoKTtcblx0XHR0aGlzLmluZGV4LndhdGNoKCB0aGlzLm9uQ2hhbmdlSW5kZXguYmluZCggdGhpcyApICk7XG5cblx0XHRmb3IgKCBjb25zdCBjaGlsZCBvZiB0aGlzLmdldFNjb3BlTm9kZSgpLmNoaWxkcmVuICkge1xuXHRcdFx0aWYgKCAhY2hpbGQubWF0Y2hlcyggJy5qZXQtZm9ybS1idWlsZGVyLXByb2dyZXNzLXBhZ2VzJyApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMucHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIoIGNoaWxkLCB0aGlzICk7XG5cdFx0fVxuXHR9O1xuXHQvKipcblx0ICogQHBhcmFtIHBhZ2VzIHtFbGVtZW50W119XG5cdCAqL1xuXHR0aGlzLnNldFBhZ2VzID0gZnVuY3Rpb24gKCBwYWdlcyApIHtcblx0XHQvKipcblx0XHQgKiBNdWx0aXN0ZXAgaXMgaW5pdGlhbGl6aW5nIGZvciBhbGwgZm9ybSBvclxuXHRcdCAqIHNwZWNpZmljIGNvbmRpdGlvbmFsIGJsb2NrLlxuXHRcdCAqXG5cdFx0ICogV2UgbmVlZCB0byBzZXBhcmF0ZSBnbG9iYWwgJiBibG9jayBtdWx0aXN0ZXBcblx0XHQgKi9cblx0XHR0aGlzLmVsZW1lbnRzID0gcGFnZXMubWFwKFxuXHRcdFx0cGFnZSA9PiBuZXcgUGFnZVN0YXRlKCBwYWdlLCB0aGlzICksXG5cdFx0KTtcblxuXHRcdHRoaXMuZWxlbWVudHMuZm9yRWFjaChcblx0XHRcdHBhZ2UgPT4gcGFnZS5vYnNlcnZlKCksXG5cdFx0KTtcblx0XHQvKipcblx0XHQgKiBXZSBzaG91bGQgcnVuIHRoaXMgbWV0aG9kIHNlcGFyYXRlbHksIGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXNcblx0XHQgKiBjb25kaXRpb25hbCBibG9ja3MsIHdoaWNoIGNvdWxkIHJlbW92ZSBzb21lIHBhcnQgb2Ygbm9kZXMgZnJvbSBET01cblx0XHQgKlxuXHRcdCAqIEFuZCB0aGlzIGJyZWFrcyBsb2dpYyBvZiB0aGUgb3RoZXIgbW9kdWxlc1xuXHRcdCAqIChzd2l0Y2gtcGFnZS1vbi1jaGFuZ2UgZm9yIGV4YW1wbGUpXG5cdFx0ICovXG5cdFx0dGhpcy5lbGVtZW50cy5mb3JFYWNoKFxuXHRcdFx0cGFnZSA9PiBwYWdlLm9ic2VydmVDb25kaXRpb25hbEJsb2NrcygpLFxuXHRcdCk7XG5cblx0XHRjb25zdCB7IHN1Ym1pdHRlciB9ID0gdGhpcy5nZXRSb290KCkuZ2V0U3VibWl0KCk7XG5cdFx0Ly8gaXMgYWpheFxuXHRcdGlmICggIXN1Ym1pdHRlci5oYXNPd25Qcm9wZXJ0eSggJ3N0YXR1cycgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzdWJtaXR0ZXIud2F0Y2hSZXNldCggKCkgPT4ge1xuXHRcdFx0dGhpcy5pbmRleC5jdXJyZW50ID0gMTtcblx0XHR9ICk7XG5cdH07XG5cdHRoaXMub25DaGFuZ2VJbmRleCAgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Zm9yICggY29uc3QgcGFnZSBvZiB0aGlzLmdldFBhZ2VzKCkgKSB7XG5cdFx0XHRwYWdlLmlzU2hvdy5jdXJyZW50ID0gcGFnZS5pbmRleCA9PT0gdGhpcy5pbmRleC5jdXJyZW50O1xuXHRcdH1cblxuXHRcdHdpbmRvdz8ualF1ZXJ5KCBkb2N1bWVudCApPy50cmlnZ2VyKFxuXHRcdFx0J2pldC1mb3JtLWJ1aWxkZXIvc3dpdGNoLXBhZ2UnLFxuXHRcdCk7XG5cdH07XG5cdHRoaXMuZ2V0Q3VycmVudFBhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Zm9yICggY29uc3QgcGFnZSBvZiB0aGlzLmdldFBhZ2VzKCkgKSB7XG5cdFx0XHRpZiAoIHBhZ2UuaXNTaG93LmN1cnJlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBwYWdlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0LyoqXG5cdCAqIEByZXR1cm4ge0FycmF5PFBhZ2VTdGF0ZT59XG5cdCAqL1xuXHR0aGlzLmdldFBhZ2VzID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmVsZW1lbnRzO1xuXHR9O1xuXHQvKipcblx0ICogQHJldHVybiB7SFRNTEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fVxuXHQgKi9cblx0dGhpcy5nZXRTY29wZU5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYmxvY2s/Lm5vZGUgPz8gdGhpcy5yb290LnJvb3ROb2RlO1xuXHR9O1xuXHQvKipcblx0ICogQHJldHVybiB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdHRoaXMuZ2V0Um9vdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5ibG9jaz8ucm9vdCA/PyB0aGlzLnJvb3Q7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBwYWdlIHtQYWdlU3RhdGV9XG5cdCAqL1xuXHR0aGlzLmlzTGFzdFBhZ2UgPSBmdW5jdGlvbiAoIHBhZ2UgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudHMuYXQoIC0xICkgPT09IHBhZ2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjAuNVxuXHQgKlxuXHQgKiBAcGFyYW0gIHBhZ2Vcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdHRoaXMuaXNGaXJzdFBhZ2UgPSBmdW5jdGlvbiAoIHBhZ2UgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudHNbIDAgXSA9PT0gcGFnZTtcblx0fTtcblxuXHR0aGlzLm9uUmVhZHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0ZG9BY3Rpb24oICdqZXQuZmIubXVsdGlzdGVwLmluaXQnLCB0aGlzICk7XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IE11bHRpU3RlcFN0YXRlOyIsImltcG9ydCBDb25kaXRpb25QYWdlU3RhdGVJdGVtIGZyb20gJy4vQ29uZGl0aW9uUGFnZVN0YXRlSXRlbSc7XG5cbmNvbnN0IHtcblx0ICAgICAgUmVhY3RpdmVWYXIsXG5cdCAgICAgIGNyZWF0ZUNvbmRpdGlvbmFsQmxvY2ssXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJBYnN0cmFjdDtcblxuY29uc3Qge1xuXHQgICAgICB2YWxpZGF0ZUlucHV0cyxcblx0ICAgICAgZ2V0T2Zmc2V0VG9wLFxuXHQgICAgICBmb2N1c09uSW52YWxpZElucHV0LFxuXHQgICAgICBwb3B1bGF0ZUlucHV0cyxcbiAgICAgIH0gPSBKZXRGb3JtQnVpbGRlckZ1bmN0aW9ucztcblxuY29uc3QgeyBhZGRBY3Rpb24sIGRvQWN0aW9uIH0gPSBKZXRQbHVnaW5zLmhvb2tzO1xuXG4vKipcbiAqIEBwcm9wZXJ0eSB7SW5wdXREYXRhW119ICAgIGlucHV0cyBJbm5lciBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7TXVsdGlTdGVwU3RhdGV9IHN0YXRlICBNdWx0aXN0ZXAgc3RhdGVcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gICAgICAgIG5vZGUgICBSZWxhdGVkIG5vZGUsIGVsZW1lbnRcbiAqIEBwYXJhbSAgICB7RWxlbWVudH0gICAgICAgIG5vZGUgICBSZWxhdGVkIG5vZGUsIGVsZW1lbnRcbiAqIEBwYXJhbSAgICB7TXVsdGlTdGVwU3RhdGV9IHN0YXRlICBNdWx0aXN0ZXAgc3RhdGVcbiAqL1xuZnVuY3Rpb24gUGFnZVN0YXRlKCBub2RlLCBzdGF0ZSApIHtcblx0dGhpcy5ub2RlICAgICAgPSBub2RlO1xuXHR0aGlzLmluZGV4ICAgICA9ICtub2RlLmRhdGFzZXQucGFnZTtcblx0dGhpcy5vZmZzZXQgICAgPSArbm9kZS5kYXRhc2V0LnBhZ2VPZmZzZXQ7XG5cdHRoaXMuc3RhdGUgICAgID0gc3RhdGU7XG5cdHRoaXMuaW5wdXRzICAgID0gW107XG5cdHRoaXMuaW5wdXRCaW5kaW5ncyA9IG5ldyBNYXAoKTtcblx0dGhpcy5jYW5Td2l0Y2ggPSBuZXcgUmVhY3RpdmVWYXIoIG51bGwgKTtcblx0dGhpcy5pc1Nob3cgICAgPSBuZXcgUmVhY3RpdmVWYXIoIDEgPT09IHRoaXMuaW5kZXggKTtcblxuXHQvKipcblx0ICogQHNpbmNlIDMuMC4xXG5cdCAqL1xuXHR0aGlzLmF1dG9Gb2N1cyA9IHdpbmRvdy5KZXRGb3JtQnVpbGRlclNldHRpbmdzPy5hdXRvX2ZvY3VzO1xuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy4wLjVcblx0ICogQHR5cGUge2Jvb2xlYW59XG5cdCAqL1xuXHR0aGlzLmluaXRpYWxPYnNlcnZlU3RhdGUgPSBmYWxzZTtcbn1cblxuUGFnZVN0YXRlLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKCkge1xuXG5cdGlmICggIXRoaXMuaXNMYXN0KCkgKSB7XG5cdFx0dGhpcy5vYnNlcnZlSW5wdXRzKCk7XG5cdH1cblxuXHR0aGlzLmNhblN3aXRjaC5tYWtlKCk7XG5cdHRoaXMuaXNTaG93Lm1ha2UoKTtcblx0dGhpcy5pc1Nob3cud2F0Y2goICgpID0+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdFx0dGhpcy5pc1Nob3cuY3VycmVudCA/IHRoaXMub25TaG93KCkgOiB0aGlzLm9uSGlkZSgpO1xuXHR9ICk7XG5cblx0dGhpcy5hZGRCdXR0b25zTGlzdGVuZXJzKCk7XG5cblx0LyoqXG5cdCAqIFdlIGNoZWNrIHRoZSBmaWVsZHMgb25seSBmb3IgdGhlIGZpcnN0IHBhZ2UuXG5cdCAqIEFuZCBmb3IgdGhlIGZvbGxvd2luZywgd2UgZG8gaXQgd2hlbiBzd2l0Y2hpbmcgcGFnZXNcblx0ICogKGluIHRoZSBgb25TaG93YCBtZXRob2QpXG5cdCAqXG5cdCAqIFdlIGRvIHRoaXMgYmVjYXVzZSBvbiBvdGhlciBwYWdlcyB0aGUgZmllbGRzIGFyZSBhbHdheXNcblx0ICogY2hlY2tlZCB3aXRoIGEgc3VjY2Vzc2Z1bCByZXN1bHQgZHVlIHRvIHRoZSBjaGVjayBvbiBgaXNWaXNpYmxlYFxuXHQgKlxuXHQgKiBAc2luY2UgMy4wLjVcblx0ICpcblx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vQ3JvY29ibG9jay9pc3N1ZXMtdHJhY2tlci9pc3N1ZXMvMjc4MSNpc3N1ZWNvbW1lbnQtMTUxNzkyODIxM1xuXHQgKiBAc2VlIFBhZ2VTdGF0ZS5vblNob3dcblx0ICogQHNlZSBJbnB1dERhdGEuaXNWaXNpYmxlXG5cdCAqL1xuXHRpZiAoIHRoaXMuaXNGaXJzdCgpICkge1xuXHRcdHRoaXMuaW5pdGlhbE9ic2VydmVTdGF0ZSA9IHRydWU7XG5cdFx0dGhpcy51cGRhdGVTdGF0ZUFzeW5jKCkudGhlbiggKCkgPT4ge30gKS5jYXRjaCggKCkgPT4ge30gKTtcblx0fVxuXG5cdHRoaXMudXBkYXRlT2Zmc2V0QnlQcm9ncmVzcygpO1xuXG5cdGFkZEFjdGlvbihcblx0XHQnamV0LmZiLm9ic2VydmUuaW5wdXQubWFudWFsJyxcblx0XHQnamV0LWZvcm0tYnVpbGRlci9wYWdlLXN0YXRlJyxcblx0XHRpbnB1dCA9PiB0aGlzLm9ic2VydmVJbnB1dCggaW5wdXQubm9kZXNbIDAgXSApLFxuXHQpO1xuXG5cdGRvQWN0aW9uKCAnamV0LmZiLm11bHRpc3RlcC5wYWdlLmluaXQnLCB0aGlzICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLm9ic2VydmVJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG5cdGZvciAoIGNvbnN0IG5vZGUgb2YgdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1qZmItc3luY10nICkgKSB7XG5cdFx0Y29uc3QgaW5wdXQgPSB0aGlzLm9ic2VydmVJbnB1dCggbm9kZSApO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdGlucHV0ICYmIGRvQWN0aW9uKFxuXHRcdFx0J2pldC5mYi5tdWx0aXN0ZXAucGFnZS5vYnNlcnZlZC5pbnB1dCcsXG5cdFx0XHRpbnB1dCxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBAcGFyYW0gbm9kZSB7RWxlbWVudH1cbiAqL1xuUGFnZVN0YXRlLnByb3RvdHlwZS5vYnNlcnZlSW5wdXQgPSBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cdGlmIChcblx0XHQhdGhpcy5pc05vZGVCZWxvbmdUaGlzKCBub2RlICkgfHxcblx0XHQhbm9kZS5oYXNPd25Qcm9wZXJ0eSggJ2pmYlN5bmMnICkgfHxcblx0XHRub2RlLmpmYlN5bmMuaGFzUGFyZW50KClcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtJbnB1dERhdGF9XG5cdCAqL1xuXHRjb25zdCBpbnB1dCA9IG5vZGUuamZiU3luYztcblxuXHRyZXR1cm4gdGhpcy5yZWdpc3RlcklucHV0KCBpbnB1dCApO1xufTtcbi8qKlxuICogQnV0dG9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gcGFnZXMgYXJlIGhpZGRlbiBjb25kaXRpb25hbCBibG9ja3NcbiAqIHRoYXQgcGVyZm9ybSB0aGVpciBmdW5jdGlvbiAoZGlzYWJsZSlcbiAqIGlmIGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIGZpbGxlZCBpbiB0aGUgcGFnZS5cbiAqL1xuUGFnZVN0YXRlLnByb3RvdHlwZS5vYnNlcnZlQ29uZGl0aW9uYWxCbG9ja3MgPSBmdW5jdGlvbiAoKSB7XG5cdGlmICggdGhpcy5pc0xhc3QoKSApIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Zm9yICggY29uc3Qgbm9kZSBvZiB0aGlzLm5vZGUucXVlcnlTZWxlY3RvckFsbChcblx0XHQnW2RhdGEtamZiLWNvbmRpdGlvbmFsXScsXG5cdCkgKSB7XG5cdFx0aWYgKCAhdGhpcy5pc05vZGVCZWxvbmdUaGlzKCBub2RlICkgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Y29uc3QgYmxvY2sgPSBjcmVhdGVDb25kaXRpb25hbEJsb2NrKFxuXHRcdFx0bm9kZSxcblx0XHRcdHRoaXMuc3RhdGUuZ2V0Um9vdCgpLFxuXHRcdCk7XG5cblx0XHRmb3IgKCBjb25zdCBjb25kaXRpb24gb2YgYmxvY2subGlzdC5nZXRDb25kaXRpb25zKCkgKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWRlcHRoXG5cdFx0XHRpZiAoIGNvbmRpdGlvbiBpbnN0YW5jZW9mIENvbmRpdGlvblBhZ2VTdGF0ZUl0ZW0gKSB7XG5cdFx0XHRcdGJsb2NrLnBhZ2UgPSB0aGlzO1xuXHRcdFx0XHR0aGlzLmNhblN3aXRjaC53YXRjaCggKCkgPT4gYmxvY2subGlzdC5vbkNoYW5nZVJlbGF0ZWQoKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLyoqXG4gKiBAc2luY2UgMy4wLjUgV2UgY2hlY2sgdGhlIGZpZWxkcyBpZiB0aGlzIGlzIGRvbmUgZm9yIHRoZSBmaXJzdCB0aW1lXG4gKiBAc2luY2UgMy4wLjAgSW50cm9kdWNlZFxuICovXG5QYWdlU3RhdGUucHJvdG90eXBlLm9uU2hvdyA9IGZ1bmN0aW9uICgpIHtcblx0dGhpcy5ub2RlLmNsYXNzTGlzdC5yZW1vdmUoICdqZXQtZm9ybS1idWlsZGVyLXBhZ2UtLWhpZGRlbicgKTtcblxuXHRpZiAoIHRoaXMuaW5pdGlhbE9ic2VydmVTdGF0ZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzLmluaXRpYWxPYnNlcnZlU3RhdGUgPSB0cnVlO1xuXHR0aGlzLnVwZGF0ZVN0YXRlQXN5bmMoKS50aGVuKCAoKSA9PiB7fSApLmNhdGNoKCAoKSA9PiB7fSApO1xufTtcblBhZ2VTdGF0ZS5wcm90b3R5cGUub25IaWRlICAgICAgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCAnamV0LWZvcm0tYnVpbGRlci1wYWdlLS1oaWRkZW4nICk7XG59O1xuUGFnZVN0YXRlLnByb3RvdHlwZS51cGRhdGVTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0Zm9yICggY29uc3QgaW5wdXQgb2YgdGhpcy5nZXRJbnB1dHMoKSApIHtcblx0XHRpZiAoIGlucHV0LnJlcG9ydGluZy52YWxpZGl0eVN0YXRlLmN1cnJlbnQgfHxcblx0XHRcdG51bGwgPT09IGlucHV0LnJlcG9ydGluZy52YWxpZGl0eVN0YXRlLmN1cnJlbnRcblx0XHQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHR0aGlzLmNhblN3aXRjaC5jdXJyZW50ID0gZmFsc2U7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGhpcy5jYW5Td2l0Y2guY3VycmVudCA9IHRydWU7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLnVwZGF0ZVN0YXRlQXN5bmMgICAgPSBhc3luYyBmdW5jdGlvbiAoIHNpbGVuY2UgPSB0cnVlICkge1xuXHR0cnkge1xuXHRcdGF3YWl0IHZhbGlkYXRlSW5wdXRzKCB0aGlzLmdldElucHV0cygpLCBzaWxlbmNlICk7XG5cblx0XHR0aGlzLmNhblN3aXRjaC5jdXJyZW50ID0gdHJ1ZTtcblx0fVxuXHRjYXRjaCAoIGVycm9yICkge1xuXHRcdHRoaXMuY2FuU3dpdGNoLmN1cnJlbnQgPSBmYWxzZTtcblx0fVxufTtcblBhZ2VTdGF0ZS5wcm90b3R5cGUuYWRkQnV0dG9uc0xpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcblx0Y29uc3Qgc3dpdGNoQnV0dG9ucyA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdCcuamV0LWZvcm0tYnVpbGRlcl9fbmV4dC1wYWdlLCAuamV0LWZvcm0tYnVpbGRlcl9fcHJldi1wYWdlJyxcblx0KTtcblxuXHRmb3IgKCBjb25zdCBzd2l0Y2hCdXR0b24gb2Ygc3dpdGNoQnV0dG9ucyApIHtcblx0XHRpZiAoICF0aGlzLmlzTm9kZUJlbG9uZ1RoaXMoIHN3aXRjaEJ1dHRvbiApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGNvbnN0IGlzUHJldiA9IHN3aXRjaEJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoXG5cdFx0XHQnamV0LWZvcm0tYnVpbGRlcl9fcHJldi1wYWdlJyxcblx0XHQpO1xuXG5cdFx0c3dpdGNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHQnY2xpY2snLFxuXHRcdFx0KCkgPT4gdGhpcy5jaGFuZ2VQYWdlKCBpc1ByZXYgKSxcblx0XHQpO1xuXHR9XG59O1xuUGFnZVN0YXRlLnByb3RvdHlwZS5jaGFuZ2VQYWdlICAgICAgICAgID0gYXN5bmMgZnVuY3Rpb24gKCBpc0JhY2sgKSB7XG5cdGlmICggaXNCYWNrICkge1xuXHRcdHRoaXMuc3RhdGUuaW5kZXguY3VycmVudCA9IHRoaXMuaW5kZXggLSAxO1xuXG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCB0aGlzLmlzTGFzdCgpICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICggdGhpcy5nZXRMb2NrU3RhdGUoKS5jdXJyZW50ICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGF3YWl0IHRoaXMudXBkYXRlU3RhdGVBc3luYyggZmFsc2UgKTtcblxuXHRpZiAoIHRoaXMuY2FuU3dpdGNoLmN1cnJlbnQgKSB7XG5cdFx0dGhpcy5zdGF0ZS5pbmRleC5jdXJyZW50ID0gdGhpcy5pbmRleCArIDE7XG5cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdHRoaXMuYXV0b0ZvY3VzICYmIGZvY3VzT25JbnZhbGlkSW5wdXQoIHRoaXMuZ2V0SW5wdXRzKCkgKTtcbn07XG5QYWdlU3RhdGUucHJvdG90eXBlLmlzTm9kZUJlbG9uZ1RoaXMgICAgPSBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cdGNvbnN0IHBhcmVudFBhZ2UgPSBub2RlLmNsb3Nlc3QoICcuamV0LWZvcm0tYnVpbGRlci1wYWdlJyApO1xuXG5cdHJldHVybiBwYXJlbnRQYWdlID8gcGFyZW50UGFnZS5pc0VxdWFsTm9kZSggdGhpcy5ub2RlICkgOiBmYWxzZTtcbn07XG4vKipcbiAqIEByZXR1cm4ge0FycmF5PElucHV0RGF0YT4gfCAqfVxuICovXG5QYWdlU3RhdGUucHJvdG90eXBlLmdldElucHV0cyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHBvcHVsYXRlSW5wdXRzKCB0aGlzLmlucHV0cyApO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtMb2FkaW5nUmVhY3RpdmVWYXJ9XG4gKi9cblBhZ2VTdGF0ZS5wcm90b3R5cGUuZ2V0TG9ja1N0YXRlID0gZnVuY3Rpb24gKCkge1xuXHQvKipcblx0ICogQHR5cGUge09ic2VydmFibGV9XG5cdCAqL1xuXHRjb25zdCByb290ID0gdGhpcy5zdGF0ZS5nZXRSb290KCk7XG5cdGNvbnN0IGZvcm0gPSByb290Py5wYXJlbnQ/LnJvb3Q/LmZvcm0gPz8gcm9vdC5mb3JtO1xuXG5cdHJldHVybiBmb3JtLmxvY2tTdGF0ZTtcbn07XG5cblBhZ2VTdGF0ZS5wcm90b3R5cGUuaXNMYXN0ID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdGhpcy5zdGF0ZS5pc0xhc3RQYWdlKCB0aGlzICk7XG59O1xuXG4vKipcbiAqIEBzaW5jZSAzLjAuNVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblBhZ2VTdGF0ZS5wcm90b3R5cGUuaXNGaXJzdCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMuc3RhdGUuaXNGaXJzdFBhZ2UoIHRoaXMgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGlucHV0IHtJbnB1dERhdGF8UmVwZWF0ZXJEYXRhfVxuICovXG5QYWdlU3RhdGUucHJvdG90eXBlLmhhbmRsZUlucHV0RW50ZXIgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRpbnB1dD8uZW50ZXJLZXk/LmFkZEZpbHRlciggKCkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBpbnB1dC5yb290LmZvcm07XG5cblx0XHRpZiAoIGZvcm0gKSB7XG5cdFx0XHRpZiAoIHRydWUgPT09IGZvcm0uY2FuVHJpZ2dlckVudGVyU3VibWl0ICkge1xuXHRcdFx0XHR0aGlzLmNoYW5nZVBhZ2UoKS50aGVuKCAoKSA9PiB7fSApLmNhdGNoKCAoKSA9PiB7fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNoYW5nZVBhZ2UoKS50aGVuKCAoKSA9PiB7fSApLmNhdGNoKCAoKSA9PiB7fSApO1xuXHRcdH1cblxuXHRcdC8vIHByZXZlbnQgc3VibWl0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9ICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLnJlZ2lzdGVySW5wdXQgPSBmdW5jdGlvbiAoXG5cdGlucHV0LFxuXHR7IGluY2x1ZGVJblZhbGlkYXRpb24gPSB0cnVlIH0gPSB7fSxcbikge1xuXHRpZiAoICFpbnB1dCB8fCB0aGlzLmlucHV0QmluZGluZ3MuaGFzKCBpbnB1dCApICkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXG5cdHRoaXMuaGFuZGxlSW5wdXRFbnRlciggaW5wdXQgKTtcblxuXHRjb25zdCBjbGVhckxvYWRpbmdXYXRjaCA9IGlucHV0LmxvYWRpbmcud2F0Y2goICgpID0+IHtcblx0XHRpZiAoIGlucHV0LmxvYWRpbmcuY3VycmVudCApIHtcblx0XHRcdHRoaXMuY2FuU3dpdGNoLmN1cnJlbnQgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVwZGF0ZVN0YXRlKCk7XG5cdFx0fVxuXHR9ICk7XG5cblx0Y29uc3QgYmluZGluZyA9IHtcblx0XHRjbGVhckxvYWRpbmdXYXRjaCxcblx0XHRjbGVhclZhbGlkaXR5V2F0Y2g6IG51bGwsXG5cdH07XG5cblx0aWYgKCBpbnB1dC5yZXBvcnRpbmcucmVzdHJpY3Rpb25zLmxlbmd0aCApIHtcblx0XHR0aGlzLmlucHV0cy5wdXNoKCBpbnB1dCApO1xuXHRcdGJpbmRpbmcuY2xlYXJWYWxpZGl0eVdhdGNoID0gaW5wdXQud2F0Y2hWYWxpZGl0eShcblx0XHRcdCgpID0+IHRoaXMudXBkYXRlU3RhdGUoKSxcblx0XHQpO1xuXG5cdFx0aWYgKCAhaW5jbHVkZUluVmFsaWRhdGlvbiApIHtcblx0XHRcdHRoaXMuaW5wdXRzID0gdGhpcy5pbnB1dHMuZmlsdGVyKCBjdXJyZW50ID0+IGN1cnJlbnQgIT09IGlucHV0ICk7XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5pbnB1dEJpbmRpbmdzLnNldCggaW5wdXQsIGJpbmRpbmcgKTtcblxuXHRyZXR1cm4gaW5wdXQ7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLnVucmVnaXN0ZXJJbnB1dCA9IGZ1bmN0aW9uICggaW5wdXQgKSB7XG5cdGlmICggIXRoaXMuaW5wdXRCaW5kaW5ncy5oYXMoIGlucHV0ICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYmluZGluZyA9IHRoaXMuaW5wdXRCaW5kaW5ncy5nZXQoIGlucHV0ICk7XG5cblx0YmluZGluZz8uY2xlYXJMb2FkaW5nV2F0Y2g/LigpO1xuXHRiaW5kaW5nPy5jbGVhclZhbGlkaXR5V2F0Y2g/LigpO1xuXG5cdHRoaXMuaW5wdXRCaW5kaW5ncy5kZWxldGUoIGlucHV0ICk7XG5cdHRoaXMuaW5wdXRzID0gdGhpcy5pbnB1dHMuZmlsdGVyKCBjdXJyZW50ID0+IGN1cnJlbnQgIT09IGlucHV0ICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLmdldFRyYWNrZWRJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBBcnJheS5mcm9tKCB0aGlzLmlucHV0QmluZGluZ3Mua2V5cygpICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLmdldE9mZnNldFRvcCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIGdldE9mZnNldFRvcCggdGhpcy5ub2RlICkgLSB0aGlzLm9mZnNldDtcbn07XG5cbi8qKlxuICogQHNpbmNlIDMuMi4zXG4gKi9cblBhZ2VTdGF0ZS5wcm90b3R5cGUudXBkYXRlT2Zmc2V0QnlQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCAhdGhpcy5zdGF0ZT8ucHJvZ3Jlc3M/Lm5vZGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMub2Zmc2V0ICs9ICt0aGlzLnN0YXRlLnByb2dyZXNzLm5vZGUuY2xpZW50SGVpZ2h0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFnZVN0YXRlO1xuIiwiZnVuY3Rpb24gUHJvZ3Jlc3NCYXIoIG5vZGUsIHN0YXRlICkge1xuXHQvKipcblx0ICogQHBhcmFtIG5vZGUgIHtIVE1MRWxlbWVudH1cblx0ICogQHBhcmFtIHN0YXRlIHtNdWx0aVN0ZXBTdGF0ZX1cblx0ICovXG5cdHRoaXMubm9kZSA9IG5vZGU7XG5cdHRoaXMuc3RhdGUgPSBzdGF0ZTtcblxuXHR0aGlzLnN0YXRlLmluZGV4LndhdGNoKCAoKSA9PiB0aGlzLnVwZGF0ZUl0ZW1zKCkgKTtcblxuXHR0aGlzLnVwZGF0ZUl0ZW1zID0gZnVuY3Rpb24gKCkge1xuXHRcdGNvbnN0IHsgY3VycmVudCB9ID0gdGhpcy5zdGF0ZS5pbmRleDtcblxuXHRcdGZvciAoIGNvbnN0IGl0ZW0gb2YgdGhpcy5ub2RlLmNoaWxkcmVuICkge1xuXHRcdFx0Y29uc3QgcGFnZUluZGV4ID0gK2l0ZW0uZGF0YXNldC5wYWdlO1xuXG5cdFx0XHRpZiAoIHBhZ2VJbmRleCA8IGN1cnJlbnQgKSB7XG5cdFx0XHRcdHRoaXMubWFrZVBhc3NlZCggaXRlbSApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIGN1cnJlbnQgPT09IHBhZ2VJbmRleCApIHtcblx0XHRcdFx0dGhpcy5tYWtlQWN0aXZlKCBpdGVtICk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5tYWtlTm90UGFzc2VkKCBpdGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0gZWxlbWVudCB7SFRNTEVsZW1lbnR9XG5cdCAqL1xuXHR0aGlzLm1ha2VBY3RpdmUgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAncGFzc2VkLXBhZ2UnICk7XG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnYWN0aXZlLXBhZ2UnICk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGVtZW50IHtIVE1MRWxlbWVudH1cblx0ICovXG5cdHRoaXMubWFrZVBhc3NlZCA9IGZ1bmN0aW9uICggZWxlbWVudCApIHtcblx0XHRlbGVtZW50LmNsYXNzTGlzdC5hZGQoICdwYXNzZWQtcGFnZScgKTtcblx0XHRlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdhY3RpdmUtcGFnZScgKTtcblx0fTtcblxuXHR0aGlzLm1ha2VOb3RQYXNzZWQgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlLXBhZ2UnLCAncGFzc2VkLXBhZ2UnICk7XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzQmFyOyIsImltcG9ydCBNdWx0aVN0ZXBTdGF0ZSBmcm9tICcuL011bHRpU3RlcFN0YXRlJztcblxuZnVuY3Rpb24gY3JlYXRlTXVsdGlTdGVwKCByb290T3JCbG9jayApIHtcblx0Y29uc3QgbXVsdGlzdGVwID0gbmV3IE11bHRpU3RlcFN0YXRlKCk7XG5cdG11bHRpc3RlcC5zZXRTY29wZSggcm9vdE9yQmxvY2sgKTtcblxuXHRjb25zdCBwYWdlcyA9IFtdO1xuXG5cdGZvciAoIGNvbnN0IGNoaWxkIG9mIG11bHRpc3RlcC5nZXRTY29wZU5vZGUoKS5jaGlsZE5vZGVzICkge1xuXHRcdGlmICggIWNoaWxkPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnamV0LWZvcm0tYnVpbGRlci1wYWdlJyApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdHBhZ2VzLnB1c2goIGNoaWxkICk7XG5cdH1cblxuXHRpZiAoICFwYWdlcy5sZW5ndGggKSB7XG5cdFx0cmV0dXJuIG11bHRpc3RlcDtcblx0fVxuXG5cdG11bHRpc3RlcC5zZXRQcm9ncmVzcygpO1xuXHRtdWx0aXN0ZXAuc2V0UGFnZXMoIHBhZ2VzICk7XG5cblx0cmV0dXJuIG11bHRpc3RlcDtcbn1cblxuZXhwb3J0IHsgY3JlYXRlTXVsdGlTdGVwIH07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IGNyZWF0ZU11bHRpU3RlcCB9IGZyb20gJy4vZnVuY3Rpb25zJztcbmltcG9ydCBDb25kaXRpb25QYWdlU3RhdGVJdGVtIGZyb20gJy4vQ29uZGl0aW9uUGFnZVN0YXRlSXRlbSc7XG5cbmNvbnN0IHtcblx0ICAgICAgYWRkQWN0aW9uLFxuXHQgICAgICBhZGRGaWx0ZXIsXG4gICAgICB9ID0gSmV0UGx1Z2lucy5ob29rcztcblxuY29uc3Qge1xuXHQgICAgICBnZXRTY3JvbGxQYXJlbnQsXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJGdW5jdGlvbnM7XG5cbmFkZEFjdGlvbihcblx0J2pldC5mYi5vYnNlcnZlLmFmdGVyJyxcblx0J2pldC1mb3JtLWJ1aWxkZXIvbXVsdGktc3RlcCcsXG5cdGZ1bmN0aW9uICggb2JzZXJ2YWJsZSApIHtcblx0XHRjb25zdCBtdWx0aXN0ZXAgPSBjcmVhdGVNdWx0aVN0ZXAoIG9ic2VydmFibGUgKTtcblxuXHRcdGlmICggIW11bHRpc3RlcC5nZXRQYWdlcygpPy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0b2JzZXJ2YWJsZS5tdWx0aXN0ZXAgPSBtdWx0aXN0ZXA7XG5cdFx0bXVsdGlzdGVwLm9uUmVhZHkoKTtcblx0fSxcblx0MTUsXG4pO1xuXG5hZGRBY3Rpb24oXG5cdCdqZXQuZmIuY29uZGl0aW9uYWwuaW5pdCcsXG5cdCdqZXQtZm9ybS1idWlsZGVyL211bHRpLXN0ZXAnLFxuXHRmdW5jdGlvbiAoIGJsb2NrICkge1xuXHRcdGNvbnN0IG11bHRpc3RlcCA9IGNyZWF0ZU11bHRpU3RlcCggYmxvY2sgKTtcblxuXHRcdGlmICggIW11bHRpc3RlcC5nZXRQYWdlcygpPy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YmxvY2subXVsdGlzdGVwID0gbXVsdGlzdGVwO1xuXHRcdG11bHRpc3RlcC5vblJlYWR5KCk7XG5cdH0sXG4pO1xuXG5hZGRGaWx0ZXIoXG5cdCdqZXQuZmIuY29uZGl0aW9uYWwudHlwZXMnLFxuXHQnamV0LWZvcm0tYnVpbGRlci9tdWx0aS1zdGVwJyxcblx0ZnVuY3Rpb24gKCBpdGVtcyApIHtcblx0XHRpdGVtcyA9IFsgQ29uZGl0aW9uUGFnZVN0YXRlSXRlbSwgLi4uaXRlbXMgXTtcblxuXHRcdHJldHVybiBpdGVtcztcblx0fSxcbik7XG5cbmFkZEFjdGlvbihcblx0J2pldC5mYi5tdWx0aXN0ZXAuaW5pdCcsXG5cdCdqZXQtZm9ybS1idWlsZGVyL211bHRpLXN0ZXAvYXV0b3Njcm9sbCcsXG5cdC8qKlxuXHQgKiBAcGFyYW0gbXVsdGlzdGVwIHtNdWx0aVN0ZXBTdGF0ZX1cblx0ICovXG5cdGZ1bmN0aW9uICggbXVsdGlzdGVwICkge1xuXHRcdGlmICggIXdpbmRvdz8uSmV0Rm9ybUJ1aWxkZXJTZXR0aW5ncz8uc2Nyb2xsX29uX25leHQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG11bHRpc3RlcC5pbmRleC53YXRjaCggKCkgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBAdHlwZSB7UGFnZVN0YXRlfGJvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHBhZ2UgPSBtdWx0aXN0ZXAuZ2V0Q3VycmVudFBhZ2UoKTtcblxuXHRcdFx0Y29uc3QgcGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KCBwYWdlLm5vZGUgKTtcblx0XHRcdGNvbnN0IHRvcCAgICA9IHBhZ2UuZ2V0T2Zmc2V0VG9wKCk7XG5cblx0XHRcdHBhcmVudD8uc2Nyb2xsVG8/LiggeyB0b3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9ICk7XG5cdFx0fSApO1xuXHR9LFxuKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= |