vendor: 7,844 bytes, lines 1-187
1import { t as __commonJSMin } from "/node_modules/.vite/deps/rolldown-runtime-DC62tzP2.js?v=ae253003"; 2import { t as require_react } from "/node_modules/.vite/deps/react.js?v=ae253003"; 3import { t as require_react_dom } from "/node_modules/.vite/deps/react-dom.js?v=ae253003"; 4//#region node_modules/scheduler/cjs/scheduler.development.js 5/** 6* @license React 7* scheduler.development.js 8* 9* Copyright (c) Meta Platforms, Inc. and affiliates. 10* 11* This source code is licensed under the MIT license found in the 12* LICENSE file in the root directory of this source tree. 13*/ 14var require_scheduler_development = /* @__PURE__ */ __commonJSMin(((exports) => { 15 (function() { 16 function performWorkUntilDeadline() { 17 needsPaint = !1; 18 if (isMessageLoopRunning) { 19 var currentTime = exports.unstable_now(); 20 startTime = currentTime; 21 var hasMoreWork = !0; 22 try { 23 a: { 24 isHostCallbackScheduled = !1; 25 isHostTimeoutScheduled && (isHostTimeoutScheduled = !1, localClearTimeout(taskTimeoutID), taskTimeoutID = -1); 26 isPerformingWork = !0; 27 var previousPriorityLevel = currentPriorityLevel; 28 try { 29 b: { 30 advanceTimers(currentTime); 31 for (currentTask = peek(taskQueue); null !== currentTask && !(currentTask.expirationTime > currentTime && shouldYieldToHost());) { 32 var callback = currentTask.callback; 33 if ("function" === typeof callback) { 34 currentTask.callback = null; 35 currentPriorityLevel = currentTask.priorityLevel; 36 var continuationCallback = callback(currentTask.expirationTime <= currentTime); 37 currentTime = exports.unstable_now(); 38 if ("function" === typeof continuationCallback) { 39 currentTask.callback = continuationCallback; 40 advanceTimers(currentTime); 41 hasMoreWork = !0; 42 break b; 43 } 44 currentTask === peek(taskQueue) && pop(taskQueue); 45 advanceTimers(currentTime); 46 } else pop(taskQueue); 47 currentTask = peek(taskQueue); 48 } 49 if (null !== currentTask) hasMoreWork = !0; 50 else { 51 var firstTimer = peek(timerQueue); 52 null !== firstTimer && requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); 53 hasMoreWork = !1; 54 } 55 } 56 break a; 57 } finally { 58 currentTask = null, currentPriorityLevel = previousPriorityLevel, isPerformingWork = !1; 59 } 60 hasMoreWork = void 0; 61 } 62 } finally { 63 hasMoreWork ? schedulePerformWorkUntilDeadline() : isMessageLoopRunning = !1; 64 } 65 } 66 } 67 function push(heap, node) { 68 var index = heap.length; 69 heap.push(node); 70 a: for (; 0 < index;) { 71 var parentIndex = index - 1 >>> 1, parent = heap[parentIndex]; 72 if (0 < compare(parent, node)) heap[parentIndex] = node, heap[index] = parent, index = parentIndex; 73 else break a; 74 } 75 } 76 function peek(heap) { 77 return 0 === heap.length ? null : heap[0]; 78 } 79 function pop(heap) { 80 if (0 === heap.length) return null; 81 var first = heap[0], last = heap.pop(); 82 if (last !== first) { 83 heap[0] = last; 84 a: for (var index = 0, length = heap.length, halfLength = length >>> 1; index < halfLength;) { 85 var leftIndex = 2 * (index + 1) - 1, left = heap[leftIndex], rightIndex = leftIndex + 1, right = heap[rightIndex]; 86 if (0 > compare(left, last)) rightIndex < length && 0 > compare(right, left) ? (heap[index] = right, heap[rightIndex] = last, index = rightIndex) : (heap[index] = left, heap[leftIndex] = last, index = leftIndex); 87 else if (rightIndex < length && 0 > compare(right, last)) heap[index] = right, heap[rightIndex] = last, index = rightIndex; 88 else break a; 89 } 90 } 91 return first; 92 } 93 function compare(a, b) { 94 var diff = a.sortIndex - b.sortIndex; 95 return 0 !== diff ? diff : a.id - b.id; 96 } 97 function advanceTimers(currentTime) { 98 for (var timer = peek(timerQueue); null !== timer;) { 99 if (null === timer.callback) pop(timerQueue); 100 else if (timer.startTime <= currentTime) pop(timerQueue), timer.sortIndex = timer.expirationTime, push(taskQueue, timer); 101 else break; 102 timer = peek(timerQueue); 103 } 104 } 105 function handleTimeout(currentTime) { 106 isHostTimeoutScheduled = !1; 107 advanceTimers(currentTime); 108 if (!isHostCallbackScheduled) if (null !== peek(taskQueue)) isHostCallbackScheduled = !0, isMessageLoopRunning || (isMessageLoopRunning = !0, schedulePerformWorkUntilDeadline()); 109 else { 110 var firstTimer = peek(timerQueue); 111 null !== firstTimer && requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); 112 } 113 } 114 function shouldYieldToHost() { 115 return needsPaint ? !0 : exports.unstable_now() - startTime < frameInterval ? !1 : !0; 116 } 117 function requestHostTimeout(callback, ms) { 118 taskTimeoutID = localSetTimeout(function() { 119 callback(exports.unstable_now()); 120 }, ms); 121 } 122 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 123 exports.unstable_now = void 0; 124 if ("object" === typeof performance && "function" === typeof performance.now) { 125 var localPerformance = performance; 126 exports.unstable_now = function() { 127 return localPerformance.now(); 128 }; 129 } else { 130 var localDate = Date, initialTime = localDate.now(); 131 exports.unstable_now = function() { 132 return localDate.now() - initialTime; 133 }; 134 } 135 var taskQueue = [], timerQueue = [], taskIdCounter = 1, currentTask = null, currentPriorityLevel = 3, isPerformingWork = !1, isHostCallbackScheduled = !1, isHostTimeoutScheduled = !1, needsPaint = !1, localSetTimeout = "function" === typeof setTimeout ? setTimeout : null, localClearTimeout = "function" === typeof clearTimeout ? clearTimeout : null, localSetImmediate = "undefined" !== typeof setImmediate ? setImmediate : null, isMessageLoopRunning = !1, taskTimeoutID = -1, frameInterval = 5, startTime = -1; 136 if ("function" === typeof localSetImmediate) var schedulePerformWorkUntilDeadline = function() { 137 localSetImmediate(performWorkUntilDeadline); 138 }; 139 else if ("undefined" !== typeof MessageChannel) { 140 var channel = new MessageChannel(), port = channel.port2; 141 channel.port1.onmessage = performWorkUntilDeadline; 142 schedulePerformWorkUntilDeadline = function() { 143 port.postMessage(null); 144 }; 145 } else schedulePerformWorkUntilDeadline = function() { 146 localSetTimeout(performWorkUntilDeadline, 0); 147 }; 148 exports.unstable_IdlePriority = 5; 149 exports.unstable_ImmediatePriority = 1; 150 exports.unstable_LowPriority = 4; 151 exports.unstable_NormalPriority = 3; 152 exports.unstable_Profiling = null; 153 exports.unstable_UserBlockingPriority = 2; 154 exports.unstable_cancelCallback = function(task) { 155 task.callback = null; 156 }; 157 exports.unstable_forceFrameRate = function(fps) { 158 0 > fps || 125 < fps ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5; 159 }; 160 exports.unstable_getCurrentPriorityLevel = function() { 161 return currentPriorityLevel; 162 }; 163 exports.unstable_next = function(eventHandler) { 164 switch (currentPriorityLevel) { 165 case 1: 166 case 2: 167 case 3: 168 var priorityLevel = 3; 169 break; 170 default: priorityLevel = currentPriorityLevel; 171 } 172 var previousPriorityLevel = currentPriorityLevel; 173 currentPriorityLevel = priorityLevel; 174 try { 175 return eventHandler(); 176 } finally { 177 currentPriorityLevel = previousPriorityLevel; 178 } 179 }; 180 exports.unstable_requestPaint = function() { 181 needsPaint = !0; 182 }; 183 exports.unstable_runWithPriority = function(priorityLevel, eventHandler) { 184 switch (priorityLevel) { 185 case 1: 186 case 2: 187 case 3:
vendor: 4,600 bytes, lines 188-300
188 case 4: 189 case 5: break; 190 default: priorityLevel = 3; 191 } 192 var previousPriorityLevel = currentPriorityLevel; 193 currentPriorityLevel = priorityLevel; 194 try { 195 return eventHandler(); 196 } finally { 197 currentPriorityLevel = previousPriorityLevel; 198 } 199 }; 200 exports.unstable_scheduleCallback = function(priorityLevel, callback, options) { 201 var currentTime = exports.unstable_now(); 202 "object" === typeof options && null !== options ? (options = options.delay, options = "number" === typeof options && 0 < options ? currentTime + options : currentTime) : options = currentTime; 203 switch (priorityLevel) { 204 case 1: 205 var timeout = -1; 206 break; 207 case 2: 208 timeout = 250; 209 break; 210 case 5: 211 timeout = 1073741823; 212 break; 213 case 4: 214 timeout = 1e4; 215 break; 216 default: timeout = 5e3; 217 } 218 timeout = options + timeout; 219 priorityLevel = { 220 id: taskIdCounter++, 221 callback, 222 priorityLevel, 223 startTime: options, 224 expirationTime: timeout, 225 sortIndex: -1 226 }; 227 options > currentTime ? (priorityLevel.sortIndex = options, push(timerQueue, priorityLevel), null === peek(taskQueue) && priorityLevel === peek(timerQueue) && (isHostTimeoutScheduled ? (localClearTimeout(taskTimeoutID), taskTimeoutID = -1) : isHostTimeoutScheduled = !0, requestHostTimeout(handleTimeout, options - currentTime))) : (priorityLevel.sortIndex = timeout, push(taskQueue, priorityLevel), isHostCallbackScheduled || isPerformingWork || (isHostCallbackScheduled = !0, isMessageLoopRunning || (isMessageLoopRunning = !0, schedulePerformWorkUntilDeadline()))); 228 return priorityLevel; 229 }; 230 exports.unstable_shouldYield = shouldYieldToHost; 231 exports.unstable_wrapCallback = function(callback) { 232 var parentPriorityLevel = currentPriorityLevel; 233 return function() { 234 var previousPriorityLevel = currentPriorityLevel; 235 currentPriorityLevel = parentPriorityLevel; 236 try { 237 return callback.apply(this, arguments); 238 } finally { 239 currentPriorityLevel = previousPriorityLevel; 240 } 241 }; 242 }; 243 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 244 })(); 245})); 246//#endregion 247//#region node_modules/scheduler/index.js 248var require_scheduler = /* @__PURE__ */ __commonJSMin(((exports, module) => { 249 module.exports = require_scheduler_development(); 250})); 251//#endregion 252//#region node_modules/react-dom/cjs/react-dom-client.development.js 253/** 254* @license React 255* react-dom-client.development.js 256* 257* Copyright (c) Meta Platforms, Inc. and affiliates. 258* 259* This source code is licensed under the MIT license found in the 260* LICENSE file in the root directory of this source tree. 261*/ 262var require_react_dom_client_development = /* @__PURE__ */ __commonJSMin(((exports) => { 263 (function() { 264 function findHook(fiber, id) { 265 for (fiber = fiber.memoizedState; null !== fiber && 0 < id;) fiber = fiber.next, id--; 266 return fiber; 267 } 268 function copyWithSetImpl(obj, path, index, value) { 269 if (index >= path.length) return value; 270 var key = path[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj); 271 updated[key] = copyWithSetImpl(obj[key], path, index + 1, value); 272 return updated; 273 } 274 function copyWithRename(obj, oldPath, newPath) { 275 if (oldPath.length !== newPath.length) console.warn("copyWithRename() expects paths of the same length"); 276 else { 277 for (var i = 0; i < newPath.length - 1; i++) if (oldPath[i] !== newPath[i]) { 278 console.warn("copyWithRename() expects paths to be the same except for the deepest key"); 279 return; 280 } 281 return copyWithRenameImpl(obj, oldPath, newPath, 0); 282 } 283 } 284 function copyWithRenameImpl(obj, oldPath, newPath, index) { 285 var oldKey = oldPath[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj); 286 index + 1 === oldPath.length ? (updated[newPath[index]] = updated[oldKey], isArrayImpl(updated) ? updated.splice(oldKey, 1) : delete updated[oldKey]) : updated[oldKey] = copyWithRenameImpl(obj[oldKey], oldPath, newPath, index + 1); 287 return updated; 288 } 289 function copyWithDeleteImpl(obj, path, index) { 290 var key = path[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj); 291 if (index + 1 === path.length) return isArrayImpl(updated) ? updated.splice(key, 1) : delete updated[key], updated; 292 updated[key] = copyWithDeleteImpl(obj[key], path, index + 1); 293 return updated; 294 } 295 function shouldSuspendImpl() { 296 return !1; 297 } 298 function shouldErrorImpl() { 299 return null; 300 }
301 function warnInvalidHookAccess() { 302 console.error("Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. You can only call Hooks at the top level of your React function. For more information, see https://react.dev/link/rules-of-hooks"); 303 } 304 function warnInvalidContextAccess() { 305 console.error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); 306 } 307 function noop() {} 308 function warnForMissingKey() {} 309 function setToSortedString(set) { 310 var array = []; 311 set.forEach(function(value) { 312 array.push(value); 313 }); 314 return array.sort().join(", "); 315 } 316 function createFiber(tag, pendingProps, key, mode) { 317 return new FiberNode(tag, pendingProps, key, mode); 318 } 319 function scheduleRoot(root, element) { 320 root.context === emptyContextObject && (updateContainerImpl(root.current, 2, element, root, null, null), flushSyncWork$1()); 321 } 322 function scheduleRefresh(root, update) { 323 if (null !== resolveFamily) { 324 var staleFamilies = update.staleFamilies; 325 update = update.updatedFamilies; 326 flushPendingEffects(); 327 scheduleFibersWithFamiliesRecursively(root.current, update, staleFamilies); 328 flushSyncWork$1(); 329 } 330 } 331 function setRefreshHandler(handler) { 332 resolveFamily = handler; 333 } 334 function isValidContainer(node) { 335 return !(!node || 1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType); 336 } 337 function getNearestMountedFiber(fiber) { 338 for (var node = fiber, nextNode = node; nextNode && !nextNode.alternate;) node = nextNode, 0 !== (node.flags & 4098) && (fiber = node.return), nextNode = node.return; 339 for (; node.return;) node = node.return; 340 return 3 === node.tag ? fiber : null; 341 } 342 function getSuspenseInstanceFromFiber(fiber) { 343 if (13 === fiber.tag) { 344 var suspenseState = fiber.memoizedState; 345 null === suspenseState && (fiber = fiber.alternate, null !== fiber && (suspenseState = fiber.memoizedState)); 346 if (null !== suspenseState) return suspenseState.dehydrated; 347 } 348 return null; 349 } 350 function getActivityInstanceFromFiber(fiber) { 351 if (31 === fiber.tag) { 352 var activityState = fiber.memoizedState; 353 null === activityState && (fiber = fiber.alternate, null !== fiber && (activityState = fiber.memoizedState)); 354 if (null !== activityState) return activityState.dehydrated; 355 } 356 return null; 357 } 358 function assertIsMounted(fiber) { 359 if (getNearestMountedFiber(fiber) !== fiber) throw Error("Unable to find node on an unmounted component."); 360 } 361 function findCurrentFiberUsingSlowPath(fiber) { 362 var alternate = fiber.alternate; 363 if (!alternate) { 364 alternate = getNearestMountedFiber(fiber); 365 if (null === alternate) throw Error("Unable to find node on an unmounted component."); 366 return alternate !== fiber ? null : fiber; 367 } 368 for (var a = fiber, b = alternate;;) { 369 var parentA = a.return; 370 if (null === parentA) break; 371 var parentB = parentA.alternate; 372 if (null === parentB) { 373 b = parentA.return; 374 if (null !== b) { 375 a = b; 376 continue; 377 } 378 break; 379 } 380 if (parentA.child === parentB.child) { 381 for (parentB = parentA.child; parentB;) { 382 if (parentB === a) return assertIsMounted(parentA), fiber; 383 if (parentB === b) return assertIsMounted(parentA), alternate; 384 parentB = parentB.sibling; 385 } 386 throw Error("Unable to find node on an unmounted component."); 387 } 388 if (a.return !== b.return) a = parentA, b = parentB; 389 else { 390 for (var didFindChild = !1, _child = parentA.child; _child;) { 391 if (_child === a) { 392 didFindChild = !0; 393 a = parentA; 394 b = parentB; 395 break; 396 } 397 if (_child === b) { 398 didFindChild = !0; 399 b = parentA; 400 a = parentB; 401 break; 402 } 403 _child = _child.sibling; 404 } 405 if (!didFindChild) { 406 for (_child = parentB.child; _child;) { 407 if (_child === a) { 408 didFindChild = !0; 409 a = parentB; 410 b = parentA; 411 break; 412 } 413 if (_child === b) { 414 didFindChild = !0; 415 b = parentB; 416 a = parentA; 417 break; 418 } 419 _child = _child.sibling; 420 } 421 if (!didFindChild) throw Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue."); 422 } 423 } 424 if (a.alternate !== b) throw Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."); 425 } 426 if (3 !== a.tag) throw Error("Unable to find node on an unmounted component."); 427 return a.stateNode.current === a ? fiber : alternate; 428 } 429 function findCurrentHostFiberImpl(node) { 430 var tag = node.tag; 431 if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node; 432 for (node = node.child; null !== node;) { 433 tag = findCurrentHostFiberImpl(node); 434 if (null !== tag) return tag; 435 node = node.sibling; 436 } 437 return null; 438 } 439 function traverseFragmentInstancesAndTextInstances(fragmentFiber, fn, a, b, c) { 440 traverseVisibleInstancesAndTextInstances(fragmentFiber.child, !1, fn, a, b, c); 441 } 442 function traverseVisibleInstancesAndTextInstances(child, searchWithinHosts, fn, a, b, c) { 443 for (; null !== child;) { 444 if ((5 === child.tag || 27 === child.tag || 6 === child.tag) && fn(child, a, b, c) || (22 !== child.tag || null === child.memoizedState) && (searchWithinHosts || 5 !== child.tag && 27 !== child.tag) && traverseVisibleInstancesAndTextInstances(child.child, searchWithinHosts, fn, a, b, c)) return !0; 445 child = child.sibling; 446 } 447 return !1; 448 } 449 function getFragmentParentInstanceOrContainerFiber(fiber) { 450 for (fiber = fiber.return; null !== fiber;) { 451 if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) return fiber; 452 fiber = fiber.return; 453 } 454 return null; 455 } 456 function fiberIsPortaledIntoHost(fiber) { 457 var foundPortalParent = !1; 458 for (fiber = fiber.return; null !== fiber;) { 459 4 === fiber.tag && (foundPortalParent = !0); 460 if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) break; 461 fiber = fiber.return; 462 } 463 return foundPortalParent; 464 } 465 function getFragmentInstanceOrTextInstanceSiblings(fiber) { 466 var result = [null, null], parentHostFiber = getFragmentParentInstanceOrContainerFiber(fiber); 467 if (null === parentHostFiber) return result; 468 findFragmentInstanceOrTextInstanceSiblings(result, fiber, parentHostFiber.child, { foundSelf: !1 }); 469 return result; 470 } 471 function findFragmentInstanceOrTextInstanceSiblings(result, self, child, state) { 472 for (; null !== child;) { 473 if (child === self) state.foundSelf = !0; 474 else if (5 === child.tag || 27 === child.tag || 6 === child.tag) { 475 if (state.foundSelf) return result[1] = child, !0; 476 result[0] = child; 477 } else if ((22 !== child.tag || null === child.memoizedState) && findFragmentInstanceOrTextInstanceSiblings(result, self, child.child, state)) return !0; 478 child = child.sibling; 479 } 480 return !1; 481 } 482 function getInstanceFromHostFiber(fiber) { 483 switch (fiber.tag) { 484 case 5: 485 case 27: 486 case 6: return fiber.stateNode; 487 case 3: return fiber.stateNode.containerInfo; 488 default: throw Error("Expected to find a host node. This is a bug in React."); 489 } 490 } 491 function isFiberPrecedingCheck(child, target, boundary) {
492 return child === boundary ? !0 : child === target ? (searchTarget = child, !0) : !1; 493 } 494 function isFiberFollowingCheck(child, target, boundary) { 495 return child === boundary ? (searchBoundary = child, !1) : child === target ? (null !== searchBoundary && (searchTarget = child), !0) : !1; 496 } 497 function getParentForFragmentAncestors(inst) { 498 if (null === inst) return null; 499 do 500 inst = null === inst ? null : inst.return; 501 while (inst && 5 !== inst.tag && 27 !== inst.tag && 3 !== inst.tag); 502 return inst ? inst : null; 503 } 504 function getLowestCommonAncestor(instA, instB, getParent) { 505 for (var depthA = 0, tempA = instA; tempA; tempA = getParent(tempA)) depthA++; 506 tempA = 0; 507 for (var tempB = instB; tempB; tempB = getParent(tempB)) tempA++; 508 for (; 0 < depthA - tempA;) instA = getParent(instA), depthA--; 509 for (; 0 < tempA - depthA;) instB = getParent(instB), tempA--; 510 for (; depthA--;) { 511 if (instA === instB || null !== instB && instA === instB.alternate) return instA; 512 instA = getParent(instA); 513 instB = getParent(instB); 514 } 515 return null; 516 } 517 function getIteratorFn(maybeIterable) { 518 if (null === maybeIterable || "object" !== typeof maybeIterable) return null; 519 maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"]; 520 return "function" === typeof maybeIterable ? maybeIterable : null; 521 } 522 function getComponentNameFromType(type) { 523 if (null == type) return null; 524 if ("function" === typeof type) return type.$$typeof === REACT_CLIENT_REFERENCE ? null : type.displayName || type.name || null; 525 if ("string" === typeof type) return type; 526 switch (type) { 527 case REACT_FRAGMENT_TYPE: return "Fragment"; 528 case REACT_PROFILER_TYPE: return "Profiler"; 529 case REACT_STRICT_MODE_TYPE: return "StrictMode"; 530 case REACT_SUSPENSE_TYPE: return "Suspense"; 531 case REACT_SUSPENSE_LIST_TYPE: return "SuspenseList"; 532 case REACT_ACTIVITY_TYPE: return "Activity"; 533 case REACT_VIEW_TRANSITION_TYPE: return "ViewTransition"; 534 } 535 if ("object" === typeof type) switch ("number" === typeof type.tag && console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), type.$$typeof) { 536 case REACT_PORTAL_TYPE: return "Portal"; 537 case REACT_CONTEXT_TYPE: return type.displayName || "Context"; 538 case REACT_CONSUMER_TYPE: return (type._context.displayName || "Context") + ".Consumer"; 539 case REACT_FORWARD_REF_TYPE: 540 var innerType = type.render; 541 type = type.displayName; 542 type || (type = innerType.displayName || innerType.name || "", type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef"); 543 return type; 544 case REACT_MEMO_TYPE: return innerType = type.displayName || null, null !== innerType ? innerType : getComponentNameFromType(type.type) || "Memo"; 545 case REACT_LAZY_TYPE: 546 innerType = type._payload; 547 type = type._init; 548 try { 549 return getComponentNameFromType(type(innerType)); 550 } catch (x) {} 551 } 552 return null; 553 } 554 function getComponentNameFromOwner(owner) { 555 return "number" === typeof owner.tag ? getComponentNameFromFiber(owner) : "string" === typeof owner.name ? owner.name : null; 556 } 557 function getComponentNameFromFiber(fiber) { 558 var type = fiber.type; 559 switch (fiber.tag) { 560 case 31: return "Activity"; 561 case 24: return "Cache"; 562 case 9: return (type._context.displayName || "Context") + ".Consumer"; 563 case 10: return type.displayName || "Context"; 564 case 18: return "DehydratedFragment"; 565 case 11: return fiber = type.render, fiber = fiber.displayName || fiber.name || "", type.displayName || ("" !== fiber ? "ForwardRef(" + fiber + ")" : "ForwardRef"); 566 case 7: return "Fragment"; 567 case 26: 568 case 27: 569 case 5: return type; 570 case 4: return "Portal"; 571 case 3: return "Root"; 572 case 6: return "Text"; 573 case 16: return getComponentNameFromType(type); 574 case 8: return type === REACT_STRICT_MODE_TYPE ? "StrictMode" : "Mode"; 575 case 22: 576 if (null !== fiber.return) return getComponentNameFromFiber(fiber.return); 577 break; 578 case 12: return "Profiler"; 579 case 21: return "Scope"; 580 case 13: return "Suspense"; 581 case 19: return "SuspenseList"; 582 case 25: return "TracingMarker"; 583 case 30: return "ViewTransition"; 584 case 1: 585 case 0: 586 case 14:
vendor: 18,155 bytes, lines 587-1002
587 case 15: 588 if ("function" === typeof type) return type.displayName || type.name || null; 589 if ("string" === typeof type) return type; 590 break; 591 case 29: 592 type = fiber._debugInfo; 593 if (null != type) { 594 for (var i = type.length - 1; 0 <= i; i--) if ("string" === typeof type[i].name) return type[i].name; 595 } 596 if (null !== fiber.return) return getComponentNameFromFiber(fiber.return); 597 } 598 return null; 599 } 600 function createCursor(defaultValue) { 601 return { current: defaultValue }; 602 } 603 function pop(cursor, fiber) { 604 0 > index$jscomp$0 ? console.error("Unexpected pop.") : (fiber !== fiberStack[index$jscomp$0] && console.error("Unexpected Fiber popped."), cursor.current = valueStack[index$jscomp$0], valueStack[index$jscomp$0] = null, fiberStack[index$jscomp$0] = null, index$jscomp$0--); 605 } 606 function push(cursor, value, fiber) { 607 index$jscomp$0++; 608 valueStack[index$jscomp$0] = cursor.current; 609 fiberStack[index$jscomp$0] = fiber; 610 cursor.current = value; 611 } 612 function requiredContext(c) { 613 null === c && console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."); 614 return c; 615 } 616 function pushHostContainer(fiber, nextRootInstance) { 617 push(rootInstanceStackCursor, nextRootInstance, fiber); 618 push(contextFiberStackCursor, fiber, fiber); 619 push(contextStackCursor, null, fiber); 620 var nextRootContext = nextRootInstance.nodeType; 621 switch (nextRootContext) { 622 case 9: 623 case 11: 624 nextRootContext = 9 === nextRootContext ? "#document" : "#fragment"; 625 nextRootInstance = (nextRootInstance = nextRootInstance.documentElement) ? (nextRootInstance = nextRootInstance.namespaceURI) ? getOwnHostContext(nextRootInstance) : HostContextNamespaceNone : HostContextNamespaceNone; 626 break; 627 default: if (nextRootContext = nextRootInstance.tagName, nextRootInstance = nextRootInstance.namespaceURI) nextRootInstance = getOwnHostContext(nextRootInstance), nextRootInstance = getChildHostContextProd(nextRootInstance, nextRootContext); 628 else switch (nextRootContext) { 629 case "svg": 630 nextRootInstance = HostContextNamespaceSvg; 631 break; 632 case "math": 633 nextRootInstance = HostContextNamespaceMath; 634 break; 635 default: nextRootInstance = HostContextNamespaceNone; 636 } 637 } 638 nextRootContext = nextRootContext.toLowerCase(); 639 nextRootContext = updatedAncestorInfoDev(null, nextRootContext); 640 nextRootContext = { 641 context: nextRootInstance, 642 ancestorInfo: nextRootContext 643 }; 644 pop(contextStackCursor, fiber); 645 push(contextStackCursor, nextRootContext, fiber); 646 } 647 function popHostContainer(fiber) { 648 pop(contextStackCursor, fiber); 649 pop(contextFiberStackCursor, fiber); 650 pop(rootInstanceStackCursor, fiber); 651 } 652 function getHostContext() { 653 return requiredContext(contextStackCursor.current); 654 } 655 function pushHostContext(fiber) { 656 var stateHook = fiber.memoizedState; 657 null !== stateHook && (HostTransitionContext._currentValue = stateHook.memoizedState, push(hostTransitionProviderCursor, fiber, fiber)); 658 stateHook = requiredContext(contextStackCursor.current); 659 var type = fiber.type; 660 var nextContext = getChildHostContextProd(stateHook.context, type); 661 type = updatedAncestorInfoDev(stateHook.ancestorInfo, type); 662 nextContext = { 663 context: nextContext, 664 ancestorInfo: type 665 }; 666 stateHook !== nextContext && (push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor, nextContext, fiber)); 667 } 668 function popHostContext(fiber) { 669 contextFiberStackCursor.current === fiber && (pop(contextStackCursor, fiber), pop(contextFiberStackCursor, fiber)); 670 hostTransitionProviderCursor.current === fiber && (pop(hostTransitionProviderCursor, fiber), HostTransitionContext._currentValue = NotPendingTransition); 671 } 672 function disabledLog() {} 673 function disableLogs() { 674 if (0 === disabledDepth) { 675 prevLog = console.log; 676 prevInfo = console.info; 677 prevWarn = console.warn; 678 prevError = console.error; 679 prevGroup = console.group; 680 prevGroupCollapsed = console.groupCollapsed; 681 prevGroupEnd = console.groupEnd; 682 var props = { 683 configurable: !0, 684 enumerable: !0, 685 value: disabledLog, 686 writable: !0 687 }; 688 Object.defineProperties(console, { 689 info: props, 690 log: props, 691 warn: props, 692 error: props, 693 group: props, 694 groupCollapsed: props, 695 groupEnd: props 696 }); 697 } 698 disabledDepth++; 699 } 700 function reenableLogs() { 701 disabledDepth--; 702 if (0 === disabledDepth) { 703 var props = { 704 configurable: !0, 705 enumerable: !0, 706 writable: !0 707 }; 708 Object.defineProperties(console, { 709 log: assign({}, props, { value: prevLog }), 710 info: assign({}, props, { value: prevInfo }), 711 warn: assign({}, props, { value: prevWarn }), 712 error: assign({}, props, { value: prevError }), 713 group: assign({}, props, { value: prevGroup }), 714 groupCollapsed: assign({}, props, { value: prevGroupCollapsed }), 715 groupEnd: assign({}, props, { value: prevGroupEnd }) 716 }); 717 } 718 0 > disabledDepth && console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); 719 } 720 function formatOwnerStack(error) { 721 var prevPrepareStackTrace = Error.prepareStackTrace; 722 Error.prepareStackTrace = void 0; 723 error = error.stack; 724 Error.prepareStackTrace = prevPrepareStackTrace; 725 error.startsWith("Error: react-stack-top-frame\n") && (error = error.slice(29)); 726 prevPrepareStackTrace = error.indexOf("\n"); 727 -1 !== prevPrepareStackTrace && (error = error.slice(prevPrepareStackTrace + 1)); 728 prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame"); 729 -1 !== prevPrepareStackTrace && (prevPrepareStackTrace = error.lastIndexOf("\n", prevPrepareStackTrace)); 730 if (-1 !== prevPrepareStackTrace) error = error.slice(0, prevPrepareStackTrace); 731 else return ""; 732 return error; 733 } 734 function describeBuiltInComponentFrame(name) { 735 if (void 0 === prefix) try { 736 throw Error(); 737 } catch (x) { 738 var match = x.stack.trim().match(/\n( *(at )?)/); 739 prefix = match && match[1] || ""; 740 suffix = -1 < x.stack.indexOf("\n at") ? " (<anonymous>)" : -1 < x.stack.indexOf("@") ? "@unknown:0:0" : ""; 741 } 742 return "\n" + prefix + name + suffix; 743 } 744 function describeNativeComponentFrame(fn, construct) { 745 if (!fn || reentry) return ""; 746 var frame = componentFrameCache.get(fn); 747 if (void 0 !== frame) return frame; 748 reentry = !0; 749 frame = Error.prepareStackTrace; 750 Error.prepareStackTrace = void 0; 751 var previousDispatcher = null; 752 previousDispatcher = ReactSharedInternals.H; 753 ReactSharedInternals.H = null; 754 disableLogs(); 755 try { 756 var RunInRootFrame = { DetermineComponentFrameRoot: function() { 757 try { 758 if (construct) { 759 var Fake = function() { 760 throw Error(); 761 }; 762 Object.defineProperty(Fake.prototype, "props", { set: function() { 763 throw Error(); 764 } }); 765 if ("object" === typeof Reflect && Reflect.construct) { 766 try { 767 Reflect.construct(Fake, []); 768 } catch (x) { 769 var control = x; 770 } 771 Reflect.construct(fn, [], Fake); 772 } else { 773 try { 774 Fake.call(); 775 } catch (x$0) { 776 control = x$0; 777 } 778 Fake = !1; 779 try { 780 var prevProps = Object.getOwnPropertyDescriptor(fn.prototype, "props"); 781 Object.defineProperty(fn.prototype, "props", { 782 configurable: !0, 783 set: function() { 784 throw Error(); 785 } 786 }); 787 Fake = !0; 788 new fn(); 789 } finally { 790 Fake && (void 0 !== prevProps ? Object.defineProperty(fn.prototype, "props", prevProps) : delete fn.prototype.props); 791 } 792 } 793 } else { 794 try { 795 throw Error(); 796 } catch (x$1) { 797 control = x$1; 798 } 799 (Fake = fn()) && "function" === typeof Fake.catch && Fake.catch(function() {}); 800 } 801 } catch (sample) { 802 if (sample && control && "string" === typeof sample.stack) return [sample.stack, control.stack]; 803 } 804 return [null, null]; 805 } }; 806 RunInRootFrame.DetermineComponentFrameRoot.displayName = "DetermineComponentFrameRoot"; 807 var namePropDescriptor = Object.getOwnPropertyDescriptor(RunInRootFrame.DetermineComponentFrameRoot, "name"); 808 namePropDescriptor && namePropDescriptor.configurable && Object.defineProperty(RunInRootFrame.DetermineComponentFrameRoot, "name", { value: "DetermineComponentFrameRoot" }); 809 var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(), sampleStack = _RunInRootFrame$Deter[0], controlStack = _RunInRootFrame$Deter[1]; 810 if (sampleStack && controlStack) { 811 var sampleLines = sampleStack.split("\n"), controlLines = controlStack.split("\n"); 812 for (_RunInRootFrame$Deter = namePropDescriptor = 0; namePropDescriptor < sampleLines.length && !sampleLines[namePropDescriptor].includes("DetermineComponentFrameRoot");) namePropDescriptor++; 813 for (; _RunInRootFrame$Deter < controlLines.length && !controlLines[_RunInRootFrame$Deter].includes("DetermineComponentFrameRoot");) _RunInRootFrame$Deter++; 814 if (namePropDescriptor === sampleLines.length || _RunInRootFrame$Deter === controlLines.length) for (namePropDescriptor = sampleLines.length - 1, _RunInRootFrame$Deter = controlLines.length - 1; 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter && sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter];) _RunInRootFrame$Deter--; 815 for (; 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter; namePropDescriptor--, _RunInRootFrame$Deter--) if (sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) { 816 if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) do 817 if (namePropDescriptor--, _RunInRootFrame$Deter--, 0 > _RunInRootFrame$Deter || sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) { 818 var _frame = "\n" + sampleLines[namePropDescriptor].replace(" at new ", " at "); 819 fn.displayName && _frame.includes("<anonymous>") && (_frame = _frame.replace("<anonymous>", fn.displayName)); 820 "function" === typeof fn && componentFrameCache.set(fn, _frame); 821 return _frame; 822 } 823 while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter); 824 break; 825 } 826 } 827 } finally { 828 reentry = !1, ReactSharedInternals.H = previousDispatcher, reenableLogs(), Error.prepareStackTrace = frame; 829 } 830 sampleLines = (sampleLines = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(sampleLines) : ""; 831 "function" === typeof fn && componentFrameCache.set(fn, sampleLines); 832 return sampleLines; 833 } 834 function describeFiber(fiber, childFiber) { 835 switch (fiber.tag) { 836 case 26: 837 case 27: 838 case 5: return describeBuiltInComponentFrame(fiber.type); 839 case 16: return describeBuiltInComponentFrame("Lazy"); 840 case 13: return fiber.child !== childFiber && null !== childFiber ? describeBuiltInComponentFrame("Suspense Fallback") : describeBuiltInComponentFrame("Suspense"); 841 case 19: return describeBuiltInComponentFrame("SuspenseList"); 842 case 0: 843 case 15: return describeNativeComponentFrame(fiber.type, !1); 844 case 11: return describeNativeComponentFrame(fiber.type.render, !1); 845 case 1: return describeNativeComponentFrame(fiber.type, !0); 846 case 31: return describeBuiltInComponentFrame("Activity"); 847 case 30: return describeBuiltInComponentFrame("ViewTransition"); 848 default: return ""; 849 } 850 } 851 function getStackByFiberInDevAndProd(workInProgress) { 852 try { 853 var info = "", previous = null; 854 do { 855 info += describeFiber(workInProgress, previous); 856 var debugInfo = workInProgress._debugInfo; 857 if (debugInfo) for (var i = debugInfo.length - 1; 0 <= i; i--) { 858 var entry = debugInfo[i]; 859 if ("string" === typeof entry.name) { 860 var JSCompiler_temp_const = info; 861 a: { 862 var name = entry.name, env = entry.env, location = entry.debugLocation; 863 if (null != location) { 864 var childStack = formatOwnerStack(location), idx = childStack.lastIndexOf("\n"), lastLine = -1 === idx ? childStack : childStack.slice(idx + 1); 865 if (-1 !== lastLine.indexOf(name)) { 866 var JSCompiler_inline_result = "\n" + lastLine; 867 break a; 868 } 869 } 870 JSCompiler_inline_result = describeBuiltInComponentFrame(name + (env ? " [" + env + "]" : "")); 871 } 872 info = JSCompiler_temp_const + JSCompiler_inline_result; 873 } 874 } 875 previous = workInProgress; 876 workInProgress = workInProgress.return; 877 } while (workInProgress); 878 return info; 879 } catch (x) { 880 return "\nError generating stack: " + x.message + "\n" + x.stack; 881 } 882 } 883 function describeFunctionComponentFrameWithoutLineNumber(fn) { 884 return (fn = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(fn) : ""; 885 } 886 function getCurrentFiberOwnerNameInDevOrNull() { 887 if (null === current) return null; 888 var owner = current._debugOwner; 889 return null != owner ? getComponentNameFromOwner(owner) : null; 890 } 891 function getCurrentFiberStackInDev() { 892 if (null === current) return ""; 893 var workInProgress = current; 894 try { 895 var info = ""; 896 6 === workInProgress.tag && (workInProgress = workInProgress.return); 897 switch (workInProgress.tag) { 898 case 26: 899 case 27: 900 case 5: 901 info += describeBuiltInComponentFrame(workInProgress.type); 902 break; 903 case 13: 904 info += describeBuiltInComponentFrame("Suspense"); 905 break; 906 case 19: 907 info += describeBuiltInComponentFrame("SuspenseList"); 908 break; 909 case 31: 910 info += describeBuiltInComponentFrame("Activity"); 911 break; 912 case 30: 913 info += describeBuiltInComponentFrame("ViewTransition"); 914 break; 915 case 0: 916 case 15: 917 case 1: 918 workInProgress._debugOwner || "" !== info || (info += describeFunctionComponentFrameWithoutLineNumber(workInProgress.type)); 919 break; 920 case 11: workInProgress._debugOwner || "" !== info || (info += describeFunctionComponentFrameWithoutLineNumber(workInProgress.type.render)); 921 } 922 for (; workInProgress;) if ("number" === typeof workInProgress.tag) { 923 var fiber = workInProgress; 924 workInProgress = fiber._debugOwner; 925 var debugStack = fiber._debugStack; 926 if (workInProgress && debugStack) { 927 var formattedStack = formatOwnerStack(debugStack); 928 "" !== formattedStack && (info += "\n" + formattedStack); 929 } 930 } else if (null != workInProgress.debugStack) { 931 var ownerStack = workInProgress.debugStack; 932 (workInProgress = workInProgress.owner) && ownerStack && (info += "\n" + formatOwnerStack(ownerStack)); 933 } else break; 934 var JSCompiler_inline_result = info; 935 } catch (x) { 936 JSCompiler_inline_result = "\nError generating stack: " + x.message + "\n" + x.stack; 937 } 938 return JSCompiler_inline_result; 939 } 940 function runWithFiberInDEV(fiber, callback, arg0, arg1, arg2, arg3, arg4) { 941 var previousFiber = current; 942 setCurrentFiber(fiber); 943 try { 944 return null !== fiber && fiber._debugTask ? fiber._debugTask.run(callback.bind(null, arg0, arg1, arg2, arg3, arg4)) : callback(arg0, arg1, arg2, arg3, arg4); 945 } finally { 946 setCurrentFiber(previousFiber); 947 } 948 throw Error("runWithFiberInDEV should never be called in production. This is a bug in React."); 949 } 950 function setCurrentFiber(fiber) { 951 ReactSharedInternals.getCurrentStack = null === fiber ? null : getCurrentFiberStackInDev; 952 isRendering = !1; 953 current = fiber; 954 } 955 function typeName(value) { 956 return "function" === typeof Symbol && Symbol.toStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; 957 } 958 function willCoercionThrow(value) { 959 try { 960 return testStringCoercion(value), !1; 961 } catch (e) { 962 return !0; 963 } 964 } 965 function testStringCoercion(value) { 966 return "" + value; 967 } 968 function checkAttributeStringCoercion(value, attributeName) { 969 if (willCoercionThrow(value)) return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.", attributeName, typeName(value)), testStringCoercion(value); 970 } 971 function checkCSSPropertyStringCoercion(value, propName) { 972 if (willCoercionThrow(value)) return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.", propName, typeName(value)), testStringCoercion(value); 973 } 974 function checkFormFieldValueStringCoercion(value) { 975 if (willCoercionThrow(value)) return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.", typeName(value)), testStringCoercion(value); 976 } 977 function injectInternals(internals) { 978 if ("undefined" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1; 979 var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; 980 if (hook.isDisabled) return !0; 981 if (!hook.supportsFiber) return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"), !0; 982 try { 983 rendererID = hook.inject(internals), injectedHook = hook; 984 } catch (err) { 985 console.error("React instrumentation encountered an error: %o.", err); 986 } 987 return hook.checkDCE ? !0 : !1; 988 } 989 function setIsStrictModeForDevtools(newIsStrictMode) { 990 "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode); 991 if (injectedHook && "function" === typeof injectedHook.setStrictMode) try { 992 injectedHook.setStrictMode(rendererID, newIsStrictMode); 993 } catch (err) { 994 hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err)); 995 } 996 } 997 function clz32Fallback(x) { 998 x >>>= 0; 999 return 0 === x ? 32 : 31 - (log(x) / LN2 | 0) | 0; 1000 } 1001 function getHighestPriorityLanes(lanes) { 1002 var pendingSyncLanes = lanes & 42;
vendor: 6,842 bytes, lines 1003-1168
1003 if (0 !== pendingSyncLanes) return pendingSyncLanes; 1004 switch (lanes & -lanes) { 1005 case 1: return 1; 1006 case 2: return 2; 1007 case 4: return 4; 1008 case 8: return 8; 1009 case 16: return 16; 1010 case 32: return 32; 1011 case 64: return 64; 1012 case 128: return 128; 1013 case 256: 1014 case 512: 1015 case 1024: 1016 case 2048: 1017 case 4096: 1018 case 8192: 1019 case 16384: 1020 case 32768: 1021 case 65536: 1022 case 131072: return lanes & -lanes; 1023 case 262144: 1024 case 524288: 1025 case 1048576: 1026 case 2097152: return lanes & 3932160; 1027 case 4194304: 1028 case 8388608: 1029 case 16777216: 1030 case 33554432: return lanes & 62914560; 1031 case 67108864: return 67108864; 1032 case 134217728: return 134217728; 1033 case 268435456: return 268435456; 1034 case 536870912: return 536870912; 1035 case 1073741824: return 0; 1036 default: return console.error("Should have found matching lanes. This is a bug in React."), lanes; 1037 } 1038 } 1039 function getNextLanes(root, wipLanes, rootHasPendingCommit) { 1040 var pendingLanes = root.pendingLanes; 1041 if (0 === pendingLanes) return 0; 1042 var nextLanes = 0, suspendedLanes = root.suspendedLanes, pingedLanes = root.pingedLanes; 1043 root = root.warmLanes; 1044 var nonIdlePendingLanes = pendingLanes & 134217727; 1045 0 !== nonIdlePendingLanes ? (pendingLanes = nonIdlePendingLanes & ~suspendedLanes, 0 !== pendingLanes ? nextLanes = getHighestPriorityLanes(pendingLanes) : (pingedLanes &= nonIdlePendingLanes, 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = nonIdlePendingLanes & ~root, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))))) : (nonIdlePendingLanes = pendingLanes & ~suspendedLanes, 0 !== nonIdlePendingLanes ? nextLanes = getHighestPriorityLanes(nonIdlePendingLanes) : 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = pendingLanes & ~root, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))); 1046 return 0 === nextLanes ? 0 : 0 !== wipLanes && wipLanes !== nextLanes && 0 === (wipLanes & suspendedLanes) && (suspendedLanes = nextLanes & -nextLanes, rootHasPendingCommit = wipLanes & -wipLanes, suspendedLanes >= rootHasPendingCommit || 32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)) ? wipLanes : nextLanes; 1047 } 1048 function checkIfRootIsPrerendering(root, renderLanes) { 1049 return 0 === (root.pendingLanes & ~(root.suspendedLanes & ~root.pingedLanes) & renderLanes); 1050 } 1051 function getEntangledLanes(root, renderLanes) { 1052 0 !== (renderLanes & 8) && (renderLanes |= renderLanes & 32); 1053 var allEntangledLanes = root.entangledLanes; 1054 if (0 !== allEntangledLanes) for (root = root.entanglements, allEntangledLanes &= renderLanes; 0 < allEntangledLanes;) { 1055 var index = 31 - clz32(allEntangledLanes), lane = 1 << index; 1056 renderLanes |= root[index]; 1057 allEntangledLanes &= ~lane; 1058 } 1059 return renderLanes; 1060 } 1061 function computeExpirationTime(lane, currentTime) { 1062 switch (lane) { 1063 case 1: 1064 case 2: 1065 case 4: 1066 case 8: 1067 case 64: return currentTime + 250; 1068 case 16: 1069 case 32: 1070 case 128: 1071 case 256: 1072 case 512: 1073 case 1024: 1074 case 2048: 1075 case 4096: 1076 case 8192: 1077 case 16384: 1078 case 32768: 1079 case 65536: 1080 case 131072: 1081 case 262144: 1082 case 524288: 1083 case 1048576: 1084 case 2097152: return currentTime + 5e3; 1085 case 4194304: 1086 case 8388608: 1087 case 16777216: 1088 case 33554432: return -1; 1089 case 67108864: 1090 case 134217728: 1091 case 268435456: 1092 case 536870912: 1093 case 1073741824: return -1; 1094 default: return console.error("Should have found matching lanes. This is a bug in React."), -1; 1095 } 1096 } 1097 function claimNextRetryLane() { 1098 var lane = nextRetryLane; 1099 nextRetryLane <<= 1; 1100 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304); 1101 return lane; 1102 } 1103 function createLaneMap(initial) { 1104 for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial); 1105 return laneMap; 1106 } 1107 function markRootUpdated$1(root, updateLane) { 1108 root.pendingLanes |= updateLane; 1109 268435456 !== updateLane && (root.suspendedLanes = 0, root.pingedLanes = 0, root.warmLanes = 0); 1110 } 1111 function markRootFinished(root, finishedLanes, remainingLanes, spawnedLane, updatedLanes, suspendedRetryLanes) { 1112 var previouslyPendingLanes = root.pendingLanes; 1113 root.pendingLanes = remainingLanes; 1114 root.suspendedLanes = 0; 1115 root.pingedLanes = 0; 1116 root.warmLanes = 0; 1117 root.expiredLanes &= remainingLanes; 1118 root.entangledLanes &= remainingLanes; 1119 root.errorRecoveryDisabledLanes &= remainingLanes; 1120 root.shellSuspendCounter = 0; 1121 var entanglements = root.entanglements, expirationTimes = root.expirationTimes, hiddenUpdates = root.hiddenUpdates; 1122 for (remainingLanes = previouslyPendingLanes & ~remainingLanes; 0 < remainingLanes;) { 1123 var index = 31 - clz32(remainingLanes), lane = 1 << index; 1124 entanglements[index] = 0; 1125 expirationTimes[index] = -1; 1126 var hiddenUpdatesForLane = hiddenUpdates[index]; 1127 if (null !== hiddenUpdatesForLane) for (hiddenUpdates[index] = null, index = 0; index < hiddenUpdatesForLane.length; index++) { 1128 var update = hiddenUpdatesForLane[index]; 1129 null !== update && (update.lane &= -536870913); 1130 } 1131 remainingLanes &= ~lane; 1132 } 1133 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0); 1134 0 !== suspendedRetryLanes && 0 === updatedLanes && 0 !== root.tag && (root.suspendedLanes |= suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes)); 1135 } 1136 function markSpawnedDeferredLane(root, spawnedLane, entangledLanes) { 1137 root.pendingLanes |= spawnedLane; 1138 root.suspendedLanes &= ~spawnedLane; 1139 var spawnedLaneIndex = 31 - clz32(spawnedLane); 1140 root.entangledLanes |= spawnedLane; 1141 root.entanglements[spawnedLaneIndex] = root.entanglements[spawnedLaneIndex] | 1073741824 | entangledLanes & 261930; 1142 } 1143 function markRootEntangled(root, entangledLanes) { 1144 var rootEntangledLanes = root.entangledLanes |= entangledLanes; 1145 for (root = root.entanglements; rootEntangledLanes;) { 1146 var index = 31 - clz32(rootEntangledLanes), lane = 1 << index; 1147 lane & entangledLanes | root[index] & entangledLanes && (root[index] |= entangledLanes); 1148 rootEntangledLanes &= ~lane; 1149 } 1150 } 1151 function getBumpedLaneForHydration(root, renderLanes) { 1152 var renderLane = renderLanes & -renderLanes; 1153 renderLane = 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane); 1154 return 0 !== (renderLane & (root.suspendedLanes | renderLanes)) ? 0 : renderLane; 1155 } 1156 function getBumpedLaneForHydrationByLane(lane) { 1157 switch (lane) { 1158 case 2: 1159 lane = 1; 1160 break; 1161 case 8: 1162 lane = 4; 1163 break; 1164 case 32: 1165 lane = 16; 1166 break; 1167 case 256: 1168 case 512:
1169 case 1024: 1170 case 2048: 1171 case 4096: 1172 case 8192: 1173 case 16384: 1174 case 32768: 1175 case 65536: 1176 case 131072: 1177 case 262144: 1178 case 524288: 1179 case 1048576: 1180 case 2097152: 1181 case 4194304: 1182 case 8388608: 1183 case 16777216: 1184 case 33554432: 1185 lane = 128; 1186 break; 1187 case 268435456: 1188 lane = 134217728; 1189 break; 1190 default: lane = 0; 1191 } 1192 return lane; 1193 } 1194 function addFiberToLanesMap(root, fiber, lanes) { 1195 if (isDevToolsPresent) for (root = root.pendingUpdatersLaneMap; 0 < lanes;) { 1196 var index = 31 - clz32(lanes), lane = 1 << index; 1197 root[index].add(fiber); 1198 lanes &= ~lane; 1199 } 1200 } 1201 function movePendingFibersToMemoized(root, lanes) { 1202 if (isDevToolsPresent) for (var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap, memoizedUpdaters = root.memoizedUpdaters; 0 < lanes;) { 1203 var index = 31 - clz32(lanes); 1204 root = 1 << index; 1205 index = pendingUpdatersLaneMap[index]; 1206 0 < index.size && (index.forEach(function(fiber) { 1207 var alternate = fiber.alternate; 1208 null !== alternate && memoizedUpdaters.has(alternate) || memoizedUpdaters.add(fiber); 1209 }), index.clear()); 1210 lanes &= ~root; 1211 } 1212 } 1213 function lanesToEventPriority(lanes) { 1214 lanes &= -lanes; 1215 return 0 !== DiscreteEventPriority && DiscreteEventPriority < lanes ? 0 !== ContinuousEventPriority && ContinuousEventPriority < lanes ? 0 !== (lanes & 134217727) ? DefaultEventPriority : IdleEventPriority : ContinuousEventPriority : DiscreteEventPriority; 1216 } 1217 function resolveUpdatePriority() { 1218 var updatePriority = ReactDOMSharedInternals.p; 1219 if (0 !== updatePriority) return updatePriority; 1220 updatePriority = window.event; 1221 return void 0 === updatePriority ? DefaultEventPriority : getEventPriority(updatePriority.type); 1222 } 1223 function runWithPriority(priority, fn) { 1224 var previousPriority = ReactDOMSharedInternals.p; 1225 try { 1226 return ReactDOMSharedInternals.p = priority, fn(); 1227 } finally { 1228 ReactDOMSharedInternals.p = previousPriority; 1229 } 1230 } 1231 function detachDeletedInstance(node) { 1232 delete node[internalInstanceKey]; 1233 delete node[internalPropsKey]; 1234 delete node[internalEventHandlerListenersKey]; 1235 delete node[internalEventHandlesSetKey]; 1236 } 1237 function getClosestInstanceFromNode(targetNode) { 1238 var targetInst; 1239 if (targetInst = targetNode[internalInstanceKey]) return targetInst; 1240 for (var parentNode = targetNode.parentNode; parentNode;) { 1241 if (targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]) { 1242 parentNode = targetInst.alternate; 1243 if (null !== targetInst.child || null !== parentNode && null !== parentNode.child) for (targetNode = getParentHydrationBoundary(targetNode); null !== targetNode;) { 1244 if (parentNode = targetNode[internalInstanceKey]) return parentNode; 1245 targetNode = getParentHydrationBoundary(targetNode); 1246 } 1247 return targetInst; 1248 } 1249 targetNode = parentNode; 1250 parentNode = targetNode.parentNode; 1251 } 1252 return null; 1253 } 1254 function getInstanceFromNode(node) { 1255 if (node = node[internalInstanceKey] || node[internalContainerInstanceKey]) { 1256 var tag = node.tag; 1257 if (5 === tag || 6 === tag || 13 === tag || 31 === tag || 26 === tag || 27 === tag || 3 === tag) return node; 1258 } 1259 return null; 1260 } 1261 function getNodeFromInstance(inst) { 1262 var tag = inst.tag; 1263 if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode; 1264 throw Error("getNodeFromInstance: Invalid argument."); 1265 } 1266 function getResourcesFromRoot(root) { 1267 var resources = root[internalRootNodeResourcesKey]; 1268 resources || (resources = root[internalRootNodeResourcesKey] = { 1269 hoistableStyles: /* @__PURE__ */ new Map(), 1270 hoistableScripts: /* @__PURE__ */ new Map() 1271 }); 1272 return resources; 1273 } 1274 function markNodeAsHoistable(node) { 1275 node[internalHoistableMarker] = !0; 1276 } 1277 function clearPendingLoadOnNode(node) { 1278 node[internalLoadPendingKey] = void 0; 1279 } 1280 function registerTwoPhaseEvent(registrationName, dependencies) { 1281 registerDirectEvent(registrationName, dependencies); 1282 registerDirectEvent(registrationName + "Capture", dependencies); 1283 } 1284 function registerDirectEvent(registrationName, dependencies) { 1285 registrationNameDependencies[registrationName] && console.error("EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.", registrationName);
1286 registrationNameDependencies[registrationName] = dependencies; 1287 var lowerCasedName = registrationName.toLowerCase(); 1288 possibleRegistrationNames[lowerCasedName] = registrationName; 1289 "onDoubleClick" === registrationName && (possibleRegistrationNames.ondblclick = registrationName); 1290 for (registrationName = 0; registrationName < dependencies.length; registrationName++) allNativeEvents.add(dependencies[registrationName]); 1291 } 1292 function checkControlledValueProps(tagName, props) { 1293 hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || null == props.value || ("select" === tagName ? console.error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set `onChange`.") : console.error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")); 1294 props.onChange || props.readOnly || props.disabled || null == props.checked || console.error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`."); 1295 } 1296 function isAttributeNameSafe(attributeName) { 1297 if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) return !0; 1298 if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1; 1299 if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) return validatedAttributeNameCache[attributeName] = !0; 1300 illegalAttributeNameCache[attributeName] = !0; 1301 console.error("Invalid attribute name: `%s`", attributeName); 1302 return !1; 1303 } 1304 function pushMutationContext() { 1305 var prev = viewTransitionMutationContext; 1306 viewTransitionMutationContext = !1; 1307 return prev; 1308 } 1309 function getValueForAttributeOnCustomComponent(node, name, expected) { 1310 if (isAttributeNameSafe(name)) { 1311 if (!node.hasAttribute(name)) { 1312 switch (typeof expected) { 1313 case "symbol": 1314 case "object": return expected; 1315 case "function": return expected; 1316 case "boolean": if (!1 === expected) return expected; 1317 } 1318 return void 0 === expected ? void 0 : null; 1319 } 1320 node = "nonce" === name.toLowerCase() ? node.nonce : node.getAttribute(name); 1321 if ("" === node && !0 === expected) return !0; 1322 checkAttributeStringCoercion(expected, name); 1323 return node === "" + expected ? expected : node; 1324 } 1325 } 1326 function setValueForAttribute(node, name, value) { 1327 if (isAttributeNameSafe(name)) if (null === value) node.removeAttribute(name); 1328 else { 1329 switch (typeof value) { 1330 case "undefined": 1331 case "function": 1332 case "symbol": 1333 node.removeAttribute(name); 1334 return; 1335 case "boolean": 1336 var prefix = name.toLowerCase().slice(0, 5); 1337 if ("data-" !== prefix && "aria-" !== prefix) { 1338 node.removeAttribute(name); 1339 return; 1340 } 1341 } 1342 checkAttributeStringCoercion(value, name); 1343 node.setAttribute(name, value); 1344 } 1345 } 1346 function setValueForKnownAttribute(node, name, value) { 1347 if (null === value) node.removeAttribute(name); 1348 else { 1349 switch (typeof value) { 1350 case "undefined": 1351 case "function": 1352 case "symbol": 1353 case "boolean": 1354 node.removeAttribute(name); 1355 return; 1356 } 1357 checkAttributeStringCoercion(value, name); 1358 node.setAttribute(name, value); 1359 } 1360 } 1361 function setValueForNamespacedAttribute(node, namespace, name, value) { 1362 if (null === value) node.removeAttribute(name); 1363 else { 1364 switch (typeof value) { 1365 case "undefined": 1366 case "function": 1367 case "symbol": 1368 case "boolean": 1369 node.removeAttribute(name); 1370 return; 1371 } 1372 checkAttributeStringCoercion(value, name); 1373 node.setAttributeNS(namespace, name, value); 1374 } 1375 } 1376 function getToStringValue(value) { 1377 switch (typeof value) { 1378 case "bigint": 1379 case "boolean":
vendor: 18,801 bytes, lines 1380-1664
1380 case "number": 1381 case "string": 1382 case "undefined": return value; 1383 case "object": return checkFormFieldValueStringCoercion(value), value; 1384 default: return ""; 1385 } 1386 } 1387 function isCheckable(elem) { 1388 var type = elem.type; 1389 return (elem = elem.nodeName) && "input" === elem.toLowerCase() && ("checkbox" === type || "radio" === type); 1390 } 1391 function trackValueOnNode(node, valueField, currentValue) { 1392 var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); 1393 if (!node.hasOwnProperty(valueField) && "undefined" !== typeof descriptor && "function" === typeof descriptor.get && "function" === typeof descriptor.set) { 1394 var get = descriptor.get, set = descriptor.set; 1395 Object.defineProperty(node, valueField, { 1396 configurable: !0, 1397 get: function() { 1398 return get.call(this); 1399 }, 1400 set: function(value) { 1401 checkFormFieldValueStringCoercion(value); 1402 currentValue = "" + value; 1403 set.call(this, value); 1404 } 1405 }); 1406 Object.defineProperty(node, valueField, { enumerable: descriptor.enumerable }); 1407 return { 1408 getValue: function() { 1409 return currentValue; 1410 }, 1411 setValue: function(value) { 1412 checkFormFieldValueStringCoercion(value); 1413 currentValue = "" + value; 1414 }, 1415 stopTracking: function() { 1416 node._valueTracker = null; 1417 delete node[valueField]; 1418 } 1419 }; 1420 } 1421 } 1422 function track(node) { 1423 if (!node._valueTracker) { 1424 var valueField = isCheckable(node) ? "checked" : "value"; 1425 node._valueTracker = trackValueOnNode(node, valueField, "" + node[valueField]); 1426 } 1427 } 1428 function updateValueIfChanged(node) { 1429 if (!node) return !1; 1430 var tracker = node._valueTracker; 1431 if (!tracker) return !0; 1432 var lastValue = tracker.getValue(); 1433 var value = ""; 1434 node && (value = isCheckable(node) ? node.checked ? "true" : "false" : node.value); 1435 node = value; 1436 return node !== lastValue ? (tracker.setValue(node), !0) : !1; 1437 } 1438 function escapeSelectorAttributeValueInsideDoubleQuotes(value) { 1439 return value.replace(escapeSelectorAttributeValueInsideDoubleQuotesRegex, function(ch) { 1440 return "\\" + ch.charCodeAt(0).toString(16) + " "; 1441 }); 1442 } 1443 function validateInputProps(element, props) { 1444 void 0 === props.checked || void 0 === props.defaultChecked || didWarnCheckedDefaultChecked || (console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type), didWarnCheckedDefaultChecked = !0); 1445 void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue$1 || (console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type), didWarnValueDefaultValue$1 = !0); 1446 } 1447 function updateInput(element, value, defaultValue, lastDefaultValue, checked, defaultChecked, type, name) { 1448 element.name = ""; 1449 null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type ? (checkAttributeStringCoercion(type, "type"), element.type = type) : element.removeAttribute("type"); 1450 if (null != value) if ("number" === type) { 1451 if (0 === value && "" === element.value || element.value != value) element.value = "" + getToStringValue(value); 1452 } else element.value !== "" + getToStringValue(value) && (element.value = "" + getToStringValue(value)); 1453 else "submit" !== type && "reset" !== type || element.removeAttribute("value"); 1454 null != value ? "number" === type && element.value == value ? setDefaultValue(element, getToStringValue(element.value)) : setDefaultValue(element, getToStringValue(value)) : null != defaultValue ? setDefaultValue(element, getToStringValue(defaultValue)) : null != lastDefaultValue && element.removeAttribute("value"); 1455 null == checked && null != defaultChecked && (element.defaultChecked = !!defaultChecked); 1456 null != checked && (element.checked = checked && "function" !== typeof checked && "symbol" !== typeof checked); 1457 null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name ? (checkAttributeStringCoercion(name, "name"), element.name = "" + getToStringValue(name)) : element.removeAttribute("name"); 1458 } 1459 function initInput(element, value, defaultValue, checked, defaultChecked, type, name, isHydrating) { 1460 null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type && (checkAttributeStringCoercion(type, "type"), element.type = type); 1461 if (null != value || null != defaultValue) { 1462 if (!("submit" !== type && "reset" !== type || void 0 !== value && null !== value)) { 1463 track(element); 1464 return; 1465 } 1466 defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : ""; 1467 value = null != value ? "" + getToStringValue(value) : defaultValue; 1468 isHydrating || value === element.value || (element.value = value); 1469 element.defaultValue = value; 1470 } 1471 checked = null != checked ? checked : defaultChecked; 1472 checked = "function" !== typeof checked && "symbol" !== typeof checked && !!checked; 1473 element.checked = isHydrating ? element.checked : !!checked; 1474 element.defaultChecked = !!checked; 1475 null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name && (checkAttributeStringCoercion(name, "name"), element.name = name); 1476 track(element); 1477 } 1478 function setDefaultValue(node, value) { 1479 node.defaultValue !== "" + value && (node.defaultValue = "" + value); 1480 } 1481 function validateOptionProps(element, props) { 1482 props.value ?? ("object" === typeof props.children && null !== props.children ? React.Children.forEach(props.children, function(child) { 1483 null == child || "string" === typeof child || "number" === typeof child || "bigint" === typeof child || didWarnInvalidChild || (didWarnInvalidChild = !0, console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to <option>.")); 1484 }) : null == props.dangerouslySetInnerHTML || didWarnInvalidInnerHTML || (didWarnInvalidInnerHTML = !0, console.error("Pass a `value` prop if you set dangerouslyInnerHTML so React knows which value should be selected."))); 1485 null == props.selected || didWarnSelectedSetOnOption || (console.error("Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>."), didWarnSelectedSetOnOption = !0); 1486 } 1487 function getDeclarationErrorAddendum() { 1488 var ownerName = getCurrentFiberOwnerNameInDevOrNull(); 1489 return ownerName ? "\n\nCheck the render method of `" + ownerName + "`." : ""; 1490 } 1491 function updateOptions(node, multiple, propValue, setDefaultSelected) { 1492 node = node.options; 1493 if (multiple) { 1494 multiple = {}; 1495 for (var i = 0; i < propValue.length; i++) multiple["$" + propValue[i]] = !0; 1496 for (propValue = 0; propValue < node.length; propValue++) i = multiple.hasOwnProperty("$" + node[propValue].value), node[propValue].selected !== i && (node[propValue].selected = i), i && setDefaultSelected && (node[propValue].defaultSelected = !0); 1497 } else { 1498 propValue = "" + getToStringValue(propValue); 1499 multiple = null; 1500 for (i = 0; i < node.length; i++) { 1501 if (node[i].value === propValue) { 1502 node[i].selected = !0; 1503 setDefaultSelected && (node[i].defaultSelected = !0); 1504 return; 1505 } 1506 null !== multiple || node[i].disabled || (multiple = node[i]); 1507 } 1508 null !== multiple && (multiple.selected = !0); 1509 } 1510 } 1511 function validateSelectProps(element, props) { 1512 for (element = 0; element < valuePropNames.length; element++) { 1513 var propName = valuePropNames[element]; 1514 if (null != props[propName]) { 1515 var propNameIsArray = isArrayImpl(props[propName]); 1516 props.multiple && !propNameIsArray ? console.error("The `%s` prop supplied to <select> must be an array if `multiple` is true.%s", propName, getDeclarationErrorAddendum()) : !props.multiple && propNameIsArray && console.error("The `%s` prop supplied to <select> must be a scalar value if `multiple` is false.%s", propName, getDeclarationErrorAddendum()); 1517 } 1518 } 1519 void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue || (console.error("Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://react.dev/link/controlled-components"), didWarnValueDefaultValue = !0); 1520 } 1521 function validateTextareaProps(element, props) { 1522 void 0 === props.value || void 0 === props.defaultValue || didWarnValDefaultVal || (console.error("%s contains a textarea with both value and defaultValue props. Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://react.dev/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component"), didWarnValDefaultVal = !0); 1523 null != props.children && null == props.value && console.error("Use the `defaultValue` or `value` props instead of setting children on <textarea>."); 1524 } 1525 function updateTextarea(element, value, defaultValue) { 1526 if (null != value && (value = "" + getToStringValue(value), value !== element.value && (element.value = value), null == defaultValue)) { 1527 element.defaultValue !== value && (element.defaultValue = value); 1528 return; 1529 } 1530 element.defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : ""; 1531 } 1532 function initTextarea(element, value, defaultValue, children) { 1533 if (null == value) { 1534 if (null != children) { 1535 if (null != defaultValue) throw Error("If you supply `defaultValue` on a <textarea>, do not pass children."); 1536 if (isArrayImpl(children)) { 1537 if (1 < children.length) throw Error("<textarea> can only have at most one child."); 1538 children = children[0]; 1539 } 1540 defaultValue = children; 1541 } 1542 defaultValue ??= ""; 1543 value = defaultValue; 1544 } 1545 defaultValue = getToStringValue(value); 1546 element.defaultValue = defaultValue; 1547 children = element.textContent; 1548 children === defaultValue && "" !== children && null !== children && (element.value = children); 1549 track(element); 1550 } 1551 function findNotableNode(node, indent) { 1552 return void 0 === node.serverProps && 0 === node.serverTail.length && 1 === node.children.length && 3 < node.distanceFromLeaf && node.distanceFromLeaf > 15 - indent ? findNotableNode(node.children[0], indent) : node; 1553 } 1554 function indentation(indent) { 1555 return " " + " ".repeat(indent); 1556 } 1557 function added(indent) { 1558 return "+ " + " ".repeat(indent); 1559 } 1560 function removed(indent) { 1561 return "- " + " ".repeat(indent); 1562 } 1563 function describeFiberType(fiber) { 1564 switch (fiber.tag) { 1565 case 26: 1566 case 27: 1567 case 5: return fiber.type; 1568 case 16: return "Lazy"; 1569 case 31: return "Activity"; 1570 case 13: return "Suspense"; 1571 case 19: return "SuspenseList"; 1572 case 0: 1573 case 15: return fiber = fiber.type, fiber.displayName || fiber.name || null; 1574 case 11: return fiber = fiber.type.render, fiber.displayName || fiber.name || null; 1575 case 1: return fiber = fiber.type, fiber.displayName || fiber.name || null; 1576 default: return null; 1577 } 1578 } 1579 function describeTextNode(content, maxLength) { 1580 return needsEscaping.test(content) ? (content = JSON.stringify(content), content.length > maxLength - 2 ? 8 > maxLength ? "{\"...\"}" : "{" + content.slice(0, maxLength - 7) + "...\"}" : "{" + content + "}") : content.length > maxLength ? 5 > maxLength ? "{\"...\"}" : content.slice(0, maxLength - 3) + "..." : content; 1581 } 1582 function describeTextDiff(clientText, serverProps, indent) { 1583 var maxLength = 120 - 2 * indent; 1584 if (null === serverProps) return added(indent) + describeTextNode(clientText, maxLength) + "\n"; 1585 if ("string" === typeof serverProps) { 1586 for (var firstDiff = 0; firstDiff < serverProps.length && firstDiff < clientText.length && serverProps.charCodeAt(firstDiff) === clientText.charCodeAt(firstDiff); firstDiff++); 1587 firstDiff > maxLength - 8 && 10 < firstDiff && (clientText = "..." + clientText.slice(firstDiff - 8), serverProps = "..." + serverProps.slice(firstDiff - 8)); 1588 return added(indent) + describeTextNode(clientText, maxLength) + "\n" + removed(indent) + describeTextNode(serverProps, maxLength) + "\n"; 1589 } 1590 return indentation(indent) + describeTextNode(clientText, maxLength) + "\n"; 1591 } 1592 function objectName(object) { 1593 return Object.prototype.toString.call(object).replace(/^\[object (.*)\]$/, function(m, p0) { 1594 return p0; 1595 }); 1596 } 1597 function describeValue(value, maxLength) { 1598 switch (typeof value) { 1599 case "string": return value = JSON.stringify(value), value.length > maxLength ? 5 > maxLength ? "\"...\"" : value.slice(0, maxLength - 4) + "...\"" : value; 1600 case "object": 1601 if (null === value) return "null"; 1602 if (isArrayImpl(value)) return "[...]"; 1603 if (value.$$typeof === REACT_ELEMENT_TYPE) return (maxLength = getComponentNameFromType(value.type)) ? "<" + maxLength + ">" : "<...>"; 1604 var name = objectName(value); 1605 if ("Object" === name) { 1606 name = ""; 1607 maxLength -= 2; 1608 for (var propName in value) if (value.hasOwnProperty(propName)) { 1609 var jsonPropName = JSON.stringify(propName); 1610 jsonPropName !== "\"" + propName + "\"" && (propName = jsonPropName); 1611 maxLength -= propName.length - 2; 1612 jsonPropName = describeValue(value[propName], 15 > maxLength ? maxLength : 15); 1613 maxLength -= jsonPropName.length; 1614 if (0 > maxLength) { 1615 name += "" === name ? "..." : ", ..."; 1616 break; 1617 } 1618 name += ("" === name ? "" : ",") + propName + ":" + jsonPropName; 1619 } 1620 return "{" + name + "}"; 1621 } 1622 return name; 1623 case "function": return (maxLength = value.displayName || value.name) ? "function " + maxLength : "function"; 1624 default: return String(value); 1625 } 1626 } 1627 function describePropValue(value, maxLength) { 1628 return "string" !== typeof value || needsEscaping.test(value) ? "{" + describeValue(value, maxLength - 2) + "}" : value.length > maxLength - 2 ? 5 > maxLength ? "\"...\"" : "\"" + value.slice(0, maxLength - 5) + "...\"" : "\"" + value + "\""; 1629 } 1630 function describeExpandedElement(type, props, rowPrefix) { 1631 var remainingRowLength = 120 - rowPrefix.length - type.length, properties = [], propName; 1632 for (propName in props) if (props.hasOwnProperty(propName) && "children" !== propName) { 1633 var propValue = describePropValue(props[propName], 120 - rowPrefix.length - propName.length - 1); 1634 remainingRowLength -= propName.length + propValue.length + 2; 1635 properties.push(propName + "=" + propValue); 1636 } 1637 return 0 === properties.length ? rowPrefix + "<" + type + ">\n" : 0 < remainingRowLength ? rowPrefix + "<" + type + " " + properties.join(" ") + ">\n" : rowPrefix + "<" + type + "\n" + rowPrefix + " " + properties.join("\n" + rowPrefix + " ") + "\n" + rowPrefix + ">\n"; 1638 } 1639 function describePropertiesDiff(clientObject, serverObject, indent) { 1640 var properties = "", remainingServerProperties = assign({}, serverObject), propName; 1641 for (propName in clientObject) if (clientObject.hasOwnProperty(propName)) { 1642 delete remainingServerProperties[propName]; 1643 var maxLength = 120 - 2 * indent - propName.length - 2, clientPropValue = describeValue(clientObject[propName], maxLength); 1644 serverObject.hasOwnProperty(propName) ? (maxLength = describeValue(serverObject[propName], maxLength), properties += added(indent) + propName + ": " + clientPropValue + "\n", properties += removed(indent) + propName + ": " + maxLength + "\n") : properties += added(indent) + propName + ": " + clientPropValue + "\n"; 1645 } 1646 for (var _propName in remainingServerProperties) remainingServerProperties.hasOwnProperty(_propName) && (clientObject = describeValue(remainingServerProperties[_propName], 120 - 2 * indent - _propName.length - 2), properties += removed(indent) + _propName + ": " + clientObject + "\n"); 1647 return properties; 1648 } 1649 function describeElementDiff(type, clientProps, serverProps, indent) { 1650 var content = "", serverPropNames = /* @__PURE__ */ new Map(); 1651 for (propName$jscomp$0 in serverProps) serverProps.hasOwnProperty(propName$jscomp$0) && serverPropNames.set(propName$jscomp$0.toLowerCase(), propName$jscomp$0); 1652 if (1 === serverPropNames.size && serverPropNames.has("children")) content += describeExpandedElement(type, clientProps, indentation(indent)); 1653 else { 1654 for (var _propName2 in clientProps) if (clientProps.hasOwnProperty(_propName2) && "children" !== _propName2) { 1655 var maxLength$jscomp$0 = 120 - 2 * (indent + 1) - _propName2.length - 1, serverPropName = serverPropNames.get(_propName2.toLowerCase()); 1656 if (void 0 !== serverPropName) { 1657 serverPropNames.delete(_propName2.toLowerCase()); 1658 var propName$jscomp$0 = clientProps[_propName2]; 1659 serverPropName = serverProps[serverPropName]; 1660 var clientPropValue = describePropValue(propName$jscomp$0, maxLength$jscomp$0); 1661 maxLength$jscomp$0 = describePropValue(serverPropName, maxLength$jscomp$0); 1662 "object" === typeof propName$jscomp$0 && null !== propName$jscomp$0 && "object" === typeof serverPropName && null !== serverPropName && "Object" === objectName(propName$jscomp$0) && "Object" === objectName(serverPropName) && (2 < Object.keys(propName$jscomp$0).length || 2 < Object.keys(serverPropName).length || -1 < clientPropValue.indexOf("...") || -1 < maxLength$jscomp$0.indexOf("...")) ? content += indentation(indent + 1) + _propName2 + "={{\n" + describePropertiesDiff(propName$jscomp$0, serverPropName, indent + 2) + indentation(indent + 1) + "}}\n" : (content += added(indent + 1) + _propName2 + "=" + clientPropValue + "\n", content += removed(indent + 1) + _propName2 + "=" + maxLength$jscomp$0 + "\n"); 1663 } else content += indentation(indent + 1) + _propName2 + "=" + describePropValue(clientProps[_propName2], maxLength$jscomp$0) + "\n"; 1664 }
1665 serverPropNames.forEach(function(propName) { 1666 if ("children" !== propName) { 1667 var maxLength = 120 - 2 * (indent + 1) - propName.length - 1; 1668 content += removed(indent + 1) + propName + "=" + describePropValue(serverProps[propName], maxLength) + "\n"; 1669 } 1670 }); 1671 content = "" === content ? indentation(indent) + "<" + type + ">\n" : indentation(indent) + "<" + type + "\n" + content + indentation(indent) + ">\n"; 1672 } 1673 type = serverProps.children; 1674 clientProps = clientProps.children; 1675 if ("string" === typeof type || "number" === typeof type || "bigint" === typeof type) { 1676 serverPropNames = ""; 1677 if ("string" === typeof clientProps || "number" === typeof clientProps || "bigint" === typeof clientProps) serverPropNames = "" + clientProps; 1678 content += describeTextDiff(serverPropNames, "" + type, indent + 1); 1679 } else if ("string" === typeof clientProps || "number" === typeof clientProps || "bigint" === typeof clientProps) content = null == type ? content + describeTextDiff("" + clientProps, null, indent + 1) : content + describeTextDiff("" + clientProps, void 0, indent + 1); 1680 return content; 1681 } 1682 function describeSiblingFiber(fiber, indent) { 1683 var type = describeFiberType(fiber); 1684 if (null === type) { 1685 type = ""; 1686 for (fiber = fiber.child; fiber;) type += describeSiblingFiber(fiber, indent), fiber = fiber.sibling; 1687 return type; 1688 } 1689 return indentation(indent) + "<" + type + ">\n"; 1690 } 1691 function describeNode(node, indent) { 1692 var skipToNode = findNotableNode(node, indent); 1693 if (skipToNode !== node && (1 !== node.children.length || node.children[0] !== skipToNode)) return indentation(indent) + "...\n" + describeNode(skipToNode, indent + 1); 1694 skipToNode = ""; 1695 var debugInfo = node.fiber._debugInfo; 1696 if (debugInfo) for (var i = 0; i < debugInfo.length; i++) { 1697 var serverComponentName = debugInfo[i].name; 1698 "string" === typeof serverComponentName && (skipToNode += indentation(indent) + "<" + serverComponentName + ">\n", indent++); 1699 } 1700 debugInfo = ""; 1701 i = node.fiber.pendingProps; 1702 if (6 === node.fiber.tag) debugInfo = describeTextDiff(i, node.serverProps, indent), indent++; 1703 else if (serverComponentName = describeFiberType(node.fiber), null !== serverComponentName) if (void 0 === node.serverProps) { 1704 debugInfo = indent; 1705 var maxLength = 120 - 2 * debugInfo - serverComponentName.length - 2, content = ""; 1706 for (propName in i) if (i.hasOwnProperty(propName) && "children" !== propName) { 1707 var propValue = describePropValue(i[propName], 15); 1708 maxLength -= propName.length + propValue.length + 2; 1709 if (0 > maxLength) { 1710 content += " ..."; 1711 break; 1712 } 1713 content += " " + propName + "=" + propValue; 1714 } 1715 debugInfo = indentation(debugInfo) + "<" + serverComponentName + content + ">\n"; 1716 indent++; 1717 } else null === node.serverProps ? (debugInfo = describeExpandedElement(serverComponentName, i, added(indent)), indent++) : "string" === typeof node.serverProps ? console.error("Should not have matched a non HostText fiber to a Text node. This is a bug in React.") : (debugInfo = describeElementDiff(serverComponentName, i, node.serverProps, indent), indent++); 1718 var propName = ""; 1719 i = node.fiber.child; 1720 for (serverComponentName = 0; i && serverComponentName < node.children.length;) maxLength = node.children[serverComponentName], maxLength.fiber === i ? (propName += describeNode(maxLength, indent), serverComponentName++) : propName += describeSiblingFiber(i, indent), i = i.sibling; 1721 i && 0 < node.children.length && (propName += indentation(indent) + "...\n"); 1722 i = node.serverTail; 1723 null === node.serverProps && indent--; 1724 for (node = 0; node < i.length; node++) serverComponentName = i[node], propName = "string" === typeof serverComponentName ? propName + (removed(indent) + describeTextNode(serverComponentName, 120 - 2 * indent) + "\n") : propName + describeExpandedElement(serverComponentName.type, serverComponentName.props, removed(indent)); 1725 return skipToNode + debugInfo + propName; 1726 } 1727 function describeDiff(rootNode) { 1728 try { 1729 return "\n\n" + describeNode(rootNode, 0); 1730 } catch (x) { 1731 return ""; 1732 } 1733 } 1734 function describeAncestors(ancestor, child, props) { 1735 for (var fiber = child, node = null, distanceFromLeaf = 0; fiber;) fiber === ancestor && (distanceFromLeaf = 0), node = { 1736 fiber, 1737 children: null !== node ? [node] : [], 1738 serverProps: fiber === child ? props : fiber === ancestor ? null : void 0, 1739 serverTail: [], 1740 distanceFromLeaf 1741 }, distanceFromLeaf++, fiber = fiber.return; 1742 return null !== node ? describeDiff(node).replaceAll(/^[+-]/gm, ">") : ""; 1743 } 1744 function updatedAncestorInfoDev(oldInfo, tag) { 1745 var ancestorInfo = assign({}, oldInfo || emptyAncestorInfoDev), info = { tag }; 1746 -1 !== inScopeTags.indexOf(tag) && (ancestorInfo.aTagInScope = null, ancestorInfo.buttonTagInScope = null, ancestorInfo.nobrTagInScope = null); 1747 -1 !== buttonScopeTags.indexOf(tag) && (ancestorInfo.pTagInButtonScope = null); 1748 -1 !== specialTags.indexOf(tag) && "address" !== tag && "div" !== tag && "p" !== tag && (ancestorInfo.listItemTagAutoclosing = null, ancestorInfo.dlItemTagAutoclosing = null); 1749 ancestorInfo.current = info; 1750 "form" === tag && (ancestorInfo.formTag = info); 1751 "a" === tag && (ancestorInfo.aTagInScope = info); 1752 "button" === tag && (ancestorInfo.buttonTagInScope = info); 1753 "nobr" === tag && (ancestorInfo.nobrTagInScope = info); 1754 "p" === tag && (ancestorInfo.pTagInButtonScope = info); 1755 "li" === tag && (ancestorInfo.listItemTagAutoclosing = info); 1756 if ("dd" === tag || "dt" === tag) ancestorInfo.dlItemTagAutoclosing = info; 1757 "#document" === tag || "html" === tag ? ancestorInfo.containerTagInScope = null : ancestorInfo.containerTagInScope || (ancestorInfo.containerTagInScope = info); 1758 null !== oldInfo || "#document" !== tag && "html" !== tag && "body" !== tag ? !0 === ancestorInfo.implicitRootScope && (ancestorInfo.implicitRootScope = !1) : ancestorInfo.implicitRootScope = !0; 1759 return ancestorInfo; 1760 } 1761 function isTagValidWithParent(tag, parentTag, implicitRootScope) { 1762 switch (parentTag) { 1763 case "tr": return "th" === tag || "td" === tag || "style" === tag || "script" === tag || "template" === tag; 1764 case "tbody":
1765 case "thead": 1766 case "tfoot": return "tr" === tag || "style" === tag || "script" === tag || "template" === tag; 1767 case "colgroup": return "col" === tag || "template" === tag; 1768 case "table": return "caption" === tag || "colgroup" === tag || "tbody" === tag || "tfoot" === tag || "thead" === tag || "style" === tag || "script" === tag || "template" === tag; 1769 case "head": return "base" === tag || "basefont" === tag || "bgsound" === tag || "link" === tag || "meta" === tag || "title" === tag || "noscript" === tag || "noframes" === tag || "style" === tag || "script" === tag || "template" === tag; 1770 case "html": 1771 if (implicitRootScope) break; 1772 return "head" === tag || "body" === tag || "frameset" === tag; 1773 case "frameset": return "frame" === tag; 1774 case "#document": if (!implicitRootScope) return "html" === tag; 1775 } 1776 switch (tag) { 1777 case "h1": 1778 case "h2": 1779 case "h3": 1780 case "h4": 1781 case "h5": 1782 case "h6": return "h1" !== parentTag && "h2" !== parentTag && "h3" !== parentTag && "h4" !== parentTag && "h5" !== parentTag && "h6" !== parentTag; 1783 case "rp": 1784 case "rt": return -1 === impliedEndTags.indexOf(parentTag); 1785 case "caption": 1786 case "col": 1787 case "colgroup": 1788 case "input": return "select" !== parentTag; 1789 case "frameset": 1790 case "frame": 1791 case "tbody":
1792 case "td": 1793 case "tfoot": 1794 case "th": 1795 case "thead": 1796 case "tr": return null == parentTag; 1797 case "head": return implicitRootScope || null === parentTag; 1798 case "html": return implicitRootScope && "#document" === parentTag || null === parentTag; 1799 case "body": return implicitRootScope && ("#document" === parentTag || "html" === parentTag) || null === parentTag; 1800 } 1801 return !0; 1802 } 1803 function findInvalidAncestorForTag(tag, ancestorInfo) { 1804 switch (tag) { 1805 case "address": 1806 case "article": 1807 case "aside": 1808 case "blockquote": 1809 case "center": 1810 case "details": 1811 case "dialog": 1812 case "dir": 1813 case "div": 1814 case "dl": 1815 case "fieldset": 1816 case "figcaption": 1817 case "figure": 1818 case "footer": 1819 case "header": 1820 case "hgroup": 1821 case "main": 1822 case "menu": 1823 case "nav": 1824 case "ol": 1825 case "p": 1826 case "section": 1827 case "summary": 1828 case "ul": 1829 case "pre": 1830 case "listing": 1831 case "table": 1832 case "hr": 1833 case "xmp": 1834 case "h1": 1835 case "h2": 1836 case "h3": 1837 case "h4": 1838 case "h5": 1839 case "h6": return ancestorInfo.pTagInButtonScope; 1840 case "form": return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; 1841 case "li": return ancestorInfo.listItemTagAutoclosing; 1842 case "dd": 1843 case "dt": return ancestorInfo.dlItemTagAutoclosing; 1844 case "button": return ancestorInfo.buttonTagInScope; 1845 case "a": return ancestorInfo.aTagInScope; 1846 case "nobr": return ancestorInfo.nobrTagInScope; 1847 } 1848 return null; 1849 } 1850 function findAncestor(parent, tagName) { 1851 for (; parent;) { 1852 switch (parent.tag) { 1853 case 5: 1854 case 26: 1855 case 27: if (parent.type === tagName) return parent; 1856 } 1857 parent = parent.return; 1858 } 1859 return null; 1860 } 1861 function validateDOMNesting(childTag, ancestorInfo) { 1862 ancestorInfo = ancestorInfo || emptyAncestorInfoDev; 1863 var parentInfo = ancestorInfo.current; 1864 ancestorInfo = (parentInfo = isTagValidWithParent(childTag, parentInfo && parentInfo.tag, ancestorInfo.implicitRootScope) ? null : parentInfo) ? null : findInvalidAncestorForTag(childTag, ancestorInfo); 1865 ancestorInfo = parentInfo || ancestorInfo; 1866 if (!ancestorInfo) return !0; 1867 var ancestorTag = ancestorInfo.tag; 1868 ancestorInfo = String(!!parentInfo) + "|" + childTag + "|" + ancestorTag; 1869 if (didWarn[ancestorInfo]) return !1; 1870 didWarn[ancestorInfo] = !0; 1871 var ancestor = (ancestorInfo = current) ? findAncestor(ancestorInfo.return, ancestorTag) : null, ancestorDescription = null !== ancestorInfo && null !== ancestor ? describeAncestors(ancestor, ancestorInfo, null) : "", tagDisplayName = "<" + childTag + ">"; 1872 parentInfo ? (parentInfo = "", "table" === ancestorTag && "tr" === childTag && (parentInfo += " Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by the browser."), console.error("In HTML, %s cannot be a child of <%s>.%s\nThis will cause a hydration error.%s", tagDisplayName, ancestorTag, parentInfo, ancestorDescription)) : console.error("In HTML, %s cannot be a descendant of <%s>.\nThis will cause a hydration error.%s", tagDisplayName, ancestorTag, ancestorDescription); 1873 ancestorInfo && (childTag = ancestorInfo.return, null === ancestor || null === childTag || ancestor === childTag && childTag._debugOwner === ancestorInfo._debugOwner || runWithFiberInDEV(ancestor, function() { 1874 console.error("<%s> cannot contain a nested %s.\nSee this log for the ancestor stack trace.", ancestorTag, tagDisplayName); 1875 })); 1876 return !1; 1877 } 1878 function validateTextNesting(childText, parentTag, implicitRootScope) { 1879 if (implicitRootScope || isTagValidWithParent("#text", parentTag, !1)) return !0; 1880 implicitRootScope = "#text|" + parentTag; 1881 if (didWarn[implicitRootScope]) return !1; 1882 didWarn[implicitRootScope] = !0; 1883 var ancestor = (implicitRootScope = current) ? findAncestor(implicitRootScope, parentTag) : null; 1884 implicitRootScope = null !== implicitRootScope && null !== ancestor ? describeAncestors(ancestor, implicitRootScope, 6 !== implicitRootScope.tag ? { children: null } : null) : ""; 1885 /\S/.test(childText) ? console.error("In HTML, text nodes cannot be a child of <%s>.\nThis will cause a hydration error.%s", parentTag, implicitRootScope) : console.error("In HTML, whitespace text nodes cannot be a child of <%s>. Make sure you don't have any extra whitespace between tags on each line of your source code.\nThis will cause a hydration error.%s", parentTag, implicitRootScope); 1886 return !1; 1887 } 1888 function setTextContent(node, text) { 1889 if (text) { 1890 var firstChild = node.firstChild;
1891 if (firstChild && firstChild === node.lastChild && 3 === firstChild.nodeType) { 1892 firstChild.nodeValue = text; 1893 return; 1894 } 1895 } 1896 node.textContent = text; 1897 } 1898 function camelize(string) { 1899 return string.replace(hyphenPattern, function(_, character) { 1900 return character.toUpperCase(); 1901 }); 1902 } 1903 function setValueForStyle(style, styleName, value) { 1904 var isCustomProperty = 0 === styleName.indexOf("--"); 1905 isCustomProperty || (-1 < styleName.indexOf("-") ? warnedStyleNames.hasOwnProperty(styleName) && warnedStyleNames[styleName] || (warnedStyleNames[styleName] = !0, console.error("Unsupported style property %s. Did you mean %s?", styleName, camelize(styleName.replace(msPattern, "ms-")))) : badVendoredStyleNamePattern.test(styleName) ? warnedStyleNames.hasOwnProperty(styleName) && warnedStyleNames[styleName] || (warnedStyleNames[styleName] = !0, console.error("Unsupported vendor-prefixed style property %s. Did you mean %s?", styleName, styleName.charAt(0).toUpperCase() + styleName.slice(1))) : !badStyleValueWithSemicolonPattern.test(value) || warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value] || (warnedStyleValues[value] = !0, console.error("Style property values shouldn't contain a semicolon. Try \"%s: %s\" instead.", styleName, value.replace(badStyleValueWithSemicolonPattern, ""))), "number" === typeof value && (isNaN(value) ? warnedForNaNValue || (warnedForNaNValue = !0, console.error("`NaN` is an invalid value for the `%s` css style property.", styleName)) : isFinite(value) || warnedForInfinityValue || (warnedForInfinityValue = !0, console.error("`Infinity` is an invalid value for the `%s` css style property.", styleName)))); 1906 null == value || "boolean" === typeof value || "" === value ? isCustomProperty ? style.setProperty(styleName, "") : "float" === styleName ? style.cssFloat = "" : style[styleName] = "" : isCustomProperty ? style.setProperty(styleName, value) : "number" !== typeof value || 0 === value || unitlessNumbers.has(styleName) ? "float" === styleName ? style.cssFloat = value : (checkCSSPropertyStringCoercion(value, styleName), style[styleName] = ("" + value).trim()) : style[styleName] = value + "px"; 1907 } 1908 function setValueForStyles(node, styles, prevStyles) { 1909 if (null != styles && "object" !== typeof styles) throw Error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX."); 1910 styles && Object.freeze(styles); 1911 node = node.style; 1912 if (null != prevStyles) { 1913 if (styles) { 1914 var expandedUpdates = {}; 1915 if (prevStyles) { 1916 for (var key in prevStyles) if (prevStyles.hasOwnProperty(key) && !styles.hasOwnProperty(key)) for (var longhands = shorthandToLonghand[key] || [key], i = 0; i < longhands.length; i++) expandedUpdates[longhands[i]] = key; 1917 } 1918 for (var _key in styles) if (styles.hasOwnProperty(_key) && (!prevStyles || prevStyles[_key] !== styles[_key])) for (key = shorthandToLonghand[_key] || [_key], longhands = 0; longhands < key.length; longhands++) expandedUpdates[key[longhands]] = _key; 1919 _key = {}; 1920 for (var key$jscomp$0 in styles) for (key = shorthandToLonghand[key$jscomp$0] || [key$jscomp$0], longhands = 0; longhands < key.length; longhands++) _key[key[longhands]] = key$jscomp$0; 1921 key$jscomp$0 = {}; 1922 for (var _key2 in expandedUpdates) if (key = expandedUpdates[_key2], (longhands = _key[_key2]) && key !== longhands && (i = key + "," + longhands, !key$jscomp$0[i])) { 1923 key$jscomp$0[i] = !0; 1924 i = console; 1925 var value = styles[key]; 1926 i.error.call(i, "%s a style property during rerender (%s) when a conflicting property is set (%s) can lead to styling bugs. To avoid this, don't mix shorthand and non-shorthand properties for the same value; instead, replace the shorthand with separate values.", null == value || "boolean" === typeof value || "" === value ? "Removing" : "Updating", key, longhands); 1927 } 1928 } 1929 for (var styleName in prevStyles) !prevStyles.hasOwnProperty(styleName) || null != styles && styles.hasOwnProperty(styleName) || (0 === styleName.indexOf("--") ? node.setProperty(styleName, "") : "float" === styleName ? node.cssFloat = "" : node[styleName] = "", viewTransitionMutationContext = !0); 1930 for (var _styleName in styles) _key2 = styles[_styleName], styles.hasOwnProperty(_styleName) && prevStyles[_styleName] !== _key2 && (setValueForStyle(node, _styleName, _key2), viewTransitionMutationContext = !0); 1931 }
1931 else for (expandedUpdates in styles) styles.hasOwnProperty(expandedUpdates) && setValueForStyle(node, expandedUpdates, styles[expandedUpdates]); 1932 } 1933 function isCustomElement(tagName) { 1934 if (-1 === tagName.indexOf("-")) return !1; 1935 switch (tagName) { 1936 case "annotation-xml": 1937 case "color-profile": 1938 case "font-face": 1939 case "font-face-src": 1940 case "font-face-uri": 1941 case "font-face-format": 1942 case "font-face-name": 1943 case "missing-glyph": return !1; 1944 default: return !0; 1945 } 1946 } 1947 function getAttributeAlias(name) { 1948 return aliases.get(name) || name; 1949 } 1950 function validateProperty$1(tagName, name) { 1951 if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) return !0; 1952 if (rARIACamel$1.test(name)) { 1953 tagName = "aria-" + name.slice(4).toLowerCase(); 1954 tagName = ariaProperties.hasOwnProperty(tagName) ? tagName : null; 1955 if (null == tagName) return console.error("Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.", name), warnedProperties$1[name] = !0; 1956 if (name !== tagName) return console.error("Invalid ARIA attribute `%s`. Did you mean `%s`?", name, tagName), warnedProperties$1[name] = !0; 1957 } 1958 if (rARIA$1.test(name)) { 1959 tagName = name.toLowerCase(); 1960 tagName = ariaProperties.hasOwnProperty(tagName) ? tagName : null; 1961 if (null == tagName) return warnedProperties$1[name] = !0, !1; 1962 name !== tagName && (console.error("Unknown ARIA attribute `%s`. Did you mean `%s`?", name, tagName), warnedProperties$1[name] = !0); 1963 } 1964 return !0; 1965 } 1966 function validateProperties$2(type, props) { 1967 var invalidProps = [], key; 1968 for (key in props) validateProperty$1(type, key) || invalidProps.push(key); 1969 props = invalidProps.map(function(prop) { 1970 return "`" + prop + "`"; 1971 }).join(", "); 1972 1 === invalidProps.length ? console.error("Invalid aria prop %s on <%s> tag. For details, see https://react.dev/link/invalid-aria-props", props, type) : 1 < invalidProps.length && console.error("Invalid aria props %s on <%s> tag. For details, see https://react.dev/link/invalid-aria-props", props, type); 1973 } 1974 function validateProperty(tagName, name, value, eventRegistry) { 1975 if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) return !0; 1976 var lowerCasedName = name.toLowerCase(); 1977 if ("onfocusin" === lowerCasedName || "onfocusout" === lowerCasedName) return console.error("React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React."), warnedProperties[name] = !0; 1978 if ("function" === typeof value && ("form" === tagName && "action" === name || "input" === tagName && "formAction" === name || "button" === tagName && "formAction" === name)) return !0; 1979 if (null != eventRegistry) { 1980 tagName = eventRegistry.possibleRegistrationNames; 1981 if (eventRegistry.registrationNameDependencies.hasOwnProperty(name)) return !0; 1982 eventRegistry = tagName.hasOwnProperty(lowerCasedName) ? tagName[lowerCasedName] : null; 1983 if (null != eventRegistry) return console.error("Invalid event handler property `%s`. Did you mean `%s`?", name, eventRegistry), warnedProperties[name] = !0; 1984 if (EVENT_NAME_REGEX.test(name)) return console.error("Unknown event handler property `%s`. It will be ignored.", name), warnedProperties[name] = !0; 1985 } else if (EVENT_NAME_REGEX.test(name)) return INVALID_EVENT_NAME_REGEX.test(name) && console.error("Invalid event handler property `%s`. React events use the camelCase naming convention, for example `onClick`.", name), warnedProperties[name] = !0; 1986 if (rARIA.test(name) || rARIACamel.test(name)) return !0; 1987 if ("innerhtml" === lowerCasedName) return console.error("Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`."), warnedProperties[name] = !0; 1988 if ("aria" === lowerCasedName) return console.error("The `aria` attribute is reserved for future use in React. Pass individual `aria-` attributes instead."), warnedProperties[name] = !0; 1989 if ("is" === lowerCasedName && null !== value && void 0 !== value && "string" !== typeof value) return console.error("Received a `%s` for a string attribute `is`. If this is expected, cast the value to a string.", typeof value), warnedProperties[name] = !0; 1990 if ("number" === typeof value && isNaN(value)) return console.error("Received NaN for the `%s` attribute. If this is expected, cast the value to a string.", name), warnedProperties[name] = !0; 1991 if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { 1992 if (lowerCasedName = possibleStandardNames[lowerCasedName], lowerCasedName !== name) return console.error("Invalid DOM property `%s`. Did you mean `%s`?", name, lowerCasedName), warnedProperties[name] = !0; 1993 } else if (name !== lowerCasedName) return console.error("React does not recognize the `%s` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `%s` instead. If you accidentally passed it from a parent component, remove it from the DOM element.", name, lowerCasedName), warnedProperties[name] = !0; 1994 switch (name) { 1995 case "dangerouslySetInnerHTML":
1996 case "children": 1997 case "style": 1998 case "suppressContentEditableWarning": 1999 case "suppressHydrationWarning": 2000 case "defaultValue": 2001 case "defaultChecked": 2002 case "innerHTML": 2003 case "ref": return !0; 2004 case "innerText": 2005 case "textContent": return !0; 2006 } 2007 switch (typeof value) { 2008 case "boolean": switch (name) { 2009 case "autoFocus": 2010 case "checked": 2011 case "multiple": 2012 case "muted": 2013 case "selected": 2014 case "contentEditable": 2015 case "spellCheck": 2016 case "draggable": 2017 case "value": 2018 case "autoReverse": 2019 case "externalResourcesRequired": 2020 case "focusable": 2021 case "preserveAlpha": 2022 case "allowFullScreen": 2023 case "async": 2024 case "autoPlay": 2025 case "controls": 2026 case "credentialless": 2027 case "default": 2028 case "defer": 2029 case "disabled": 2030 case "disablePictureInPicture": 2031 case "disableRemotePlayback": 2032 case "formNoValidate": 2033 case "hidden": 2034 case "loop": 2035 case "noModule": 2036 case "noValidate": 2037 case "open": 2038 case "playsInline": 2039 case "readOnly": 2040 case "required": 2041 case "reversed": 2042 case "scoped": 2043 case "seamless": 2044 case "itemScope": 2045 case "capture": 2046 case "download": 2047 case "inert": return !0; 2048 default: 2049 lowerCasedName = name.toLowerCase().slice(0, 5); 2050 if ("data-" === lowerCasedName || "aria-" === lowerCasedName) return !0; 2051 value ? console.error("Received `%s` for a non-boolean attribute `%s`.\n\nIf you want to write it to the DOM, pass a string instead: %s=\"%s\" or %s={value.toString()}.", value, name, name, value, name) : console.error("Received `%s` for a non-boolean attribute `%s`.\n\nIf you want to write it to the DOM, pass a string instead: %s=\"%s\" or %s={value.toString()}.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.", value, name, name, value, name, name, name); 2052 return warnedProperties[name] = !0; 2053 } 2054 case "function": 2055 case "symbol": return warnedProperties[name] = !0, !1; 2056 case "string": if ("false" === value || "true" === value) { 2057 switch (name) { 2058 case "checked": 2059 case "selected": 2060 case "multiple": 2061 case "muted": 2062 case "allowFullScreen": 2063 case "async": 2064 case "autoPlay": 2065 case "controls": 2066 case "credentialless": 2067 case "default": 2068 case "defer": 2069 case "disabled": 2070 case "disablePictureInPicture": 2071 case "disableRemotePlayback": 2072 case "formNoValidate": 2073 case "hidden": 2074 case "loop": 2075 case "noModule": 2076 case "noValidate": 2077 case "open": 2078 case "playsInline": 2079 case "readOnly": 2080 case "required": 2081 case "reversed": 2082 case "scoped": 2083 case "seamless": 2084 case "itemScope": 2085 case "inert": break; 2086 default: return !0; 2087 } 2088 console.error("Received the string `%s` for the boolean attribute `%s`. %s Did you mean %s={%s}?", value, name, "false" === value ? "The browser will interpret it as a truthy value." : "Although this works, it will not work as expected if you pass the string \"fal
2088se\".", name, value); 2089 warnedProperties[name] = !0; 2090 } 2091 } 2092 return !0; 2093 } 2094 function warnUnknownProperties(type, props, eventRegistry) { 2095 var unknownProps = [], key; 2096 for (key in props) validateProperty(type, key, props[key], eventRegistry) || unknownProps.push(key); 2097 props = unknownProps.map(function(prop) { 2098 return "`" + prop + "`"; 2099 }).join(", "); 2100 1 === unknownProps.length ? console.error("Invalid value for prop %s on <%s> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM. For details, see https://react.dev/link/attribute-behavior ", props, type) : 1 < unknownProps.length && console.error("Invalid values for props %s on <%s> tag. Either remove them from the element, or pass a string or number value to keep them in the DOM. For details, see https://react.dev/link/attribute-behavior ", props, type); 2101 } 2102 function sanitizeURL(url) { 2103 return isJavaScriptProtocol.test("" + url) ? "javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')" : url; 2104 } 2105 function noop$1() {} 2106 function getEventTarget(nativeEvent) { 2107 nativeEvent = nativeEvent.target || nativeEvent.srcElement || window; 2108 nativeEvent.correspondingUseElement && (nativeEvent = nativeEvent.correspondingUseElement); 2109 return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent; 2110 } 2111 function restoreStateOfTarget(target) { 2112 var internalInstance = getInstanceFromNode(target); 2113 if (internalInstance && (target = internalInstance.stateNode)) { 2114 var props = target[internalPropsKey] || null; 2115 a: switch (target = internalInstance.stateNode, internalInstance.type) { 2116 case "input": 2117 updateInput(target, props.value, props.defaultValue, props.defaultValue, props.checked, props.defaultChecked, props.type, props.name); 2118 internalInstance = props.name; 2119 if ("radio" === props.type && null != internalInstance) { 2120 for (props = target; props.parentNode;) props = props.parentNode; 2121 checkAttributeStringCoercion(internalInstance, "name"); 2122 props = props.querySelectorAll("input[name=\"" + escapeSelectorAttributeValueInsideDoubleQuotes("" + internalInstance) + "\"][type=\"radio\"]"); 2123 for (internalInstance = 0; internalInstance < props.length; internalInstance++) { 2124 var otherNode = props[internalInstance]; 2125 if (otherNode !== target && otherNode.form === target.form) { 2126 var otherProps = otherNode[internalPropsKey] || null; 2127 if (!otherProps) throw Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."); 2128 updateInput(otherNode, otherProps.value, otherProps.defaultValue, otherProps.defaultValue, otherProps.checked, otherProps.defaultChecked, otherProps.type, otherProps.name); 2129 } 2130 } 2131 for (internalInstance = 0; internalInstance < props.length; internalInstance++) otherNode = props[internalInstance], otherNode.form === target.form && updateValueIfChanged(otherNode); 2132 } 2133 break a; 2134 case "textarea": 2135 updateTextarea(target, props.value, props.defaultValue); 2136 break a; 2137 case "select": internalInstance = props.value, null != internalInstance && updateOptions(target, !!props.multiple, internalInstance, !1); 2138 } 2139 } 2140 } 2141 function batchedUpdates$1(fn, a, b) { 2142 if (isInsideEventHandler) return fn(a, b); 2143 isInsideEventHandler = !0; 2144 try { 2145 return fn(a); 2146 } finally { 2147 if (isInsideEventHandler = !1, null !== restoreTarget || null !== restoreQueue) { 2148 if (flushSyncWork$1(), restoreTarget && (a = restoreTarget, fn = restoreQueue, restoreQueue = restoreTarget = null, restoreStateOfTarget(a), fn)) for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]); 2149 } 2150 } 2151 } 2152 function getListener(inst, registrationName) { 2153 var stateNode = inst.stateNode; 2154 if (null === stateNode) return null; 2155 var props = stateNode[internalPropsKey] || null; 2156 if (null === props) return null; 2157 stateNode = props[registrationName]; 2158 a: switch (registrationName) { 2159 case "onClick":
vendor: 6,006 bytes, lines 2160-2283
2160 case "onClickCapture": 2161 case "onDoubleClick": 2162 case "onDoubleClickCapture": 2163 case "onMouseDown": 2164 case "onMouseDownCapture": 2165 case "onMouseMove": 2166 case "onMouseMoveCapture": 2167 case "onMouseUp": 2168 case "onMouseUpCapture": 2169 case "onMouseEnter": 2170 (props = !props.disabled) || (inst = inst.type, props = !("button" === inst || "input" === inst || "select" === inst || "textarea" === inst)); 2171 inst = !props; 2172 break a; 2173 default: inst = !1; 2174 } 2175 if (inst) return null; 2176 if (stateNode && "function" !== typeof stateNode) throw Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof stateNode + "` type."); 2177 return stateNode; 2178 } 2179 function getData() { 2180 if (fallbackText) return fallbackText; 2181 var start, startValue = startText, startLength = startValue.length, end, endValue = "value" in root ? root.value : root.textContent, endLength = endValue.length; 2182 for (start = 0; start < startLength && startValue[start] === endValue[start]; start++); 2183 var minEnd = startLength - start; 2184 for (end = 1; end <= minEnd && startValue[startLength - end] === endValue[endLength - end]; end++); 2185 return fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0); 2186 } 2187 function getEventCharCode(nativeEvent) { 2188 var keyCode = nativeEvent.keyCode; 2189 "charCode" in nativeEvent ? (nativeEvent = nativeEvent.charCode, 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13)) : nativeEvent = keyCode; 2190 10 === nativeEvent && (nativeEvent = 13); 2191 return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0; 2192 } 2193 function functionThatReturnsTrue() { 2194 return !0; 2195 } 2196 function functionThatReturnsFalse() { 2197 return !1; 2198 } 2199 function createSyntheticEvent(Interface) { 2200 function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) { 2201 this._reactName = reactName; 2202 this._targetInst = targetInst; 2203 this.type = reactEventType; 2204 this.nativeEvent = nativeEvent; 2205 this.target = nativeEventTarget; 2206 this.currentTarget = null; 2207 for (var propName in Interface) Interface.hasOwnProperty(propName) && (reactName = Interface[propName], this[propName] = reactName ? reactName(nativeEvent) : nativeEvent[propName]); 2208 this.isDefaultPrevented = (null != nativeEvent.defaultPrevented ? nativeEvent.defaultPrevented : !1 === nativeEvent.returnValue) ? functionThatReturnsTrue : functionThatReturnsFalse; 2209 this.isPropagationStopped = functionThatReturnsFalse; 2210 return this; 2211 } 2212 assign(SyntheticBaseEvent.prototype, { 2213 preventDefault: function() { 2214 this.defaultPrevented = !0; 2215 var event = this.nativeEvent; 2216 event && (event.preventDefault ? event.preventDefault() : "unknown" !== typeof event.returnValue && (event.returnValue = !1), this.isDefaultPrevented = functionThatReturnsTrue); 2217 }, 2218 stopPropagation: function() { 2219 var event = this.nativeEvent; 2220 event && (event.stopPropagation ? event.stopPropagation() : "unknown" !== typeof event.cancelBubble && (event.cancelBubble = !0), this.isPropagationStopped = functionThatReturnsTrue); 2221 }, 2222 persist: function() {}, 2223 isPersistent: functionThatReturnsTrue 2224 }); 2225 return SyntheticBaseEvent; 2226 } 2227 function modifierStateGetter(keyArg) { 2228 var nativeEvent = this.nativeEvent; 2229 return nativeEvent.getModifierState ? nativeEvent.getModifierState(keyArg) : (keyArg = modifierKeyToProp[keyArg]) ? !!nativeEvent[keyArg] : !1; 2230 } 2231 function getEventModifierState() { 2232 return modifierStateGetter; 2233 } 2234 function isFallbackCompositionEnd(domEventName, nativeEvent) { 2235 switch (domEventName) { 2236 case "keyup": return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode); 2237 case "keydown": return nativeEvent.keyCode !== START_KEYCODE; 2238 case "keypress": 2239 case "mousedown": 2240 case "focusout": return !0; 2241 default: return !1; 2242 } 2243 } 2244 function getDataFromCustomEvent(nativeEvent) { 2245 nativeEvent = nativeEvent.detail; 2246 return "object" === typeof nativeEvent && "data" in nativeEvent ? nativeEvent.data : null; 2247 } 2248 function getNativeBeforeInputChars(domEventName, nativeEvent) { 2249 switch (domEventName) { 2250 case "compositionend": return getDataFromCustomEvent(nativeEvent); 2251 case "keypress": 2252 if (nativeEvent.which !== SPACEBAR_CODE) return null; 2253 hasSpaceKeypress = !0; 2254 return SPACEBAR_CHAR; 2255 case "textInput": return domEventName = nativeEvent.data, domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName; 2256 default: return null; 2257 } 2258 } 2259 function getFallbackBeforeInputChars(domEventName, nativeEvent) { 2260 if (isComposing) return "compositionend" === domEventName || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent) ? (domEventName = getData(), fallbackText = startText = root = null, isComposing = !1, domEventName) : null; 2261 switch (domEventName) { 2262 case "paste": return null; 2263 case "keypress": 2264 if (!(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) || nativeEvent.ctrlKey && nativeEvent.altKey) { 2265 if (nativeEvent.char && 1 < nativeEvent.char.length) return nativeEvent.char; 2266 if (nativeEvent.which) return String.fromCharCode(nativeEvent.which); 2267 } 2268 return null; 2269 case "compositionend": return useFallbackCompositionData && "ko" !== nativeEvent.locale ? null : nativeEvent.data; 2270 default: return null; 2271 } 2272 } 2273 function isTextInputElement(elem) { 2274 var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); 2275 return "input" === nodeName ? !!supportedInputTypes[elem.type] : "textarea" === nodeName ? !0 : !1; 2276 } 2277 function isEventSupported(eventNameSuffix) { 2278 if (!canUseDOM) return !1; 2279 eventNameSuffix = "on" + eventNameSuffix; 2280 var isSupported = eventNameSuffix in document; 2281 isSupported || (isSupported = document.createElement("div"), isSupported.setAttribute(eventNameSuffix, "return;"), isSupported = "function" === typeof isSupported[eventNameSuffix]); 2282 return isSupported; 2283 }
vendor: 5,188 bytes, lines 2284-2395
2284 function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) { 2285 restoreTarget ? restoreQueue ? restoreQueue.push(target) : restoreQueue = [target] : restoreTarget = target; 2286 inst = accumulateTwoPhaseListeners(inst, "onChange"); 2287 0 < inst.length && (nativeEvent = new SyntheticEvent("onChange", "change", null, nativeEvent, target), dispatchQueue.push({ 2288 event: nativeEvent, 2289 listeners: inst 2290 })); 2291 } 2292 function runEventInBatch(dispatchQueue) { 2293 processDispatchQueue(dispatchQueue, 0); 2294 } 2295 function getInstIfValueChanged(targetInst) { 2296 if (updateValueIfChanged(getNodeFromInstance(targetInst))) return targetInst; 2297 } 2298 function getTargetInstForChangeEvent(domEventName, targetInst) { 2299 if ("change" === domEventName) return targetInst; 2300 } 2301 function stopWatchingForValueChange() { 2302 activeElement$1 && (activeElement$1.detachEvent("onpropertychange", handlePropertyChange), activeElementInst$1 = activeElement$1 = null); 2303 } 2304 function handlePropertyChange(nativeEvent) { 2305 if ("value" === nativeEvent.propertyName && getInstIfValueChanged(activeElementInst$1)) { 2306 var dispatchQueue = []; 2307 createAndAccumulateChangeEvent(dispatchQueue, activeElementInst$1, nativeEvent, getEventTarget(nativeEvent)); 2308 batchedUpdates$1(runEventInBatch, dispatchQueue); 2309 } 2310 } 2311 function handleEventsForInputEventPolyfill(domEventName, target, targetInst) { 2312 "focusin" === domEventName ? (stopWatchingForValueChange(), activeElement$1 = target, activeElementInst$1 = targetInst, activeElement$1.attachEvent("onpropertychange", handlePropertyChange)) : "focusout" === domEventName && stopWatchingForValueChange(); 2313 } 2314 function getTargetInstForInputEventPolyfill(domEventName) { 2315 if ("selectionchange" === domEventName || "keyup" === domEventName || "keydown" === domEventName) return getInstIfValueChanged(activeElementInst$1); 2316 } 2317 function getTargetInstForClickEvent(domEventName, targetInst) { 2318 if ("click" === domEventName) return getInstIfValueChanged(targetInst); 2319 } 2320 function getTargetInstForInputOrChangeEvent(domEventName, targetInst) { 2321 if ("input" === domEventName || "change" === domEventName) return getInstIfValueChanged(targetInst); 2322 } 2323 function is(x, y) { 2324 return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; 2325 } 2326 function shallowEqual(objA, objB) { 2327 if (objectIs(objA, objB)) return !0; 2328 if ("object" !== typeof objA || null === objA || "object" !== typeof objB || null === objB) return !1; 2329 var keysA = Object.keys(objA), keysB = Object.keys(objB); 2330 if (keysA.length !== keysB.length) return !1; 2331 for (keysB = 0; keysB < keysA.length; keysB++) { 2332 var currentKey = keysA[keysB]; 2333 if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) return !1; 2334 } 2335 return !0; 2336 } 2337 function getActiveElement(doc) { 2338 doc = doc || ("undefined" !== typeof document ? document : void 0); 2339 if ("undefined" === typeof doc) return null; 2340 try { 2341 return doc.activeElement || doc.body; 2342 } catch (e$2) { 2343 return doc.body; 2344 } 2345 } 2346 function getLeafNode(node) { 2347 for (; node && node.firstChild;) node = node.firstChild; 2348 return node; 2349 } 2350 function getNodeForCharacterOffset(root, offset) { 2351 var node = getLeafNode(root); 2352 root = 0; 2353 for (var nodeEnd; node;) { 2354 if (3 === node.nodeType) { 2355 nodeEnd = root + node.textContent.length; 2356 if (root <= offset && nodeEnd >= offset) return { 2357 node, 2358 offset: offset - root 2359 }; 2360 root = nodeEnd; 2361 } 2362 a: { 2363 for (; node;) { 2364 if (node.nextSibling) { 2365 node = node.nextSibling; 2366 break a; 2367 } 2368 node = node.parentNode; 2369 } 2370 node = void 0; 2371 } 2372 node = getLeafNode(node); 2373 } 2374 } 2375 function containsNode(outerNode, innerNode) { 2376 return outerNode && innerNode ? outerNode === innerNode ? !0 : outerNode && 3 === outerNode.nodeType ? !1 : innerNode && 3 === innerNode.nodeType ? containsNode(outerNode, innerNode.parentNode) : "contains" in outerNode ? outerNode.contains(innerNode) : outerNode.compareDocumentPosition ? !!(outerNode.compareDocumentPosition(innerNode) & 16) : !1 : !1; 2377 } 2378 function getActiveElementDeep(containerInfo) { 2379 containerInfo = null != containerInfo && null != containerInfo.ownerDocument && null != containerInfo.ownerDocument.defaultView ? containerInfo.ownerDocument.defaultView : window; 2380 for (var element = getActiveElement(containerInfo.document); element instanceof containerInfo.HTMLIFrameElement;) { 2381 try { 2382 var JSCompiler_inline_result = "string" === typeof element.contentWindow.location.href; 2383 } catch (err) { 2384 JSCompiler_inline_result = !1; 2385 } 2386 if (JSCompiler_inline_result) containerInfo = element.contentWindow; 2387 else break; 2388 element = getActiveElement(containerInfo.document); 2389 } 2390 return element; 2391 } 2392 function hasSelectionCapabilities(elem) { 2393 var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); 2394 return nodeName && ("input" === nodeName && ("text" === elem.type || "search" === elem.type || "tel" === elem.type || "url" === elem.type || "password" === elem.type) || "textarea" === nodeName || "true" === elem.contentEditable); 2395 }
2396 function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) { 2397 var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : 9 === nativeEventTarget.nodeType ? nativeEventTarget : nativeEventTarget.ownerDocument; 2398 mouseDown || null == activeElement || activeElement !== getActiveElement(doc) || (doc = activeElement, "selectionStart" in doc && hasSelectionCapabilities(doc) ? doc = { 2399 start: doc.selectionStart, 2400 end: doc.selectionEnd 2401 } : (doc = (doc.ownerDocument && doc.ownerDocument.defaultView || window).getSelection(), doc = { 2402 anchorNode: doc.anchorNode, 2403 anchorOffset: doc.anchorOffset, 2404 focusNode: doc.focusNode, 2405 focusOffset: doc.focusOffset 2406 }), lastSelection && shallowEqual(lastSelection, doc) || (lastSelection = doc, doc = accumulateTwoPhaseListeners(activeElementInst, "onSelect"), 0 < doc.length && (nativeEvent = new SyntheticEvent("onSelect", "select", null, nativeEvent, nativeEventTarget), dispatchQueue.push({ 2407 event: nativeEvent, 2408 listeners: doc 2409 }), nativeEvent.target = activeElement))); 2410 } 2411 function makePrefixMap(styleProp, eventName) { 2412 var prefixes = {}; 2413 prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); 2414 prefixes["Webkit" + styleProp] = "webkit" + eventName; 2415 prefixes["Moz" + styleProp] = "moz" + eventName; 2416 return prefixes; 2417 } 2418 function getVendorPrefixedEventName(eventName) { 2419 if (prefixedEventNames[eventName]) return prefixedEventNames[eventName]; 2420 if (!vendorPrefixes[eventName]) return eventName; 2421 var prefixMap = vendorPrefixes[eventName], styleProp; 2422 for (styleProp in prefixMap) if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) return prefixedEventNames[eventName] = prefixMap[styleProp]; 2423 return eventName; 2424 } 2425 function registerSimpleEvent(domEventName, reactName) { 2426 topLevelEventsToReactNames.set(domEventName, reactName); 2427 registerTwoPhaseEvent(reactName, [domEventName]); 2428 } 2429 function getViewTransitionName(props, instance) { 2430 if (null != props.name && "auto" !== props.name) return props.name; 2431 if (null !== instance.autoName) return instance.autoName; 2432 props = pendingEffectsRoot.identifierPrefix; 2433 var globalClientId = globalClientIdCounter$1++; 2434 props = "_" + props + "t_" + globalClientId.toString(32) + "_"; 2435 return instance.autoName = props; 2436 } 2437 function getClassNameByType(classByType) { 2438 if (null == classByType || "string" === typeof classByType) return classByType; 2439 var className = null, activeTypes = pendingTransitionTypes; 2440 if (null !== activeTypes) for (var i = 0; i < activeTypes.length; i++) { 2441 var match = classByType[activeTypes[i]]; 2442 if (null != match) { 2443 if ("none" === match) return "none"; 2444 className = null == className ? match : className + (" " + match); 2445 } 2446 } 2447 return null == className ? classByType.default : className; 2448 } 2449 function getViewTransitionClassName(defaultClass, eventClass) { 2450 defaultClass = getClassNameByType(defaultClass); 2451 eventClass = getClassNameByType(eventClass); 2452 return null == eventClass ? "auto" === defaultClass ? null : defaultClass : "auto" === eventClass ? null : eventClass; 2453 } 2454 function getArrayKind(array) { 2455 for (var kind = EMPTY_ARRAY, i = 0; i < array.length && i < OBJECT_WIDTH_LIMIT; i++) { 2456 var value = array[i]; 2457 if ("object" === typeof value && null !== value) if (isArrayImpl(value) && 2 === value.length && "string" === typeof value[0]) { 2458 if (kind !== EMPTY_ARRAY && kind !== ENTRIES_ARRAY) return COMPLEX_ARRAY; 2459 kind = ENTRIES_ARRAY; 2460 } else return COMPLEX_ARRAY; 2461 else { 2462 if ("function" === typeof value || "string" === typeof value && 50 < value.length || kind !== EMPTY_ARRAY && kind !== PRIMITIVE_ARRAY || "bigint" === typeof value) return COMPLEX_ARRAY; 2463 kind = PRIMITIVE_ARRAY; 2464 } 2465 } 2466 return kind; 2467 } 2468 function addObjectToProperties(object, properties, indent, prefix) { 2469 if (!ArrayBuffer.isView(object)) { 2470 var addedProperties = 0, key; 2471 for (key in object) if (hasOwnProperty.call(object, key) && "_" !== key[0] && (addedProperties++, addValueToProperties(key, object[key], properties, indent, prefix), addedProperties >= OBJECT_WIDTH_LIMIT)) { 2472 properties.push([prefix + "\xA0\xA0".repeat(indent) + "Only " + OBJECT_WIDTH_LIMIT + " properties are shown. React will not log more properties of this object.", ""]); 2473 break; 2474 } 2475 } 2476 } 2477 function readReactElementTypeof(value) { 2478 return "$$typeof" in value && hasOwnProperty.call(value, "$$typeof") ? value.$$typeof : void 0; 2479 } 2480 function addValueToProperties(propertyName, value, properties, indent, prefix) { 2481 switch (typeof value) { 2482 case "object": if (null === value) { 2483 value = "null"; 2484 break; 2485 } else { 2486 if (readReactElementTypeof(value) === REACT_ELEMENT_TYPE) { 2487 var typeName = getComponentNameFromType(value.type) || "…", key = value.key; 2488 value = value.props; 2489 var propsKeys = Object.keys(value), propsLength = propsKeys.length; 2490 if (null == key && 0 === propsLength) { 2491 value = "<" + typeName + " />"; 2492 break; 2493 } 2494 if (3 > indent || 1 === propsLength && "children" === propsKeys[0] && null == key) { 2495 value = "<" + typeName + " … />"; 2496 break; 2497 } 2498 properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, "<" + typeName]); 2499 null !== key && addValueToProperties("key", key, properties, indent + 1, prefix); 2500 propertyName = !1; 2501 key = 0; 2502 for (var propKey in value) if (key++, "children" === propKey ? null != value.children && (!isArrayImpl(value.children) || 0 < value.children.length) && (propertyName = !0) : hasOwnProperty.call(value, propKey) && "_" !== propKey[0] && addValueToProperties(propKey, value[propKey], properties, indent + 1, prefix), key >= OBJECT_WIDTH_LIMIT) break; 2503 properties.push(["", propertyName ? ">…</" + typeName + ">" : "/>"]); 2504 return; 2505 } 2506 typeName = Object.prototype.toString.call(value); 2507 typeName = typeName.slice(8, typeName.length - 1); 2508 if (ArrayBuffer.isView(value)) { 2509 value = value.length; 2510 value = "number" === typeof value ? typeName + "(" + value + ")" : typeName; 2511 break; 2512 } 2513 if ("Array" === typeName) { 2514 if (propKey = value.length > OBJECT_WIDTH_LIMIT, key = getArrayKind(value), key === PRIMITIVE_ARRAY || key === EMPTY_ARRAY) { 2515 value = JSON.stringify(propKey ? value.slice(0, OBJECT_WIDTH_LIMIT).concat("…") : value); 2516 break; 2517 } else if (key === ENTRIES_ARRAY) { 2518 properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, ""]); 2519 for (propertyName = 0; propertyName < value.length && propertyName < OBJECT_WIDTH_LIMIT; propertyName++) typeName = value[propertyName], addValueToProperties(typeName[0], typeName[1], properties, indent + 1, prefix); 2520 propKey && addValueToProperties(OBJECT_WIDTH_LIMIT.toString(), "…", properties, indent + 1, prefix); 2521 return; 2522 } 2523 } 2524 if ("Promise" === typeName) { 2525 if ("fulfilled" === value.status) { 2526 if (typeName = properties.length, addValueToProperties(propertyName, value.value, properties, indent, prefix), properties.length > typeName) { 2527 properties = properties[typeName]; 2528 properties[1] = "Promise<" + (properties[1] || "Object") + ">"; 2529 return; 2530 } 2531 } else if ("rejected" === value.status && (typeName = properties.length, addValueToProperties(propertyName, value.reason, properties, indent, prefix), properties.length > typeName)) { 2532 properties = properties[typeName]; 2533 properties[1] = "Rejected Promise<" + properties[1] + ">"; 2534 return; 2535 } 2536 properties.push(["\xA0\xA0".repeat(indent) + propertyName, "Promise"]); 2537 return; 2538 } 2539 "Object" === typeName && (propKey = Object.getPrototypeOf(value)) && "function" === typeof propKey.constructor && (typeName = propKey.constructor.name); 2540 properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, "Object" === typeName ? 3 > indent ? "" : "…" : typeName]); 2541 3 > indent && addObjectToProperties(value, properties, indent + 1, prefix); 2542 return; 2543 } 2544 case "function": 2545 value = value.name; 2546 value = "" === value || "string" !== typeof value ? "() => {}" : value + "() {}"; 2547 break; 2548 case "string": 2549 value = value === OMITTED_PROP_ERROR ? "…" : JSON.stringify(1024 <= value.length ? value.slice(0, 1023) + "…" : value); 2550 break; 2551 case "undefined": 2552 value = "undefined"; 2553 break; 2554 case "boolean": 2555 value = value ? "true" : "false"; 2556 break;
2557 default: value = String(value); 2558 } 2559 properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, value]); 2560 } 2561 function addObjectDiffToProperties(prev, next, properties, indent) { 2562 var isDeeplyEqual = !0, prevPropertiesChecked = 0; 2563 for (key in prev) { 2564 if (prevPropertiesChecked > OBJECT_WIDTH_LIMIT) { 2565 properties.push(["Previous object has more than " + OBJECT_WIDTH_LIMIT + " properties. React will not attempt to diff objects with too many properties.", ""]); 2566 isDeeplyEqual = !1; 2567 break; 2568 } 2569 key in next || (properties.push([REMOVED + "\xA0\xA0".repeat(indent) + key, "…"]), isDeeplyEqual = !1); 2570 prevPropertiesChecked++; 2571 } 2572 prevPropertiesChecked = 0; 2573 for (var _key in next) { 2574 if (prevPropertiesChecked > OBJECT_WIDTH_LIMIT) { 2575 properties.push(["Next object has more than " + OBJECT_WIDTH_LIMIT + " properties. React will not attempt to diff objects with too many properties.", ""]); 2576 isDeeplyEqual = !1; 2577 break; 2578 } 2579 if (_key in prev) { 2580 var key = prev[_key]; 2581 var nextValue = next[_key]; 2582 if (key !== nextValue) { 2583 if (0 === indent && "children" === _key) { 2584 isDeeplyEqual = "\xA0\xA0".repeat(indent) + _key; 2585 properties.push([REMOVED + isDeeplyEqual, "…"], [ADDED + isDeeplyEqual, "…"]); 2586 isDeeplyEqual = !1; 2587 continue; 2588 } 2589 if (!(3 <= indent)) { 2590 if ("object" === typeof key && "object" === typeof nextValue && null !== key && null !== nextValue && readReactElementTypeof(key) === readReactElementTypeof(nextValue)) if (readReactElementTypeof(nextValue) === REACT_ELEMENT_TYPE) { 2591 if (key.type === nextValue.type && key.key === nextValue.key) { 2592 key = getComponentNameFromType(nextValue.type) || "…"; 2593 isDeeplyEqual = "\xA0\xA0".repeat(indent) + _key; 2594 key = "<" + key + " … />"; 2595 properties.push([REMOVED + isDeeplyEqual, key], [ADDED + isDeeplyEqual, key]); 2596 isDeeplyEqual = !1; 2597 continue; 2598 } 2599 } else { 2600 var prevKind = Object.prototype.toString.call(key), nextKind = Object.prototype.toString.call(nextValue); 2601 if (prevKind === nextKind && ("[object Object]" === nextKind || "[object Array]" === nextKind)) { 2602 prevKind = [UNCHANGED + "\xA0\xA0".repeat(indent) + _key, "[object Array]" === nextKind ? "Array" : ""]; 2603 properties.push(prevKind); 2604 nextKind = properties.length; 2605 addObjectDiffToProperties(key, nextValue, properties, indent + 1) ? nextKind === properties.length && (prevKind[1] = "Referentially unequal but deeply equal objects. Consider memoization.") : isDeeplyEqual = !1; 2606 continue; 2607 } 2608 } 2609 else if ("function" === typeof key && "function" === typeof nextValue && key.name === nextValue.name && key.length === nextValue.length && (prevKind = Function.prototype.toString.call(key), nextKind = Function.prototype.toString.call(nextValue), prevKind === nextKind)) { 2610 key = "" === nextValue.name ? "() => {}" : nextValue.name + "() {}"; 2611 properties.push([UNCHANGED + "\xA0\xA0".repeat(indent) + _key, key + " Referentially unequal function closure. Consider memoization."]); 2612 continue; 2613 } 2614 } 2615 addValueToProperties(_key, key, properties, indent, REMOVED); 2616 addValueToProperties(_key, nextValue, properties, indent, ADDED); 2617 isDeeplyEqual = !1; 2618 } 2619 } else properties.push([ADDED + "\xA0\xA0".repeat(indent) + _key, "…"]), isDeeplyEqual = !1; 2620 prevPropertiesChecked++; 2621 } 2622 return isDeeplyEqual; 2623 } 2624 function setCurrentTrackFromLanes(lanes) { 2625 currentTrack = lanes & 63 ? "Blocking" : lanes & 64 ? "Gesture" : lanes & 4194176 ? "Transition" : lanes & 62914560 ? "Suspense" : lanes & 2080374784 ? "Idle" : "Other"; 2626 } 2627 function logComponentTrigger(fiber, startTime, endTime, trigger) { 2628 supportsUserTiming && (reusableComponentOptions.start = startTime, reusableComponentOptions.end = endTime, reusableComponentDevToolDetails.color = "warning", reusableComponentDevToolDetails.tooltipText = trigger, reusableComponentDevToolDetails.properties = null, (fiber = fiber._debugTask) ? fiber.run(performance.measure.bind(performance, trigger, reusableComponentOptions)) : performance.measure(trigger, reusableComponentOptions), performance.clearMeasures(trigger)); 2629 } 2630 function logComponentReappeared(fiber, startTime, endTime) { 2631 logComponentTrigger(fiber, startTime, endTime, "Reconnect"); 2632 } 2633 function logComponentRender(fiber, startTime, endTime, wasHydrated, committedLanes) { 2634 var name = getComponentNameFromFiber(fiber); 2635 if (null !== name && supportsUserTiming) { 2636 var alternate = fiber.alternate, selfTime = fiber.actualDuration; 2637 if (null === alternate || alternate.child !== fiber.child) for (var child = fiber.child; null !== child; child = child.sibling) selfTime -= child.actualDuration; 2638 selfTime = .5 > selfTime ? wasHydrated ? "tertiary-light" : "primary-light" : 10 > selfTime ? wasHydrated ? "tertiary" : "primary" : 100 > selfTime ? wasHydrated ? "tertiary-dark" : "primary-dark" : "error"; 2639 var props = fiber.memoizedProps; 2640 wasHydrated = fiber._debugTask; 2641 null !== props && null !== alternate && alternate.memoizedProps !== props ? (child = [reusableChangedPropsEntry], props = addObjectDiffToProperties(alternate.memoizedProps, props, child, 0), 1 < child.length ? (props && !alreadyWarnedForDeepEquality && 0 === (alternate.lanes & committedLanes) && 100 < fiber.actualDuration ? (alreadyWarnedForDeepEquality = !0, child[0] = reusableDeeplyEqualPropsEntry, reusableComponentDevToolDetails.color = "warning", reusableComponentDevToolDetails.tooltipText = DEEP_EQUALITY_WARNING) : (reusableComponentDevToolDetails.color = selfTime, reusableComponentDevToolDetails.tooltipText = name), reusableComponentDevToolDetails.properties = child, reusableComponentOptions.start = startTime, reusableComponentOptions.end = endTime, fiber = "​" + name, null != wasHydrated ? wasHydrated.run(performance.measure.bind(performance, fiber, reusableComponentOptions)) : performance.measure(fiber, reusableComponentOptions), performance.clearMeasures(fiber)) : null != wasHydrated ? wasHydrated.run(console.timeStamp.bind(console, name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime)) : console.timeStamp(name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime)) : null != wasHydrated ? wasHydrated.run(console.timeStamp.bind(console, name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime)) : console.timeStamp(name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime); 2642 } 2643 } 2644 function logComponentErrored(fiber, startTime, endTime, errors) { 2645 if (supportsUserTiming) { 2646 var name = getComponentNameFromFiber(fiber); 2647 if (null !== name) { 2648 for (var debugTask = null, properties = [], i = 0; i < errors.length; i++) { 2649 var capturedValue = errors[i]; 2650 null == debugTask && null !== capturedValue.source && (debugTask = capturedValue.source._debugTask); 2651 capturedValue = capturedValue.value; 2652 properties.push(["Error", "object" === typeof capturedValue && null !== capturedValue && "string" === typeof capturedValue.message ? String(capturedValue.message) : String(capturedValue)]); 2653 }
vendor: 4,434 bytes, lines 2654-2727
2654 null !== fiber.key && addValueToProperties("key", fiber.key, properties, 0, ""); 2655 null !== fiber.memoizedProps && addObjectToProperties(fiber.memoizedProps, properties, 0, ""); 2656 debugTask ??= fiber._debugTask; 2657 fiber = { 2658 start: startTime, 2659 end: endTime, 2660 detail: { devtools: { 2661 color: "error", 2662 track: COMPONENTS_TRACK, 2663 tooltipText: 13 === fiber.tag ? "Hydration failed" : "Error boundary caught an error", 2664 properties 2665 } } 2666 }; 2667 name = "​" + name; 2668 debugTask ? debugTask.run(performance.measure.bind(performance, name, fiber)) : performance.measure(name, fiber); 2669 performance.clearMeasures(name); 2670 } 2671 } 2672 } 2673 function logComponentEffect(fiber, startTime, endTime, selfTime, errors) { 2674 if (null !== errors) { 2675 if (supportsUserTiming) { 2676 var name = getComponentNameFromFiber(fiber); 2677 if (null !== name) { 2678 selfTime = []; 2679 for (var i = 0; i < errors.length; i++) { 2680 var error = errors[i].value; 2681 selfTime.push(["Error", "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error)]); 2682 } 2683 null !== fiber.key && addValueToProperties("key", fiber.key, selfTime, 0, ""); 2684 null !== fiber.memoizedProps && addObjectToProperties(fiber.memoizedProps, selfTime, 0, ""); 2685 startTime = { 2686 start: startTime, 2687 end: endTime, 2688 detail: { devtools: { 2689 color: "error", 2690 track: COMPONENTS_TRACK, 2691 tooltipText: "A lifecycle or effect errored", 2692 properties: selfTime 2693 } } 2694 }; 2695 fiber = fiber._debugTask; 2696 endTime = "​" + name; 2697 fiber ? fiber.run(performance.measure.bind(performance, endTime, startTime)) : performance.measure(endTime, startTime); 2698 performance.clearMeasures(endTime); 2699 } 2700 } 2701 } else name = getComponentNameFromFiber(fiber), null !== name && supportsUserTiming && (errors = 1 > selfTime ? "secondary-light" : 100 > selfTime ? "secondary" : 500 > selfTime ? "secondary-dark" : "error", (fiber = fiber._debugTask) ? fiber.run(console.timeStamp.bind(console, name, startTime, endTime, COMPONENTS_TRACK, void 0, errors)) : console.timeStamp(name, startTime, endTime, COMPONENTS_TRACK, void 0, errors)); 2702 } 2703 function logSuspendedRenderPhase(startTime, endTime, lanes, debugTask) { 2704 !supportsUserTiming || endTime <= startTime || (lanes = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", debugTask ? debugTask.run(console.timeStamp.bind(console, "Prewarm", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes)) : console.timeStamp("Prewarm", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes)); 2705 } 2706 function logSuspendedWithDelayPhase(startTime, endTime, lanes, debugTask) { 2707 !supportsUserTiming || endTime <= startTime || (lanes = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", debugTask ? debugTask.run(console.timeStamp.bind(console, "Suspended", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes)) : console.timeStamp("Suspended", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes)); 2708 } 2709 function logErroredRenderPhase(startTime, endTime, lanes, debugTask) { 2710 !supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, "Errored", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "error")) : console.timeStamp("Errored", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "error")); 2711 } 2712 function logSuspendedCommitPhase(startTime, endTime, reason, debugTask) { 2713 !supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, reason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")) : console.timeStamp(reason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")); 2714 } 2715 function logCommitErrored(startTime, endTime, errors, passive, debugTask) { 2716 if (supportsUserTiming && !(endTime <= startTime)) { 2717 for (var properties = [], i = 0; i < errors.length; i++) { 2718 var error = errors[i].value; 2719 properties.push(["Error", "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error)]); 2720 } 2721 startTime = { 2722 start: startTime, 2723 end: endTime, 2724 detail: { devtools: { 2725 color: "error", 2726 track: currentTrack, 2727 trackGroup: LANES_TRACK_GROUP,
2728 tooltipText: passive ? "Remaining Effects Errored" : "Commit Errored", 2729 properties 2730 } } 2731 }; 2732 debugTask ? debugTask.run(performance.measure.bind(performance, "Errored", startTime)) : performance.measure("Errored", startTime); 2733 performance.clearMeasures("Errored"); 2734 } 2735 } 2736 function logCommitPhase(startTime, endTime, errors, abortedViewTransition, debugTask) { 2737 null !== errors ? logCommitErrored(startTime, endTime, errors, !1, debugTask) : !supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, abortedViewTransition ? "Commit Interrupted View Transition" : "Commit", startTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? "error" : "secondary-dark")) : console.timeStamp(abortedViewTransition ? "Commit Interrupted View Transition" : "Commit", startTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? "error" : "secondary-dark")); 2738 } 2739 function logAnimatingPhase(startTime, endTime, debugTask) { 2740 !supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, "Animating", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark")) : console.timeStamp("Animating", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark")); 2741 } 2742 function finishQueueingConcurrentUpdates() { 2743 for (var endIndex = concurrentQueuesIndex, i = concurrentlyUpdatedLanes = concurrentQueuesIndex = 0; i < endIndex;) { 2744 var fiber = concurrentQueues[i]; 2745 concurrentQueues[i++] = null; 2746 var queue = concurrentQueues[i]; 2747 concurrentQueues[i++] = null; 2748 var update = concurrentQueues[i]; 2749 concurrentQueues[i++] = null; 2750 var lane = concurrentQueues[i]; 2751 concurrentQueues[i++] = null; 2752 if (null !== queue && null !== update) { 2753 var pending = queue.pending; 2754 null === pending ? update.next = update : (update.next = pending.next, pending.next = update); 2755 queue.pending = update; 2756 } 2757 0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane); 2758 } 2759 } 2760 function enqueueUpdate$1(fiber, queue, update, lane) { 2761 concurrentQueues[concurrentQueuesIndex++] = fiber; 2762 concurrentQueues[concurrentQueuesIndex++] = queue; 2763 concurrentQueues[concurrentQueuesIndex++] = update; 2764 concurrentQueues[concurrentQueuesIndex++] = lane; 2765 concurrentlyUpdatedLanes |= lane; 2766 fiber.lanes |= lane; 2767 fiber = fiber.alternate; 2768 null !== fiber && (fiber.lanes |= lane); 2769 } 2770 function enqueueConcurrentHookUpdate(fiber, queue, update, lane) { 2771 enqueueUpdate$1(fiber, queue, update, lane); 2772 return getRootForUpdatedFiber(fiber); 2773 } 2774 function enqueueConcurrentRenderForLane(fiber, lane) { 2775 enqueueUpdate$1(fiber, null, null, lane); 2776 return getRootForUpdatedFiber(fiber); 2777 } 2778 function markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) { 2779 sourceFiber.lanes |= lane; 2780 var alternate = sourceFiber.alternate; 2781 null !== alternate && (alternate.lanes |= lane); 2782 for (var isHidden = !1, parent = sourceFiber.return; null !== parent;) parent.childLanes |= lane, alternate = parent.alternate, null !== alternate && (alternate.childLanes |= lane), 22 === parent.tag && (sourceFiber = parent.stateNode, null === sourceFiber || sourceFiber._visibility & OffscreenVisible || (isHidden = !0)), sourceFiber = parent, parent = parent.return; 2783 return 3 === sourceFiber.tag ? (parent = sourceFiber.stateNode, isHidden && null !== update && (isHidden = 31 - clz32(lane), sourceFiber = parent.hiddenUpdates, alternate = sourceFiber[isHidden], null === alternate ? sourceFiber[isHidden] = [update] : alternate.push(update), update.lane = lane | 536870912), parent) : null; 2784 } 2785 function getRootForUpdatedFiber(sourceFiber) { 2786 if (nestedUpdateCount > NESTED_UPDATE_LIMIT) throw nestedPassiveUpdateCount = nestedUpdateCount = 0, rootWithPassiveNestedUpdates = rootWithNestedUpdates = null, Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.");
2787 nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT && (nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null, console.error("Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn't have a dependency array, or one of the dependencies changes on every render.")); 2788 null === sourceFiber.alternate && 0 !== (sourceFiber.flags & 4098) && warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); 2789 for (var node = sourceFiber, parent = node.return; null !== parent;) null === node.alternate && 0 !== (node.flags & 4098) && warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber), node = parent, parent = node.return; 2790 return 3 === node.tag ? node.stateNode : null; 2791 } 2792 function resolveTypeForHotReloading(type) { 2793 if (null === resolveFamily) return type; 2794 var family = resolveFamily(type); 2795 return void 0 === family ? type : family.current; 2796 } 2797 function isCompatibleFamilyForHotReloading(fiber, element) { 2798 if (null === resolveFamily) return !1; 2799 var resolve = resolveFamily, prevType = fiber.elementType; 2800 element = element.type; 2801 var needsCompareFamilies = !1, $$typeofNextType = "object" === typeof element && null !== element ? element.$$typeof : null; 2802 switch (fiber.tag) { 2803 case 1: 2804 "function" === typeof element && (needsCompareFamilies = !0); 2805 break; 2806 case 0: 2807 "function" === typeof element ? needsCompareFamilies = !0 : $$typeofNextType === REACT_LAZY_TYPE && (needsCompareFamilies = !0); 2808 break; 2809 case 11: 2810 $$typeofNextType === REACT_FORWARD_REF_TYPE ? needsCompareFamilies = !0 : $$typeofNextType === REACT_LAZY_TYPE && (needsCompareFamilies = !0); 2811 break; 2812 case 14: 2813 case 15: 2814 $$typeofNextType === REACT_MEMO_TYPE ? needsCompareFamilies = !0 : $$typeofNextType === REACT_LAZY_TYPE && (needsCompareFamilies = !0); 2815 break; 2816 default: return !1; 2817 } 2818 return needsCompareFamilies && (fiber = resolve(prevType), void 0 !== fiber && fiber === resolve(element)) ? !0 : !1; 2819 } 2820 function markFailedErrorBoundaryForHotReloading(fiber) { 2821 null !== resolveFamily && "function" === typeof WeakSet && (null === failedBoundaries && (failedBoundaries = /* @__PURE__ */ new WeakSet()), failedBoundaries.add(fiber)); 2822 } 2823 function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) { 2824 do { 2825 var _fiber = fiber, alternate = _fiber.alternate, child = _fiber.child, sibling = _fiber.sibling, tag = _fiber.tag, type = _fiber.type, elementType = _fiber.elementType, candidateType = null; 2826 _fiber = null; 2827 switch (tag) { 2828 case 0: 2829 case 1: 2830 candidateType = type; 2831 break; 2832 case 15: 2833 candidateType = type; 2834 _fiber = elementType; 2835 break; 2836 case 14: 2837 _fiber = elementType; 2838 break; 2839 case 11: candidateType = type.render, _fiber = elementType; 2840 } 2841 if (null === resolveFamily) throw Error("Expected resolveFamily to be set during hot reload."); 2842 var resolve = resolveFamily; 2843 type = elementType = !1; 2844 null !== candidateType && (candidateType = resolve(candidateType), void 0 !== candidateType && (staleFamilies.has(candidateType) ? type = !0 : updatedFamilies.has(candidateType) && (1 === tag ? type = !0 : elementType = !0))); 2845 type || null === _fiber || (tag = resolve(_fiber), void 0 !== tag && staleFamilies.has(tag) ? type = !0 : "object" === typeof _fiber && _fiber.$$typeof === REACT_LAZY_TYPE && (tag = _fiber._payload, 1 === tag._status && (tag = resolve(tag._result.default), void 0 !== tag && staleFamilies.has(tag) && (type = !0)))); 2846 null !== failedBoundaries && (failedBoundaries.has(fiber) || null !== alternate && failedBoundaries.has(alternate)) && (type = !0); 2847 type && (fiber._debugNeedsRemount = !0); 2848 if (type || elementType) alternate = enqueueConcurrentRenderForLane(fiber, 2), null !== alternate && scheduleUpdateOnFiber(alternate, fiber, 2); 2849 null === child || type || scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies); 2850 if (null === sibling) break; 2851 fiber = sibling; 2852 } while (1); 2853 } 2854 function FiberNode(tag, pendingProps, key, mode) { 2855 this.tag = tag; 2856 this.key = key; 2857 this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null; 2858 this.index = 0; 2859 this.refCleanup = this.ref = null; 2860 this.pendingProps = pendingProps; 2861 this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null; 2862 this.mode = mode; 2863 this.subtreeFlags = this.flags = 0; 2864 this.deletions = null; 2865 this.childLanes = this.lanes = 0; 2866 this.alternate = null; 2867 this.actualDuration = -0; 2868 this.actualStartTime = -1.1; 2869 this.treeBaseDuration = this.selfBaseDuration = -0; 2870 this._debugTask = this._debugStack = this._debugOwner = this._debugInfo = null; 2871 this._debugNeedsRemount = !1; 2872 this._debugHookTypes = null; 2873 hasBadMapPolyfill || "function" !== typeof Object.preventExtensions || Object.preventExtensions(this); 2874 } 2875 function shouldConstruct(Component) { 2876 Component = Component.prototype; 2877 return !(!Component || !Component.isReactComponent); 2878 } 2879 function createWorkInProgress(current, pendingProps) { 2880 var workInProgress = current.alternate; 2881 null === workInProgress ? (workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode), workInProgress.elementType = current.elementType, workInProgress.type = current.type, workInProgress.stateNode = current.stateNode, workInProgress._debugOwner = current._debugOwner, workInProgress._debugStack = current._debugStack, workInProgress._debugTask = current._debugTask, workInProgress._debugHookTypes = current._debugHookTypes, workInProgress.alternate = current, current.alternate = workInProgress) : (workInProgress.pendingProps = pendingProps, workInProgress.type = current.type, workInProgress.flags = 0, workInProgress.subtreeFlags = 0, workInProgress.deletions = null, workInProgress.actualDuration = -0, workInProgress.actualStartTime = -1.1); 2882 workInProgress.flags = current.flags & 1206910976; 2883 workInProgress.childLanes = current.childLanes; 2884 workInProgress.lanes = current.lanes; 2885 workInProgress.child = current.child; 2886 workInProgress.memoizedProps = current.memoizedProps; 2887 workInProgress.memoizedState = current.memoizedState; 2888 workInProgress.updateQueue = current.updateQueue; 2889 pendingProps = current.dependencies;
2890 workInProgress.dependencies = null === pendingProps ? null : { 2891 lanes: pendingProps.lanes, 2892 firstContext: pendingProps.firstContext, 2893 _debugThenableState: pendingProps._debugThenableState 2894 }; 2895 workInProgress.sibling = current.sibling; 2896 workInProgress.index = current.index; 2897 workInProgress.ref = current.ref; 2898 workInProgress.refCleanup = current.refCleanup; 2899 workInProgress.selfBaseDuration = current.selfBaseDuration; 2900 workInProgress.treeBaseDuration = current.treeBaseDuration; 2901 workInProgress._debugInfo = current._debugInfo; 2902 workInProgress._debugNeedsRemount = current._debugNeedsRemount; 2903 switch (workInProgress.tag) { 2904 case 0: 2905 case 15: 2906 case 14: 2907 case 1: 2908 case 11: workInProgress.type = resolveTypeForHotReloading(current.type); 2909 } 2910 return workInProgress; 2911 } 2912 function resetWorkInProgress(workInProgress, renderLanes) { 2913 workInProgress.flags &= 1206910978; 2914 var current = workInProgress.alternate; 2915 null === current ? (workInProgress.childLanes = 0, workInProgress.lanes = renderLanes, workInProgress.child = null, workInProgress.subtreeFlags = 0, workInProgress.memoizedProps = null, workInProgress.memoizedState = null, workInProgress.updateQueue = null, workInProgress.dependencies = null, workInProgress.stateNode = null, workInProgress.selfBaseDuration = 0, workInProgress.treeBaseDuration = 0) : (workInProgress.childLanes = current.childLanes, workInProgress.lanes = current.lanes, workInProgress.child = current.child, workInProgress.subtreeFlags = 0, workInProgress.deletions = null, workInProgress.memoizedProps = current.memoizedProps, workInProgress.memoizedState = current.memoizedState, workInProgress.updateQueue = current.updateQueue, workInProgress.type = current.type, renderLanes = current.dependencies, workInProgress.dependencies = null === renderLanes ? null : { 2916 lanes: renderLanes.lanes, 2917 firstContext: renderLanes.firstContext, 2918 _debugThenableState: renderLanes._debugThenableState 2919 }, workInProgress.selfBaseDuration = current.selfBaseDuration, workInProgress.treeBaseDuration = current.treeBaseDuration); 2920 return workInProgress; 2921 } 2922 function createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes) { 2923 var fiberTag = 0; 2924 var resolvedType = resolveTypeForHotReloading(type); 2925 if ("function" === typeof resolvedType) shouldConstruct(resolvedType) && (fiberTag = 1); 2926 else if ("string" === typeof resolvedType) fiberTag = getHostContext(), fiberTag = isHostHoistableType(type, pendingProps, fiberTag) ? 26 : "html" === type || "head" === type || "body" === type ? 27 : 5; 2927 else a: switch (resolvedType) { 2928 case REACT_ACTIVITY_TYPE: return key = createFiber(31, pendingProps, key, mode), key.elementType = REACT_ACTIVITY_TYPE, key.lanes = lanes, key; 2929 case REACT_FRAGMENT_TYPE: return createFiberFromFragment(pendingProps.children, mode, lanes, key); 2930 case REACT_STRICT_MODE_TYPE: 2931 fiberTag = 8; 2932 mode |= StrictLegacyMode; 2933 mode |= StrictEffectsMode; 2934 break; 2935 case REACT_PROFILER_TYPE: return type = pendingProps, owner = mode, "string" !== typeof type.id && console.error("Profiler must specify an \"id\" of type `string` as a prop. Received the type `%s` instead.", typeof type.id), key = createFiber(12, type, key, owner | ProfileMode), key.elementType = REACT_PROFILER_TYPE, key.lanes = lanes, key.stateNode = { 2936 effectDuration: 0, 2937 passiveEffectDuration: 0 2938 }, key; 2939 case REACT_SUSPENSE_TYPE: return key = createFiber(13, pendingProps, key, mode), key.elementType = REACT_SUSPENSE_TYPE, key.lanes = lanes, key; 2940 case REACT_SUSPENSE_LIST_TYPE: return key = createFiber(19, pendingProps, key, mode), key.elementType = REACT_SUSPENSE_LIST_TYPE, key.lanes = lanes, key; 2941 case REACT_LEGACY_HIDDEN_TYPE: 2942 case REACT_VIEW_TRANSITION_TYPE: return type = mode | SuspenseyImagesMode, key = createFiber(30, pendingProps, key, type), key.elementType = REACT_VIEW_TRANSITION_TYPE, key.lanes = lanes, key.stateNode = { 2943 autoName: null, 2944 paired: null, 2945 clones: null, 2946 ref: null 2947 }, key; 2948 default: 2949 if ("object" === typeof resolvedType && null !== resolvedType) switch (resolvedType.$$typeof) { 2950 case REACT_CONTEXT_TYPE: 2951 fiberTag = 10; 2952 break a; 2953 case REACT_CONSUMER_TYPE: 2954 fiberTag = 9; 2955 break a; 2956 case REACT_FORWARD_REF_TYPE: 2957 fiberTag = 11; 2958 break a; 2959 case REACT_MEMO_TYPE: 2960 fiberTag = 14; 2961 break a; 2962 case REACT_LAZY_TYPE: 2963 fiberTag = 16; 2964 resolvedType = null; 2965 break a; 2966 } 2967 pendingProps = ""; 2968 if (void 0 === type || "object" === typeof type && null !== type && 0 === Object.keys(type).length) pendingProps += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; 2969 null === type ? resolvedType = "null" : isArrayImpl(type) ? resolvedType = "array" : void 0 !== type && type.$$typeof === REACT_ELEMENT_TYPE ? (resolvedType = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />", pendingProps = " Did you accidentally export a JSX literal instead of a component?") : resolvedType = typeof type; 2970 (fiberTag = owner ? getComponentNameFromOwner(owner) : null) && (pendingProps += "\n\nCheck the render method of `" + fiberTag + "`."); 2971 fiberTag = 29;
vendor: 9,143 bytes, lines 2972-3172
2972 pendingProps = Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (resolvedType + "." + pendingProps)); 2973 resolvedType = null; 2974 } 2975 key = createFiber(fiberTag, pendingProps, key, mode); 2976 key.elementType = type; 2977 key.type = resolvedType; 2978 key.lanes = lanes; 2979 key._debugOwner = owner; 2980 return key; 2981 } 2982 function createFiberFromElement(element, mode, lanes) { 2983 mode = createFiberFromTypeAndProps(element.type, element.key, element.props, element._owner, mode, lanes); 2984 mode._debugOwner = element._owner; 2985 mode._debugStack = element._debugStack; 2986 mode._debugTask = element._debugTask; 2987 return mode; 2988 } 2989 function createFiberFromFragment(elements, mode, lanes, key) { 2990 elements = createFiber(7, elements, key, mode); 2991 elements.lanes = lanes; 2992 return elements; 2993 } 2994 function createFiberFromText(content, mode, lanes) { 2995 content = createFiber(6, content, null, mode); 2996 content.lanes = lanes; 2997 return content; 2998 } 2999 function createFiberFromDehydratedFragment(dehydratedNode) { 3000 var fiber = createFiber(18, null, null, NoMode); 3001 fiber.stateNode = dehydratedNode; 3002 return fiber; 3003 } 3004 function createFiberFromPortal(portal, mode, lanes) { 3005 mode = createFiber(4, null !== portal.children ? portal.children : [], portal.key, mode); 3006 mode.lanes = lanes; 3007 mode.stateNode = { 3008 containerInfo: portal.containerInfo, 3009 pendingChildren: null, 3010 implementation: portal.implementation 3011 }; 3012 return mode; 3013 } 3014 function createCapturedValueAtFiber(value, source) { 3015 if ("object" === typeof value && null !== value) { 3016 var existing = CapturedStacks.get(value); 3017 if (void 0 !== existing) return existing; 3018 source = { 3019 value, 3020 source, 3021 stack: getStackByFiberInDevAndProd(source) 3022 }; 3023 CapturedStacks.set(value, source); 3024 return source; 3025 } 3026 return { 3027 value, 3028 source, 3029 stack: getStackByFiberInDevAndProd(source) 3030 }; 3031 } 3032 function pushTreeFork(workInProgress, totalChildren) { 3033 warnIfNotHydrating(); 3034 forkStack[forkStackIndex++] = treeForkCount; 3035 forkStack[forkStackIndex++] = treeForkProvider; 3036 treeForkProvider = workInProgress; 3037 treeForkCount = totalChildren; 3038 } 3039 function pushTreeId(workInProgress, totalChildren, index) { 3040 warnIfNotHydrating(); 3041 idStack[idStackIndex++] = treeContextId; 3042 idStack[idStackIndex++] = treeContextOverflow; 3043 idStack[idStackIndex++] = treeContextProvider; 3044 treeContextProvider = workInProgress; 3045 var baseIdWithLeadingBit = treeContextId; 3046 workInProgress = treeContextOverflow; 3047 var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1; 3048 baseIdWithLeadingBit &= ~(1 << baseLength); 3049 index += 1; 3050 var length = 32 - clz32(totalChildren) + baseLength; 3051 if (30 < length) { 3052 var numberOfOverflowBits = baseLength - baseLength % 5; 3053 length = (baseIdWithLeadingBit & (1 << numberOfOverflowBits) - 1).toString(32); 3054 baseIdWithLeadingBit >>= numberOfOverflowBits; 3055 baseLength -= numberOfOverflowBits; 3056 treeContextId = 1 << 32 - clz32(totalChildren) + baseLength | index << baseLength | baseIdWithLeadingBit; 3057 treeContextOverflow = length + workInProgress; 3058 } else treeContextId = 1 << length | index << baseLength | baseIdWithLeadingBit, treeContextOverflow = workInProgress; 3059 } 3060 function pushMaterializedTreeId(workInProgress) { 3061 warnIfNotHydrating(); 3062 null !== workInProgress.return && (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0)); 3063 } 3064 function popTreeContext(workInProgress) { 3065 for (; workInProgress === treeForkProvider;) treeForkProvider = forkStack[--forkStackIndex], forkStack[forkStackIndex] = null, treeForkCount = forkStack[--forkStackIndex], forkStack[forkStackIndex] = null; 3066 for (; workInProgress === treeContextProvider;) treeContextProvider = idStack[--idStackIndex], idStack[idStackIndex] = null, treeContextOverflow = idStack[--idStackIndex], idStack[idStackIndex] = null, treeContextId = idStack[--idStackIndex], idStack[idStackIndex] = null; 3067 } 3068 function getSuspendedTreeContext() { 3069 warnIfNotHydrating(); 3070 return null !== treeContextProvider ? { 3071 id: treeContextId, 3072 overflow: treeContextOverflow 3073 } : null; 3074 } 3075 function restoreSuspendedTreeContext(workInProgress, suspendedContext) { 3076 warnIfNotHydrating(); 3077 idStack[idStackIndex++] = treeContextId; 3078 idStack[idStackIndex++] = treeContextOverflow; 3079 idStack[idStackIndex++] = treeContextProvider; 3080 treeContextId = suspendedContext.id; 3081 treeContextOverflow = suspendedContext.overflow; 3082 treeContextProvider = workInProgress; 3083 } 3084 function warnIfNotHydrating() { 3085 isHydrating || console.error("Expected to be hydrating. This is a bug in React. Please file an issue."); 3086 } 3087 function buildHydrationDiffNode(fiber, distanceFromLeaf) { 3088 if (null === fiber.return) { 3089 if (null === hydrationDiffRootDEV) hydrationDiffRootDEV = { 3090 fiber, 3091 children: [], 3092 serverProps: void 0, 3093 serverTail: [], 3094 distanceFromLeaf 3095 }; 3096 else { 3097 if (hydrationDiffRootDEV.fiber !== fiber) throw Error("Saw multiple hydration diff roots in a pass. This is a bug in React."); 3098 hydrationDiffRootDEV.distanceFromLeaf > distanceFromLeaf && (hydrationDiffRootDEV.distanceFromLeaf = distanceFromLeaf); 3099 } 3100 return hydrationDiffRootDEV; 3101 } 3102 var siblings = buildHydrationDiffNode(fiber.return, distanceFromLeaf + 1).children; 3103 if (0 < siblings.length && siblings[siblings.length - 1].fiber === fiber) return siblings = siblings[siblings.length - 1], siblings.distanceFromLeaf > distanceFromLeaf && (siblings.distanceFromLeaf = distanceFromLeaf), siblings; 3104 distanceFromLeaf = { 3105 fiber, 3106 children: [], 3107 serverProps: void 0, 3108 serverTail: [], 3109 distanceFromLeaf 3110 }; 3111 siblings.push(distanceFromLeaf); 3112 return distanceFromLeaf; 3113 } 3114 function warnIfHydrating() { 3115 isHydrating && console.error("We should not be hydrating here. This is a bug in React. Please file a bug."); 3116 } 3117 function warnNonHydratedInstance(fiber, rejectedCandidate) { 3118 didSuspendOrErrorDEV || (fiber = buildHydrationDiffNode(fiber, 0), fiber.serverProps = null, null !== rejectedCandidate && (rejectedCandidate = describeHydratableInstanceForDevWarnings(rejectedCandidate), fiber.serverTail.push(rejectedCandidate))); 3119 } 3120 function throwOnHydrationMismatch(fiber) { 3121 var fromText = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : !1, diff = "", diffRoot = hydrationDiffRootDEV; 3122 null !== diffRoot && (hydrationDiffRootDEV = null, diff = describeDiff(diffRoot)); 3123 queueHydrationError(createCapturedValueAtFiber(Error("Hydration failed because the server rendered " + (fromText ? "text" : "HTML") + " didn't match the client. As a result this tree will be regenerated on the client. This can happen if a SSR-ed Client Component used:\n\n- A server/client branch `if (typeof window !== 'undefined')`.\n- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.\n- Date formatting in a user's locale which doesn't match the server.\n- External changing data without sending a snapshot of it along with the HTML.\n- Invalid HTML tag nesting.\n\nIt can also happen if the client has a browser extension installed which messes with the HTML before React loaded.\n\nhttps://react.dev/link/hydration-mismatch" + diff), fiber)); 3124 throw HydrationMismatchException; 3125 } 3126 function prepareToHydrateHostInstance(fiber) { 3127 var didHydrate = fiber.stateNode; 3128 var type = fiber.type, props = fiber.memoizedProps; 3129 didHydrate[internalInstanceKey] = fiber; 3130 didHydrate[internalPropsKey] = props; 3131 validatePropertiesInDevelopment(type, props); 3132 switch (type) { 3133 case "dialog": 3134 listenToNonDelegatedEvent("cancel", didHydrate); 3135 listenToNonDelegatedEvent("close", didHydrate); 3136 break; 3137 case "iframe": 3138 case "object": 3139 case "embed": 3140 listenToNonDelegatedEvent("load", didHydrate); 3141 break; 3142 case "video": 3143 case "audio": 3144 for (type = 0; type < mediaEventTypes.length; type++) listenToNonDelegatedEvent(mediaEventTypes[type], didHydrate); 3145 break; 3146 case "source": 3147 listenToNonDelegatedEvent("error", didHydrate); 3148 break; 3149 case "img": 3150 case "image": 3151 case "link": 3152 listenToNonDelegatedEvent("error", didHydrate); 3153 listenToNonDelegatedEvent("load", didHydrate); 3154 break; 3155 case "details": 3156 listenToNonDelegatedEvent("toggle", didHydrate); 3157 break; 3158 case "input": 3159 checkControlledValueProps("input", props); 3160 listenToNonDelegatedEvent("invalid", didHydrate); 3161 validateInputProps(didHydrate, props); 3162 initInput(didHydrate, props.value, props.defaultValue, props.checked, props.defaultChecked, props.type, props.name, !0); 3163 break; 3164 case "option": 3165 validateOptionProps(didHydrate, props); 3166 break; 3167 case "select": 3168 checkControlledValueProps("select", props); 3169 listenToNonDelegatedEvent("invalid", didHydrate); 3170 validateSelectProps(didHydrate, props); 3171 break; 3172 case "textarea": checkControlledValueProps("textarea", props), listenToNonDelegatedEvent("invalid", didHydrate), val
vendor: 5,283 bytes, lines 3172-3250
3172idateTextareaProps(didHydrate, props), initTextarea(didHydrate, props.value, props.defaultValue, props.children); 3173 } 3174 type = props.children; 3175 "string" !== typeof type && "number" !== typeof type && "bigint" !== typeof type || didHydrate.textContent === "" + type || !0 === props.suppressHydrationWarning || checkForUnmatchedText(didHydrate.textContent, type) ? (null != props.popover && (listenToNonDelegatedEvent("beforetoggle", didHydrate), listenToNonDelegatedEvent("toggle", didHydrate)), null != props.onScroll && listenToNonDelegatedEvent("scroll", didHydrate), null != props.onScrollEnd && listenToNonDelegatedEvent("scrollend", didHydrate), null != props.onClick && (didHydrate.onclick = noop$1), didHydrate = !0) : didHydrate = !1; 3176 didHydrate || throwOnHydrationMismatch(fiber, !0); 3177 } 3178 function popToNextHostParent(fiber) { 3179 for (hydrationParentFiber = fiber.return; hydrationParentFiber;) switch (hydrationParentFiber.tag) { 3180 case 5: 3181 case 31: 3182 case 13: 3183 rootOrSingletonContext = !1; 3184 return; 3185 case 27: 3186 case 3: 3187 rootOrSingletonContext = !0; 3188 return; 3189 default: hydrationParentFiber = hydrationParentFiber.return; 3190 } 3191 } 3192 function popHydrationState(fiber) { 3193 if (fiber !== hydrationParentFiber) return !1; 3194 if (!isHydrating) return popToNextHostParent(fiber), isHydrating = !0, !1; 3195 var tag = fiber.tag, JSCompiler_temp; 3196 if (JSCompiler_temp = 3 !== tag && 27 !== tag) { 3197 if (JSCompiler_temp = 5 === tag) JSCompiler_temp = fiber.type, JSCompiler_temp = !("form" !== JSCompiler_temp && "button" !== JSCompiler_temp) || shouldSetTextContent(fiber.type, fiber.memoizedProps); 3198 JSCompiler_temp = !JSCompiler_temp; 3199 } 3200 if (JSCompiler_temp && nextHydratableInstance) { 3201 for (JSCompiler_temp = nextHydratableInstance; JSCompiler_temp;) { 3202 var diffNode = buildHydrationDiffNode(fiber, 0), description = describeHydratableInstanceForDevWarnings(JSCompiler_temp); 3203 diffNode.serverTail.push(description); 3204 JSCompiler_temp = "Suspense" === description.type ? getNextHydratableInstanceAfterHydrationBoundary(JSCompiler_temp) : getNextHydratable(JSCompiler_temp.nextSibling); 3205 } 3206 throwOnHydrationMismatch(fiber); 3207 } 3208 popToNextHostParent(fiber); 3209 if (13 === tag) { 3210 fiber = fiber.memoizedState; 3211 fiber = null !== fiber ? fiber.dehydrated : null; 3212 if (!fiber) throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); 3213 nextHydratableInstance = getNextHydratableInstanceAfterHydrationBoundary(fiber); 3214 } else if (31 === tag) { 3215 fiber = fiber.memoizedState; 3216 fiber = null !== fiber ? fiber.dehydrated : null; 3217 if (!fiber) throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); 3218 nextHydratableInstance = getNextHydratableInstanceAfterHydrationBoundary(fiber); 3219 } else 27 === tag ? (tag = nextHydratableInstance, isSingletonScope(fiber.type) ? (fiber = previousHydratableOnEnteringScopedSingleton, previousHydratableOnEnteringScopedSingleton = null, nextHydratableInstance = fiber) : nextHydratableInstance = tag) : nextHydratableInstance = hydrationParentFiber ? getNextHydratable(fiber.stateNode.nextSibling) : null; 3220 return !0; 3221 } 3222 function resetHydrationState() { 3223 nextHydratableInstance = hydrationParentFiber = null; 3224 didSuspendOrErrorDEV = isHydrating = !1; 3225 } 3226 function upgradeHydrationErrorsToRecoverable() { 3227 var queuedErrors = hydrationErrors; 3228 null !== queuedErrors && (null === workInProgressRootRecoverableErrors ? workInProgressRootRecoverableErrors = queuedErrors : workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, queuedErrors), hydrationErrors = null); 3229 return queuedErrors; 3230 } 3231 function queueHydrationError(error) { 3232 null === hydrationErrors ? hydrationErrors = [error] : hydrationErrors.push(error); 3233 } 3234 function emitPendingHydrationWarnings() { 3235 var diffRoot = hydrationDiffRootDEV; 3236 if (null !== diffRoot) { 3237 hydrationDiffRootDEV = null; 3238 for (var diff = describeDiff(diffRoot); 0 < diffRoot.children.length;) diffRoot = diffRoot.children[0]; 3239 runWithFiberInDEV(diffRoot.fiber, function() { 3240 console.error("A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used:\n\n- A server/client branch `if (typeof window !== 'undefined')`.\n- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.\n- Date formatting in a user's locale which doesn't match the server.\n- External changing data without sending a snapshot of it along with the HTML.\n- Invalid HTML tag nesting.\n\nIt can also happen if the client has a browser extension installed which messes with the HTML before React loaded.\n\n%s%s", "https://react.dev/link/hydration-mismatch", diff); 3241 }); 3242 } 3243 } 3244 function resetContextDependencies() { 3245 lastContextDependency = currentlyRenderingFiber$1 = null; 3246 isDisallowedContextReadInDEV = !1; 3247 } 3248 function pushProvider(providerFiber, context, nextValue) { 3249 push(valueCursor, context._currentValue, providerFiber); 3250 context._currentValue = nextValue;
vendor: 1,338 bytes, lines 3251-3270
3251 push(rendererCursorDEV, context._currentRenderer, providerFiber); 3252 void 0 !== context._currentRenderer && null !== context._currentRenderer && context._currentRenderer !== rendererSigil && console.error("Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported."); 3253 context._currentRenderer = rendererSigil; 3254 } 3255 function popProvider(context, providerFiber) { 3256 context._currentValue = valueCursor.current; 3257 var currentRenderer = rendererCursorDEV.current; 3258 pop(rendererCursorDEV, providerFiber); 3259 context._currentRenderer = currentRenderer; 3260 pop(valueCursor, providerFiber); 3261 } 3262 function scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) { 3263 for (; null !== parent;) { 3264 var alternate = parent.alternate; 3265 (parent.childLanes & renderLanes) !== renderLanes ? (parent.childLanes |= renderLanes, null !== alternate && (alternate.childLanes |= renderLanes)) : null !== alternate && (alternate.childLanes & renderLanes) !== renderLanes && (alternate.childLanes |= renderLanes); 3266 if (parent === propagationRoot) break; 3267 parent = parent.return; 3268 } 3269 parent !== propagationRoot && console.error("Expected to find the propagation root when scheduling context work. This error is likely caused by a bug in React. Please file an issue."); 3270 }
vendor: 3,329 bytes, lines 3271-3339
3271 function propagateContextChanges(workInProgress, contexts, renderLanes, forcePropagateEntireTree) { 3272 var fiber = workInProgress.child; 3273 null !== fiber && (fiber.return = workInProgress); 3274 for (; null !== fiber;) { 3275 var list = fiber.dependencies; 3276 if (null !== list) { 3277 var nextFiber = fiber.child; 3278 list = list.firstContext; 3279 a: for (; null !== list;) { 3280 var dependency = list; 3281 list = fiber; 3282 for (var i = 0; i < contexts.length; i++) if (dependency.context === contexts[i]) { 3283 list.lanes |= renderLanes; 3284 dependency = list.alternate; 3285 null !== dependency && (dependency.lanes |= renderLanes); 3286 scheduleContextWorkOnParentPath(list.return, renderLanes, workInProgress); 3287 forcePropagateEntireTree || (nextFiber = null); 3288 break a; 3289 } 3290 list = dependency.next; 3291 } 3292 } else if (18 === fiber.tag) { 3293 nextFiber = fiber.return; 3294 if (null === nextFiber) throw Error("We just came from a parent so we must have had a parent. This is a bug in React."); 3295 nextFiber.lanes |= renderLanes; 3296 list = nextFiber.alternate; 3297 null !== list && (list.lanes |= renderLanes); 3298 scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress); 3299 nextFiber = null; 3300 } else 13 === fiber.tag && null !== fiber.memoizedState && null === fiber.memoizedState.dehydrated ? (fiber.lanes |= renderLanes, nextFiber = fiber.alternate, null !== nextFiber && (nextFiber.lanes |= renderLanes), scheduleContextWorkOnParentPath(fiber.return, renderLanes, workInProgress), nextFiber = fiber.child, nextFiber = null !== nextFiber ? nextFiber.sibling : null) : nextFiber = fiber.child; 3301 if (null !== nextFiber) nextFiber.return = fiber; 3302 else for (nextFiber = fiber; null !== nextFiber;) { 3303 if (nextFiber === workInProgress) { 3304 nextFiber = null; 3305 break; 3306 } 3307 fiber = nextFiber.sibling; 3308 if (null !== fiber) { 3309 fiber.return = nextFiber.return; 3310 nextFiber = fiber; 3311 break; 3312 } 3313 nextFiber = nextFiber.return; 3314 } 3315 fiber = nextFiber; 3316 } 3317 } 3318 function propagateParentContextChanges(current, workInProgress, renderLanes, forcePropagateEntireTree) { 3319 current = null; 3320 for (var parent = workInProgress, isInsidePropagationBailout = !1; null !== parent;) { 3321 if (!isInsidePropagationBailout) { 3322 if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0; 3323 else if (0 !== (parent.flags & 262144)) break; 3324 } 3325 if (10 === parent.tag) { 3326 var currentParent = parent.alternate; 3327 if (null === currentParent) throw Error("Should have a current fiber. This is a bug in React."); 3328 currentParent = currentParent.memoizedProps; 3329 if (null !== currentParent) { 3330 var context = parent.type; 3331 objectIs(parent.pendingProps.value, currentParent.value) || (null !== current ? current.push(context) : current = [context]); 3332 } 3333 } else if (parent === hostTransitionProviderCursor.current) { 3334 currentParent = parent.alternate; 3335 if (null === currentParent) throw Error("Should have a current fiber. This is a bug in React."); 3336 currentParent.memoizedState.memoizedState !== parent.memoizedState.memoizedState && (null !== current ? current.push(HostTransitionContext) : current = [HostTransitionContext]); 3337 } 3338 parent = parent.return; 3339 }
3340 null !== current && propagateContextChanges(workInProgress, current, renderLanes, forcePropagateEntireTree); 3341 workInProgress.flags |= 262144; 3342 return null !== current; 3343 } 3344 function checkIfContextChanged(currentDependencies) { 3345 for (currentDependencies = currentDependencies.firstContext; null !== currentDependencies;) { 3346 if (!objectIs(currentDependencies.context._currentValue, currentDependencies.memoizedValue)) return !0; 3347 currentDependencies = currentDependencies.next; 3348 } 3349 return !1; 3350 } 3351 function prepareToReadContext(workInProgress) { 3352 currentlyRenderingFiber$1 = workInProgress; 3353 lastContextDependency = null; 3354 workInProgress = workInProgress.dependencies; 3355 null !== workInProgress && (workInProgress.firstContext = null); 3356 } 3357 function readContext(context) { 3358 isDisallowedContextReadInDEV && console.error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); 3359 return readContextForConsumer(currentlyRenderingFiber$1, context); 3360 } 3361 function readContextDuringReconciliation(consumer, context) { 3362 null === currentlyRenderingFiber$1 && prepareToReadContext(consumer); 3363 return readContextForConsumer(consumer, context); 3364 } 3365 function readContextForConsumer(consumer, context) { 3366 var value = context._currentValue; 3367 context = { 3368 context, 3369 memoizedValue: value, 3370 next: null 3371 }; 3372 if (null === lastContextDependency) { 3373 if (null === consumer) throw Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."); 3374 lastContextDependency = context; 3375 consumer.dependencies = { 3376 lanes: 0, 3377 firstContext: context, 3378 _debugThenableState: null 3379 }; 3380 consumer.flags |= 524288; 3381 } else lastContextDependency = lastContextDependency.next = context; 3382 return value; 3383 } 3384 function createCache() { 3385 return { 3386 controller: new AbortControllerLocal(), 3387 data: /* @__PURE__ */ new Map(), 3388 refCount: 0 3389 }; 3390 } 3391 function retainCache(cache) { 3392 cache.controller.signal.aborted && console.warn("A cache instance was retained after it was already freed. This likely indicates a bug in React."); 3393 cache.refCount++; 3394 } 3395 function releaseCache(cache) { 3396 cache.refCount--; 3397 0 > cache.refCount && console.warn("A cache instance was released after it was already freed. This likely indicates a bug in React."); 3398 0 === cache.refCount && scheduleCallback$2(NormalPriority, function() { 3399 cache.controller.abort(); 3400 }); 3401 } 3402 function queueTransitionTypes(root, transitionTypes) { 3403 if (0 !== (root.pendingLanes & 4194048)) { 3404 var queued = root.transitionTypes; 3405 null === queued && (queued = root.transitionTypes = []); 3406 for (root = 0; root < transitionTypes.length; root++) { 3407 var transitionType = transitionTypes[root]; 3408 -1 === queued.indexOf(transitionType) && queued.push(transitionType); 3409 } 3410 } 3411 } 3412 function claimQueuedTransitionTypes(root) { 3413 var claimed = root.transitionTypes; 3414 root.transitionTypes = null; 3415 return claimed; 3416 } 3417 function startUpdateTimerByLane(lane, method, fiber) { 3418 if (0 !== (lane & 127)) 0 > blockingUpdateTime && (blockingUpdateTime = now(), blockingUpdateTask = createTask(method), blockingUpdateMethodName = method, null != fiber && (blockingUpdateComponentName = getComponentNameFromFiber(fiber)), (executionContext & (RenderContext | CommitContext)) !== NoContext && (componentEffectSpawnedUpdate = !0, blockingUpdateType = SPAWNED_UPDATE), lane = resolveEventTimeStamp(), method = resolveEventType(), lane !== blockingEventRepeatTime || method !== blockingEventType ? blockingEventRepeatTime = -1.1 : null !== method && (blockingUpdateType = SPAWNED_UPDATE), blockingEventTime = lane, blockingEventType = method); 3419 else if (0 !== (lane & 4194048) && 0 >
vendor: 11,710 bytes, lines 3419-3677
3419 transitionUpdateTime && (transitionUpdateTime = now(), transitionUpdateTask = createTask(method), transitionUpdateMethodName = method, null != fiber && (transitionUpdateComponentName = getComponentNameFromFiber(fiber)), 0 > transitionStartTime)) { 3420 lane = resolveEventTimeStamp(); 3421 method = resolveEventType(); 3422 if (lane !== transitionEventRepeatTime || method !== transitionEventType) transitionEventRepeatTime = -1.1; 3423 transitionEventTime = lane; 3424 transitionEventType = method; 3425 } 3426 } 3427 function startHostActionTimer(fiber) { 3428 if (0 > blockingUpdateTime) { 3429 blockingUpdateTime = now(); 3430 blockingUpdateTask = null != fiber._debugTask ? fiber._debugTask : null; 3431 (executionContext & (RenderContext | CommitContext)) !== NoContext && (blockingUpdateType = SPAWNED_UPDATE); 3432 var newEventTime = resolveEventTimeStamp(), newEventType = resolveEventType(); 3433 newEventTime !== blockingEventRepeatTime || newEventType !== blockingEventType ? blockingEventRepeatTime = -1.1 : null !== newEventType && (blockingUpdateType = SPAWNED_UPDATE); 3434 blockingEventTime = newEventTime; 3435 blockingEventType = newEventType; 3436 } 3437 if (0 > transitionUpdateTime && (transitionUpdateTime = now(), transitionUpdateTask = null != fiber._debugTask ? fiber._debugTask : null, 0 > transitionStartTime)) { 3438 fiber = resolveEventTimeStamp(); 3439 newEventTime = resolveEventType(); 3440 if (fiber !== transitionEventRepeatTime || newEventTime !== transitionEventType) transitionEventRepeatTime = -1.1; 3441 transitionEventTime = fiber; 3442 transitionEventType = newEventTime; 3443 } 3444 } 3445 function pushNestedEffectDurations() { 3446 var prevEffectDuration = profilerEffectDuration; 3447 profilerEffectDuration = 0; 3448 return prevEffectDuration; 3449 } 3450 function popNestedEffectDurations(prevEffectDuration) { 3451 var elapsedTime = profilerEffectDuration; 3452 profilerEffectDuration = prevEffectDuration; 3453 return elapsedTime; 3454 } 3455 function bubbleNestedEffectDurations(prevEffectDuration) { 3456 var elapsedTime = profilerEffectDuration; 3457 profilerEffectDuration += prevEffectDuration; 3458 return elapsedTime; 3459 } 3460 function resetComponentEffectTimers() { 3461 componentEffectEndTime = componentEffectStartTime = -1.1; 3462 } 3463 function pushComponentEffectStart() { 3464 var prevEffectStart = componentEffectStartTime; 3465 componentEffectStartTime = -1.1; 3466 return prevEffectStart; 3467 } 3468 function popComponentEffectStart(prevEffectStart) { 3469 0 <= prevEffectStart && (componentEffectStartTime = prevEffectStart); 3470 } 3471 function pushComponentEffectDuration() { 3472 var prevEffectDuration = componentEffectDuration; 3473 componentEffectDuration = -0; 3474 return prevEffectDuration; 3475 } 3476 function popComponentEffectDuration(prevEffectDuration) { 3477 0 <= prevEffectDuration && (componentEffectDuration = prevEffectDuration); 3478 } 3479 function pushComponentEffectErrors() { 3480 var prevErrors = componentEffectErrors; 3481 componentEffectErrors = null; 3482 return prevErrors; 3483 } 3484 function pushComponentEffectDidSpawnUpdate() { 3485 var prev = componentEffectSpawnedUpdate; 3486 componentEffectSpawnedUpdate = !1; 3487 return prev; 3488 } 3489 function startProfilerTimer(fiber) { 3490 profilerStartTime = now(); 3491 0 > fiber.actualStartTime && (fiber.actualStartTime = profilerStartTime); 3492 } 3493 function stopProfilerTimerIfRunningAndRecordDuration(fiber) { 3494 if (0 <= profilerStartTime) { 3495 var elapsedTime = now() - profilerStartTime; 3496 fiber.actualDuration += elapsedTime; 3497 fiber.selfBaseDuration = elapsedTime; 3498 profilerStartTime = -1; 3499 } 3500 } 3501 function stopProfilerTimerIfRunningAndRecordIncompleteDuration(fiber) { 3502 if (0 <= profilerStartTime) { 3503 var elapsedTime = now() - profilerStartTime; 3504 fiber.actualDuration += elapsedTime; 3505 profilerStartTime = -1; 3506 } 3507 } 3508 function recordEffectDuration() { 3509 if (0 <= profilerStartTime) { 3510 var endTime = now(), elapsedTime = endTime - profilerStartTime; 3511 profilerStartTime = -1; 3512 profilerEffectDuration += elapsedTime; 3513 componentEffectDuration += elapsedTime; 3514 componentEffectEndTime = endTime; 3515 } 3516 } 3517 function recordEffectError(errorInfo) { 3518 null === componentEffectErrors && (componentEffectErrors = []); 3519 componentEffectErrors.push(errorInfo); 3520 null === commitErrors && (commitErrors = []); 3521 commitErrors.push(errorInfo); 3522 } 3523 function startEffectTimer() { 3524 profilerStartTime = now(); 3525 0 > componentEffectStartTime && (componentEffectStartTime = profilerStartTime); 3526 } 3527 function transferActualDuration(fiber) { 3528 for (var child = fiber.child; child;) fiber.actualDuration += child.actualDuration, child = child.sibling; 3529 } 3530 function entangleAsyncAction(transition, thenable) { 3531 if (null === currentEntangledListeners) { 3532 var entangledListeners = currentEntangledListeners = []; 3533 currentEntangledPendingCount = 0; 3534 currentEntangledLane = requestTransitionLane(); 3535 currentEntangledActionThenable = { 3536 status: "pending", 3537 value: void 0, 3538 then: function(resolve) { 3539 entangledListeners.push(resolve); 3540 } 3541 }; 3542 } 3543 currentEntangledPendingCount++; 3544 thenable.then(pingEngtangledActionScope, pingEngtangledActionScope); 3545 return thenable; 3546 } 3547 function pingEngtangledActionScope() { 3548 if (0 === --currentEntangledPendingCount && (-1 < transitionUpdateTime || (transitionStartTime = -1.1), entangledTransitionTypes = null, null !== currentEntangledListeners)) { 3549 null !== currentEntangledActionThenable && (currentEntangledActionThenable.status = "fulfilled"); 3550 var listeners = currentEntangledListeners; 3551 currentEntangledListeners = null; 3552 currentEntangledLane = 0; 3553 currentEntangledActionThenable = null; 3554 for (var i = 0; i < listeners.length; i++) (0, listeners[i])(); 3555 } 3556 } 3557 function chainThenableValue(thenable, result) { 3558 var listeners = [], thenableWithOverride = { 3559 status: "pending", 3560 value: null, 3561 reason: null, 3562 then: function(resolve) { 3563 listeners.push(resolve); 3564 } 3565 }; 3566 thenable.then(function() { 3567 thenableWithOverride.status = "fulfilled"; 3568 thenableWithOverride.value = result; 3569 for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result); 3570 }, function(error) { 3571 thenableWithOverride.status = "rejected"; 3572 thenableWithOverride.reason = error; 3573 for (error = 0; error < listeners.length; error++) (0, listeners[error])(void 0); 3574 }); 3575 return thenableWithOverride; 3576 } 3577 function peekCacheFromPool() { 3578 var cacheResumedFromPreviousRender = resumedCache.current; 3579 return null !== cacheResumedFromPreviousRender ? cacheResumedFromPreviousRender : workInProgressRoot.pooledCache; 3580 } 3581 function pushTransition(offscreenWorkInProgress, prevCachePool) { 3582 null === prevCachePool ? push(resumedCache, resumedCache.current, offscreenWorkInProgress) : push(resumedCache, prevCachePool.pool, offscreenWorkInProgress); 3583 } 3584 function getSuspendedCache() { 3585 var cacheFromPool = peekCacheFromPool(); 3586 return null === cacheFromPool ? null : { 3587 parent: CacheContext._currentValue, 3588 pool: cacheFromPool 3589 }; 3590 } 3591 function createThenableState() { 3592 return { 3593 didWarnAboutUncachedPromise: !1, 3594 thenables: [] 3595 }; 3596 } 3597 function isThenableResolved(thenable) { 3598 thenable = thenable.status; 3599 return "fulfilled" === thenable || "rejected" === thenable; 3600 } 3601 function trackUsedThenable(thenableState, thenable, index, fiber) { 3602 null !== ReactSharedInternals.actQueue && (ReactSharedInternals.didUsePromise = !0); 3603 var trackedThenables = thenableState.thenables; 3604 index = trackedThenables[index]; 3605 void 0 === index ? trackedThenables.push(thenable) : index !== thenable && (thenableState.didWarnAboutUncachedPromise || (thenableState.didWarnAboutUncachedPromise = !0, console.error("A component was suspended by an uncached promise. Creating promises inside a Client Component or hook is not yet supported, except via a Suspense-compatible library or framework.")), thenable.then(noop$1, noop$1), thenable = index); 3606 if (void 0 === thenable._debugInfo) { 3607 thenableState = performance.now(); 3608 trackedThenables = thenable.displayName; 3609 var ioInfo = { 3610 name: "string" === typeof trackedThenables ? trackedThenables : "Promise", 3611 start: thenableState, 3612 end: thenableState, 3613 value: thenable 3614 }; 3615 thenable._debugInfo = [{ awaited: ioInfo }]; 3616 "fulfilled" !== thenable.status && "rejected" !== thenable.status && (thenableState = function() { 3617 ioInfo.end = performance.now(); 3618 }, thenable.then(thenableState, thenableState)); 3619 } 3620 switch (thenable.status) { 3621 case "fulfilled": return thenable.value; 3622 case "rejected": 3623 fiber = thenable.reason; 3624 checkIfUseWrappedInAsyncCatch(fiber); 3625 if (void 0 === fiber && !("reason" in thenable)) throw Error("A rejected Promise was passed to React without a `reason` property. React threw a generic error from where the Promise was used to assist in identifying the problematic Promise. Make sure that instrumented Promises correctly set the `reason` property when setting `status` to `'rejected'`."); 3626 throw fiber; 3627 default: 3628 if ("string" === typeof thenable.status) thenable.then(noop$1, noop$1); 3629 else { 3630 thenableState = workInProgressRoot; 3631 if (null !== thenableState && 100 < thenableState.shellSuspendCounter) throw Error("An unknown Component is an async Client Component. Only Server Components can be async at the moment. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server."); 3632 thenableState = thenable; 3633 thenableState.status = "pending"; 3634 thenableState.then(function(fulfilledValue) { 3635 if ("pending" === thenable.status) { 3636 var fulfilledThenable = thenable; 3637 fulfilledThenable.status = "fulfilled"; 3638 fulfilledThenable.value = fulfilledValue; 3639 } 3640 }, function(error) { 3641 if ("pending" === thenable.status) { 3642 var rejectedThenable = thenable; 3643 rejectedThenable.status = "rejected"; 3644 rejectedThenable.reason = error; 3645 } 3646 }); 3647 } 3648 switch (thenable.status) { 3649 case "fulfilled": return thenable.value; 3650 case "rejected": throw fiber = thenable.reason, checkIfUseWrappedInAsyncCatch(fiber), fiber; 3651 } 3652 suspendedThenable = thenable; 3653 needsToResetSuspendedThenableDEV = !0; 3654 didIssueUseWarning || null === fiber || null !== fiber.alternate || (lastSuspendedFiber = fiber, lastSuspendedStack = Error("This library called use() to suspend in a previous render but did not call use() when it finished. This indicates an incorrect use of use(). Learn more: https://react.dev/warnings/conditional-use-of-use")); 3655 throw SuspenseException; 3656 } 3657 } 3658 function resolveLazy(lazyType) { 3659 try { 3660 return callLazyInitInDEV(lazyType); 3661 } catch (x) { 3662 if (null !== x && "object" === typeof x && "function" === typeof x.then) throw suspendedThenable = x, needsToResetSuspendedThenableDEV = !0, SuspenseException; 3663 throw x; 3664 } 3665 } 3666 function getSuspendedThenable() { 3667 if (null === suspendedThenable) throw Error("Expected a suspended thenable. This is a bug in React. Please file an issue."); 3668 var thenable = suspendedThenable; 3669 suspendedThenable = null; 3670 needsToResetSuspendedThenableDEV = !1; 3671 return thenable; 3672 } 3673 function checkIfUseWrappedInAsyncCatch(rejectedReason) { 3674 if (rejectedReason === SuspenseException || rejectedReason === SuspenseActionException) throw Error("Hooks are not supported inside an async component. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server."); 3675 } 3676 function areSameKeyPath(a, b) { 3677 return a === b ? !0 : a.tag !== b.tag || a.type !== b.type || a.key !== b.ke
3677y || a.index !== b.index || 3 === a.tag && a.stateNode !== b.stateNode || null === a.return || null === b.return ? !1 : areSameKeyPath(a.return, b.return); 3678 } 3679 function pushDebugInfo(debugInfo) { 3680 var previousDebugInfo = currentDebugInfo; 3681 null != debugInfo && (currentDebugInfo = null === previousDebugInfo ? debugInfo : previousDebugInfo.concat(debugInfo)); 3682 return previousDebugInfo; 3683 } 3684 function getCurrentDebugTask() { 3685 var debugInfo = currentDebugInfo; 3686 if (null != debugInfo) { 3687 for (var i = debugInfo.length - 1; 0 <= i; i--) if (null != debugInfo[i].name) { 3688 var debugTask = debugInfo[i].debugTask; 3689 if (null != debugTask) return debugTask; 3690 } 3691 } 3692 return null; 3693 } 3694 function validateFragmentProps(element, fiber, returnFiber) { 3695 for (var keys = Object.keys(element.props), i = 0; i < keys.length; i++) { 3696 var key = keys[i]; 3697 if ("children" !== key && "key" !== key && "ref" !== key) { 3698 null === fiber && (fiber = createFiberFromElement(element, returnFiber.mode, 0), fiber._debugInfo = currentDebugInfo, fiber.return = returnFiber); 3699 runWithFiberInDEV(fiber, function(erroredKey) { 3700 console.error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key`, `ref`, and `children` props.", erroredKey); 3701 }, key); 3702 break; 3703 } 3704 } 3705 } 3706 function unwrapThenable(thenable) { 3707 var index = thenableIndexCounter$1; 3708 thenableIndexCounter$1 += 1; 3709 null === thenableState$1 && (thenableState$1 = createThenableState()); 3710 return trackUsedThenable(thenableState$1, thenable, index, null); 3711 } 3712 function coerceRef(workInProgress, element) { 3713 element = element.props.ref; 3714 workInProgress.ref = void 0 !== element ? element : null; 3715 } 3716 function throwOnInvalidObjectTypeImpl(returnFiber, newChild) { 3717 if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE) throw Error("A React Element from an older version of React was rendered. This is not supported. It can happen if:\n- Multiple copies of the \"react\" package is used.\n- A library pre-bundled an old copy of \"react\" or \"react/jsx-runtime\".\n- A compiler tries to \"inline\" JSX instead of using the runtime."); 3718 returnFiber = Object.prototype.toString.call(newChild); 3719 throw Error("Objects are not valid as a React child (found: " + ("[object Object]" === returnFiber ? "object with keys {" + Object.keys(newChild).join(", ") + "}" : returnFiber) + "). If you meant to render a collection of children, use an array instead."); 3720 } 3721 function throwOnInvalidObjectType(returnFiber, newChild) { 3722 var debugTask = getCurrentDebugTask(); 3723 null !== debugTask ? debugTask.run(throwOnInvalidObjectTypeImpl.bind(null, returnFiber, newChild)) : throwOnInvalidObjectTypeImpl(returnFiber, newChild); 3724 } 3725 function warnOnFunctionTypeImpl(returnFiber, invalidChild) { 3726 var parentName = getComponentNameFromFiber(returnFiber) || "Component"; 3727 ownerHasFunctionTypeWarning[parentName] || (ownerHasFunctionTypeWarning[parentName] = !0, invalidChild = invalidChild.displayName || invalidChild.name || "Component", 3 === returnFiber.tag ? console.error("Functions are not valid as a React child. This may happen if you return %s instead of <%s /> from render. Or maybe you meant to call this function rather than return it.\n root.render(%s)", invalidChild, invalidChild, invalidChild) : console.error("Functions are not valid as a React child. This may happen if you return %s instead of <%s /> from render. Or maybe you meant to call this function rather than return it.\n <%s>{%s}</%s>", invalidChild, invalidChild, parentName, invalidChild, parentName)); 3728 } 3729 function warnOnFunctionType(returnFiber, invalidChild) { 3730 var debugTask = getCurrentDebugTask(); 3731 null !== debugTask ? debugTask.run(warnOnFunctionTypeImpl.bind(null, returnFiber, invalidChild)) : warnOnFunctionTypeImpl(returnFiber, invalidChild); 3732 } 3733 function warnOnSymbolTypeImpl(returnFiber, invalidChild) { 3734 var parentName = getComponentNameFromFiber(returnFiber) || "Component"; 3735 ownerHasSymbolTypeWarning[parentName] || (ownerHasSymbolTypeWarning[parentName] = !0, invalidChild = String(invalidChild), 3 === returnFiber.tag ? console.error("Symbols are not valid as a React child.\n root.render(%s)", invalidChild) : console.error("Symbols are not valid as a React child.\n <%s>%s</%s>", parentName, invalidChild, parentName)); 3736 } 3737 function warnOnSymbolType(returnFiber, invalidChild) { 3738 var debugTask = getCurrentDebugTask(); 3739 null !== debugTask ? debugTask.run(warnOnSymbolTypeImpl.bind(null, returnFiber, invalidChild)) : warnOnSymbolTypeImpl(returnFiber, invalidChild); 3740 } 3741 function createChildReconciler(shouldTrackSideEffects) { 3742 function deleteChild(returnFiber, childToDelete) { 3743 if (shouldTrackSideEffects) {
vendor: 6,148 bytes, lines 3744-3821
3744 var deletions = returnFiber.deletions; 3745 null === deletions ? (returnFiber.deletions = [childToDelete], returnFiber.flags |= 16) : deletions.push(childToDelete); 3746 } 3747 } 3748 function deleteRemainingChildren(returnFiber, currentFirstChild) { 3749 if (!shouldTrackSideEffects) return null; 3750 for (; null !== currentFirstChild;) deleteChild(returnFiber, currentFirstChild), currentFirstChild = currentFirstChild.sibling; 3751 return null; 3752 } 3753 function mapRemainingChildren(currentFirstChild) { 3754 for (var existingChildren = /* @__PURE__ */ new Map(); null !== currentFirstChild;) null === currentFirstChild.key ? existingChildren.set(currentFirstChild.index, currentFirstChild) : existingChildren.set(currentFirstChild.key, currentFirstChild), currentFirstChild = currentFirstChild.sibling; 3755 return existingChildren; 3756 } 3757 function useFiber(fiber, pendingProps) { 3758 fiber = createWorkInProgress(fiber, pendingProps); 3759 fiber.index = 0; 3760 fiber.sibling = null; 3761 return fiber; 3762 } 3763 function placeChild(newFiber, lastPlacedIndex, newIndex) { 3764 newFiber.index = newIndex; 3765 if (!shouldTrackSideEffects) return newFiber.flags |= 1048576, lastPlacedIndex; 3766 newIndex = newFiber.alternate; 3767 if (null !== newIndex) return newIndex = newIndex.index, newIndex < lastPlacedIndex ? (newFiber.flags |= 2, lastPlacedIndex) : newIndex; 3768 newFiber.flags |= 134217730; 3769 return lastPlacedIndex; 3770 } 3771 function placeSingleChild(newFiber) { 3772 shouldTrackSideEffects && null === newFiber.alternate && (newFiber.flags |= 134217730); 3773 return newFiber; 3774 } 3775 function updateTextNode(returnFiber, current, textContent, lanes) { 3776 if (null === current || 6 !== current.tag) return current = createFiberFromText(textContent, returnFiber.mode, lanes), current.return = returnFiber, current._debugOwner = returnFiber, current._debugTask = returnFiber._debugTask, current._debugInfo = currentDebugInfo, current; 3777 current = useFiber(current, textContent); 3778 current.return = returnFiber; 3779 current._debugInfo = currentDebugInfo; 3780 return current; 3781 } 3782 function updateElement(returnFiber, current, element, lanes) { 3783 var elementType = element.type; 3784 if (elementType === REACT_FRAGMENT_TYPE) return current = updateFragment(returnFiber, current, element.props.children, lanes, element.key), coerceRef(current, element), validateFragmentProps(element, current, returnFiber), current; 3785 if (null !== current && (current.elementType === elementType || isCompatibleFamilyForHotReloading(current, element) || "object" === typeof elementType && null !== elementType && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current.type)) return current = useFiber(current, element.props), coerceRef(current, element), current.return = returnFiber, current._debugOwner = element._owner, current._debugInfo = currentDebugInfo, current; 3786 current = createFiberFromElement(element, returnFiber.mode, lanes); 3787 coerceRef(current, element); 3788 current.return = returnFiber; 3789 current._debugInfo = currentDebugInfo; 3790 return current; 3791 } 3792 function updatePortal(returnFiber, current, portal, lanes) { 3793 if (null === current || 4 !== current.tag || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) return current = createFiberFromPortal(portal, returnFiber.mode, lanes), current.return = returnFiber, current._debugInfo = currentDebugInfo, current; 3794 current = useFiber(current, portal.children || []); 3795 current.return = returnFiber; 3796 current._debugInfo = currentDebugInfo; 3797 return current; 3798 } 3799 function updateFragment(returnFiber, current, fragment, lanes, key) { 3800 if (null === current || 7 !== current.tag) return current = createFiberFromFragment(fragment, returnFiber.mode, lanes, key), current.return = returnFiber, current._debugOwner = returnFiber, current._debugTask = returnFiber._debugTask, current._debugInfo = currentDebugInfo, current; 3801 current = useFiber(current, fragment); 3802 current.return = returnFiber; 3803 current._debugInfo = currentDebugInfo; 3804 return current; 3805 } 3806 function createChild(returnFiber, newChild, lanes) { 3807 if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return newChild = createFiberFromText("" + newChild, returnFiber.mode, lanes), newChild.return = returnFiber, newChild._debugOwner = returnFiber, newChild._debugTask = returnFiber._debugTask, newChild._debugInfo = currentDebugInfo, newChild; 3808 if ("object" === typeof newChild && null !== newChild) { 3809 switch (newChild.$$typeof) { 3810 case REACT_ELEMENT_TYPE: return lanes = createFiberFromElement(newChild, returnFiber.mode, lanes), coerceRef(lanes, newChild), lanes.return = returnFiber, returnFiber = pushDebugInfo(newChild._debugInfo), lanes._debugInfo = currentDebugInfo, currentDebugInfo = returnFiber, lanes; 3811 case REACT_PORTAL_TYPE: return newChild = createFiberFromPortal(newChild, returnFiber.mode, lanes), newChild.return = returnFiber, newChild._debugInfo = currentDebugInfo, newChild; 3812 case REACT_LAZY_TYPE: 3813 var _prevDebugInfo = pushDebugInfo(newChild._debugInfo); 3814 newChild = resolveLazy(newChild); 3815 returnFiber = createChild(returnFiber, newChild, lanes); 3816 currentDebugInfo = _prevDebugInfo; 3817 return returnFiber; 3818 } 3819 if (isArrayImpl(newChild) || getIteratorFn(newChild)) return lanes = createFiberFromFragment(newChild, returnFiber.mode, lanes, null), lanes.return = returnFiber, lanes._debugOwner = returnFiber, lanes._debugTask = returnFiber._debugTask, returnFiber = pushDebugInfo(newChild._debugInfo), lanes._debugInfo = currentDebugInfo, currentDebugInfo = returnFiber, lanes; 3820 if ("function" === typeof newChild.then) return _prevDebugInfo = pushDebugInfo(newChild._debugInfo), returnFiber = createChild(returnFiber, unwrapThenable(newChild), lanes), currentDebugInfo = _prevDebugInfo, returnFiber; 3821 if (newChild.$$typeof === REACT_CONTEXT_TYPE) return createChild(returnFiber, readContextDuringReconciliation(returnFiber, newChild), lanes);
3822 throwOnInvalidObjectType(returnFiber, newChild); 3823 } 3824 "function" === typeof newChild && warnOnFunctionType(returnFiber, newChild); 3825 "symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild); 3826 return null; 3827 } 3828 function updateSlot(returnFiber, oldFiber, newChild, lanes) { 3829 var key = null !== oldFiber ? oldFiber.key : null; 3830 if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return null !== key ? null : updateTextNode(returnFiber, oldFiber, "" + newChild, lanes); 3831 if ("object" === typeof newChild && null !== newChild) { 3832 switch (newChild.$$typeof) { 3833 case REACT_ELEMENT_TYPE: return newChild.key === key ? (key = pushDebugInfo(newChild._debugInfo), returnFiber = updateElement(returnFiber, oldFiber, newChild, lanes), currentDebugInfo = key, returnFiber) : null; 3834 case REACT_PORTAL_TYPE: return newChild.key === key ? updatePortal(returnFiber, oldFiber, newChild, lanes) : null; 3835 case REACT_LAZY_TYPE: return key = pushDebugInfo(newChild._debugInfo), newChild = resolveLazy(newChild), returnFiber = updateSlot(returnFiber, oldFiber, newChild, lanes), currentDebugInfo = key, returnFiber; 3836 } 3837 if (isArrayImpl(newChild) || getIteratorFn(newChild)) { 3838 if (null !== key) return null; 3839 key = pushDebugInfo(newChild._debugInfo); 3840 returnFiber = updateFragment(returnFiber, oldFiber, newChild, lanes, null); 3841 currentDebugInfo = key; 3842 return returnFiber; 3843 } 3844 if ("function" === typeof newChild.then) return key = pushDebugInfo(newChild._debugInfo), returnFiber = updateSlot(returnFiber, oldFiber, unwrapThenable(newChild), lanes), currentDebugInfo = key, returnFiber; 3845 if (newChild.$$typeof === REACT_CONTEXT_TYPE) return updateSlot(returnFiber, oldFiber, readContextDuringReconciliation(returnFiber, newChild), lanes); 3846 throwOnInvalidObjectType(returnFiber, newChild); 3847 } 3848 "function" === typeof newChild && warnOnFunctionType(returnFiber, newChild); 3849 "symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild); 3850 return null; 3851 } 3852 function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) { 3853 if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return existingChildren = existingChildren.get(newIdx) || null, updateTextNode(returnFiber, existingChildren, "" + newChild, lanes); 3854 if ("object" === typeof newChild && null !== newChild) { 3855 switch (newChild.$$typeof) { 3856 case REACT_ELEMENT_TYPE: return newIdx = existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, existingChildren = pushDebugInfo(newChild._debugInfo), returnFiber = updateElement(returnFiber, newIdx, newChild, lanes), currentDebugInfo = existingChildren, returnFiber; 3857 case REACT_PORTAL_TYPE: return existingChildren = existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, updatePortal(returnFiber, existingChildren, newChild, lanes); 3858 case REACT_LAZY_TYPE: 3859 var _prevDebugInfo7 = pushDebugInfo(newChild._debugInfo); 3860 newChild = resolveLazy(newChild); 3861 returnFiber = updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes); 3862 currentDebugInfo = _prevDebugInfo7; 3863 return returnFiber; 3864 } 3865 if (isArrayImpl(newChild) || getIteratorFn(newChild)) return newIdx = existingChildren.get(newIdx) || null, existingChildren = pushDebugInfo(newChild._debugInfo), returnFiber = updateFragment(returnFiber, newIdx, newChild, lanes, null), currentDebugInfo = existingChildren, returnFiber; 3866 if ("function" === typeof newChild.then) return _prevDebugInfo7 = pushDebugInfo(newChild._debugInfo), returnFiber = updateFromMap(existingChildren, returnFiber, newIdx, unwrapThenable(newChild), lanes), currentDebugInfo = _prevDebugInfo7, returnFiber; 3867 if (newChild.$$typeof === REACT_CONTEXT_TYPE) return updateFromMap(existingChildren, returnFiber, newIdx, readContextDuringReconciliation(returnFiber, newChild), lanes);
vendor: 1,079 bytes, lines 3868-3892
3868 throwOnInvalidObjectType(returnFiber, newChild); 3869 } 3870 "function" === typeof newChild && warnOnFunctionType(returnFiber, newChild); 3871 "symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild); 3872 return null; 3873 } 3874 function warnOnInvalidKey(returnFiber, workInProgress, child, knownKeys) { 3875 if ("object" !== typeof child || null === child) return knownKeys; 3876 switch (child.$$typeof) { 3877 case REACT_ELEMENT_TYPE: 3878 case REACT_PORTAL_TYPE: 3879 warnForMissingKey(returnFiber, workInProgress, child); 3880 var key = child.key; 3881 if ("string" !== typeof key) break; 3882 if (null === knownKeys) { 3883 knownKeys = /* @__PURE__ */ new Set(); 3884 knownKeys.add(key); 3885 break; 3886 } 3887 if (!knownKeys.has(key)) { 3888 knownKeys.add(key); 3889 break; 3890 } 3891 runWithFiberInDEV(workInProgress, function() { 3892 console.error("Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/
vendor: 1,682 bytes, lines 3892-3916
3892or omitted — the behavior is unsupported and could change in a future version.", key); 3893 }); 3894 break; 3895 case REACT_LAZY_TYPE: child = resolveLazy(child), warnOnInvalidKey(returnFiber, workInProgress, child, knownKeys); 3896 } 3897 return knownKeys; 3898 } 3899 function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) { 3900 for (var knownKeys = null, resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, newIdx = currentFirstChild = 0, nextOldFiber = null; null !== oldFiber && newIdx < newChildren.length; newIdx++) { 3901 oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling; 3902 var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes); 3903 if (null === newFiber) { 3904 null === oldFiber && (oldFiber = nextOldFiber); 3905 break; 3906 } 3907 knownKeys = warnOnInvalidKey(returnFiber, newFiber, newChildren[newIdx], knownKeys); 3908 shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber); 3909 currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx); 3910 null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber; 3911 previousNewFiber = newFiber; 3912 oldFiber = nextOldFiber; 3913 } 3914 if (newIdx === newChildren.length) return deleteRemainingChildren(returnFiber, oldFiber), isHydrating && pushTreeFork(returnFiber, newIdx), resultingFirstChild; 3915 if (null === oldFiber) { 3916 for (; newIdx < newChildren.length; newIdx++) oldFiber = createChild(returnFiber, newChildren[newIdx], lanes), null !== oldFiber && (knownKeys = warnOnInvali
vendor: 1,948 bytes, lines 3916-3935
3916dKey(returnFiber, oldFiber, newChildren[newIdx], knownKeys), currentFirstChild = placeChild(oldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = oldFiber : previousNewFiber.sibling = oldFiber, previousNewFiber = oldFiber); 3917 isHydrating && pushTreeFork(returnFiber, newIdx); 3918 return resultingFirstChild; 3919 } 3920 for (oldFiber = mapRemainingChildren(oldFiber); newIdx < newChildren.length; newIdx++) nextOldFiber = updateFromMap(oldFiber, returnFiber, newIdx, newChildren[newIdx], lanes), null !== nextOldFiber && (knownKeys = warnOnInvalidKey(returnFiber, nextOldFiber, newChildren[newIdx], knownKeys), shouldTrackSideEffects && (newFiber = nextOldFiber.alternate, null !== newFiber && oldFiber.delete(null === newFiber.key ? newIdx : newFiber.key)), currentFirstChild = placeChild(nextOldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = nextOldFiber : previousNewFiber.sibling = nextOldFiber, previousNewFiber = nextOldFiber); 3921 shouldTrackSideEffects && oldFiber.forEach(function(child) { 3922 return deleteChild(returnFiber, child); 3923 }); 3924 isHydrating && pushTreeFork(returnFiber, newIdx); 3925 return resultingFirstChild; 3926 } 3927 function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildren, lanes) { 3928 if (null == newChildren) throw Error("An iterable object provided no iterator."); 3929 for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, newIdx = currentFirstChild = 0, nextOldFiber = null, knownKeys = null, step = newChildren.next(); null !== oldFiber && !step.done; newIdx++, step = newChildren.next()) { 3930 oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling; 3931 var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes); 3932 if (null === newFiber) { 3933 null === oldFiber && (oldFiber = nextOldFiber); 3934 break; 3935 }
vendor: 1,349 bytes, lines 3936-3949
3936 knownKeys = warnOnInvalidKey(returnFiber, newFiber, step.value, knownKeys); 3937 shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber); 3938 currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx); 3939 null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber; 3940 previousNewFiber = newFiber; 3941 oldFiber = nextOldFiber; 3942 } 3943 if (step.done) return deleteRemainingChildren(returnFiber, oldFiber), isHydrating && pushTreeFork(returnFiber, newIdx), resultingFirstChild; 3944 if (null === oldFiber) { 3945 for (; !step.done; newIdx++, step = newChildren.next()) oldFiber = createChild(returnFiber, step.value, lanes), null !== oldFiber && (knownKeys = warnOnInvalidKey(returnFiber, oldFiber, step.value, knownKeys), currentFirstChild = placeChild(oldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = oldFiber : previousNewFiber.sibling = oldFiber, previousNewFiber = oldFiber); 3946 isHydrating && pushTreeFork(returnFiber, newIdx); 3947 return resultingFirstChild; 3948 } 3949 for (oldFiber = mapRemainingChildren(oldFiber); !step.done; newIdx++, step = newChildren.next()) nextOldFiber = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes), null !== nextOldFiber && (knownKeys = warnOnInvali
3949dKey(returnFiber, nextOldFiber, step.value, knownKeys), shouldTrackSideEffects && (step = nextOldFiber.alternate, null !== step && oldFiber.delete(null === step.key ? newIdx : step.key)), currentFirstChild = placeChild(nextOldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = nextOldFiber : previousNewFiber.sibling = nextOldFiber, previousNewFiber = nextOldFiber); 3950 shouldTrackSideEffects && oldFiber.forEach(function(child) { 3951 return deleteChild(returnFiber, child); 3952 }); 3953 isHydrating && pushTreeFork(returnFiber, newIdx); 3954 return resultingFirstChild; 3955 } 3956 function reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes) { 3957 "object" === typeof newChild && null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && void 0 === newChild.props.ref && (validateFragmentProps(newChild, null, returnFiber), newChild = newChild.props.children); 3958 if ("object" === typeof newChild && null !== newChild) { 3959 switch (newChild.$$typeof) { 3960 case REACT_ELEMENT_TYPE: 3961 var prevDebugInfo = pushDebugInfo(newChild._debugInfo); 3962 a: { 3963 for (var key = newChild.key; null !== currentFirstChild;) { 3964 if (currentFirstChild.key === key) { 3965 key = newChild.type; 3966 if (key === REACT_FRAGMENT_TYPE) { 3967 if (7 === currentFirstChild.tag) { 3968 deleteRemainingChildren(returnFiber, currentFirstChild.sibling); 3969 lanes = useFiber(currentFirstChild, newChild.props.children); 3970 coerceRef(lanes, newChild); 3971 lanes.return = returnFiber; 3972 lanes._debugOwner = newChild._owner; 3973 lanes._debugInfo = currentDebugInfo; 3974 validateFragmentProps(newChild, lanes, returnFiber); 3975 returnFiber = lanes; 3976 break a; 3977 } 3978 } else if (currentFirstChild.elementType === key || isCompatibleFamilyForHotReloading(currentFirstChild, newChild) || "object" === typeof key && null !== key && key.$$typeof === REACT_LAZY_TYPE && resolveLazy(key) === currentFirstChild.type) { 3979 deleteRemainingChildren(returnFiber, currentFirstChild.sibling); 3980 lanes = useFiber(currentFirstChild, newChild.props); 3981 coerceRef(lanes, newChild); 3982 lanes.return = returnFiber; 3983 lanes._debugOwner = newChild._owner; 3984 lanes._debugInfo = currentDebugInfo; 3985 returnFiber = lanes; 3986 break a; 3987 } 3988 deleteRemainingChildren(returnFiber, currentFirstChild); 3989 break; 3990 } else deleteChild(returnFiber, currentFirstChild); 3991 currentFirstChild = currentFirstChild.sibling; 3992 } 3993 newChild.type === REACT_FRAGMENT_TYPE ? (lanes = createFiberFromFragment(newChild.props.children, returnFiber.mode, lanes, newChild.key), coerceRef(lanes, newChild), lanes.return = returnFiber, lanes._debugOwner = returnFiber, lanes._debugTask = returnFiber._debugTask, lanes._debugInfo = currentDebugInfo, validateFragmentProps(newChild, lanes, returnFiber), returnFiber = lanes) : (lanes = createFiberFromElement(newChild, returnFiber.mode, lanes), coerceRef(lanes, newChild), lanes.return = returnFiber, lanes._debugInfo = currentDebugInfo, returnFiber = lanes); 3994 } 3995 returnFiber = placeSingleChild(returnFiber); 3996 currentDebugInfo = prevDebugInfo; 3997 return returnFiber; 3998 case REACT_PORTAL_TYPE: 3999 a: { 4000 prevDebugInfo = newChild; 4001 for (newChild = prevDebugInfo.key; null !== currentFirstChild;) { 4002 if (currentFirstChild.key === newChild) if (4 === currentFirstChild.tag && currentFirstChild.stateNode.containerInfo === prevDebugInfo.containerInfo && currentFirstChild.stateNode.implementation === prevDebugInfo.implementation) { 4003 deleteRemainingChildren(returnFiber, currentFirstChild.sibling); 4004 lanes = useFiber(currentFirstChild, prevDebugInfo.children || []); 4005 lanes.return = returnFiber; 4006 returnFiber = lanes; 4007 break a; 4008 } else { 4009 deleteRemainingChildren(returnFiber, currentFirstChild); 4010 break; 4011 } 4012 else deleteChild(returnFiber, currentFirstChild); 4013 currentFirstChild = currentFirstChild.sibling; 4014 } 4015 lanes = createFiberFromPortal(prevDebugInfo, returnFiber.mode, lanes); 4016 lanes.return = returnFiber; 4017 returnFiber = lanes; 4018 } 4019 return placeSingleChild(returnFiber); 4020 case REACT_LAZY_TYPE: return prevDebugInfo = pushDebugInfo(newChild._debugInfo), newChild = resolveLazy(newChild), returnFiber = reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes), currentDebugInfo = prevDebugInfo, returnFiber; 4021 } 4022 if (isArrayImpl(newChild)) return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes); 4023 if (getIteratorFn(newChild)) { 4024 prevDebugInfo = newChild; 4025 newChild = getIteratorFn(prevDebugInfo); 4026 if ("function" !== typeof newChild) throw Error("An object is not an iterable. This error is likely caused by a bug in React. Please file an issue."); 4027 key = newChild.call(prevDebugInfo); 4028 if (key === prevDebugInfo) { 4029 if (0 !== returnFiber.tag || "[object GeneratorFunction]" !== Object.prototype.toString.call(returnFiber.type) || "[object Generator]" !== Object.prototype.toString.call(key)) didWarnAboutGenerators || console.error("Using Iterators as children is unsupported and will likely yield unexpected results because enumerating a generator mutates it. You may convert it to an array with `Array.from()` or the `[...spread]` operator before rendering. You can also use an Iterable that can iterate multiple times over the same items."), didWarnAboutGenerators = !0; 4030 } else prevDebugInfo.entries !== newChild || didWarnAboutMaps || (console.error("Using Maps as children is not supported. Use an array of keyed ReactElements instead."), didWarnAboutMaps = !0); 4031 return reconcileChildrenIterator(returnFiber, currentFirstChild, key, lanes); 4032 } 4033 if ("function" === typeof newChild.then) return prevDebugInfo = pushDebugInfo(newChild._debugInfo), returnFiber = reconcileChildFibersImpl(returnFiber, currentFirstChild, unwrapThenable(newChild), lanes), currentDebugInfo = prevDebugInfo, returnFiber; 4034 if (newChild.$$typeof === REACT_CONTEXT_TYPE) return reconcileChildFibersImpl(returnFiber, currentFirstChild, readContextDuringReconciliation(returnFiber, newChild), lanes);
4035 throwOnInvalidObjectType(returnFiber, newChild); 4036 } 4037 if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return prevDebugInfo = "" + newChild, null !== currentFirstChild && 6 === currentFirstChild.tag ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling), lanes = useFiber(currentFirstChild, prevDebugInfo), lanes.return = returnFiber, returnFiber = lanes) : (deleteRemainingChildren(returnFiber, currentFirstChild), lanes = createFiberFromText(prevDebugInfo, returnFiber.mode, lanes), lanes.return = returnFiber, lanes._debugOwner = returnFiber, lanes._debugTask = returnFiber._debugTask, lanes._debugInfo = currentDebugInfo, returnFiber = lanes), placeSingleChild(returnFiber); 4038 "function" === typeof newChild && warnOnFunctionType(returnFiber, newChild); 4039 "symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild); 4040 return deleteRemainingChildren(returnFiber, currentFirstChild); 4041 } 4042 return function(returnFiber, currentFirstChild, newChild, lanes) { 4043 var prevDebugInfo = currentDebugInfo; 4044 currentDebugInfo = null; 4045 try { 4046 thenableIndexCounter$1 = 0; 4047 var firstChildFiber = reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes); 4048 thenableState$1 = null; 4049 return firstChildFiber; 4050 } catch (x) { 4051 if (x === SuspenseException || x === SuspenseActionException) throw x; 4052 var fiber = createFiber(29, x, null, returnFiber.mode); 4053 fiber.lanes = lanes; 4054 fiber.return = returnFiber; 4055 var debugInfo = fiber._debugInfo = currentDebugInfo; 4056 fiber._debugOwner = returnFiber._debugOwner; 4057 fiber._debugTask = returnFiber._debugTask; 4058 if (null != debugInfo) { 4059 for (var i = debugInfo.length - 1; 0 <= i; i--) if ("string" === typeof debugInfo[i].stack) { 4060 fiber._debugOwner = debugInfo[i]; 4061 fiber._debugTask = debugInfo[i].debugTask; 4062 break; 4063 } 4064 } 4065 return fiber; 4066 } finally { 4067 currentDebugInfo = prevDebugInfo; 4068 } 4069 }; 4070 } 4071 function validateSuspenseListNestedChild(childSlot, index) { 4072 var isAnArray = isArrayImpl(childSlot); 4073 childSlot = !isAnArray && "function" === typeof getIteratorFn(childSlot); 4074 return isAnArray || childSlot ? (isAnArray = isAnArray ? "array" : "iterable", console.error("A nested %s was passed to row #%s in <SuspenseList />. Wrap it in an additional SuspenseList to configure its revealOrder: <SuspenseList revealOrder=...> ... <SuspenseList revealOrder=...>{%s}</SuspenseList> ... </SuspenseList>", isAnArray, index, isAnArray), !1) : !0; 4075 } 4076 function initializeUpdateQueue(fiber) { 4077 fiber.updateQueue = { 4078 baseState: fiber.memoizedState, 4079 firstBaseUpdate: null, 4080 lastBaseUpdate: null, 4081 shared: { 4082 pending: null, 4083 lanes: 0, 4084 hiddenCallbacks: null 4085 }, 4086 callbacks: null 4087 }; 4088 } 4089 function cloneUpdateQueue(current, workInProgress) { 4090 current = current.updateQueue; 4091 workInProgress.updateQueue === current && (workInProgress.updateQueue = { 4092 baseState: current.baseState, 4093 firstBaseUpdate: current.firstBaseUpdate, 4094 lastBaseUpdate: current.lastBaseUpdate, 4095 shared: current.shared, 4096 callbacks: null 4097 }); 4098 } 4099 function createUpdate(lane) { 4100 return { 4101 lane, 4102 tag: UpdateState, 4103 payload: null, 4104 callback: null, 4105 next: null 4106 }; 4107 } 4108 function enqueueUpdate(fiber, update, lane) { 4109 var updateQueue = fiber.updateQueue; 4110 if (null === updateQueue) return null; 4111 updateQueue = updateQueue.shared; 4112 if (currentlyProcessingQueue === updateQueue && !didWarnUpdateInsideUpdate) { 4113 var componentName = getComponentNameFromFiber(fiber); 4114 console.error("An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback.\n\nPlease update the following component: %s", componentName); 4115 didWarnUpdateInsideUpdate = !0; 4116 } 4117 if ((executionContext & RenderContext) !== NoContext) return componentName = updateQueue.pending, null === componentName ? update.next = update : (update.next = componentName.next, componentName.next = update), updateQueue.pending = update, update = getRootForUpdatedFiber(fiber), markUpdateLaneFromFiberToRoot(fiber, null, lane), update; 4118 enqueueUpdate$1(fiber, updateQueue, update, lane); 4119 return getRootForUpdatedFiber(fiber); 4120 } 4121 function entangleTransitions(root, fiber, lane) { 4122 fiber = fiber.updateQueue; 4123 if (null !== fiber && (fiber = fiber.shared, 0 !== (lane & 4194048))) { 4124 var queueLanes = fiber.lanes; 4125 queueLanes &= root.pendingLanes; 4126 lane |= queueLanes; 4127 fiber.lanes = lane; 4128 markRootEntangled(root, lane); 4129 } 4130 } 4131 function enqueueCapturedUpdate(workInProgress, capturedUpdate) { 4132 var queue = workInProgress.updateQueue, current = workInProgress.alternate; 4133 if (null !== current && (current = current.updateQueue, queue === current)) { 4134 var newFirst = null, newLast = null; 4135 queue = queue.firstBaseUpdate; 4136 if (null !== queue) { 4137 do { 4138 var clone = { 4139 lane: queue.lane, 4140 tag: queue.tag, 4141 payload: queue.payload, 4142 callback: null, 4143 next: null 4144 }; 4145 null === newLast ? newFirst = newLast = clone : newLast = newLast.next = clone; 4146 queue = queue.next; 4147 } while (null !== queue); 4148 null === newLast ? newFirst = newLast = capturedUpdate : newLast = newLast.next = capturedUpdate; 4149 } else newFirst = newLast = capturedUpdate; 4150 queue = { 4151 baseState: current.baseState, 4152 firstBaseUpdate: newFirst, 4153 lastBaseUpdate: newLast, 4154 shared: current.shared, 4155 callbacks: current.callbacks 4156 }; 4157 workInProgress.updateQueue = queue; 4158 return; 4159 } 4160 workInProgress = queue.lastBaseUpdate; 4161 null === workInProgress ? queue.firstBaseUpdate = capturedUpdate : workInProgress.next = capturedUpdate; 4162 queue.lastBaseUpdate = capturedUpdate; 4163 } 4164 function suspendIfUpdateReadFromEntangledAsyncAction() { 4165 if (didReadFromEntangledAsyncAction) { 4166 var entangledActionThenable = currentEntangledActionThenable; 4167 if (null !== entangledActionThenable) throw entangledActionThenable; 4168 } 4169 } 4170 function processUpdateQueue(workInProgress, props, instance$jscomp$0, renderLanes) { 4171 didReadFromEntangledAsyncAction = !1; 4172 var queue = workInProgress.updateQueue; 4173 hasForceUpdate = !1; 4174 currentlyProcessingQueue = queue.shared; 4175 var firstBaseUpdate = queue.firstBaseUpdate, lastBaseUpdate = queue.lastBaseUpdate, pendingQueue = queue.shared.pending; 4176 if (null !== pendingQueue) { 4177 queue.shared.pending = null; 4178 var lastPendingUpdate = pendingQueue, firstPendingUpdate = lastPendingUpdate.next; 4179 lastPendingUpdate.next = null; 4180 null === lastBaseUpdate ? firstBaseUpdate = firstPendingUpdate : lastBaseUpdate.next = firstPendingUpdate; 4181 lastBaseUpdate = lastPendingUpdate; 4182 var current = workInProgress.alternate; 4183 null !== current && (current = current.updateQueue, pendingQueue = current.lastBaseUpdate, pendingQueue !== lastBaseUpdate && (null === pen
4183dingQueue ? current.firstBaseUpdate = firstPendingUpdate : pendingQueue.next = firstPendingUpdate, current.lastBaseUpdate = lastPendingUpdate)); 4184 } 4185 if (null !== firstBaseUpdate) { 4186 var newState = queue.baseState; 4187 lastBaseUpdate = 0; 4188 current = firstPendingUpdate = lastPendingUpdate = null; 4189 pendingQueue = firstBaseUpdate; 4190 do { 4191 var updateLane = pendingQueue.lane & -536870913, isHiddenUpdate = updateLane !== pendingQueue.lane; 4192 if (isHiddenUpdate ? (workInProgressRootRenderLanes & updateLane) === updateLane : (renderLanes & updateLane) === updateLane) { 4193 0 !== updateLane && updateLane === currentEntangledLane && (didReadFromEntangledAsyncAction = !0); 4194 null !== current && (current = current.next = { 4195 lane: 0, 4196 tag: pendingQueue.tag, 4197 payload: pendingQueue.payload, 4198 callback: null, 4199 next: null 4200 }); 4201 a: { 4202 updateLane = workInProgress; 4203 var partialState = pendingQueue; 4204 var nextProps = props, instance = instance$jscomp$0; 4205 switch (partialState.tag) { 4206 case ReplaceState: 4207 partialState = partialState.payload; 4208 if ("function" === typeof partialState) { 4209 isDisallowedContextReadInDEV = !0; 4210 var nextState = partialState.call(instance, newState, nextProps); 4211 if (updateLane.mode & StrictLegacyMode) { 4212 setIsStrictModeForDevtools(!0); 4213 try { 4214 partialState.call(instance, newState, nextProps); 4215 } finally { 4216 setIsStrictModeForDevtools(!1); 4217 } 4218 } 4219 isDisallowedContextReadInDEV = !1; 4220 newState = nextState; 4221 break a; 4222 } 4223 newState = partialState; 4224 break a; 4225 case CaptureUpdate: updateLane.flags = updateLane.flags & -65537 | 128; 4226 case UpdateState: 4227 nextState = partialState.payload; 4228 if ("function" === typeof nextState) { 4229 isDisallowedContextReadInDEV = !0; 4230 partialState = nextState.call(instance, newState, nextProps); 4231 if (updateLane.mode & StrictLegacyMode) { 4232 setIsStrictModeForDevtools(!0); 4233 try { 4234 nextState.call(instance, newState, nextProps); 4235 } finally { 4236 setIsStrictModeForDevtools(!1); 4237 } 4238 } 4239 isDisallowedContextReadInDEV = !1; 4240 } else partialState = nextState; 4241 if (null === partialState || void 0 === partialState) break a; 4242 newState = assign({}, newState, partialState); 4243 break a; 4244 case ForceUpdate: hasForceUpdate = !0; 4245 } 4246 } 4247 updateLane = pendingQueue.callback; 4248 null !== updateLane && (workInProgress.flags |= 64, isHiddenUpdate && (workInProgress.flags |= 8192), isHiddenUpdate = queue.callbacks, null === isHiddenUpdate ? queue.callbacks = [updateLane] : isHiddenUpdate.push(updateLane)); 4249 } else isHiddenUpdate = { 4250 lane: updateLane, 4251 tag: pendingQueue.tag, 4252 payload: pendingQueue.payload, 4253 callback: pendingQueue.callback, 4254 next: null 4255 }, null === current ? (firstPendingUpdate = current = isHiddenUpdate, lastPendingUpdate = newState) : current = current.next = isHiddenUpdate, lastBaseUpdate |= updateLane; 4256 pendingQueue = pendingQueue.next; 4257 if (null === pendingQueue) if (pendingQueue = queue.shared.pending, null === pendingQueue) break; 4258 else isHiddenUpdate = pendingQueue, pendingQueue = isHiddenUpdate.next, isHiddenUpdate.next = null, queue.lastBaseUpdate = isHiddenUpdate, queue.shared.pending = null; 4259 } while (1); 4260 null === current && (lastPendingUpdate = newState); 4261 queue.baseState = lastPendingUpdate; 4262 queue.firstBaseUpdate = firstPendingUpdate; 4263 queue.lastBaseUpdate = current; 4264 null === firstBaseUpdate && (queue.shared.lanes = 0); 4265 workInProgressRootSkippedLanes |= lastBaseUpdate; 4266 workInProgress.lanes = lastBaseUpdate; 4267 workInProgress.memoizedState = newState; 4268 } 4269 currentlyProcessingQueue = null; 4270 } 4271 function callCallback(callback, context) { 4272 if ("function" !== typeof callback) throw Error("Invalid argument passed as callback. E
vendor: 8,901 bytes, lines 4272-4404
4272xpected a function. Instead received: " + callback); 4273 callback.call(context); 4274 } 4275 function commitHiddenCallbacks(updateQueue, context) { 4276 var hiddenCallbacks = updateQueue.shared.hiddenCallbacks; 4277 if (null !== hiddenCallbacks) for (updateQueue.shared.hiddenCallbacks = null, updateQueue = 0; updateQueue < hiddenCallbacks.length; updateQueue++) callCallback(hiddenCallbacks[updateQueue], context); 4278 } 4279 function commitCallbacks(updateQueue, context) { 4280 var callbacks = updateQueue.callbacks; 4281 if (null !== callbacks) for (updateQueue.callbacks = null, updateQueue = 0; updateQueue < callbacks.length; updateQueue++) callCallback(callbacks[updateQueue], context); 4282 } 4283 function pushHiddenContext(fiber, context) { 4284 var prevEntangledRenderLanes = entangledRenderLanes; 4285 push(prevEntangledRenderLanesCursor, prevEntangledRenderLanes, fiber); 4286 push(currentTreeHiddenStackCursor, context, fiber); 4287 entangledRenderLanes = prevEntangledRenderLanes | context.baseLanes; 4288 } 4289 function reuseHiddenContextOnStack(fiber) { 4290 push(prevEntangledRenderLanesCursor, entangledRenderLanes, fiber); 4291 push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current, fiber); 4292 } 4293 function popHiddenContext(fiber) { 4294 entangledRenderLanes = prevEntangledRenderLanesCursor.current; 4295 pop(currentTreeHiddenStackCursor, fiber); 4296 pop(prevEntangledRenderLanesCursor, fiber); 4297 } 4298 function pushPrimaryTreeSuspenseHandler(handler) { 4299 var current = handler.alternate; 4300 push(suspenseStackCursor, suspenseStackCursor.current & SubtreeSuspenseContextMask, handler); 4301 push(suspenseHandlerStackCursor, handler, handler); 4302 null === shellBoundary && (null === current || null !== currentTreeHiddenStackCursor.current ? shellBoundary = handler : null !== current.memoizedState && (shellBoundary = handler)); 4303 } 4304 function pushDehydratedActivitySuspenseHandler(fiber) { 4305 push(suspenseStackCursor, suspenseStackCursor.current, fiber); 4306 push(suspenseHandlerStackCursor, fiber, fiber); 4307 null === shellBoundary && (shellBoundary = fiber); 4308 } 4309 function pushOffscreenSuspenseHandler(fiber) { 4310 22 === fiber.tag ? (push(suspenseStackCursor, suspenseStackCursor.current, fiber), push(suspenseHandlerStackCursor, fiber, fiber), null === shellBoundary && (shellBoundary = fiber)) : reuseSuspenseHandlerOnStack(fiber); 4311 } 4312 function reuseSuspenseHandlerOnStack(fiber) { 4313 push(suspenseStackCursor, suspenseStackCursor.current, fiber); 4314 push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current, fiber); 4315 } 4316 function popSuspenseHandler(fiber) { 4317 pop(suspenseHandlerStackCursor, fiber); 4318 shellBoundary === fiber && (shellBoundary = null); 4319 pop(suspenseStackCursor, fiber); 4320 } 4321 function pushSuspenseListContext(fiber, newContext) { 4322 push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current, fiber); 4323 push(suspenseStackCursor, newContext, fiber); 4324 } 4325 function popSuspenseListContext(fiber) { 4326 pop(suspenseStackCursor, fiber); 4327 pop(suspenseHandlerStackCursor, fiber); 4328 shellBoundary === fiber && (shellBoundary = null); 4329 } 4330 function findFirstSuspended(row) { 4331 for (var node = row; null !== node;) { 4332 if (13 === node.tag) { 4333 var state = node.memoizedState; 4334 if (null !== state && (state = state.dehydrated, null === state || isSuspenseInstancePending(state) || isSuspenseInstanceFallback(state))) return node; 4335 } else if (19 === node.tag && "independent" !== node.memoizedProps.revealOrder) { 4336 if (0 !== (node.flags & 128)) return node; 4337 } else if (null !== node.child) { 4338 node.child.return = node; 4339 node = node.child; 4340 continue; 4341 } 4342 if (node === row) break; 4343 for (; null === node.sibling;) { 4344 if (null === node.return || node.return === row) return null; 4345 node = node.return; 4346 } 4347 node.sibling.return = node.return; 4348 node = node.sibling; 4349 } 4350 return null; 4351 } 4352 function mountHookTypesDev() { 4353 var hookName = currentHookNameInDev; 4354 null === hookTypesDev ? hookTypesDev = [hookName] : hookTypesDev.push(hookName); 4355 } 4356 function updateHookTypesDev() { 4357 var hookName = currentHookNameInDev; 4358 if (null !== hookTypesDev && (hookTypesUpdateIndexDev++, hookTypesDev[hookTypesUpdateIndexDev] !== hookName)) { 4359 var componentName = getComponentNameFromFiber(currentlyRenderingFiber); 4360 if (!didWarnAboutMismatchedHooksForComponent.has(componentName) && (didWarnAboutMismatchedHooksForComponent.add(componentName), null !== hookTypesDev)) { 4361 for (var table = "", i = 0; i <= hookTypesUpdateIndexDev; i++) { 4362 var oldHookName = hookTypesDev[i], newHookName = i === hookTypesUpdateIndexDev ? hookName : oldHookName; 4363 for (oldHookName = i + 1 + ". " + oldHookName; 30 > oldHookName.length;) oldHookName += " "; 4364 oldHookName += newHookName + "\n"; 4365 table += oldHookName; 4366 } 4367 console.error("React has detected a change in the order of Hooks called by %s. This will lead to bugs and errors if not fixed. For more information, read the Rules of Hooks: https://react.dev/link/rules-of-hooks\n\n Previous render Next render\n ------------------------------------------------------\n%s ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", componentName, table); 4368 } 4369 } 4370 } 4371 function checkDepsAreArrayDev(deps) { 4372 void 0 === deps || null === deps || isArrayImpl(deps) || console.error("%s received a final argument that is not an array (instead, received `%s`). When specified, the final argument must be an array.", currentHookNameInDev, typeof deps); 4373 } 4374 function warnOnUseFormStateInDev() { 4375 var componentName = getComponentNameFromFiber(currentlyRenderingFiber); 4376 didWarnAboutUseFormState.has(componentName) || (didWarnAboutUseFormState.add(componentName), console.error("ReactDOM.useFormState has been renamed to React.useActionState. Please update %s to use React.useActionState.", componentName)); 4377 } 4378 function throwInvalidHookError() { 4379 throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem."); 4380 } 4381 function areHookInputsEqual(nextDeps, prevDeps) { 4382 if (ignorePreviousDependencies) return !1; 4383 if (null === prevDeps) return console.error("%s received a final argument during this render, but not during the previous render. Even though the final argument is optional, its type cannot change between renders.", currentHookNameInDev), !1; 4384 nextDeps.length !== prevDeps.length && console.error("The final argument passed to %s changed size between renders. The order and size of this array must remain constant.\n\nPrevious: %s\nIncoming: %s", currentHookNameInDev, "[" + prevDeps.join(", ") + "]", "[" + nextDeps.join(", ") + "]"); 4385 for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) if (!objectIs(nextDeps[i], prevDeps[i])) return !1; 4386 return !0; 4387 } 4388 function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) { 4389 renderLanes = nextRenderLanes; 4390 currentlyRenderingFiber = workInProgress; 4391 hookTypesDev = null !== current ? current._debugHookTypes : null; 4392 hookTypesUpdateIndexDev = -1; 4393 ignorePreviousDependencies = null !== current && current.type !== workInProgress.type; 4394 if ("[object AsyncFunction]" === Object.prototype.toString.call(Component) || "[object AsyncGeneratorFunction]" === Object.prototype.toString.call(Component)) nextRenderLanes = getComponentNameFromFiber(currentlyRenderingFiber), didWarnAboutAsyncClientComponent.has(nextRenderLanes) || (didWarnAboutAsyncClientComponent.add(nextRenderLanes), console.error("%s is an async Client Component. Only Server Components can be async at the moment. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.", null === nextRenderLanes ? "An unknown Component" : "<" + nextRenderLanes + ">")); 4395 workInProgress.memoizedState = null; 4396 workInProgress.updateQueue = null; 4397 workInProgress.lanes = 0; 4398 ReactSharedInternals.H = null !== current && null !== current.memoizedState ? HooksDispatcherOnUpdateInDEV : null !== hookTypesDev ? HooksDispatcherOnMountWithHookTypesInDEV : HooksDispatcherOnMountInDEV; 4399 shouldDoubleInvokeUserFnsInHooksDEV = nextRenderLanes = (workInProgress.mode & StrictLegacyMode) !== NoMode; 4400 var children = callComponentInDEV(Component, props, secondArg); 4401 shouldDoubleInvokeUserFnsInHooksDEV = !1; 4402 didScheduleRenderPhaseUpdateDuringThisPass && (children = renderWithHooksAgain(workInProgress, Component, props, secondArg)); 4403 if (nextRenderLanes) { 4404 setIsStrictModeForDevtools(!0);
4405 try { 4406 children = renderWithHooksAgain(workInProgress, Component, props, secondArg); 4407 } finally { 4408 setIsStrictModeForDevtools(!1); 4409 } 4410 } 4411 finishRenderingHooks(current, workInProgress); 4412 return children; 4413 } 4414 function finishRenderingHooks(current, workInProgress) { 4415 workInProgress._debugHookTypes = hookTypesDev; 4416 null === workInProgress.dependencies ? null !== thenableState && (workInProgress.dependencies = { 4417 lanes: 0, 4418 firstContext: null, 4419 _debugThenableState: thenableState 4420 }) : workInProgress.dependencies._debugThenableState = thenableState; 4421 var thenableState$jscomp$0 = thenableState; 4422 null !== lastSuspendedFiber && areSameKeyPath(lastSuspendedFiber, workInProgress) && (null !== thenableState$jscomp$0 || null === lastSuspendedStack || didIssueUseWarning || (didIssueUseWarning = !0, console.error(lastSuspendedStack)), lastSuspendedStack = lastSuspendedFiber = null); 4423 ReactSharedInternals.H = ContextOnlyDispatcher; 4424 thenableState$jscomp$0 = null !== currentHook && null !== currentHook.next; 4425 renderLanes = 0; 4426 hookTypesDev = currentHookNameInDev = workInProgressHook = currentHook = currentlyRenderingFiber = null; 4427 hookTypesUpdateIndexDev = -1; 4428 null !== current && (current.flags & 1206910976) !== (workInProgress.flags & 1206910976) && console.error("Internal React error: Expected static flag was missing. Please notify the React team."); 4429 didScheduleRenderPhaseUpdate = !1; 4430 thenableIndexCounter = 0; 4431 thenableState = null; 4432 if (thenableState$jscomp$0) throw Error("Rendered fewer hooks than expected. This may be caused by an accidental early return statement."); 4433 null === current || didReceiveUpdate || (current = current.dependencies, null !== current && checkIfContextChanged(current) && (didReceiveUpdate = !0)); 4434 needsToResetSuspendedThenableDEV ? (needsToResetSuspendedThenableDEV = !1, current = !0) : current = !1; 4435 current && (workInProgress = getComponentNameFromFiber(workInProgress) || "Unknown", didWarnAboutUseWrappedInTryCatch.has(workInProgress) || didWarnAboutAsyncClientComponent.has(workInProgress) || (didWarnAboutUseWrappedInTryCatch.add(workInProgress), console.error("`use` was called from inside a try/catch block. This is not allowed and can lead to unexpected behavior. To handle errors triggered by `use`, wrap your component in a error boundary."))); 4436 } 4437 function renderWithHooksAgain(workInProgress, Component, props, secondArg) { 4438 currentlyRenderingFiber = workInProgress; 4439 var numberOfReRenders = 0; 4440 do { 4441 didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null); 4442 thenableIndexCounter = 0; 4443 didScheduleRenderPhaseUpdateDuringThisPass = !1; 4444 if (numberOfReRenders >= RE_RENDER_LIMIT) throw Error("Too many re-renders. React limits the number of renders to prevent an infinite loop."); 4445 numberOfReRenders += 1; 4446 ignorePreviousDependencies = !1; 4447 workInProgressHook = currentHook = null; 4448 if (null != workInProgress.updateQueue) { 4449 var children = workInProgress.updateQueue; 4450 children.lastEffect = null; 4451 children.events = null; 4452 children.stores = null; 4453 null != children.memoCache && (children.memoCache.index = 0); 4454 } 4455 hookTypesUpdateIndexDev = -1; 4456 ReactSharedInternals.H = HooksDispatcherOnRerenderInDEV; 4457 children = callComponentInDEV(Component, props, secondArg); 4458 } while (didScheduleRenderPhaseUpdateDuringThisPass); 4459 return children; 4460 } 4461 function TransitionAwareHostComponent() { 4462 var dispatcher = ReactSharedInternals.H, maybeThenable = dispatcher.useState()[0]; 4463 maybeThenable = "function" === typeof maybeThenable.then ? useThenable(maybeThenable) : maybeThenable; 4464 dispatcher = dispatcher.useState()[0]; 4465 (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher && (currentlyRenderingFiber.flags |= 1024); 4466 return maybeThenable; 4467 } 4468 function checkDidRenderIdHook() { 4469 var didRenderIdHook = 0 !== localIdCounter; 4470 localIdCounter = 0; 4471 return didRenderIdHook; 4472 } 4473 function bailoutHooks(current, workInProgress, lanes) { 4474 workInProgress.updateQueue = current.updateQueue; 4475 workInProgress.flags = (workInProgress.mode & StrictEffectsMode) !== NoMode ? workInProgress.flags & -805308421 : workInProgress.flags & -2053; 4476 current.lanes &= ~lanes; 4477 }
vendor: 8,572 bytes, lines 4478-4667
4478 function resetHooksOnUnwind(workInProgress) { 4479 if (didScheduleRenderPhaseUpdate) { 4480 for (workInProgress = workInProgress.memoizedState; null !== workInProgress;) { 4481 var queue = workInProgress.queue; 4482 null !== queue && (queue.pending = null); 4483 workInProgress = workInProgress.next; 4484 } 4485 didScheduleRenderPhaseUpdate = !1; 4486 } 4487 renderLanes = 0; 4488 hookTypesDev = workInProgressHook = currentHook = currentlyRenderingFiber = null; 4489 hookTypesUpdateIndexDev = -1; 4490 currentHookNameInDev = null; 4491 didScheduleRenderPhaseUpdateDuringThisPass = !1; 4492 thenableIndexCounter = localIdCounter = 0; 4493 thenableState = null; 4494 } 4495 function mountWorkInProgressHook() { 4496 var hook = { 4497 memoizedState: null, 4498 baseState: null, 4499 baseQueue: null, 4500 queue: null, 4501 next: null 4502 }; 4503 null === workInProgressHook ? currentlyRenderingFiber.memoizedState = workInProgressHook = hook : workInProgressHook = workInProgressHook.next = hook; 4504 return workInProgressHook; 4505 } 4506 function updateWorkInProgressHook() { 4507 if (null === currentHook) { 4508 var nextCurrentHook = currentlyRenderingFiber.alternate; 4509 nextCurrentHook = null !== nextCurrentHook ? nextCurrentHook.memoizedState : null; 4510 } else nextCurrentHook = currentHook.next; 4511 var nextWorkInProgressHook = null === workInProgressHook ? currentlyRenderingFiber.memoizedState : workInProgressHook.next; 4512 if (null !== nextWorkInProgressHook) workInProgressHook = nextWorkInProgressHook, currentHook = nextCurrentHook; 4513 else { 4514 if (null === nextCurrentHook) { 4515 if (null === currentlyRenderingFiber.alternate) throw Error("Update hook called on initial render. This is likely a bug in React. Please file an issue."); 4516 throw Error("Rendered more hooks than during the previous render."); 4517 } 4518 currentHook = nextCurrentHook; 4519 nextCurrentHook = { 4520 memoizedState: currentHook.memoizedState, 4521 baseState: currentHook.baseState, 4522 baseQueue: currentHook.baseQueue, 4523 queue: currentHook.queue, 4524 next: null 4525 }; 4526 null === workInProgressHook ? currentlyRenderingFiber.memoizedState = workInProgressHook = nextCurrentHook : workInProgressHook = workInProgressHook.next = nextCurrentHook; 4527 } 4528 return workInProgressHook; 4529 } 4530 function createFunctionComponentUpdateQueue() { 4531 return { 4532 lastEffect: null, 4533 events: null, 4534 stores: null, 4535 memoCache: null 4536 }; 4537 } 4538 function useThenable(thenable) { 4539 var index = thenableIndexCounter; 4540 thenableIndexCounter += 1; 4541 null === thenableState && (thenableState = createThenableState()); 4542 thenable = trackUsedThenable(thenableState, thenable, index, currentlyRenderingFiber); 4543 index = currentlyRenderingFiber; 4544 null === (null === workInProgressHook ? index.memoizedState : workInProgressHook.next) && (index = index.alternate, ReactSharedInternals.H = null !== index && null !== index.memoizedState ? HooksDispatcherOnUpdateInDEV : HooksDispatcherOnMountInDEV); 4545 return thenable; 4546 } 4547 function use(usable) { 4548 if (null !== usable && "object" === typeof usable) { 4549 if ("function" === typeof usable.then) return useThenable(usable); 4550 if (usable.$$typeof === REACT_RECOVERABLE_TYPE) return; 4551 if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable); 4552 } 4553 throw Error("An unsupported type was passed to use(): " + String(usable)); 4554 } 4555 function useMemoCache(size) { 4556 var memoCache = null, updateQueue = currentlyRenderingFiber.updateQueue; 4557 null !== updateQueue && (memoCache = updateQueue.memoCache); 4558 if (null == memoCache) { 4559 var current = currentlyRenderingFiber.alternate; 4560 null !== current && (current = current.updateQueue, null !== current && (current = current.memoCache, null != current && (memoCache = { 4561 data: current.data.map(function(array) { 4562 return array.slice(); 4563 }), 4564 index: 0 4565 }))); 4566 } 4567 memoCache ??= { 4568 data: [], 4569 index: 0 4570 }; 4571 null === updateQueue && (updateQueue = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = updateQueue); 4572 updateQueue.memoCache = memoCache; 4573 updateQueue = memoCache.data[memoCache.index]; 4574 if (void 0 === updateQueue || ignorePreviousDependencies) for (updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0; current < size; current++) updateQueue[current] = REACT_MEMO_CACHE_SENTINEL; 4575 else updateQueue.length !== size && console.error("Expected a constant size argument for each invocation of useMemoCache. The previous cache was allocated with size %s but size %s was requested.", updateQueue.length, size); 4576 memoCache.index++; 4577 return updateQueue; 4578 } 4579 function basicStateReducer(state, action) { 4580 return "function" === typeof action ? action(state) : action; 4581 } 4582 function mountReducer(reducer, initialArg, init) { 4583 var hook = mountWorkInProgressHook(); 4584 if (void 0 !== init) { 4585 var initialState = init(initialArg); 4586 if (shouldDoubleInvokeUserFnsInHooksDEV) { 4587 setIsStrictModeForDevtools(!0); 4588 try { 4589 init(initialArg); 4590 } finally { 4591 setIsStrictModeForDevtools(!1); 4592 } 4593 } 4594 } else initialState = initialArg; 4595 hook.memoizedState = hook.baseState = initialState; 4596 reducer = { 4597 pending: null, 4598 lanes: 0, 4599 dispatch: null, 4600 lastRenderedReducer: reducer, 4601 lastRenderedState: initialState 4602 }; 4603 hook.queue = reducer; 4604 reducer = reducer.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber, reducer); 4605 return [hook.memoizedState, reducer]; 4606 } 4607 function updateReducer(reducer) { 4608 return updateReducerImpl(updateWorkInProgressHook(), currentHook, reducer); 4609 } 4610 function updateReducerImpl(hook, current, reducer) { 4611 var queue = hook.queue; 4612 if (null === queue) throw Error("Should have a queue. You are likely calling Hooks conditionally, which is not allowed. (https://react.dev/link/invalid-hook-call)"); 4613 queue.lastRenderedReducer = reducer; 4614 var baseQueue = hook.baseQueue, pendingQueue = queue.pending; 4615 if (null !== pendingQueue) { 4616 if (null !== baseQueue) { 4617 var baseFirst = baseQueue.next; 4618 baseQueue.next = pendingQueue.next; 4619 pendingQueue.next = baseFirst; 4620 } 4621 current.baseQueue !== baseQueue && console.error("Internal error: Expected work-in-progress queue to be a clone. This is a bug in React."); 4622 current.baseQueue = baseQueue = pendingQueue; 4623 queue.pending = null; 4624 } 4625 pendingQueue = hook.baseState; 4626 if (null === baseQueue) hook.memoizedState = pendingQueue; 4627 else { 4628 current = baseQueue.next; 4629 var newBaseQueueFirst = baseFirst = null, newBaseQueueLast = null, update = current, didReadFromEntangledAsyncAction = !1; 4630 do { 4631 var updateLane = update.lane & -536870913; 4632 if (updateLane !== update.lane ? (workInProgressRootRenderLanes & updateLane) === updateLane : (renderLanes & updateLane) === updateLane) { 4633 var revertLane = update.revertLane; 4634 if (0 === revertLane) null !== newBaseQueueLast && (newBaseQueueLast = newBaseQueueLast.next = { 4635 lane: 0, 4636 revertLane: 0, 4637 gesture: null, 4638 action: update.action, 4639 hasEagerState: update.hasEagerState, 4640 eagerState: update.eagerState, 4641 next: null 4642 }), updateLane === currentEntangledLane && (didReadFromEntangledAsyncAction = !0); 4643 else if ((renderLanes & revertLane) === revertLane) { 4644 update = update.next; 4645 revertLane === currentEntangledLane && (didReadFromEntangledAsyncAction = !0); 4646 continue; 4647 } else updateLane = { 4648 lane: 0, 4649 revertLane: update.revertLane, 4650 gesture: null, 4651 action: update.action, 4652 hasEagerState: update.hasEagerState, 4653 eagerState: update.eagerState, 4654 next: null 4655 }, null === newBaseQueueLast ? (newBaseQueueFirst = newBaseQueueLast = updateLane, baseFirst = pendingQueue) : newBaseQueueLast = newBaseQueueLast.next = updateLane, currentlyRenderingFiber.lanes |= revertLane, workInProgressRootSkippedLanes |= revertLane; 4656 updateLane = update.action; 4657 shouldDoubleInvokeUserFnsInHooksDEV && reducer(pendingQueue, updateLane); 4658 pendingQueue = update.hasEagerState ? update.eagerState : reducer(pendingQueue, updateLane); 4659 } else revertLane = { 4660 lane: updateLane, 4661 revertLane: update.revertLane, 4662 gesture: update.gesture, 4663 action: update.action, 4664 hasEagerState: update.hasEagerState, 4665 eagerState: update.eagerState, 4666 next: null 4667 }, null === newBaseQueueLast ? (newBaseQueueFirst = newBaseQueueLast = revertLane, baseFirst = pendingQueue) : newBaseQueueLast = newBaseQueueLast.next = revertLane,
4667currentlyRenderingFiber.lanes |= updateLane, workInProgressRootSkippedLanes |= updateLane; 4668 update = update.next; 4669 } while (null !== update && update !== current); 4670 null === newBaseQueueLast ? baseFirst = pendingQueue : newBaseQueueLast.next = newBaseQueueFirst; 4671 if (!objectIs(pendingQueue, hook.memoizedState) && (didReceiveUpdate = !0, didReadFromEntangledAsyncAction && (reducer = currentEntangledActionThenable, null !== reducer))) throw reducer; 4672 hook.memoizedState = pendingQueue; 4673 hook.baseState = baseFirst; 4674 hook.baseQueue = newBaseQueueLast; 4675 queue.lastRenderedState = pendingQueue; 4676 } 4677 null === baseQueue && (queue.lanes = 0); 4678 return [hook.memoizedState, queue.dispatch]; 4679 } 4680 function rerenderReducer(reducer) { 4681 var hook = updateWorkInProgressHook(), queue = hook.queue; 4682 if (null === queue) throw Error("Should have a queue. You are likely calling Hooks conditionally, which is not allowed. (https://react.dev/link/invalid-hook-call)"); 4683 queue.lastRenderedReducer = reducer; 4684 var dispatch = queue.dispatch, lastRenderPhaseUpdate = queue.pending, newState = hook.memoizedState; 4685 if (null !== lastRenderPhaseUpdate) { 4686 queue.pending = null; 4687 var update = lastRenderPhaseUpdate = lastRenderPhaseUpdate.next; 4688 do 4689 newState = reducer(newState, update.action), update = update.next; 4690 while (update !== lastRenderPhaseUpdate); 4691 objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0); 4692 hook.memoizedState = newState; 4693 null === hook.baseQueue && (hook.baseState = newState); 4694 queue.lastRenderedState = newState; 4695 } 4696 return [newState, dispatch]; 4697 } 4698 function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { 4699 var fiber = currentlyRenderingFiber, hook = mountWorkInProgressHook(); 4700 if (isHydrating) { 4701 if (void 0 === getServerSnapshot) throw Error("Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering."); 4702 var nextSnapshot = getServerSnapshot(); 4703 didWarnUncachedGetSnapshot || nextSnapshot === getServerSnapshot() || (console.error("The result of getServerSnapshot should be cached to avoid an infinite loop"), didWarnUncachedGetSnapshot = !0); 4704 } else { 4705 nextSnapshot = getSnapshot(); 4706 didWarnUncachedGetSnapshot || (getServerSnapshot = getSnapshot(), objectIs(nextSnapshot, getServerSnapshot) || (console.error("The result of getSnapshot should be cached to avoid an infinite loop"), didWarnUncachedGetSnapshot = !0)); 4707 if (null === workInProgressRoot) throw Error("Expected a work-in-progress root. This is a bug in React. Please file an issue."); 4708 0 !== (workInProgressRootRenderLanes & 127) || pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot); 4709 } 4710 hook.memoizedState = nextSnapshot; 4711 getServerSnapshot = { 4712 value: nextSnapshot, 4713 getSnapshot 4714 }; 4715 hook.queue = getServerSnapshot; 4716 mountEffect(subscribeToStore.bind(null, fiber, getServerSnapshot, subscribe), [subscribe]); 4717 fiber.flags |= 2048; 4718 pushSimpleEffect(HasEffect | Passive, { destroy: void 0 }, updateStoreInstance.bind(null, fiber, getServerSnapshot, nextSnapshot, getSnapshot), null); 4719 return nextSnapshot; 4720 } 4721 function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { 4722 var fiber = currentlyRenderingFiber, hook = updateWorkInProgressHook(), isHydrating$jscomp$0 = isHydrating; 4723 if (isHydrating$jscomp$0) { 4724 if (void 0 === getServerSnapshot) throw Error("Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering."); 4725 getServerSnapshot = getServerSnapshot(); 4726 } else if (getServerSnapshot = getSnapshot(), !didWarnUncachedGetSnapshot) { 4727 var cachedSnapshot = getSnapshot(); 4728 objectIs(getServerSnapshot, cachedSnapshot) || (console.error("The result of getSnapshot should be cached to avoid an infinite loop"), didWarnUncachedGetSnapshot = !0); 4729 } 4730 if (cachedSnapshot = !objectIs((currentHook || hook).memoizedState, getServerSnapshot)) hook.memoizedState = getServerSnapshot, didReceiveUpdate = !0; 4731 hook = hook.queue; 4732 updateEffectImpl(2048, Passive, subscribeToStore.bind(null, fiber, hook, subscribe), [subscribe]); 4733 subscribe = hook.getSnapshot !== getSnapshot || cachedSnapshot || null !== workInProgressHook && (workInProgressHook.memoizedState.tag & HasEffect) !== NoFlags; 4734 pushSimpleEffect(subscribe ? HasEffect | Passive : Passive, { destroy: void 0 }, updateStoreInstance.bind(null, fiber, hook, getServerSnapshot, getSnapshot), null); 4735 if (subscribe) { 4736 fiber.flags |= 2048; 4737 if (null === workInProgressRoot) throw Error("Expected a work-in-progress root. This is a bug in React. Please file an issue."); 4738 isHydrating$jscomp$0 || 0 !== (renderLanes & 127) || pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot); 4739 } 4740 return getServerSnapshot; 4741 } 4742 function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) { 4743 fiber.flags |= 16384; 4744 fiber = { 4745 getSnapshot, 4746 value: renderedSnapshot 4747 }; 4748 getSnapshot = currentlyRenderingFiber.updateQueue; 4749 null === getSnapshot ? (getSnapshot = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = getSnapshot, getSnapshot.stores = [fiber]) : (renderedSnapshot = getSnapshot.stores, null === renderedSnapshot ? getSnapshot.stores = [fiber] : renderedSnapshot.push(fiber)); 4750 } 4751 function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) { 4752 inst.value = nextSnapshot; 4753 inst.getSnapshot = getSnapshot; 4754 checkIfSnapshotChanged(inst) && forceStoreRerender(fiber); 4755 } 4756 function subscribeToStore(fiber, inst, subscribe) { 4757 return subscribe(function() { 4758 checkIfSnapshotChanged(inst) && (startUpdateTimerByLane(2, "updateSyncExternalStore()", fiber), forceStoreRerender(fiber)); 4759 }); 4760 } 4761 function checkIfSnapshotChanged(inst) { 4762 var latestGetSnapshot = inst.getSnapshot; 4763 inst = inst.value; 4764 try { 4765 var nextValue = latestGetSnapshot(); 4766 return !objectIs(inst, nextValue); 4767 } catch (error) { 4768 return !0; 4769 } 4770 } 4771 function forceStoreRerender(fiber) { 4772 var root = enqueueConcurrentRenderForLane(fiber, 2); 4773 null !== root && scheduleUpdateOnFiber(root, fiber, 2); 4774 } 4775 function mountStateImpl(initialState) { 4776 var hook = mountWorkInProgressHook(); 4777 if ("function" === typeof initialState) { 4778 var initialStateInitializer = initialState; 4779 initialState = initialStateInitializer(); 4780 if (shouldDoubleInvokeUserFnsInHooksDEV) { 4781 setIsStrictModeForDevtools(!0); 4782 try { 4783 initialStateInitializer(); 4784 } finally { 4785 setIsStrictModeForDevtools(!1); 4786 } 4787 } 4788 } 4789 hook.memoizedState = hook.baseState = initialState; 4790 hook.queue = { 4791 pending: null, 4792 lanes: 0, 4793 dispatch: null, 4794 lastRenderedReducer: basicStateReducer, 4795 lastRenderedState: initialState 4796 }; 4797 return hook; 4798 } 4799 function mountState(initialState) { 4800 initialState = mountStateImpl(initialState); 4801 var queue = initialState.queue, dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue); 4802 queue.dispatch = dispatch; 4803 return [initialState.memoizedState, dispatch]; 4804 } 4805 function mountOptimistic(passthrough) { 4806 var hook = mountWorkInProgressHook(); 4807 hook.memoizedState = hook.baseState = passthrough; 4808 var queue = { 4809 pending: null, 4810 lanes: 0, 4811 dispatch: null, 4812 lastRenderedReducer: null, 4813 lastRenderedState: null 4814 }; 4815 hook.queue = queue; 4816 hook = dispatchOptimisticSetState.bind(null, currentlyRenderingFiber, !0, queue); 4817 queue.dispatch = hook; 4818 return [passthrough, hook]; 4819 } 4820 function updateOptimistic(passthrough, reducer) { 4821 return updateOptimisticImpl(updateWorkInProgressHook(), currentHook, passthrough, reducer); 4822 } 4823 function updateOptimisticImpl(hook, current, passthrough, reducer) { 4824 hook.baseState = passthrough; 4825 return updateReducerImpl(hook, currentHook, "function" === typeof reducer ? reducer : basicStateReducer); 4826 } 4827 function rerenderOptimistic(passthrough, reducer) { 4828 var hook = updateWorkInProgressHook(); 4829 if (null !== currentHook) return updateOptimisticImpl(hook, currentHook, passthrough, reducer); 4830 hook.baseState = passthrough; 4831 return [passthrough, hook.queue.dispatch]; 4832 } 4833 function dispatchActionState(fiber, actionQueue, setPendingState, setState, payload) { 4834 if (isRenderPhaseUpdate(fiber)) throw Error("Cannot update action state while rendering."); 4835 fiber = actionQueue.action; 4836 if (null !== fiber) { 4837 var actionNode = { 4838 payload, 4839 action: fiber, 4840 next: null, 4841 isTransition: !0, 4842 status: "pending", 4843 value: null, 4844 reason: null, 4845 listeners: [], 4846 then: function(listener) { 4847 actionNode.listeners.push(listener); 4848 } 4849 }; 4850 null !== ReactSharedInternals.T ? setPendingState(!0) : actionNode.isTransition = !1; 4851 setState(actionNode); 4852 setPendingState = actionQueue.pending; 4853 null === setPendingState ? (actionNode.next = actionQueue.pending = actionNode, runActionStateAction(action
vendor: 2,277 bytes, lines 4853-4879
4853Queue, actionNode)) : (actionNode.next = setPendingState.next, actionQueue.pending = setPendingState.next = actionNode); 4854 } 4855 } 4856 function runActionStateAction(actionQueue, node) { 4857 var action = node.action, payload = node.payload, prevState = actionQueue.state; 4858 if (node.isTransition) { 4859 var prevTransition = ReactSharedInternals.T, currentTransition = {}; 4860 currentTransition.types = null !== prevTransition ? prevTransition.types : null; 4861 currentTransition._updatedFibers = /* @__PURE__ */ new Set(); 4862 ReactSharedInternals.T = currentTransition; 4863 try { 4864 var returnValue = action(prevState, payload), onStartTransitionFinish = ReactSharedInternals.S; 4865 null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue); 4866 handleActionReturnValue(actionQueue, node, returnValue); 4867 } catch (error) { 4868 onActionError(actionQueue, node, error); 4869 } finally { 4870 null !== prevTransition && null !== currentTransition.types && (null !== prevTransition.types && prevTransition.types !== currentTransition.types && console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."), prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition, null === prevTransition && currentTransition._updatedFibers && (actionQueue = currentTransition._updatedFibers.size, currentTransition._updatedFibers.clear(), 10 < actionQueue && console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.")); 4871 } 4872 } else try { 4873 currentTransition = action(prevState, payload), handleActionReturnValue(actionQueue, node, currentTransition); 4874 } catch (error$5) { 4875 onActionError(actionQueue, node, error$5); 4876 } 4877 } 4878 function handleActionReturnValue(actionQueue, node, returnValue) { 4879 null !== returnValue && "object" === typeof returnValue && "function" === typeof returnValue.then ? (ReactSharedInternals.asyncTransitions++, returnValue.then(releaseAsyncTransition, releaseAsyncTransition), returnValue.then(function(nextState) {
vendor: 9,745 bytes, lines 4880-5100
4880 onActionSuccess(actionQueue, node, nextState); 4881 }, function(error) { 4882 return onActionError(actionQueue, node, error); 4883 }), node.isTransition || console.error("An async function with useActionState was called outside of a transition. This is likely not what you intended (for example, isPending will not update correctly). Either call the returned function inside startTransition, or pass it to an `action` or `formAction` prop.")) : onActionSuccess(actionQueue, node, returnValue); 4884 } 4885 function onActionSuccess(actionQueue, actionNode, nextState) { 4886 actionNode.status = "fulfilled"; 4887 actionNode.value = nextState; 4888 notifyActionListeners(actionNode); 4889 actionQueue.state = nextState; 4890 actionNode = actionQueue.pending; 4891 null !== actionNode && (nextState = actionNode.next, nextState === actionNode ? actionQueue.pending = null : (nextState = nextState.next, actionNode.next = nextState, runActionStateAction(actionQueue, nextState))); 4892 } 4893 function onActionError(actionQueue, actionNode, error) { 4894 var last = actionQueue.pending; 4895 actionQueue.pending = null; 4896 if (null !== last) { 4897 last = last.next; 4898 do 4899 actionNode.status = "rejected", actionNode.reason = error, notifyActionListeners(actionNode), actionNode = actionNode.next; 4900 while (actionNode !== last); 4901 } 4902 actionQueue.action = null; 4903 } 4904 function notifyActionListeners(actionNode) { 4905 actionNode = actionNode.listeners; 4906 for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])(); 4907 } 4908 function actionStateReducer(oldState, newState) { 4909 return newState; 4910 } 4911 function mountActionState(action, initialStateProp) { 4912 if (isHydrating) { 4913 var ssrFormState = workInProgressRoot.formState; 4914 if (null !== ssrFormState) { 4915 a: { 4916 var isMatching = currentlyRenderingFiber; 4917 if (isHydrating) { 4918 if (nextHydratableInstance) { 4919 b: { 4920 var markerInstance = nextHydratableInstance; 4921 for (var inRootOrSingleton = rootOrSingletonContext; 8 !== markerInstance.nodeType;) { 4922 if (!inRootOrSingleton) { 4923 markerInstance = null; 4924 break b; 4925 } 4926 markerInstance = getNextHydratable(markerInstance.nextSibling); 4927 if (null === markerInstance) { 4928 markerInstance = null; 4929 break b; 4930 } 4931 } 4932 inRootOrSingleton = markerInstance.data; 4933 markerInstance = inRootOrSingleton === FORM_STATE_IS_MATCHING || inRootOrSingleton === FORM_STATE_IS_NOT_MATCHING ? markerInstance : null; 4934 } 4935 if (markerInstance) { 4936 nextHydratableInstance = getNextHydratable(markerInstance.nextSibling); 4937 isMatching = markerInstance.data === FORM_STATE_IS_MATCHING; 4938 break a; 4939 } 4940 } 4941 throwOnHydrationMismatch(isMatching); 4942 } 4943 isMatching = !1; 4944 } 4945 isMatching && (initialStateProp = ssrFormState[0]); 4946 } 4947 } 4948 ssrFormState = mountWorkInProgressHook(); 4949 ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp; 4950 isMatching = { 4951 pending: null, 4952 lanes: 0, 4953 dispatch: null, 4954 lastRenderedReducer: actionStateReducer, 4955 lastRenderedState: initialStateProp 4956 }; 4957 ssrFormState.queue = isMatching; 4958 ssrFormState = dispatchSetState.bind(null, currentlyRenderingFiber, isMatching); 4959 isMatching.dispatch = ssrFormState; 4960 isMatching = mountStateImpl(!1); 4961 inRootOrSingleton = dispatchOptimisticSetState.bind(null, currentlyRenderingFiber, !1, isMatching.queue); 4962 isMatching = mountWorkInProgressHook(); 4963 markerInstance = { 4964 state: initialStateProp, 4965 dispatch: null, 4966 action, 4967 pending: null 4968 }; 4969 isMatching.queue = markerInstance; 4970 ssrFormState = dispatchActionState.bind(null, currentlyRenderingFiber, markerInstance, inRootOrSingleton, ssrFormState); 4971 markerInstance.dispatch = ssrFormState; 4972 isMatching.memoizedState = action; 4973 return [ 4974 initialStateProp, 4975 ssrFormState, 4976 !1 4977 ]; 4978 } 4979 function updateActionState(action) { 4980 return updateActionStateImpl(updateWorkInProgressHook(), currentHook, action); 4981 } 4982 function updateActionStateImpl(stateHook, currentStateHook, action) { 4983 currentStateHook = updateReducerImpl(stateHook, currentStateHook, actionStateReducer)[0]; 4984 stateHook = updateReducer(basicStateReducer)[0]; 4985 if ("object" === typeof currentStateHook && null !== currentStateHook && "function" === typeof currentStateHook.then) try { 4986 var state = useThenable(currentStateHook); 4987 } catch (x) { 4988 if (x === SuspenseException) throw SuspenseActionException; 4989 throw x; 4990 } 4991 else state = currentStateHook; 4992 currentStateHook = updateWorkInProgressHook(); 4993 var actionQueue = currentStateHook.queue, dispatch = actionQueue.dispatch; 4994 action !== currentStateHook.memoizedState && (currentlyRenderingFiber.flags |= 2048, pushSimpleEffect(HasEffect | Passive, { destroy: void 0 }, actionStateActionEffect.bind(null, actionQueue, action), null)); 4995 return [ 4996 state, 4997 dispatch, 4998 stateHook 4999 ]; 5000 } 5001 function actionStateActionEffect(actionQueue, action) { 5002 actionQueue.action = action; 5003 } 5004 function rerenderActionState(action) { 5005 var stateHook = updateWorkInProgressHook(), currentStateHook = currentHook; 5006 if (null !== currentStateHook) return updateActionStateImpl(stateHook, currentStateHook, action); 5007 updateWorkInProgressHook(); 5008 stateHook = stateHook.memoizedState; 5009 currentStateHook = updateWorkInProgressHook(); 5010 var dispatch = currentStateHook.queue.dispatch; 5011 currentStateHook.memoizedState = action; 5012 return [ 5013 stateHook, 5014 dispatch, 5015 !1 5016 ]; 5017 } 5018 function pushSimpleEffect(tag, inst, create, deps) { 5019 tag = { 5020 tag, 5021 create, 5022 deps, 5023 inst, 5024 next: null 5025 }; 5026 inst = currentlyRenderingFiber.updateQueue; 5027 null === inst && (inst = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = inst); 5028 create = inst.lastEffect; 5029 null === create ? inst.lastEffect = tag.next = tag : (deps = create.next, create.next = tag, tag.next = deps, inst.lastEffect = tag); 5030 return tag; 5031 } 5032 function mountRef(initialValue) { 5033 var hook = mountWorkInProgressHook(); 5034 initialValue = { current: initialValue }; 5035 return hook.memoizedState = initialValue; 5036 } 5037 function mountEffectImpl(fiberFlags, hookFlags, create, deps) { 5038 var hook = mountWorkInProgressHook(); 5039 currentlyRenderingFiber.flags |= fiberFlags; 5040 hook.memoizedState = pushSimpleEffect(HasEffect | hookFlags, { destroy: void 0 }, create, void 0 === deps ? null : deps); 5041 } 5042 function updateEffectImpl(fiberFlags, hookFlags, create, deps) { 5043 var hook = updateWorkInProgressHook(); 5044 deps = void 0 === deps ? null : deps; 5045 var inst = hook.memoizedState.inst; 5046 null !== currentHook && null !== deps && areHookInputsEqual(deps, currentHook.memoizedState.deps) ? hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps) : (currentlyRenderingFiber.flags |= fiberFlags, hook.memoizedState = pushSimpleEffect(HasEffect | hookFlags, inst, create, deps)); 5047 } 5048 function mountEffect(create, deps) { 5049 (currentlyRenderingFiber.mode & StrictEffectsMode) !== NoMode ? mountEffectImpl(545261568, Passive, create, deps) : mountEffectImpl(8390656, Passive, create, deps); 5050 } 5051 function useEffectEventImpl(payload) { 5052 currentlyRenderingFiber.flags |= 4; 5053 var componentUpdateQueue = currentlyRenderingFiber.updateQueue; 5054 if (null === componentUpdateQueue) componentUpdateQueue = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = componentUpdateQueue, componentUpdateQueue.events = [payload]; 5055 else { 5056 var events = componentUpdateQueue.events; 5057 null === events ? componentUpdateQueue.events = [payload] : events.push(payload); 5058 } 5059 } 5060 function mountEvent(callback) { 5061 var hook = mountWorkInProgressHook(), ref = { impl: callback }; 5062 hook.memoizedState = ref; 5063 return function() { 5064 if ((executionContext & RenderContext) !== NoContext) throw Error("A function wrapped in useEffectEvent can't be called during rendering."); 5065 return ref.impl.apply(void 0, arguments); 5066 }; 5067 } 5068 function updateEvent(callback) { 5069 var ref = updateWorkInProgressHook().memoizedState; 5070 useEffectEventImpl({ 5071 ref, 5072 nextImpl: callback 5073 }); 5074 return function() { 5075 if ((executionContext & RenderContext) !== NoContext) throw Error("A function wrapped in useEffectEvent can't be called during rendering."); 5076 return ref.impl.apply(void 0, arguments); 5077 }; 5078 } 5079 function mountLayoutEffect(create, deps) { 5080 var fiberFlags = 4194308; 5081 (currentlyRenderingFiber.mode & StrictEffectsMode) !== NoMode && (fiberFlags |= 268435456); 5082 return mountEffectImpl(fiberFlags, Layout, create, deps); 5083 } 5084 function imperativeHandleEffect(create, ref) { 5085 if ("function" === typeof ref) { 5086 create = create(); 5087 var refCleanup = ref(create); 5088 return function() { 5089 "function" === typeof refCleanup ? refCleanup() : ref(null); 5090 }; 5091 } 5092 if (null !== ref && void 0 !== ref) return ref.hasOwnProperty("current") || console.error("Expected useImperativeHandle() first argument to either be a ref callback or React.createRef() object. Instead received: %s.", "an object with keys {" + Object.keys(ref).join(", ") + "}"), create = create(), ref.current = create, function() { 5093 ref.current = null; 5094 }; 5095 } 5096 function mountImperativeHandle(ref, create, deps) { 5097 "function" !== typeof create && console.error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", null !== create ? typeof create : "null"); 5098 deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null; 5099 var fiberFlags = 4194308; 5100 (currentlyRenderingFiber.mode & StrictEffectsMode) !== NoMode && (fiberFlags |= 268435456);
vendor: 8,046 bytes, lines 5101-5261
5101 mountEffectImpl(fiberFlags, Layout, imperativeHandleEffect.bind(null, create, ref), deps); 5102 } 5103 function updateImperativeHandle(ref, create, deps) { 5104 "function" !== typeof create && console.error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", null !== create ? typeof create : "null"); 5105 deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null; 5106 updateEffectImpl(4, Layout, imperativeHandleEffect.bind(null, create, ref), deps); 5107 } 5108 function mountCallback(callback, deps) { 5109 mountWorkInProgressHook().memoizedState = [callback, void 0 === deps ? null : deps]; 5110 return callback; 5111 } 5112 function updateCallback(callback, deps) { 5113 var hook = updateWorkInProgressHook(); 5114 deps = void 0 === deps ? null : deps; 5115 var prevState = hook.memoizedState; 5116 if (null !== deps && areHookInputsEqual(deps, prevState[1])) return prevState[0]; 5117 hook.memoizedState = [callback, deps]; 5118 return callback; 5119 } 5120 function mountMemo(nextCreate, deps) { 5121 var hook = mountWorkInProgressHook(); 5122 deps = void 0 === deps ? null : deps; 5123 var nextValue = nextCreate(); 5124 if (shouldDoubleInvokeUserFnsInHooksDEV) { 5125 setIsStrictModeForDevtools(!0); 5126 try { 5127 nextCreate(); 5128 } finally { 5129 setIsStrictModeForDevtools(!1); 5130 } 5131 } 5132 hook.memoizedState = [nextValue, deps]; 5133 return nextValue; 5134 } 5135 function updateMemo(nextCreate, deps) { 5136 var hook = updateWorkInProgressHook(); 5137 deps = void 0 === deps ? null : deps; 5138 var prevState = hook.memoizedState; 5139 if (null !== deps && areHookInputsEqual(deps, prevState[1])) return prevState[0]; 5140 prevState = nextCreate(); 5141 if (shouldDoubleInvokeUserFnsInHooksDEV) { 5142 setIsStrictModeForDevtools(!0); 5143 try { 5144 nextCreate(); 5145 } finally { 5146 setIsStrictModeForDevtools(!1); 5147 } 5148 } 5149 hook.memoizedState = [prevState, deps]; 5150 return prevState; 5151 } 5152 function mountDeferredValue(value, initialValue) { 5153 return mountDeferredValueImpl(mountWorkInProgressHook(), value, initialValue); 5154 } 5155 function updateDeferredValue(value, initialValue) { 5156 return updateDeferredValueImpl(updateWorkInProgressHook(), currentHook.memoizedState, value, initialValue); 5157 } 5158 function rerenderDeferredValue(value, initialValue) { 5159 var hook = updateWorkInProgressHook(); 5160 return null === currentHook ? mountDeferredValueImpl(hook, value, initialValue) : updateDeferredValueImpl(hook, currentHook.memoizedState, value, initialValue); 5161 } 5162 function mountDeferredValueImpl(hook, value, initialValue) { 5163 if (void 0 === initialValue || 0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) return hook.memoizedState = value; 5164 hook.memoizedState = initialValue; 5165 hook = requestDeferredLane(); 5166 currentlyRenderingFiber.lanes |= hook; 5167 workInProgressRootSkippedLanes |= hook; 5168 return initialValue; 5169 } 5170 function updateDeferredValueImpl(hook, prevValue, value, initialValue) { 5171 if (objectIs(value, prevValue)) return value; 5172 if (null !== currentTreeHiddenStackCursor.current) return hook = mountDeferredValueImpl(hook, value, initialValue), objectIs(hook, prevValue) || (didReceiveUpdate = !0), hook; 5173 if (0 === (renderLanes & 106) || 0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) return didReceiveUpdate = !0, hook.memoizedState = value; 5174 hook = requestDeferredLane(); 5175 currentlyRenderingFiber.lanes |= hook; 5176 workInProgressRootSkippedLanes |= hook; 5177 return prevValue; 5178 } 5179 function releaseAsyncTransition() { 5180 ReactSharedInternals.asyncTransitions--; 5181 } 5182 function startTransition(fiber, queue, pendingState, finishedState, callback) { 5183 var previousPriority = ReactDOMSharedInternals.p; 5184 ReactDOMSharedInternals.p = 0 !== previousPriority && previousPriority < ContinuousEventPriority ? previousPriority : ContinuousEventPriority; 5185 var prevTransition = ReactSharedInternals.T, currentTransition = {}; 5186 currentTransition.types = null !== prevTransition ? prevTransition.types : null; 5187 currentTransition._updatedFibers = /* @__PURE__ */ new Set(); 5188 ReactSharedInternals.T = currentTransition; 5189 dispatchOptimisticSetState(fiber, !1, queue, pendingState); 5190 try { 5191 var returnValue = callback(), onStartTransitionFinish = ReactSharedInternals.S; 5192 null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue); 5193 if (null !== returnValue && "object" === typeof returnValue && "function" === typeof returnValue.then) { 5194 ReactSharedInternals.asyncTransitions++; 5195 returnValue.then(releaseAsyncTransition, releaseAsyncTransition); 5196 var thenableForFinishedState = chainThenableValue(returnValue, finishedState); 5197 dispatchSetStateInternal(fiber, queue, thenableForFinishedState, requestUpdateLane(fiber)); 5198 } else dispatchSetStateInternal(fiber, queue, finishedState, requestUpdateLane(fiber)); 5199 } catch (error) { 5200 dispatchSetStateInternal(fiber, queue, { 5201 then: function() {}, 5202 status: "rejected", 5203 reason: error 5204 }, requestUpdateLane(fiber)); 5205 } finally { 5206 ReactDOMSharedInternals.p = previousPriority, null !== prevTransition && null !== currentTransition.types && (null !== prevTransition.types && prevTransition.types !== currentTransition.types && console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."), prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition, null === prevTransition && currentTransition._updatedFibers && (fiber = currentTransition._updatedFibers.size, currentTransition._updatedFibers.clear(), 10 < fiber && console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.")); 5207 } 5208 } 5209 function startHostTransition(formFiber, pendingState, action, formData) { 5210 if (5 !== formFiber.tag) throw Error("Expected the form instance to be a HostComponent. This is a bug in React."); 5211 var queue = ensureFormComponentIsStateful(formFiber).queue; 5212 startHostActionTimer(formFiber); 5213 startTransition(formFiber, queue, pendingState, NotPendingTransition, null === action ? noop : function() { 5214 requestFormReset$1(formFiber); 5215 return action(formData); 5216 }); 5217 } 5218 function ensureFormComponentIsStateful(formFiber) { 5219 var existingStateHook = formFiber.memoizedState; 5220 if (null !== existingStateHook) return existingStateHook; 5221 existingStateHook = { 5222 memoizedState: NotPendingTransition, 5223 baseState: NotPendingTransition, 5224 baseQueue: null, 5225 queue: { 5226 pending: null, 5227 lanes: 0, 5228 dispatch: null, 5229 lastRenderedReducer: basicStateReducer, 5230 lastRenderedState: NotPendingTransition 5231 }, 5232 next: null 5233 }; 5234 var initialResetState = {}; 5235 existingStateHook.next = { 5236 memoizedState: initialResetState, 5237 baseState: initialResetState, 5238 baseQueue: null, 5239 queue: { 5240 pending: null, 5241 lanes: 0, 5242 dispatch: null, 5243 lastRenderedReducer: basicStateReducer, 5244 lastRenderedState: initialResetState 5245 }, 5246 next: null 5247 }; 5248 formFiber.memoizedState = existingStateHook; 5249 formFiber = formFiber.alternate; 5250 null !== formFiber && (formFiber.memoizedState = existingStateHook); 5251 return existingStateHook; 5252 } 5253 function requestFormReset$1(formFiber) { 5254 null === ReactSharedInternals.T && console.error("requestFormReset was called outside a transition or action. To fix, move to an action, or wrap with startTransition."); 5255 var stateHook = ensureFormComponentIsStateful(formFiber); 5256 null === stateHook.next && (stateHook = formFiber.alternate.memoizedState); 5257 dispatchSetStateInternal(formFiber, stateHook.next.queue, {}, requestUpdateLane(formFiber)); 5258 } 5259 function mountTransition() { 5260 var stateHook = mountStateImpl(!1); 5261 stateHook = startTransition.bind(null, currentlyRenderingFiber, stateHook.queue, !0, !1);
vendor: 3,078 bytes, lines 5262-5320
5262 mountWorkInProgressHook().memoizedState = stateHook; 5263 return [!1, stateHook]; 5264 } 5265 function updateTransition() { 5266 var booleanOrThenable = updateReducer(basicStateReducer)[0], start = updateWorkInProgressHook().memoizedState; 5267 return ["boolean" === typeof booleanOrThenable ? booleanOrThenable : useThenable(booleanOrThenable), start]; 5268 } 5269 function rerenderTransition() { 5270 var booleanOrThenable = rerenderReducer(basicStateReducer)[0], start = updateWorkInProgressHook().memoizedState; 5271 return ["boolean" === typeof booleanOrThenable ? booleanOrThenable : useThenable(booleanOrThenable), start]; 5272 } 5273 function useHostTransitionStatus() { 5274 return readContext(HostTransitionContext); 5275 } 5276 function mountId() { 5277 var hook = mountWorkInProgressHook(), identifierPrefix = workInProgressRoot.identifierPrefix; 5278 if (isHydrating) { 5279 var treeId = treeContextOverflow; 5280 var idWithLeadingBit = treeContextId; 5281 treeId = (idWithLeadingBit & ~(1 << 32 - clz32(idWithLeadingBit) - 1)).toString(32) + treeId; 5282 identifierPrefix = "_" + identifierPrefix + "R_" + treeId; 5283 treeId = localIdCounter++; 5284 0 < treeId && (identifierPrefix += "H" + treeId.toString(32)); 5285 identifierPrefix += "_"; 5286 } else treeId = globalClientIdCounter++, identifierPrefix = "_" + identifierPrefix + "r_" + treeId.toString(32) + "_"; 5287 return hook.memoizedState = identifierPrefix; 5288 } 5289 function mountRefresh() { 5290 return mountWorkInProgressHook().memoizedState = refreshCache.bind(null, currentlyRenderingFiber); 5291 } 5292 function refreshCache(fiber, seedKey) { 5293 for (var provider = fiber.return; null !== provider;) { 5294 switch (provider.tag) { 5295 case 24: 5296 case 3: 5297 var lane = requestUpdateLane(provider), refreshUpdate = createUpdate(lane), root = enqueueUpdate(provider, refreshUpdate, lane); 5298 null !== root && (startUpdateTimerByLane(lane, "refresh()", fiber), scheduleUpdateOnFiber(root, provider, lane), entangleTransitions(root, provider, lane)); 5299 fiber = createCache(); 5300 null !== seedKey && void 0 !== seedKey && null !== root && console.error("The seed argument is not enabled outside experimental channels."); 5301 refreshUpdate.payload = { cache: fiber }; 5302 return; 5303 } 5304 provider = provider.return; 5305 } 5306 } 5307 function dispatchReducerAction(fiber, queue, action) { 5308 var args = arguments; 5309 "function" === typeof args[3] && console.error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect()."); 5310 args = requestUpdateLane(fiber); 5311 var update = { 5312 lane: args, 5313 revertLane: 0, 5314 gesture: null, 5315 action, 5316 hasEagerState: !1, 5317 eagerState: null, 5318 next: null 5319 }; 5320 isRenderPhaseUpdate(fiber) ? enqueueRenderPhaseUpdate(queue, update) : (update = enqueueConcurrentHookUpdate(fiber, queue, update, args), null !== update && (startUpdateTimerByLane(args, "dispatch()", fiber), scheduleUpdateOnFiber(update, fiber, args), entangleTransitionUpdate(update, queue, args
5320))); 5321 } 5322 function dispatchSetState(fiber, queue, action) { 5323 var args = arguments; 5324 "function" === typeof args[3] && console.error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect()."); 5325 args = requestUpdateLane(fiber); 5326 dispatchSetStateInternal(fiber, queue, action, args) && startUpdateTimerByLane(args, "setState()", fiber); 5327 } 5328 function dispatchSetStateInternal(fiber, queue, action, lane) { 5329 var update = { 5330 lane, 5331 revertLane: 0, 5332 gesture: null, 5333 action, 5334 hasEagerState: !1, 5335 eagerState: null, 5336 next: null 5337 }; 5338 if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update); 5339 else { 5340 var alternate = fiber.alternate; 5341 if (0 === fiber.lanes && (null === alternate || 0 === alternate.lanes) && (alternate = queue.lastRenderedReducer, null !== alternate)) { 5342 var prevDispatcher = ReactSharedInternals.H; 5343 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 5344 try { 5345 var currentState = queue.lastRenderedState, eagerState = alternate(currentState, action); 5346 update.hasEagerState = !0; 5347 update.eagerState = eagerState; 5348 if (objectIs(eagerState, currentState)) return enqueueUpdate$1(fiber, queue, update, 0), null === workInProgressRoot && finishQueueingConcurrentUpdates(), !1; 5349 } catch (error) {} finally { 5350 ReactSharedInternals.H = prevDispatcher; 5351 } 5352 } 5353 action = enqueueConcurrentHookUpdate(fiber, queue, update, lane); 5354 if (null !== action) return scheduleUpdateOnFiber(action, fiber, lane), entangleTransitionUpdate(action, queue, lane), !0; 5355 } 5356 return !1; 5357 } 5358 function dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) { 5359 null === ReactSharedInternals.T && 0 === currentEntangledLane && console.error("An optimistic state update occurred outside a transition or action. To fix, move the update to an action, or wrap with startTransition."); 5360 action = { 5361 lane: 2, 5362 revertLane: requestTransitionLane(), 5363 gesture: null, 5364 action, 5365 hasEagerState: !1, 5366 eagerState: null, 5367 next: null 5368 }; 5369 if (isRenderPhaseUpdate(fiber)) { 5370 if (throwIfDuringRender) throw Error("Cannot update optimistic state while rendering."); 5371 console.error("Cannot call startTransition while rendering."); 5372 } else throwIfDuringRender = enqueueConcurrentHookUpdate(fiber, queue, action, 2), null !== throwIfDuringRender && (startUpdateTimerByLane(2, "setOptimistic()", fiber), scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2)); 5373 } 5374 function isRenderPhaseUpdate(fiber) { 5375 var alternate = fiber.alternate; 5376 return fiber === currentlyRenderingFiber || null !== alternate && alternate === currentlyRenderingFiber; 5377 } 5378 function enqueueRenderPhaseUpdate(queue, update) { 5379 didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = !0; 5380 var pending = queue.pending; 5381 null === pending ? update.next = update : (update.next = pending.next, pending.next = update); 5382 queue.pending = update; 5383 } 5384 function entangleTransitionUpdate(root, queue, lane) { 5385 if (0 !== (lane & 4194048)) { 5386 var queueLanes = queue.lanes; 5387 queueLanes &= root.pendingLanes; 5388 lane |= queueLanes; 5389 queue.lanes = lane; 5390 markRootEntangled(root, lane); 5391 } 5392 }
vendor: 6,111 bytes, lines 5393-5494
5393 function warnOnInvalidCallback(callback) { 5394 if (null !== callback && "function" !== typeof callback) { 5395 var key = String(callback); 5396 didWarnOnInvalidCallback.has(key) || (didWarnOnInvalidCallback.add(key), console.error("Expected the last optional `callback` argument to be a function. Instead received: %s.", callback)); 5397 } 5398 } 5399 function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) { 5400 var prevState = workInProgress.memoizedState, partialState = getDerivedStateFromProps(nextProps, prevState); 5401 if (workInProgress.mode & StrictLegacyMode) { 5402 setIsStrictModeForDevtools(!0); 5403 try { 5404 partialState = getDerivedStateFromProps(nextProps, prevState); 5405 } finally { 5406 setIsStrictModeForDevtools(!1); 5407 } 5408 } 5409 void 0 === partialState && (ctor = getComponentNameFromType(ctor) || "Component", didWarnAboutUndefinedDerivedState.has(ctor) || (didWarnAboutUndefinedDerivedState.add(ctor), console.error("%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined.", ctor))); 5410 prevState = null === partialState || void 0 === partialState ? prevState : assign({}, prevState, partialState); 5411 workInProgress.memoizedState = prevState; 5412 0 === workInProgress.lanes && (workInProgress.updateQueue.baseState = prevState); 5413 } 5414 function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) { 5415 var instance = workInProgress.stateNode; 5416 if ("function" === typeof instance.shouldComponentUpdate) { 5417 oldProps = instance.shouldComponentUpdate(newProps, newState, nextContext); 5418 if (workInProgress.mode & StrictLegacyMode) { 5419 setIsStrictModeForDevtools(!0); 5420 try { 5421 oldProps = instance.shouldComponentUpdate(newProps, newState, nextContext); 5422 } finally { 5423 setIsStrictModeForDevtools(!1); 5424 } 5425 } 5426 void 0 === oldProps && console.error("%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", getComponentNameFromType(ctor) || "Component"); 5427 return oldProps; 5428 } 5429 return ctor.prototype && ctor.prototype.isPureReactComponent ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState) : !0; 5430 } 5431 function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) { 5432 var oldState = instance.state; 5433 "function" === typeof instance.componentWillReceiveProps && instance.componentWillReceiveProps(newProps, nextContext); 5434 "function" === typeof instance.UNSAFE_componentWillReceiveProps && instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); 5435 instance.state !== oldState && (workInProgress = getComponentNameFromFiber(workInProgress) || "Component", didWarnAboutStateAssignmentForComponent.has(workInProgress) || (didWarnAboutStateAssignmentForComponent.add(workInProgress), console.error("%s.componentWillReceiveProps(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", workInProgress)), classComponentUpdater.enqueueReplaceState(instance, instance.state, null)); 5436 } 5437 function resolveClassComponentProps(Component, baseProps) { 5438 var newProps = baseProps; 5439 if ("ref" in baseProps) { 5440 newProps = {}; 5441 for (var propName in baseProps) "ref" !== propName && (newProps[propName] = baseProps[propName]); 5442 } 5443 if (Component = Component.defaultProps) { 5444 newProps === baseProps && (newProps = assign({}, newProps)); 5445 for (var _propName in Component) void 0 === newProps[_propName] && (newProps[_propName] = Component[_propName]); 5446 } 5447 return newProps; 5448 } 5449 function defaultOnUncaughtError(error) { 5450 reportGlobalError(error); 5451 console.warn("%s\n\n%s\n", componentName ? "An error occurred in the <" + componentName + "> component." : "An error occurred in one of your React components.", "Consider adding an error boundary to your tree to customize error handling behavior.\nVisit https://react.dev/link/error-boundaries to learn more about error boundaries."); 5452 } 5453 function defaultOnCaughtError(error) { 5454 var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component." : "The above error occurred in one of your React components.", recreateMessage = "React will try to recreate this component tree from scratch using the error boundary you provided, " + ((errorBoundaryName || "Anonymous") + "."); 5455 if ("object" === typeof error && null !== error && "string" === typeof error.environmentName) { 5456 var JSCompiler_inline_result = error.environmentName; 5457 error = [ 5458 "%o\n\n%s\n\n%s\n", 5459 error, 5460 componentNameMessage, 5461 recreateMessage 5462 ].slice(0); 5463 "string" === typeof error[0] ? error.splice(0, 1, badgeFormat + " " + error[0], badgeStyle, pad + JSCompiler_inline_result + pad, resetStyle) : error.splice(0, 0, badgeFormat, badgeStyle, pad + JSCompiler_inline_result + pad, resetStyle); 5464 error.unshift(console); 5465 JSCompiler_inline_result = bind.apply(console.error, error); 5466 JSCompiler_inline_result(); 5467 } else console.error("%o\n\n%s\n\n%s\n", error, componentNameMessage, recreateMessage); 5468 } 5469 function defaultOnRecoverableError(error) { 5470 reportGlobalError(error); 5471 } 5472 function logUncaughtError(root, errorInfo) { 5473 try { 5474 componentName = errorInfo.source ? getComponentNameFromFiber(errorInfo.source) : null; 5475 errorBoundaryName = null; 5476 var error = errorInfo.value; 5477 if (null !== ReactSharedInternals.actQueue) ReactSharedInternals.thrownErrors.push(error); 5478 else { 5479 var onUncaughtError = root.onUncaughtError; 5480 onUncaughtError(error, { componentStack: errorInfo.stack }); 5481 } 5482 } catch (e$6) { 5483 setTimeout(function() { 5484 throw e$6; 5485 }); 5486 } 5487 } 5488 function logCaughtError(root, boundary, errorInfo) { 5489 try { 5490 componentName = errorInfo.source ? getComponentNameFromFiber(errorInfo.source) : null; 5491 errorBoundaryName = getComponentNameFromFiber(boundary); 5492 var onCaughtError = root.onCaughtError; 5493 onCaughtError(errorInfo.value, { 5494 componentStack: errorInfo.stack,
5495 errorBoundary: 1 === boundary.tag ? boundary.stateNode : null 5496 }); 5497 } catch (e$7) { 5498 setTimeout(function() { 5499 throw e$7; 5500 }); 5501 } 5502 } 5503 function createRootErrorUpdate(root, errorInfo, lane) { 5504 lane = createUpdate(lane); 5505 lane.tag = CaptureUpdate; 5506 lane.payload = { element: null }; 5507 lane.callback = function() { 5508 runWithFiberInDEV(errorInfo.source, logUncaughtError, root, errorInfo); 5509 }; 5510 return lane; 5511 } 5512 function createClassErrorUpdate(lane) { 5513 lane = createUpdate(lane); 5514 lane.tag = CaptureUpdate; 5515 return lane; 5516 } 5517 function initializeClassErrorUpdate(update, root, fiber, errorInfo) { 5518 var getDerivedStateFromError = fiber.type.getDerivedStateFromError; 5519 if ("function" === typeof getDerivedStateFromError) { 5520 var error = errorInfo.value; 5521 update.payload = function() { 5522 return getDerivedStateFromError(error); 5523 }; 5524 update.callback = function() { 5525 markFailedErrorBoundaryForHotReloading(fiber); 5526 runWithFiberInDEV(errorInfo.source, logCaughtError, root, fiber, errorInfo); 5527 }; 5528 } 5529 var inst = fiber.stateNode; 5530 null !== inst && "function" === typeof inst.componentDidCatch && (update.callback = function() { 5531 markFailedErrorBoundaryForHotReloading(fiber); 5532 runWithFiberInDEV(errorInfo.source, logCaughtError, root, fiber, errorInfo); 5533 "function" !== typeof getDerivedStateFromError && (null === legacyErrorBoundariesThatAlreadyFailed ? legacyErrorBoundariesThatAlreadyFailed = /* @__PURE__ */ new Set([this]) : legacyErrorBoundariesThatAlreadyFailed.add(this)); 5534 callComponentDidCatchInDEV(this, errorInfo); 5535 "function" === typeof getDerivedStateFromError || 0 === (fiber.lanes & 2) && console.error("%s: Error boundaries should implement getDerivedStateFromError(). In that method, return a state update to display an error message or fallback UI.", getComponentNameFromFiber(fiber) || "Unknown"); 5536 }); 5537 } 5538 function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) { 5539 sourceFiber.flags |= 32768; 5540 isDevToolsPresent && restorePendingUpdaters(root, rootRenderLanes); 5541 if (null !== value && "object" === typeof value && "function" === typeof value.then) { 5542 returnFiber = sourceFiber.alternate; 5543 null !== returnFiber && propagateParentContextChanges(returnFiber, sourceFiber, rootRenderLanes, !0); 5544 isHydrating && (didSuspendOrErrorDEV = !0); 5545 sourceFiber = suspenseHandlerStackCursor.current; 5546 if (null !== sourceFiber) { 5547 switch (sourceFiber.tag) { 5548 case 31: 5549 case 13: 5550 case 19: return null === shellBoundary ? renderDidSuspendDelayIfPossible() : null === sourceFiber.alternate && workInProgressRootExitStatus === RootInProgress && (workInProgressRootExitStatus = RootSuspended), sourceFiber.flags &= -257, sourceFiber.flags |= 65536, sourceFiber.lanes = rootRenderLanes, value === noopSuspenseyCommitThenable ? sourceFiber.flags |= 16384 : (returnFiber = sourceFiber.updateQueue, null === returnFiber ? sourceFiber.updateQueue = /* @__PURE__ */ new Set([value]) : returnFiber.add(value), attachPingListener(root, value, rootRenderLanes)), !1; 5551 case 22: return sourceFiber.flags |= 65536, value === noopSuspenseyCommitThenable ? sourceFiber.flags |= 16384 : (returnFiber = sourceFiber.updateQueue, null === returnFiber ? (returnFiber = { 5552 transitions: null, 5553 markerInstances: null, 5554 retryQueue: /* @__PURE__ */ new Set([value]) 5555 }, sourceFiber.updateQueue = returnFiber) : (sourceFiber = returnFiber.retryQueue, null === sourceFiber ? returnFiber.retryQueue = /* @__PURE__ */ new Set([value]) : sourceFiber.add(value)), attachPingListener(root, value, rootRenderLanes)), !1; 5556 } 5557 throw Error("Unexpected Suspense handler tag (" + sourceFiber.tag + "). This is a bug in React."); 5558 } 5559 attachPingListener(root, value, rootRenderLanes); 5560 renderDidSuspendDelayIfPossible(); 5561 return !1; 5562 } 5563 if (isHydrating) return didSuspendOrErrorDEV = !0, returnFiber = suspenseHandlerStackCursor.current, null !== returnFiber ? (19 === returnFiber.tag && console.error("SuspenseList should never catch while hydrating. This is a bug in React."), 0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256), returnFiber.flags |= 65536, returnFiber.lanes = rootRenderLanes, value !== HydrationMismatchException && queueHydrationError(createCapturedValueAtFiber(Error("There was an error while hydrating but React was able to re
vendor: 9,703 bytes, lines 5563-5696
5563cover by instead client rendering from the nearest Suspense boundary.", { cause: value }), sourceFiber))) : (value !== HydrationMismatchException && queueHydrationError(createCapturedValueAtFiber(Error("There was an error while hydrating but React was able to recover by instead client rendering the entire root.", { cause: value }), sourceFiber)), root = root.current.alternate, root.flags |= 65536, rootRenderLanes &= -rootRenderLanes, root.lanes |= rootRenderLanes, value = createCapturedValueAtFiber(value, sourceFiber), rootRenderLanes = createRootErrorUpdate(root.stateNode, value, rootRenderLanes), enqueueCapturedUpdate(root, rootRenderLanes), workInProgressRootExitStatus !== RootSuspendedWithDelay && (workInProgressRootExitStatus = RootErrored)), !1; 5564 var error = createCapturedValueAtFiber(Error("There was an error during concurrent rendering but React was able to recover by instead synchronously rendering the entire root.", { cause: value }), sourceFiber); 5565 null === workInProgressRootConcurrentErrors ? workInProgressRootConcurrentErrors = [error] : workInProgressRootConcurrentErrors.push(error); 5566 workInProgressRootExitStatus !== RootSuspendedWithDelay && (workInProgressRootExitStatus = RootErrored); 5567 if (null === returnFiber) return !0; 5568 value = createCapturedValueAtFiber(value, sourceFiber); 5569 sourceFiber = returnFiber; 5570 do { 5571 switch (sourceFiber.tag) { 5572 case 3: return sourceFiber.flags |= 65536, root = rootRenderLanes & -rootRenderLanes, sourceFiber.lanes |= root, root = createRootErrorUpdate(sourceFiber.stateNode, value, root), enqueueCapturedUpdate(sourceFiber, root), !1; 5573 case 1: 5574 returnFiber = sourceFiber.type; 5575 error = sourceFiber.stateNode; 5576 if (0 === (sourceFiber.flags & 128) && ("function" === typeof returnFiber.getDerivedStateFromError || null !== error && "function" === typeof error.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(error)))) return sourceFiber.flags |= 65536, rootRenderLanes &= -rootRenderLanes, sourceFiber.lanes |= rootRenderLanes, rootRenderLanes = createClassErrorUpdate(rootRenderLanes), initializeClassErrorUpdate(rootRenderLanes, root, sourceFiber, value), enqueueCapturedUpdate(sourceFiber, rootRenderLanes), !1; 5577 break; 5578 case 22: if (null !== sourceFiber.memoizedState) return sourceFiber.flags |= 65536, !1; 5579 } 5580 sourceFiber = sourceFiber.return; 5581 } while (null !== sourceFiber); 5582 return !1; 5583 } 5584 function reconcileChildren(current, workInProgress, nextChildren, renderLanes) { 5585 workInProgress.child = null === current ? mountChildFibers(workInProgress, null, nextChildren, renderLanes) : reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes); 5586 } 5587 function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) { 5588 Component = Component.render; 5589 var resolvedRender = resolveTypeForHotReloading(Component); 5590 resolvedRender !== Component && (Component = resolvedRender, null !== current && (didReceiveUpdate = !0)); 5591 resolvedRender = workInProgress.ref; 5592 if ("ref" in nextProps) { 5593 var propsWithoutRef = {}; 5594 for (var key in nextProps) "ref" !== key && (propsWithoutRef[key] = nextProps[key]); 5595 } else propsWithoutRef = nextProps; 5596 prepareToReadContext(workInProgress); 5597 nextProps = renderWithHooks(current, workInProgress, Component, propsWithoutRef, resolvedRender, renderLanes); 5598 key = checkDidRenderIdHook(); 5599 if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress, renderLanes), bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 5600 isHydrating && key && pushMaterializedTreeId(workInProgress); 5601 workInProgress.flags |= 1; 5602 reconcileChildren(current, workInProgress, nextProps, renderLanes); 5603 return workInProgress.child; 5604 } 5605 function updateMemoComponent(current, workInProgress, Component, nextProps, renderLanes) { 5606 if (null === current) { 5607 var type = Component.type; 5608 if ("function" === typeof type && !shouldConstruct(type) && void 0 === type.defaultProps && null === Component.compare) return Component = resolveTypeForHotReloading(type), workInProgress.tag = 15, workInProgress.type = Component, validateFunctionComponentInDev(workInProgress, type), updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes); 5609 current = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes); 5610 current.ref = workInProgress.ref; 5611 current.return = workInProgress; 5612 return workInProgress.child = current; 5613 } 5614 type = current.child; 5615 if (!checkScheduledUpdateOrContext(current, renderLanes)) { 5616 var prevProps = type.memoizedProps; 5617 Component = Component.compare; 5618 Component = null !== Component ? Component : shallowEqual; 5619 if (Component(prevProps, nextProps) && current.ref === workInProgress.ref) return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 5620 } 5621 workInProgress.flags |= 1; 5622 current = createWorkInProgress(type, nextProps); 5623 current.ref = workInProgress.ref; 5624 current.return = workInProgress; 5625 return workInProgress.child = current; 5626 } 5627 function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes) { 5628 if (null !== current) { 5629 var prevProps = current.memoizedProps; 5630 if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && workInProgress.type === current.type) if (didReceiveUpdate = !1, workInProgress.pendingProps = nextProps = prevProps, checkScheduledUpdateOrContext(current, renderLanes)) 0 !== (current.flags & 131072) && (didReceiveUpdate = !0); 5631 else return workInProgress.lanes = current.lanes, bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 5632 } 5633 return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes); 5634 } 5635 function updateOffscreenComponent(current, workInProgress, renderLanes, nextProps) { 5636 var nextChildren = nextProps.children, prevState = null !== current ? current.memoizedState : null; 5637 null === current && null === workInProgress.stateNode && (workInProgress.stateNode = { 5638 _visibility: OffscreenVisible, 5639 _pendingMarkers: null, 5640 _retryCache: null, 5641 _transitions: null 5642 }); 5643 if ("hidden" === nextProps.mode) { 5644 if (0 !== (workInProgress.flags & 128)) { 5645 prevState = null !== prevState ? prevState.baseLanes | renderLanes : renderLanes; 5646 if (null !== current) { 5647 nextProps = workInProgress.child = current.child; 5648 for (nextChildren = 0; null !== nextProps;) nextChildren = nextChildren | nextProps.lanes | nextProps.childLanes, nextProps = nextProps.sibling; 5649 nextProps = nextChildren & ~prevState; 5650 } else nextProps = 0, workInProgress.child = null; 5651 return deferHiddenOffscreenComponent(current, workInProgress, prevState, renderLanes, nextProps); 5652 } 5653 if (0 !== (renderLanes & 536870912)) workInProgress.memoizedState = { 5654 baseLanes: 0, 5655 cachePool: null 5656 }, null !== current && pushTransition(workInProgress, null !== prevState ? prevState.cachePool : null), null !== prevState ? pushHiddenContext(workInProgress, prevState) : reuseHiddenContextOnStack(workInProgress), pushOffscreenSuspenseHandler(workInProgress); 5657 else return nextProps = workInProgress.lanes = 536870912, deferHiddenOffscreenComponent(current, workInProgress, null !== prevState ? prevState.baseLanes | renderLanes : renderLanes, renderLanes, nextProps); 5658 } else null !== prevState ? (pushTransition(workInProgress, prevState.cachePool), pushHiddenContext(workInProgress, prevState), reuseSuspenseHandlerOnStack(workInProgress), workInProgress.memoizedState = null) : (null !== current && pushTransition(workInProgress, null), reuseHiddenContextOnStack(workInProgress), reuseSuspenseHandlerOnStack(workInProgress)); 5659 reconcileChildren(current, workInProgress, nextChildren, renderLanes); 5660 return workInProgress.child; 5661 } 5662 function bailoutOffscreenComponent(current, workInProgress) { 5663 null !== current && 22 === current.tag || null !== workInProgress.stateNode || (workInProgress.stateNode = { 5664 _visibility: OffscreenVisible, 5665 _pendingMarkers: null, 5666 _retryCache: null, 5667 _transitions: null 5668 }); 5669 return workInProgress.sibling; 5670 } 5671 function deferHiddenOffscreenComponent(current, workInProgress, nextBaseLanes, renderLanes, remainingChildLanes) { 5672 var JSCompiler_inline_result = peekCacheFromPool(); 5673 JSCompiler_inline_result = null === JSCompiler_inline_result ? null : { 5674 parent: CacheContext._currentValue, 5675 pool: JSCompiler_inline_result 5676 }; 5677 workInProgress.memoizedState = { 5678 baseLanes: nextBaseLanes, 5679 cachePool: JSCompiler_inline_result 5680 }; 5681 null !== current && pushTransition(workInProgress, null); 5682 reuseHiddenContextOnStack(workInProgress); 5683 pushOffscreenSuspenseHandler(workInProgress); 5684 null !== current && propagateParentContextChanges(current, workInProgress, renderLanes, !0); 5685 workInProgress.childLanes = remainingChildLanes; 5686 return null; 5687 } 5688 function mountActivityChildren(workInProgress, nextProps) { 5689 var hiddenProp = nextProps.hidden; 5690 void 0 !== hiddenProp && console.error("<Activity> doesn't accept a hidden prop. Use mode=\"hidden\" instead.\n- <Activity %s>\n+ <Activity %s>", !0 === hiddenProp ? "hidden" : !1 === hiddenProp ? "hidden={false}" : "hidden={...}", hiddenProp ? "mode=\"hidden\"" : "mode=\"visible\""); 5691 nextProps = mountWorkInProgressOffscreenFiber({ 5692 mode: nextProps.mode, 5693 children: nextProps.children 5694 }, workInProgress.mode); 5695 nextProps.ref = workInProgress.ref; 5696 workInProgress.child = nextProps;
5697 nextProps.return = workInProgress; 5698 return nextProps; 5699 } 5700 function retryActivityComponentWithoutHydrating(current, workInProgress, renderLanes) { 5701 reconcileChildFibers(workInProgress, current.child, null, renderLanes); 5702 current = mountActivityChildren(workInProgress, workInProgress.pendingProps); 5703 current.flags |= 2; 5704 popSuspenseHandler(workInProgress); 5705 workInProgress.memoizedState = null; 5706 return current; 5707 } 5708 function updateActivityComponent(current, workInProgress, renderLanes) { 5709 var nextProps = workInProgress.pendingProps, didSuspend = 0 !== (workInProgress.flags & 128); 5710 workInProgress.flags &= -129; 5711 if (null === current) { 5712 if (isHydrating) { 5713 if ("hidden" === nextProps.mode) return current = mountActivityChildren(workInProgress, nextProps), workInProgress.lanes = 536870912, current.memoizedState = { 5714 baseLanes: 0, 5715 cachePool: null 5716 }, bailoutOffscreenComponent(null, current); 5717 pushDehydratedActivitySuspenseHandler(workInProgress); 5718 (current = nextHydratableInstance) ? (renderLanes = canHydrateHydrationBoundary(current, rootOrSingletonContext), renderLanes = null !== renderLanes && renderLanes.data === ACTIVITY_START_DATA ? renderLanes : null, null !== renderLanes && (nextProps = { 5719 dehydrated: renderLanes, 5720 treeContext: getSuspendedTreeContext(), 5721 retryLane: 536870912, 5722 hydrationErrors: null 5723 }, workInProgress.memoizedState = nextProps, nextProps = createFiberFromDehydratedFragment(renderLanes), nextProps.return = workInProgress, workInProgress.child = nextProps, hydrationParentFiber = workInProgress, nextHydratableInstance = null)) : renderLanes = null; 5724 if (null === renderLanes) throw warnNonHydratedInstance(workInProgress, current), throwOnHydrationMismatch(workInProgress); 5725 workInProgress.lanes = 536870912; 5726 return null; 5727 } 5728 return mountActivityChildren(workInProgress, nextProps); 5729 } 5730 var prevState = current.memoizedState; 5731 if (null !== prevState) { 5732 var activityInstance = prevState.dehydrated; 5733 pushDehydratedActivitySuspenseHandler(workInProgress); 5734 if (didSuspend) if (workInProgress.flags & 256) workInProgress.flags &= -257, workInProgress = retryActivityComponentWithoutHydrating(current, workInProgress, renderLanes); 5735 else if (null !== workInProgress.memoizedState) workInProgress.child = current.child, workInProgress.flags |= 128, workInProgress = null; 5736 else throw Error("Client rendering an Activity suspended it again. This is a bug in React."); 5737 else if (warnIfHydrating(), 0 !== (renderLanes & 536870912) && markRenderDerivedCause(workInProgress), didReceiveUpdate || propagateParentContextChanges(current, workInProgress, renderLanes, !1), didSuspend = 0 !== (renderLanes & current.childLanes), didReceiveUpdate || didSuspend) { 5738 if (null === currentTreeHiddenStackCursor.current) { 5739 nextProps = workInProgressRoot; 5740 if (null !== nextProps && (activityInstance = getBumpedLaneForHydration(nextProps, renderLanes), 0 !== activityInstance && activityInstance !== prevState.retryLane)) throw prevState.retryLane = activityInstance, enqueueConcurrentRenderForLane(current, activityInstance), scheduleUpdateOnFiber(nextProps, current, activityInstance), SelectiveHydrationException; 5741 renderDidSuspendDelayIfPossible(); 5742 } 5743 workInProgress = retryActivityComponentWithoutHydrating(current, workInProgress, renderLanes); 5744 } else current = prevState.treeContext, nextHydratableInstance = getNextHydratable(activityInstance.nextSibling), hydrationParentFiber = workInProgress, isHydrating = !0, hydrationErrors = null, didSuspendOrErrorDEV = !1, hydrationDiffRootDEV = null, rootOrSingletonContext = !1, null !== current && restoreSuspendedTreeContext(workInProgress, current), workInProgress = mountActivityChildren(workInProgress, nextProps), workInProgress.flags |= 134221824; 5745 return workInProgress; 5746 } 5747 prevState = current.child; 5748 nextProps = { 5749 mode: nextProps.mode, 5750 children: nextProps.children 5751 }; 5752 0 !== (renderLanes & 536870912) && 0 !== (renderLanes & current.lanes) && markRenderDerivedCause(workInProgress); 5753 current = createWorkInProgress(prevState, nextProps); 5754 current.ref = workInProgress.ref; 5755 workInProgress.child = current;
vendor: 16,192 bytes, lines 5756-5889
5756 current.return = workInProgress; 5757 return current; 5758 } 5759 function markRef(current, workInProgress) { 5760 var ref = workInProgress.ref; 5761 if (null === ref) null !== current && null !== current.ref && (workInProgress.flags |= 4194816); 5762 else { 5763 if ("function" !== typeof ref && "object" !== typeof ref) throw Error("Expected ref to be a function, an object returned by React.createRef(), or undefined/null."); 5764 if (null === current || current.ref !== ref) workInProgress.flags |= 4194816; 5765 } 5766 } 5767 function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) { 5768 if (Component.prototype && "function" === typeof Component.prototype.render) { 5769 var componentName = getComponentNameFromType(Component) || "Unknown"; 5770 didWarnAboutBadClass[componentName] || (console.error("The <%s /> component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.", componentName, componentName), didWarnAboutBadClass[componentName] = !0); 5771 } 5772 workInProgress.mode & StrictLegacyMode && ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null); 5773 null === current && (validateFunctionComponentInDev(workInProgress, workInProgress.type), Component.contextTypes && (componentName = getComponentNameFromType(Component) || "Unknown", didWarnAboutContextTypes[componentName] || (didWarnAboutContextTypes[componentName] = !0, console.error("%s uses the legacy contextTypes API which was removed in React 19. Use React.createContext() with React.useContext() instead. (https://react.dev/link/legacy-context)", componentName)))); 5774 prepareToReadContext(workInProgress); 5775 Component = renderWithHooks(current, workInProgress, Component, nextProps, void 0, renderLanes); 5776 nextProps = checkDidRenderIdHook(); 5777 if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress, renderLanes), bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 5778 isHydrating && nextProps && pushMaterializedTreeId(workInProgress); 5779 workInProgress.flags |= 1; 5780 reconcileChildren(current, workInProgress, Component, renderLanes); 5781 return workInProgress.child; 5782 } 5783 function replayFunctionComponent(current, workInProgress, nextProps, Component, secondArg, renderLanes) { 5784 prepareToReadContext(workInProgress); 5785 hookTypesUpdateIndexDev = -1; 5786 ignorePreviousDependencies = null !== current && current.type !== workInProgress.type; 5787 workInProgress.updateQueue = null; 5788 nextProps = renderWithHooksAgain(workInProgress, Component, nextProps, secondArg); 5789 finishRenderingHooks(current, workInProgress); 5790 Component = checkDidRenderIdHook(); 5791 if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress, renderLanes), bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 5792 isHydrating && Component && pushMaterializedTreeId(workInProgress); 5793 workInProgress.flags |= 1; 5794 reconcileChildren(current, workInProgress, nextProps, renderLanes); 5795 return workInProgress.child; 5796 } 5797 function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) { 5798 switch (shouldErrorImpl(workInProgress)) { 5799 case !1: 5800 var _instance = workInProgress.stateNode, state = new workInProgress.type(workInProgress.memoizedProps, _instance.context).state; 5801 _instance.updater.enqueueSetState(_instance, state, null); 5802 break; 5803 case !0: 5804 workInProgress.flags |= 128; 5805 workInProgress.flags |= 65536; 5806 _instance = Error("Simulated error coming from DevTools"); 5807 var lane = renderLanes & -renderLanes; 5808 workInProgress.lanes |= lane; 5809 state = workInProgressRoot; 5810 if (null === state) throw Error("Expected a work-in-progress root. This is a bug in React. Please file an issue."); 5811 lane = createClassErrorUpdate(lane); 5812 initializeClassErrorUpdate(lane, state, workInProgress, createCapturedValueAtFiber(_instance, workInProgress)); 5813 enqueueCapturedUpdate(workInProgress, lane); 5814 } 5815 prepareToReadContext(workInProgress); 5816 if (null === workInProgress.stateNode) { 5817 state = emptyContextObject; 5818 _instance = Component.contextType; 5819 "contextType" in Component && null !== _instance && (void 0 === _instance || _instance.$$typeof !== REACT_CONTEXT_TYPE) && !didWarnAboutInvalidateContextType.has(Component) && (didWarnAboutInvalidateContextType.add(Component), lane = void 0 === _instance ? " However, it is set to undefined. This can be caused by a typo or by mixing up named and default imports. This can also happen due to a circular dependency, so try moving the createContext() call to a separate file." : "object" !== typeof _instance ? " However, it is set to a " + typeof _instance + "." : _instance.$$typeof === REACT_CONSUMER_TYPE ? " Did you accidentally pass the Context.Consumer instead?" : " However, it is set to an object with keys {" + Object.keys(_instance).join(", ") + "}.", console.error("%s defines an invalid contextType. contextType should point to the Context object returned by React.createContext().%s", getComponentNameFromType(Component) || "Component", lane)); 5820 "object" === typeof _instance && null !== _instance && (state = readContext(_instance)); 5821 _instance = new Component(nextProps, state); 5822 if (workInProgress.mode & StrictLegacyMode) { 5823 setIsStrictModeForDevtools(!0); 5824 try { 5825 _instance = new Component(nextProps, state); 5826 } finally { 5827 setIsStrictModeForDevtools(!1); 5828 } 5829 } 5830 state = workInProgress.memoizedState = null !== _instance.state && void 0 !== _instance.state ? _instance.state : null; 5831 _instance.updater = classComponentUpdater; 5832 workInProgress.stateNode = _instance; 5833 _instance._reactInternals = workInProgress; 5834 _instance._reactInternalInstance = fakeInternalInstance; 5835 "function" === typeof Component.getDerivedStateFromProps && null === state && (state = getComponentNameFromType(Component) || "Component", didWarnAboutUninitializedState.has(state) || (didWarnAboutUninitializedState.add(state), console.error("`%s` uses `getDerivedStateFromProps` but its initial state is %s. This is not recommended. Instead, define the initial state by assigning an object to `this.state` in the constructor of `%s`. This ensures that `getDerivedStateFromProps` arguments have a consistent shape.", state, null === _instance.state ? "null" : "undefined", state))); 5836 if ("function" === typeof Component.getDerivedStateFromProps || "function" === typeof _instance.getSnapshotBeforeUpdate) { 5837 var foundWillUpdateName = lane = state = null; 5838 "function" === typeof _instance.componentWillMount && !0 !== _instance.componentWillMount.__suppressDeprecationWarning ? state = "componentWillMount" : "function" === typeof _instance.UNSAFE_componentWillMount && (state = "UNSAFE_componentWillMount"); 5839 "function" === typeof _instance.componentWillReceiveProps && !0 !== _instance.componentWillReceiveProps.__suppressDeprecationWarning ? lane = "componentWillReceiveProps" : "function" === typeof _instance.UNSAFE_componentWillReceiveProps && (lane = "UNSAFE_componentWillReceiveProps"); 5840 "function" === typeof _instance.componentWillUpdate && !0 !== _instance.componentWillUpdate.__suppressDeprecationWarning ? foundWillUpdateName = "componentWillUpdate" : "function" === typeof _instance.UNSAFE_componentWillUpdate && (foundWillUpdateName = "UNSAFE_componentWillUpdate"); 5841 if (null !== state || null !== lane || null !== foundWillUpdateName) { 5842 _instance = getComponentNameFromType(Component) || "Component"; 5843 var newApiName = "function" === typeof Component.getDerivedStateFromProps ? "getDerivedStateFromProps()" : "getSnapshotBeforeUpdate()"; 5844 didWarnAboutLegacyLifecyclesAndDerivedState.has(_instance) || (didWarnAboutLegacyLifecyclesAndDerivedState.add(_instance), console.error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://react.dev/link/unsafe-component-lifecycles", _instance, newApiName, null !== state ? "\n " + state : "", null !== lane ? "\n " + lane : "", null !== foundWillUpdateName ? "\n " + foundWillUpdateName : "")); 5845 } 5846 } 5847 _instance = workInProgress.stateNode; 5848 state = getComponentNameFromType(Component) || "Component"; 5849 _instance.render || (Component.prototype && "function" === typeof Component.prototype.render ? console.error("No `render` method found on the %s instance: did you accidentally return an object from the constructor?", state) : console.error("No `render` method found on the %s instance: you may have forgotten to define `render`.", state)); 5850 !_instance.getInitialState || _instance.getInitialState.isReactClassApproved || _instance.state || console.error("getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", state); 5851 _instance.getDefaultProps && !_instance.getDefaultProps.isReactClassApproved && console.error("getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.", state); 5852 _instance.contextType && console.error("contextType was defined as an instance property on %s. Use a static property to define contextType instead.", state); 5853 Component.childContextTypes && !didWarnAboutChildContextTypes.has(Component) && (didWarnAboutChildContextTypes.add(Component), console.error("%s uses the legacy childContextTypes API which was removed in React 19. Use React.createContext() instead. (https://react.dev/link/legacy-context)", state)); 5854 Component.contextTypes && !didWarnAboutContextTypes$1.has(Component) && (didWarnAboutContextTypes$1.add(Component), console.error("%s uses the legacy contextTypes API which was removed in React 19. Use React.createContext() with static contextType instead. (https://react.dev/link/legacy-context)", state)); 5855 "function" === typeof _instance.componentShouldUpdate && console.error("%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", state); 5856 Component.prototype && Component.prototype.isPureReactComponent && "undefined" !== typeof _instance.shouldComponentUpdate && console.error("%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.", getComponentNameFromType(Component) || "A pure component"); 5857 "function" === typeof _instance.componentDidUnmount && console.error("%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?", state); 5858 "function" === typeof _instance.componentDidReceiveProps && console.error("%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().", state); 5859 "function" === typeof _instance.componentWillRecieveProps && console.error("%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?", state); 5860 "function" === typeof _instance.UNSAFE_componentWillRecieveProps && console.error("%s has a method called UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?", state); 5861 lane = _instance.props !== nextProps; 5862 void 0 !== _instance.props && lane && console.error("When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.", state); 5863 _instance.defaultProps && console.error("Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.", state, state); 5864 "function" !== typeof _instance.getSnapshotBeforeUpdate || "function" === typeof _instance.componentDidUpdate || didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(Component) || (didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(Component), console.error("%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.", getComponentNameFromType(Component))); 5865 "function" === typeof _instance.getDerivedStateFromProps && console.error("%s: getDerivedStateFromProps() is defined as an instance method and will be ignored. Instead, declare it as a static method.", state); 5866 "function" === typeof _instance.getDerivedStateFromError && console.error("%s: getDerivedStateFromError() is defined as an instance method and will be ignored. Instead, declare it as a static method.", state); 5867 "function" === typeof Component.getSnapshotBeforeUpdate && console.error("%s: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.", state); 5868 (lane = _instance.state) && ("object" !== typeof lane || isArrayImpl(lane)) && console.error("%s.state: must be set to an object or null", state); 5869 "function" === typeof _instance.getChildContext && "object" !== typeof Component.childContextTypes && console.error("%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", state); 5870 _instance = workInProgress.stateNode; 5871 _instance.props = nextProps; 5872 _instance.state = workInProgress.memoizedState; 5873 _instance.refs = {}; 5874 initializeUpdateQueue(workInProgress); 5875 state = Component.contextType; 5876 _instance.context = "object" === typeof state && null !== state ? readContext(state) : emptyContextObject; 5877 _instance.state === nextProps && (state = getComponentNameFromType(Component) || "Component", didWarnAboutDirectlyAssigningPropsToState.has(state) || (didWarnAboutDirectlyAssigningPropsToState.add(state), console.error("%s: It is not recommended to assign props directly to state because updates to props won't be reflected in state. In most cases, it is better to use props directly.", state))); 5878 workInProgress.mode & StrictLegacyMode && ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, _instance); 5879 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, _instance); 5880 _instance.state = workInProgress.memoizedState; 5881 state = Component.getDerivedStateFromProps; 5882 "function" === typeof state && (applyDerivedStateFromProps(workInProgress, Component, state, nextProps), _instance.state = workInProgress.memoizedState); 5883 "function" === typeof Component.getDerivedStateFromProps || "function" === typeof _instance.getSnapshotBeforeUpdate || "function" !== typeof _instance.UNSAFE_componentWillMount && "function" !== typeof _instance.componentWillMount || (state = _instance.state, "function" === typeof _instance.componentWillMount && _instance.componentWillMount(), "function" === typeof _instance.UNSAFE_componentWillMount && _instance.UNSAFE_componentWillMount(), state !== _instance.state && (console.error("%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", getComponentNameFromFiber(workInProgress) || "Component"), classComponentUpdater.enqueueReplaceState(_instance, _instance.state, null)), processUpdateQueue(workInProgress, nextProps, _instance, renderLanes), suspendIfUpdateReadFromEntangledAsyncAction(), _instance.state = workInProgress.memoizedState); 5884 "function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308); 5885 (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456); 5886 _instance = !0; 5887 } else if (null === current) { 5888 _instance = workInProgress.stateNode; 5889 var unresolvedOldProps = workInProgress.memoizedProps;
vendor: 6,869 bytes, lines 5890-5947
5890 lane = resolveClassComponentProps(Component, unresolvedOldProps); 5891 _instance.props = lane; 5892 var oldContext = _instance.context; 5893 foundWillUpdateName = Component.contextType; 5894 state = emptyContextObject; 5895 "object" === typeof foundWillUpdateName && null !== foundWillUpdateName && (state = readContext(foundWillUpdateName)); 5896 newApiName = Component.getDerivedStateFromProps; 5897 foundWillUpdateName = "function" === typeof newApiName || "function" === typeof _instance.getSnapshotBeforeUpdate; 5898 unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps; 5899 foundWillUpdateName || "function" !== typeof _instance.UNSAFE_componentWillReceiveProps && "function" !== typeof _instance.componentWillReceiveProps || (unresolvedOldProps || oldContext !== state) && callComponentWillReceiveProps(workInProgress, _instance, nextProps, state); 5900 hasForceUpdate = !1; 5901 var oldState = workInProgress.memoizedState; 5902 _instance.state = oldState; 5903 processUpdateQueue(workInProgress, nextProps, _instance, renderLanes); 5904 suspendIfUpdateReadFromEntangledAsyncAction(); 5905 oldContext = workInProgress.memoizedState; 5906 unresolvedOldProps || oldState !== oldContext || hasForceUpdate ? ("function" === typeof newApiName && (applyDerivedStateFromProps(workInProgress, Component, newApiName, nextProps), oldContext = workInProgress.memoizedState), (lane = hasForceUpdate || checkShouldComponentUpdate(workInProgress, Component, lane, nextProps, oldState, oldContext, state)) ? (foundWillUpdateName || "function" !== typeof _instance.UNSAFE_componentWillMount && "function" !== typeof _instance.componentWillMount || ("function" === typeof _instance.componentWillMount && _instance.componentWillMount(), "function" === typeof _instance.UNSAFE_componentWillMount && _instance.UNSAFE_componentWillMount()), "function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456)) : ("function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456), workInProgress.memoizedProps = nextProps, workInProgress.memoizedState = oldContext), _instance.props = nextProps, _instance.state = oldContext, _instance.context = state, _instance = lane) : ("function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456), _instance = !1); 5907 } else { 5908 _instance = workInProgress.stateNode; 5909 cloneUpdateQueue(current, workInProgress); 5910 state = workInProgress.memoizedProps; 5911 foundWillUpdateName = resolveClassComponentProps(Component, state); 5912 _instance.props = foundWillUpdateName; 5913 newApiName = workInProgress.pendingProps; 5914 oldState = _instance.context; 5915 oldContext = Component.contextType; 5916 lane = emptyContextObject; 5917 "object" === typeof oldContext && null !== oldContext && (lane = readContext(oldContext)); 5918 unresolvedOldProps = Component.getDerivedStateFromProps; 5919 (oldContext = "function" === typeof unresolvedOldProps || "function" === typeof _instance.getSnapshotBeforeUpdate) || "function" !== typeof _instance.UNSAFE_componentWillReceiveProps && "function" !== typeof _instance.componentWillReceiveProps || (state !== newApiName || oldState !== lane) && callComponentWillReceiveProps(workInProgress, _instance, nextProps, lane); 5920 hasForceUpdate = !1; 5921 oldState = workInProgress.memoizedState; 5922 _instance.state = oldState; 5923 processUpdateQueue(workInProgress, nextProps, _instance, renderLanes); 5924 suspendIfUpdateReadFromEntangledAsyncAction(); 5925 var newState = workInProgress.memoizedState; 5926 state !== newApiName || oldState !== newState || hasForceUpdate || null !== current && null !== current.dependencies && checkIfContextChanged(current.dependencies) ? ("function" === typeof unresolvedOldProps && (applyDerivedStateFromProps(workInProgress, Component, unresolvedOldProps, nextProps), newState = workInProgress.memoizedState), (foundWillUpdateName = hasForceUpdate || checkShouldComponentUpdate(workInProgress, Component, foundWillUpdateName, nextProps, oldState, newState, lane) || null !== current && null !== current.dependencies && checkIfContextChanged(current.dependencies)) ? (oldContext || "function" !== typeof _instance.UNSAFE_componentWillUpdate && "function" !== typeof _instance.componentWillUpdate || ("function" === typeof _instance.componentWillUpdate && _instance.componentWillUpdate(nextProps, newState, lane), "function" === typeof _instance.UNSAFE_componentWillUpdate && _instance.UNSAFE_componentWillUpdate(nextProps, newState, lane)), "function" === typeof _instance.componentDidUpdate && (workInProgress.flags |= 4), "function" === typeof _instance.getSnapshotBeforeUpdate && (workInProgress.flags |= 1024)) : ("function" !== typeof _instance.componentDidUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 4), "function" !== typeof _instance.getSnapshotBeforeUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 1024), workInProgress.memoizedProps = nextProps, workInProgress.memoizedState = newState), _instance.props = nextProps, _instance.state = newState, _instance.context = lane, _instance = foundWillUpdateName) : ("function" !== typeof _instance.componentDidUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 4), "function" !== typeof _instance.getSnapshotBeforeUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 1024), _instance = !1); 5927 } 5928 lane = _instance; 5929 markRef(current, workInProgress); 5930 state = 0 !== (workInProgress.flags & 128); 5931 if (lane || state) { 5932 lane = workInProgress.stateNode; 5933 setCurrentFiber(workInProgress); 5934 if (state && "function" !== typeof Component.getDerivedStateFromError) Component = null, profilerStartTime = -1; 5935 else if (Component = callRenderInDEV(lane), workInProgress.mode & StrictLegacyMode) { 5936 setIsStrictModeForDevtools(!0); 5937 try { 5938 callRenderInDEV(lane); 5939 } finally { 5940 setIsStrictModeForDevtools(!1); 5941 } 5942 } 5943 workInProgress.flags |= 1; 5944 null !== current && state ? (workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes), workInProgress.child = reconcileChildFibers(workInProgress, null, Component, renderLanes)) : reconcileChildren(current, workInProgress, Component, renderLanes); 5945 workInProgress.memoizedState = lane.state; 5946 current = workInProgress.child; 5947 } else current = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5948 renderLanes = workInProgress.stateNode; 5949 _instance && renderLanes.props !== nextProps && (didWarnAboutReassigningProps || console.error("It looks like %s is reassigning its own `this.props` while rendering. This is not supported and can lead to confusing bugs.", getComponentNameFromFiber(workInProgress) || "a component"), didWarnAboutReassigningProps = !0); 5950 return current; 5951 } 5952 function mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes) { 5953 resetHydrationState(); 5954 workInProgress.flags |= 256; 5955 reconcileChildren(current, workInProgress, nextChildren, renderLanes); 5956 return workInProgress.child; 5957 } 5958 function validateFunctionComponentInDev(workInProgress, Component) { 5959 Component && Component.childContextTypes && console.error("childContextTypes cannot be defined on a function component.\n %s.childContextTypes = ...", Component.displayName || Component.name || "Component"); 5960 "function" === typeof Component.getDerivedStateFromProps && (workInProgress = getComponentNameFromType(Component) || "Unknown", didWarnAboutGetDerivedStateOnFunctionComponent[workInProgress] || (console.error("%s: Function components do not support getDerivedStateFromProps.", workInProgress), didWarnAboutGetDerivedStateOnFunctionComponent[workInProgress] = !0)); 5961 "object" === typeof Component.contextType && null !== Component.contextType && (Component = getComponentNameFromType(Component) || "Unknown", didWarnAboutContextTypeOnFunctionComponent[Component] || (console.error("%s: Function components do not support contextType.", Component), didWarnAboutContextTypeOnFunctionComponent[Component] = !0)); 5962 } 5963 function mountSuspenseOffscreenState(renderLanes) { 5964 return { 5965 baseLanes: renderLanes, 5966 cachePool: getSuspendedCache() 5967 }; 5968 } 5969 function getRemainingWorkInPrimaryTree(current, primaryTreeDidDefer, renderLanes) { 5970 current = null !== current ? current.childLanes & ~renderLanes : 0; 5971 primaryTreeDidDefer && (current |= workInProgressDeferredLane); 5972 return current; 5973 } 5974 function updateSuspenseComponent(current, workInProgress, renderLanes) { 5975 var nextProps = workInProgress.pendingProps; 5976 shouldSuspendImpl(workInProgress) && (workInProgress.flags |= 128); 5977 var showFallback = !1, didSuspend = 0 !== (workInProgress.flags & 128), JSCompiler_temp; 5978 (JSCompiler_temp = didSuspend) || (JSCompiler_temp = null !== current && null === current.memoizedState ? !1 : 0 !== (suspenseStackCursor.current & ForceSuspenseFallback)); 5979 JSCompiler_temp && (showFallback = !0, workInProgress.flags &= -129); 5980 JSCompiler_temp = 0 !== (workInProgress.flags & 32); 5981 workInProgress.flags &= -33; 5982 if (null === current) { 5983 if (isHydrating) { 5984 showFallback ? pushPrimaryTreeSuspenseHandler(workInProgress) : reuseSuspenseHandlerOnStack(workInProgress); 5985 (current = nextHydratableInstance) ? (renderLanes = canHydrateHydrationBoundary(current, rootOrSingletonContext), renderLanes = null !== renderLanes && renderLanes.data !== ACTIVITY_START_DATA ? renderLanes : null, null !== renderLanes && (JSCompiler_temp = { 5986 dehydrated: renderLanes, 5987 treeContext: getSuspendedTreeContext(), 5988 retryLane: 536870912, 5989 hydrationErrors: null 5990 }, workInProgress.memoizedState = JSCompiler_temp, JSCompiler_temp = createFiberFromDehydratedFragment(renderLanes), JSCompiler_temp.return = workInProgress, workInProgress.child = JSCompiler_temp, hydrationParentFiber = workInProgress, nextHydratableInstance = null)) : renderLanes = null; 5991 if (null === renderLanes) throw warnNonHydratedInstance(workInProgress, current), throwOnHydrationMismatch(workInProgress); 5992 isSuspenseInstanceFallback(renderLanes) ? workInProgress.lanes = 32 : workInProgress.lanes = 536870912; 5993 return null; 5994 } 5995 didSuspend = nextProps.children; 5996 nextProps = nextProps.fallback; 5997 if (showFallback) return reuseSuspenseHandlerOnStack(workInProgress), showFallback = workInProgress.mode, didSuspend = mountWorkInProgressOffscreenFiber({ 5998 mode: "hidden", 5999 children: didSuspend 6000 }, showFallback), nextProps = createFiberFromFragment(nextProps, showFallback, renderLanes, null), didSuspend.return = w
vendor: 4,884 bytes, lines 6000-6064
6000orkInProgress, nextProps.return = workInProgress, didSuspend.sibling = nextProps, workInProgress.child = didSuspend, nextProps = workInProgress.child, nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes), nextProps.childLanes = getRemainingWorkInPrimaryTree(current, JSCompiler_temp, renderLanes), workInProgress.memoizedState = SUSPENDED_MARKER, bailoutOffscreenComponent(null, nextProps); 6001 pushPrimaryTreeSuspenseHandler(workInProgress); 6002 return mountSuspensePrimaryChildren(workInProgress, didSuspend); 6003 } 6004 var prevState = current.memoizedState; 6005 if (null !== prevState) { 6006 var _dehydrated2 = prevState.dehydrated; 6007 if (null !== _dehydrated2) return updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, JSCompiler_temp, nextProps, _dehydrated2, prevState, renderLanes); 6008 } 6009 if (showFallback) return reuseSuspenseHandlerOnStack(workInProgress), showFallback = nextProps.fallback, didSuspend = workInProgress.mode, prevState = current.child, _dehydrated2 = prevState.sibling, nextProps = createWorkInProgress(prevState, { 6010 mode: "hidden", 6011 children: nextProps.children 6012 }), nextProps.subtreeFlags = prevState.subtreeFlags & 1206910976, null !== _dehydrated2 ? showFallback = createWorkInProgress(_dehydrated2, showFallback) : (showFallback = createFiberFromFragment(showFallback, didSuspend, renderLanes, null), showFallback.flags |= 2), showFallback.return = workInProgress, nextProps.return = workInProgress, nextProps.sibling = showFallback, workInProgress.child = nextProps, bailoutOffscreenComponent(null, nextProps), nextProps = workInProgress.child, showFallback = current.child.memoizedState, null === showFallback ? showFallback = mountSuspenseOffscreenState(renderLanes) : (didSuspend = showFallback.cachePool, null !== didSuspend ? (prevState = CacheContext._currentValue, didSuspend = didSuspend.parent !== prevState ? { 6013 parent: prevState, 6014 pool: prevState 6015 } : didSuspend) : didSuspend = getSuspendedCache(), showFallback = { 6016 baseLanes: showFallback.baseLanes | renderLanes, 6017 cachePool: didSuspend 6018 }), nextProps.memoizedState = showFallback, nextProps.childLanes = getRemainingWorkInPrimaryTree(current, JSCompiler_temp, renderLanes), workInProgress.memoizedState = SUSPENDED_MARKER, bailoutOffscreenComponent(current.child, nextProps); 6019 null !== prevState && (renderLanes & 62914560) === renderLanes && 0 !== (renderLanes & current.lanes) && markRenderDerivedCause(workInProgress); 6020 pushPrimaryTreeSuspenseHandler(workInProgress); 6021 renderLanes = current.child; 6022 current = renderLanes.sibling; 6023 renderLanes = createWorkInProgress(renderLanes, { 6024 mode: "visible", 6025 children: nextProps.children 6026 }); 6027 renderLanes.return = workInProgress; 6028 renderLanes.sibling = null; 6029 null !== current && (JSCompiler_temp = workInProgress.deletions, null === JSCompiler_temp ? (workInProgress.deletions = [current], workInProgress.flags |= 16) : JSCompiler_temp.push(current)); 6030 workInProgress.child = renderLanes; 6031 workInProgress.memoizedState = null; 6032 return renderLanes; 6033 } 6034 function mountSuspensePrimaryChildren(workInProgress, primaryChildren) { 6035 primaryChildren = mountWorkInProgressOffscreenFiber({ 6036 mode: "visible", 6037 children: primaryChildren 6038 }, workInProgress.mode); 6039 primaryChildren.return = workInProgress; 6040 return workInProgress.child = primaryChildren; 6041 } 6042 function mountWorkInProgressOffscreenFiber(offscreenProps, mode) { 6043 offscreenProps = createFiber(22, offscreenProps, null, mode); 6044 offscreenProps.lanes = 0; 6045 return offscreenProps; 6046 } 6047 function retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes) { 6048 reconcileChildFibers(workInProgress, current.child, null, renderLanes); 6049 current = mountSuspensePrimaryChildren(workInProgress, workInProgress.pendingProps.children); 6050 current.flags |= 2; 6051 workInProgress.memoizedState = null; 6052 return current; 6053 } 6054 function updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, didPrimaryChildrenDefer, nextProps, suspenseInstance, suspenseState, renderLanes) { 6055 if (didSuspend) { 6056 if (workInProgress.flags & 256) return pushPrimaryTreeSuspenseHandler(workInProgress), workInProgress.flags &= -257, retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes); 6057 if (null !== workInProgress.memoizedState) return reuseSuspenseHandlerOnStack(workInProgress), workInProgress.child = current.child, workInProgress.flags |= 128, null; 6058 reuseSuspenseHandlerOnStack(workInProgress); 6059 var fallbackChildren = nextProps.fallback, fiberMode = workInProgress.mode, primaryChildFragment = mountWorkInProgressOffscreenFiber({ 6060 mode: "visible", 6061 children: nextProps.children 6062 }, fiberMode); 6063 fallbackChildren = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes, null); 6064 fallbackChildren.flags |= 2;
6065 primaryChildFragment.return = workInProgress; 6066 fallbackChildren.return = workInProgress; 6067 primaryChildFragment.sibling = fallbackChildren; 6068 workInProgress.child = primaryChildFragment; 6069 reconcileChildFibers(workInProgress, current.child, null, renderLanes); 6070 fallbackChildren = workInProgress.child; 6071 fallbackChildren.memoizedState = mountSuspenseOffscreenState(renderLanes); 6072 fallbackChildren.childLanes = getRemainingWorkInPrimaryTree(current, didPrimaryChildrenDefer, renderLanes); 6073 workInProgress.memoizedState = SUSPENDED_MARKER; 6074 return bailoutOffscreenComponent(null, fallbackChildren); 6075 } 6076 pushPrimaryTreeSuspenseHandler(workInProgress); 6077 warnIfHydrating(); 6078 0 !== (renderLanes & 536870912) && markRenderDerivedCause(workInProgress); 6079 if (isSuspenseInstanceFallback(suspenseInstance)) { 6080 didPrimaryChildrenDefer = suspenseInstance.nextSibling && suspenseInstance.nextSibling.dataset; 6081 if (didPrimaryChildrenDefer) { 6082 fallbackChildren = didPrimaryChildrenDefer.dgst; 6083 var message = didPrimaryChildrenDefer.msg; 6084 fiberMode = didPrimaryChildrenDefer.stck; 6085 primaryChildFragment = didPrimaryChildrenDefer.cstck; 6086 } 6087 suspenseInstance = message; 6088 suspenseState = fallbackChildren; 6089 nextProps = fiberMode; 6090 didPrimaryChildrenDefer = primaryChildFragment; 6091 fallbackChildren = suspenseState; 6092 fiberMode = suspenseInstance; 6093 primaryChildFragment = nextProps; 6094 nextProps = didPrimaryChildrenDefer; 6095 fallbackChildren !== REACT_RECOVERABLE_DIGEST && (didPrimaryChildrenDefer = fiberMode ? Error(fiberMode) : Error("The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering."), didPrimaryChildrenDefer.stack = primaryChildFragment || "", didPrimaryChildrenDefer.digest = fallbackChildren, fallbackChildren = void 0 === nextProps ? null : nextProps, fiberMode = { 6096 value: didPrimaryChildrenDefer, 6097 source: null, 6098 stack: fallbackChildren 6099 }, "string" === typeof fallbackChildren && CapturedStacks.set(didPrimaryChildrenDefer, fiberMode), queueHydrationError(fiberMode)); 6100 return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes); 6101 } 6102 didReceiveUpdate || propagateParentContextChanges(current, workInProgress, renderLanes, !1); 6103 didPrimaryChildrenDefer = 0 !== (renderLanes & current.childLanes); 6104 if (didReceiveUpdate || didPrimaryChildrenDefer) { 6105 if (null !== currentTreeHiddenStackCursor.current) return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes); 6106 didPrimaryChildrenDefer = workInProgressRoot; 6107 if (null !== didPrimaryChildrenDefer && (fallbackChildren = getBumpedLaneForHydration(didPrimaryChildrenDefer, renderLanes), 0 !== fallbackChildren && fallbackChildren !== suspenseState.retryLane)) throw suspenseState.retryLane = fallbackChildren, enqueueConcurrentRenderForLane(current, fallbackChildren), scheduleUpdateOnFiber(didPrimaryChildrenDefer, current, fallbackChildren), SelectiveHydrationException; 6108 isSuspenseInstancePending(suspenseInstance) || renderDidSuspendDelayIfPossible(); 6109 return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes); 6110 } 6111 if (isSuspenseInstancePending(suspenseInstance)) return workInProgress.flags |= 192, workInProgress.child = current.child, null; 6112 current = suspenseState.treeContext; 6113 nextHydratableInstance = getNextHydratable(suspenseInstance.nextSibling); 6114 hydrationParentFiber = workInProgress; 6115 isHydrating = !0; 6116 hydrationErrors = null; 6117 didSuspendOrErrorDEV = !1; 6118 hydrationDiffRootDEV = null; 6119 rootOrSingletonContext = !1; 6120 null !== current && restoreSuspendedTreeContext(workInProgress, current); 6121 workInProgress = mountSuspensePrimaryChildren(workInProgress, nextProps.children); 6122 workInProgress.flags |= 134221824; 6123 return workInProgress; 6124 } 6125 function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) { 6126 fiber.lanes |= renderLanes; 6127 var alternate = fiber.alternate; 6128 null !== alternate && (alternate.lanes |= renderLanes); 6129 scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot); 6130 } 6131 function findLastContentRow(firstChild) { 6132 for (var lastContentRow = null; null !== firstChild;) { 6133 var currentRow = firstChild.alternate; 6134 null !== currentRow && null === findFirstSuspended(currentRow) && (lastContentRow = firstChild); 6135 firstChild = firstChild.sibling; 6136 } 6137 return lastContentRow; 6138 } 6139 function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, treeForkCount) { 6140 var renderState = workInProgress.memoizedState;
6141 null === renderState ? workInProgress.memoizedState = { 6142 isBackwards, 6143 rendering: null, 6144 renderingStartTime: 0, 6145 last: lastContentRow, 6146 tail, 6147 tailMode, 6148 treeForkCount 6149 } : (renderState.isBackwards = isBackwards, renderState.rendering = null, renderState.renderingStartTime = 0, renderState.last = lastContentRow, renderState.tail = tail, renderState.tailMode = tailMode, renderState.treeForkCount = treeForkCount); 6150 } 6151 function reverseChildren(fiber) { 6152 var row = fiber.child; 6153 for (fiber.child = null; null !== row;) { 6154 var nextRow = row.sibling; 6155 row.sibling = fiber.child; 6156 fiber.child = row; 6157 row = nextRow; 6158 } 6159 } 6160 function updateSuspenseListComponent(current, workInProgress, renderLanes) { 6161 var nextProps = workInProgress.pendingProps, revealOrder = nextProps.revealOrder, tailMode = nextProps.tail, newChildren = nextProps.children, suspenseContext = suspenseStackCursor.current; 6162 if (workInProgress.flags & 128) return pushSuspenseListContext(workInProgress, suspenseContext), null; 6163 (nextProps = 0 !== (suspenseContext & ForceSuspenseFallback)) ? (suspenseContext = suspenseContext & SubtreeSuspenseContextMask | ForceSuspenseFallback, workInProgress.flags |= 128) : suspenseContext &= SubtreeSuspenseContextMask; 6164 pushSuspenseListContext(workInProgress, suspenseContext); 6165 suspenseContext = null == revealOrder ? "null" : revealOrder; 6166 if (null != revealOrder && "forwards" !== revealOrder && "backwards" !== revealOrder && "unstable_legacy-backwards" !== revealOrder && "together" !== revealOrder && "independent" !== revealOrder && !didWarnAboutRevealOrder[suspenseContext]) if (didWarnAboutRevealOrder[suspenseContext] = !0, "string" === typeof revealOrder) switch (revealOrder.toLowerCase()) { 6167 case "together": 6168 case "forwards": 6169 case "backwards": 6170 case "independent": 6171 console.error("\"%s\" is not a valid value for revealOrder on <SuspenseList />. Use lowercase \"%s\" instead.", revealOrder, revealOrder.toLowerCase()); 6172 break; 6173 case "forward": 6174 case "backward": 6175 console.error("\"%s\" is not a valid value for revealOrder on <SuspenseList />. React uses the -s suffix in the spelling. Use \"%ss\" instead.", revealOrder, revealOrder.toLowerCase()); 6176 break; 6177 default: console.error("\"%s\" is not a supported revealOrder on <SuspenseList />. Did you mean \"independent\", \"together\", \"forwards\" or \"backwards\"?", revealOrder); 6178 } 6179 else console.error("%s is not a supported value for revealOrder on <SuspenseList />. Did you mean \"independent\", \"together\", \"forwards\" or \"backwards\"?", revealOrder); 6180 suspenseContext = null == tailMode ? "null" : tailMode; 6181 didWarnAboutTailOptions[suspenseContext] || null == tailMode || ("visible" !== tailMode && "collapsed" !== tailMode && "hidden" !== tailMode ? (didWarnAboutTailOptions[suspenseContext] = !0, console.error("\"%s\" is not a supported value for tail on <SuspenseList />. Did you mean \"visible\", \"collapsed\" or \"hidden\"?", tailMode)) : null != revealOrder && "forwards" !== revealOrder && "backwards" !== revealOrder && "unstable_legacy-backwards" !== revealOrder && (didWarnAboutTailOptions[suspenseContext] = !0, console.error("<SuspenseList tail=\"%s\" /> is only valid if revealOrder is \"forwards\" (default) or \"backwards\". Did you mean to specify revealOrder=\"forwards\"?", tailMode))); 6182 a: if ((null == revealOrder || "forwards" === revealOrder || "backwards" === revealOrder || "unstable_legacy-backwards" === revealOrder) && void 0 !== newChildren && null !== newChildren && !1 !== newChildren) if (isArrayImpl(newChildren)) { 6183 for (suspenseContext = 0; suspenseContext < newChildren.length; suspenseContext++) if (!validateSuspenseListNestedChild(newChildren[suspenseContext], suspenseContext)) break a; 6184 } else if (suspenseContext = getIteratorFn(newChildren), "function" === typeof suspenseContext) { 6185 if (suspenseContext = suspenseContext.call(newChildren)) for (var step = suspenseContext.next(), _i = 0; !step.done; step = suspenseContext.next()) { 6186 if (!validateSuspenseListNestedChild(step.value, _i)) break a; 6187 _i++; 6188 } 6189 } else console.error("A single row was passed to a <SuspenseList revealOrder=\"%s\" />. This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?", revealOrder); 6190 "backwards" === revealOrder && null !== current ? (reverseChildren(current), reconcileChildren(current, workInProgress, newChildren, renderLanes), reverseChildren(current)) : reconcileChildren(current, workInProgress, newChildren, renderLanes); 6191 isHydrating ? (warnIfNotHydrating(), newChildren = treeForkCount) : newChildren = 0; 6192 if (!nextProps && null !== current && 0 !== (current.flags & 128)) a: for (current = workInProgress.child; null !== current;) { 6193 if (13 === current.tag) null !== current.memoizedState && scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress); 6194 else if (19 === current.tag) scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress); 6195 else if (null !== current.child) { 6196 current.child.return = current; 6197 current = current.child; 6198 continue; 6199 } 6200 if (current === workInProgress) break a; 6201 for (; null === current.sibling;) { 6202 if (null === current.return || current.return === workInProgress) break a; 6203 current = current.return; 6204 } 6205 current.sibling.return = current.return; 6206 current = current.sibling; 6207 } 6208 switch (revealOrder) { 6209 case "backwards": 6210 renderLanes = findLastContentRow(workInProgress.child); 6211 null === renderLanes ? (revealOrder = workInProgress.child, workInProgress.child = null) : (revealOrder = renderLanes.sibling, renderLanes.sibling = null, reverseChildren(workInProgress)); 6212 initSuspenseListRenderState(workInProgress, !0, revealOrder, null, tailMode, newChildren); 6213 break; 6214 case "unstable_legacy-backwards": 6215 renderLanes = null; 6216 revealOrder = workInProgress.child; 6217 for (workInProgress.child = null; null !== revealOrder;) { 6218 current = revealOrder.alternate; 6219 if (null !== current && null === findFirstSuspended(current)) { 6220 workInProgress.child = revealOrder; 6221 break; 6222 } 6223 current = revealOrder.sibling; 6224 revealOrder.sibling = renderLanes; 6225 renderLanes = revealOrder; 6226 revealOrder = current; 6227 } 6228 initSuspenseListRenderState(workInProgress, !0, renderLanes, null, tailMode, newChildren); 6229 break; 6230 case "together": 6231 initSuspenseListRenderState(workInProgress, !1, null, null, void 0, newChildren); 6232 break; 6233 case "independent": 6234 workInProgress.memoizedState = null; 6235 break; 6236 default: renderLanes = findLastContentRow(workInProgress.child), null === renderLanes ? (revealOrder = workInProgress.child, workInProgress.child = null) : (revealOrder = renderLanes.sibling, renderLanes.sibling = null), initSuspenseListRenderState(workInProgress, !1, revealOrder, renderLanes, tailMode, newChildren); 6237 } 6238 return workInProgress.child; 6239 } 6240 function updateContextProvider(current, workInProgress, renderLanes) { 6241 var context = workInProgress.type, newProps = workInProgress.pendingProps, newValue = newProps.value; 6242 "value" in newProps || hasWarnedAboutUsingNoValuePropOnContextProvider || (hasWarnedAboutUsingNoValuePropOnContextProvider = !0, console.error("The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?")); 6243 pushProvider(workInProgress, context, newValue); 6244 reconcileChildren(current, workInProgress, newProps.children, renderLanes); 6245 return workInProgress.child; 6246 } 6247 function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) { 6248 null !== current && (workInProgress.dependencies = current.dependencies); 6249 profilerStartTime = -1; 6250 workInProgressRootSkippedLanes |= workInProgress.lanes; 6251 if (0 === (renderLanes & workInProgress.childLanes)) if (null !== current) { 6252 if (propagateParentContextChanges(current, workInProgress, renderLanes, !1), 0 === (renderLanes & workInProgress.childLanes)) return null; 6253 } else return null; 6254 if (null !== current && workInProgress.child !== current.child) throw Error("Resuming work not yet implemented."); 6255 if (null !== workInProgress.child) { 6256 current = workInProgress.child; 6257 renderLanes = createWorkInProgress(current, current.pendingProps); 6258 workInProgress.child = renderLanes;
vendor: 4,326 bytes, lines 6259-6338
6259 for (renderLanes.return = workInProgress; null !== current.sibling;) current = current.sibling, renderLanes = renderLanes.sibling = createWorkInProgress(current, current.pendingProps), renderLanes.return = workInProgress; 6260 renderLanes.sibling = null; 6261 } 6262 return workInProgress.child; 6263 } 6264 function checkScheduledUpdateOrContext(current, renderLanes) { 6265 if (0 !== (current.lanes & renderLanes)) return !0; 6266 current = current.dependencies; 6267 return null !== current && checkIfContextChanged(current) ? !0 : !1; 6268 } 6269 function attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes) { 6270 switch (workInProgress.tag) { 6271 case 3: 6272 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); 6273 pushProvider(workInProgress, CacheContext, current.memoizedState.cache); 6274 resetHydrationState(); 6275 break; 6276 case 27: 6277 case 5: 6278 pushHostContext(workInProgress); 6279 break; 6280 case 4: 6281 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); 6282 break; 6283 case 10: 6284 pushProvider(workInProgress, workInProgress.type, workInProgress.memoizedProps.value); 6285 break; 6286 case 12: 6287 0 !== (renderLanes & workInProgress.childLanes) && (workInProgress.flags |= 4); 6288 workInProgress.flags |= 2048; 6289 var stateNode = workInProgress.stateNode; 6290 stateNode.effectDuration = -0; 6291 stateNode.passiveEffectDuration = -0; 6292 break; 6293 case 31: 6294 if (null !== workInProgress.memoizedState) return workInProgress.flags |= 128, pushDehydratedActivitySuspenseHandler(workInProgress), null; 6295 break; 6296 case 13: 6297 stateNode = workInProgress.memoizedState; 6298 if (null !== stateNode) { 6299 if (null !== stateNode.dehydrated) return pushPrimaryTreeSuspenseHandler(workInProgress), workInProgress.flags |= 128, null; 6300 stateNode = propagateParentContextChanges(current, workInProgress, renderLanes, !1); 6301 var primaryChildLanes = workInProgress.child.childLanes; 6302 if (stateNode || 0 !== (renderLanes & primaryChildLanes)) return updateSuspenseComponent(current, workInProgress, renderLanes); 6303 pushPrimaryTreeSuspenseHandler(workInProgress); 6304 current = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 6305 return null !== current ? current.sibling : null; 6306 } 6307 pushPrimaryTreeSuspenseHandler(workInProgress); 6308 break; 6309 case 19: 6310 if (workInProgress.flags & 128) return updateSuspenseListComponent(current, workInProgress, renderLanes); 6311 primaryChildLanes = 0 !== (current.flags & 128); 6312 stateNode = 0 !== (renderLanes & workInProgress.childLanes); 6313 stateNode || (propagateParentContextChanges(current, workInProgress, renderLanes, !1), stateNode = 0 !== (renderLanes & workInProgress.childLanes)); 6314 if (primaryChildLanes) { 6315 if (stateNode) return updateSuspenseListComponent(current, workInProgress, renderLanes); 6316 workInProgress.flags |= 128; 6317 } 6318 primaryChildLanes = workInProgress.memoizedState; 6319 null !== primaryChildLanes && (primaryChildLanes.rendering = null, primaryChildLanes.tail = null, primaryChildLanes.lastEffect = null); 6320 pushSuspenseListContext(workInProgress, suspenseStackCursor.current); 6321 if (stateNode) break; 6322 else return null; 6323 case 22: return workInProgress.lanes = 0, updateOffscreenComponent(current, workInProgress, renderLanes, workInProgress.pendingProps); 6324 case 24: pushProvider(workInProgress, CacheContext, current.memoizedState.cache); 6325 } 6326 return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 6327 } 6328 function beginWork(current, workInProgress, renderLanes) { 6329 if (workInProgress._debugNeedsRemount && null !== current) { 6330 renderLanes = createFiberFromTypeAndProps(resolveTypeForHotReloading(workInProgress.elementType), workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes); 6331 renderLanes._debugStack = workInProgress._debugStack; 6332 renderLanes._debugTask = workInProgress._debugTask; 6333 var returnFiber = workInProgress.return; 6334 if (null === returnFiber) throw Error("Cannot swap the root fiber."); 6335 current.alternate = null; 6336 workInProgress.alternate = null; 6337 renderLanes.index = workInProgress.index; 6338 renderLanes.sibling = workInProgress.sibling;
6339 renderLanes.return = workInProgress.return; 6340 renderLanes.ref = workInProgress.ref; 6341 renderLanes._debugInfo = workInProgress._debugInfo; 6342 if (workInProgress === returnFiber.child) returnFiber.child = renderLanes; 6343 else { 6344 var prevSibling = returnFiber.child; 6345 if (null === prevSibling) throw Error("Expected parent to have a child."); 6346 for (; prevSibling.sibling !== workInProgress;) if (prevSibling = prevSibling.sibling, null === prevSibling) throw Error("Expected to find the previous sibling."); 6347 prevSibling.sibling = renderLanes; 6348 } 6349 workInProgress = returnFiber.deletions; 6350 null === workInProgress ? (returnFiber.deletions = [current], returnFiber.flags |= 16) : workInProgress.push(current); 6351 renderLanes.flags |= 134217730; 6352 return renderLanes; 6353 } 6354 if (null !== current) if (current.memoizedProps !== workInProgress.pendingProps || workInProgress.type !== current.type) didReceiveUpdate = !0; 6355 else { 6356 if (!checkScheduledUpdateOrContext(current, renderLanes) && 0 === (workInProgress.flags & 128)) return didReceiveUpdate = !1, attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes); 6357 didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1; 6358 } 6359 else { 6360 didReceiveUpdate = !1; 6361 if (returnFiber = isHydrating) warnIfNotHydrating(), returnFiber = 0 !== (workInProgress.flags & 1048576); 6362 returnFiber && (returnFiber = workInProgress.index, warnIfNotHydrating(), pushTreeId(workInProgress, treeForkCount, returnFiber)); 6363 } 6364 workInProgress.lanes = 0; 6365 switch (workInProgress.tag) { 6366 case 16: 6367 a: if (returnFiber = workInProgress.pendingProps, current = resolveLazy(workInProgress.elementType), current = resolveTypeForHotReloading(current), workInProgress.type = current, "function" === typeof current) shouldConstruct(current) ? (returnFiber = resolveClassComponentProps(current, returnFiber), workInProgress.tag = 1, workInProgress = updateClassComponent(null, workInProgress, current, returnFiber, renderLanes)) : (workInProgress.tag = 0, validateFunctionComponentInDev(workInProgress, current), workInProgress = updateFunctionComponent(null, workInProgress, current, returnFiber, renderLanes)); 6368 else { 6369 if (void 0 !== current && null !== current) { 6370 if (prevSibling = current.$$typeof, prevSibling === REACT_FORWARD_REF_TYPE) { 6371 workInProgress.tag = 11; 6372 workInProgress = updateForwardRef(null, workInProgress, current, returnFiber, renderLanes); 6373 break a; 6374 } else if (prevSibling === REACT_MEMO_TYPE) { 6375 workInProgress.tag = 14; 6376 workInProgress = updateMemoComponent(null, workInProgress, current, returnFiber, renderLanes); 6377 break a; 6378 } else if (prevSibling === REACT_CONTEXT_TYPE) { 6379 workInProgress.tag = 10; 6380 workInProgress.type = current; 6381 workInProgress = updateContextProvider(null, workInProgress, renderLanes); 6382 break a; 6383 } 6384 } 6385 workInProgress = ""; 6386 null !== current && "object" === typeof current && current.$$typeof === REACT_LAZY_TYPE && (workInProgress = " Did you wrap a component in React.lazy() more than once?"); 6387 renderLanes = getComponentNameFromType(current) || current; 6388 throw Error("Element type is invalid. Received a promise that resolves to: " + renderLanes + ". Lazy element type must resolve to a class or function." + workInProgress); 6389 } 6390 return workInProgress; 6391 case 0: return updateFunctionComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes); 6392 case 1: return returnFiber = workInProgress.type, prevSibling = resolveClassComponentProps(returnFiber, workInProgress.pendingProps), updateClassComponent(current, workInProgress, returnFiber, prevSibling, renderLanes); 6393 case 3: 6394 a: { 6395 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); 6396 if (null === current) throw Error("Should have a current fiber. This is a bug in React."); 6397 returnFiber = workInProgress.pendingProps; 6398 var prevState = workInProgress.memoizedState; 6399 prevSibling = prevState.element; 6400 cloneUpdateQueue(current, workInProgress); 6401 processUpdateQueue(workInProgress, returnFiber, null, renderLanes); 6402 var nextState = workInProgress.memoizedState; 6403 returnFiber = nextState.cache;
6404 pushProvider(workInProgress, CacheContext, returnFiber); 6405 returnFiber !== prevState.cache && propagateContextChanges(workInProgress, [CacheContext], renderLanes, !0); 6406 suspendIfUpdateReadFromEntangledAsyncAction(); 6407 returnFiber = nextState.element; 6408 if (prevState.isDehydrated) if (prevState = { 6409 element: returnFiber, 6410 isDehydrated: !1, 6411 cache: nextState.cache 6412 }, workInProgress.updateQueue.baseState = prevState, workInProgress.memoizedState = prevState, workInProgress.flags & 256) { 6413 workInProgress = mountHostRootWithoutHydrating(current, workInProgress, returnFiber, renderLanes); 6414 break a; 6415 } else if (returnFiber !== prevSibling) { 6416 prevSibling = createCapturedValueAtFiber(Error("This root received an early update, before anything was able hydrate. Switched the entire root to client rendering."), workInProgress); 6417 queueHydrationError(prevSibling); 6418 workInProgress = mountHostRootWithoutHydrating(current, workInProgress, returnFiber, renderLanes); 6419 break a; 6420 } else { 6421 current = workInProgress.stateNode.containerInfo; 6422 switch (current.nodeType) { 6423 case 9: 6424 current = current.body; 6425 break; 6426 default: current = "HTML" === current.nodeName ? current.ownerDocument.body : current; 6427 } 6428 nextHydratableInstance = getNextHydratable(current.firstChild); 6429 hydrationParentFiber = workInProgress; 6430 isHydrating = !0; 6431 hydrationErrors = null; 6432 didSuspendOrErrorDEV = !1; 6433 hydrationDiffRootDEV = null; 6434 rootOrSingletonContext = !0; 6435 renderLanes = mountChildFibers(workInProgress, null, returnFiber, renderLanes); 6436 for (workInProgress.child = renderLanes; renderLanes;) renderLanes.flags = renderLanes.flags & -3 | 134221824, renderLanes = renderLanes.sibling; 6437 } 6438 else { 6439 resetHydrationState(); 6440 if (returnFiber === prevSibling) { 6441 workInProgress = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); 6442 break a; 6443 } 6444 reconcileChildren(current, workInProgress, returnFiber, renderLanes); 6445 } 6446 workInProgress = workInProgress.child; 6447 } 6448 return workInProgress; 6449 case 26: return markRef(current, workInProgress), null === current ? (renderLanes = getResource(workInProgress.type, null, workInProgress.pendingProps, null)) ? workInProgress.memoizedState = renderLanes : isHydrating || (workInProgress.stateNode = createHoistableInstance(workInProgress.type, workInProgress.pendingProps, requiredContext(rootInstanceStackCursor.current), workInProgress)) : workInProgress.memoizedState = getResource(workInProgress.type, current.memoizedProps, workInProgress.pendingProps, current.memoizedState), null; 6450 case 27: return pushHostContext(workInProgress), null === current && isHydrating && (returnFiber = requiredContext(rootInstanceStackCursor.current), prevSibling = getHostContext(), returnFiber = workInProgress.stateNode = resolveSingletonInstance(workInProgress.type, workInProgress.pendingProps, returnFiber, prevSibling, !1), didSuspendOrErrorDEV || (prevSibling = diffHydratedProperties(returnFiber, workInProgress.type, workInProgress.pendingProps, prevSibling), null !== prevSibling && (buildHydrationDiffNode(workInProgress, 0).serverProps = prevSibling)), hydrationParentFiber = workInProgress, rootOrSingletonContext = !0, prevSibling = nextHydratableInstance, isSingletonScope(workInProgress.type) ? (previousHydratableOnEnteringScopedSingleton = prevSibling, nextHydratableInstance = getNextHydratable(returnFiber.firstChild)) : nextHydratableInstance = prevSibling), reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), markRef(current, workInProgress), null === current && (workInProgress.flags |= 4194304), workInProgress.child; 6451 case 5: return null === current && isHydrating && (prevState = getHostContext(), returnFiber = validateDOMNesting(workInProgress.type, prevState.ancestorInfo), prevSibling = nextHydratableInstance, (nextState = !prevSibling) || (nextState = canHydrateInstance(prevSibling, workInProgress.type, workInProgress.pendingProps, rootOrSingletonContext), null !== nextState ? (workInProgress.stateNode = nextState, didSuspendOrErrorDEV || (prevState = diffHydratedProperties(nextState, workInProgress.type, workInProgress.pendingProps, prevState), null !== prevState && (buildHydrationDiffNode(workInProgress, 0).serverProps = prevState)), hydrationParentFiber = workInProgress, nextHydratableInstance = getNextHydratable(nextState.firstChild), rootOrSingletonContext = !1, prevState = !0) : prevState = !1, nextState = !prevState), nextState && (returnFiber && warnNonHydratedInstance(workInProgress, prevSibling), throwOnHydrationMismatch(workInProgress))), pushHostContext(workInProgress), prevSibling = workInProgress.type, prevState = workInProgress.pendingProps, nextState = null !== current ? current.memoizedProps : null, returnFiber = prevState.children, shouldSetTextContent(prevSibling, prevState) ? returnFiber = null : null !== nextState && shouldSetTextContent(prevSibling, nextState) && (workInProgress.flags |= 32), null !== workInProgress.memoizedState && (prevSibling = renderWithHooks(current, workInProgress, TransitionAwareHostComponent, null, null, renderLanes), HostTransitionContext._currentValue = prevSibling), markRef(current, workInProgress), reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child; 6452 case 6: return null === current && isHydrating && (renderLanes = w
6452orkInProgress.pendingProps, current = getHostContext(), returnFiber = current.ancestorInfo.current, renderLanes = null != returnFiber ? validateTextNesting(renderLanes, returnFiber.tag, current.ancestorInfo.implicitRootScope) : !0, current = nextHydratableInstance, (returnFiber = !current) || (returnFiber = canHydrateTextInstance(current, workInProgress.pendingProps, rootOrSingletonContext), null !== returnFiber ? (workInProgress.stateNode = returnFiber, hydrationParentFiber = workInProgress, nextHydratableInstance = null, returnFiber = !0) : returnFiber = !1, returnFiber = !returnFiber), returnFiber && (renderLanes && warnNonHydratedInstance(workInProgress, current), throwOnHydrationMismatch(workInProgress))), null; 6453 case 13: return updateSuspenseComponent(current, workInProgress, renderLanes); 6454 case 4: return pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo), returnFiber = workInProgress.pendingProps, null === current ? workInProgress.child = reconcileChildFibers(workInProgress, null, returnFiber, renderLanes) : reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child; 6455 case 11: return updateForwardRef(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes); 6456 case 7: return returnFiber = workInProgress.pendingProps, markRef(current, workInProgress), reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child; 6457 case 8: return reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), workInProgress.child; 6458 case 12: return workInProgress.flags |= 4, workInProgress.flags |= 2048, returnFiber = workInProgress.stateNode, returnFiber.effectDuration = -0, returnFiber.passiveEffectDuration = -0, reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), workInProgress.child; 6459 case 10: return updateContextProvider(current, workInProgress, renderLanes); 6460 case 9: return prevSibling = workInProgress.type._context, returnFiber = workInProgress.pendingProps.children, "function" !== typeof returnFiber && console.error("A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it."), prepareToReadContext(workInProgress), prevSibling = readContext(prevSibling), returnFiber = callComponentInDEV(returnFiber, prevSibling, void 0), workInProgress.flags |= 1, reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child; 6461 case 14: return updateMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes); 6462 case 15: return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes); 6463 case 19: return updateSuspenseListComponent(current, workInProgress, renderLanes); 6464 case 31: return updateActivityComponent(current, workInProgress, renderLanes); 6465 case 22: return updateOffscreenComponent(current, workInProgress, renderLanes, workInProgress.pendingProps); 6466 case 24: return prepareToReadContext(workInProgress), returnFiber = readContext(CacheContext), null === current ? (prevSibling = peekCacheFromPool(), null === prevSibling && (prevSibling = workInProgressRoot, prevState = createCache(), prevSibling.pooledCache = prevState, retainCache(prevState), null !== prevState && (prevSibling.pooledCacheLanes |= renderLanes), prevSibling = prevState), workInProgress.memoizedState = { 6467 parent: returnFiber, 6468 cache: prevSibling 6469 }, initializeUpdateQueue(workInProgress), pushProvider(workInProgress, CacheContext, prevSibling)) : (0 !== (current.lanes & renderLanes) && (cloneUpdateQueue(current, workInProgress), processUpdateQueue(workInProgress, null, null, renderLanes), suspendIfUpdateReadFromEntangledAsyncAction()), prevSibling = current.memoizedState, prevState = workInProgress.memoizedState, prevSibling.parent !== returnFiber ? (prevSibling = { 6470 parent: returnFiber, 6471 cache: returnFiber 6472 }, workInProgress.memoizedState = prevSibling, 0 === workInProgress.lanes && (workInProgress.memoizedState = workInProgress.updateQueue.baseState = prevSibling), pushProvider(workInProgress, CacheContext, returnFiber)) : (returnFiber = prevState.cache, pushProvider(workInProgress, CacheContext, returnFiber), returnFiber !== prevSibling.cache && propagateContextChanges(wor
6472kInProgress, [CacheContext], renderLanes, !0))), reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), workInProgress.child; 6473 case 30: return null === workInProgress.stateNode && (workInProgress.stateNode = { 6474 autoName: null, 6475 paired: null, 6476 clones: null, 6477 ref: null 6478 }), returnFiber = workInProgress.pendingProps, null != returnFiber.name && "auto" !== returnFiber.name ? workInProgress.flags |= null === current ? 18882560 : 18874368 : isHydrating && pushMaterializedTreeId(workInProgress), void 0 !== returnFiber.className && (prevSibling = "string" === typeof returnFiber.className ? JSON.stringify(returnFiber.className) : "{...}", didWarnAboutClassNameOnViewTransition[prevSibling] || (didWarnAboutClassNameOnViewTransition[prevSibling] = !0, console.error("<ViewTransition> doesn't accept a \"className\" prop. It has been renamed to \"default\".\n- <ViewTransition className=%s>\n+ <ViewTransition default=%s>", prevSibling, prevSibling))), null !== current && current.memoizedProps.name !== returnFiber.name ? workInProgress.flags |= 4194816 : markRef(current, workInProgress), reconcileChildren(current, workInProgress, returnFiber.children, renderLanes), workInProgress.child; 6479 case 29: throw workInProgress.pendingProps; 6480 } 6481 throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue."); 6482 } 6483 function markUpdate(workInProgress) { 6484 workInProgress.flags |= 4; 6485 } 6486 function preloadInstanceAndSuspendIfNeeded(workInProgress, type, oldProps, newProps, renderLanes) { 6487 var JSCompiler_temp; 6488 if (JSCompiler_temp = (workInProgress.mode & SuspenseyImagesMode) !== NoMode) JSCompiler_temp = null === oldProps ? maySuspendCommit(type, newProps) : maySuspendCommit(type, newProps) && (newProps.src !== oldProps.src || newProps.srcSet !== oldProps.srcSet); 6489 if (JSCompiler_temp) { 6490 if (workInProgress.flags |= 16777216, (renderLanes & 335544128) === renderLanes) if (workInProgress.stateNode.complete) workInProgress.flags |= 8192; 6491 else if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192; 6492 else throw suspendedThenable = noopSuspenseyCommitThenable, SuspenseyCommitException; 6493 } else workInProgress.flags &= -16777217; 6494 } 6495 function preloadResourceAndSuspendIfNeeded(workInProgress, resource) { 6496 if ("stylesheet" !== resource.type || (resource.state.loading & Inserted) !== NotLoaded) workInProgress.flags &= -16777217; 6497 else if (workInProgress.flags |= 16777216, !preloadResource(resource)) if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192; 6498 else throw suspendedThenable = noopSuspenseyCommitThenable, SuspenseyCommitException; 6499 } 6500 function scheduleRetryEffect(workInProgress, retryQueue) { 6501 null !== retryQueue && (workInProgress.flags |= 4); 6502 workInProgress.flags & 16384 && (retryQueue = 22 !== workInProgress.tag ? claimNextRetryLane() : 536870912, workInProgress.lanes |= retryQueue, workInProgressSuspendedRetryLanes |= retryQueue); 6503 } 6504 function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { 6505 if (!isHydrating) switch (renderState.tailMode) { 6506 case "visible": break; 6507 case "collapsed": 6508 for (var tailNode = renderState.tail, lastTailNode = null; null !== tailNode;) null !== tailNode.alternate && (lastTailNode = tailNode), tailNode = tailNode.sibling; 6509 null === lastTailNode ? hasRenderedATailFallback || null === renderState.tail ? renderState.tail = null : renderState.tail.sibling = null : lastTailNode.sibling = null; 6510 break; 6511 default: 6512 hasRenderedATailFallback = renderState.tail; 6513 for (tailNode = null; null !== hasRenderedATailFallback;) null !== hasRenderedATailFallback.alternate && (tailNode = hasRenderedATailFallback), hasRenderedATailFallback = hasRenderedATailFallback.sibling; 6514 null === tailNode ? renderState.tail = null : tailNode.sibling = null; 6515 } 6516 } 6517 function bubbleProperties(completedWork) { 6518 var didBailout = null !== completedWork.alternate && completedWork.alternate.child === completedWork.child, newChildLanes = 0, subtreeFlags = 0; 6519 if (didBailout) if ((completedWork.mode & ProfileMode) !== NoMode) { 6520 for (var _treeBaseDuration = completedWork.selfBaseDuration, _child2 = completedWork.child; null !== _child2;) newChildLanes |= _child2.lanes | _child2.childLanes, subtreeFlags |= _child2.subtreeFlags & 1206910976, subtreeFlags |= _child2.flags & 1206910976, _treeBaseDuration += _child2.treeBaseDuration, _child2 = _child2.sibling; 6521 completedWork.treeBaseDuration = _treeBaseDuration; 6522 } else for (_treeBaseDuration = completedWork.child; null !== _treeBaseDuration;) newChildLanes |= _treeBaseDuration.lanes | _treeBaseDuration.childLanes, subtreeFlags |= _treeBaseDuration.subtreeFlags & 1206910976, subtreeFlags |= _treeBaseDuration.flags & 1206910976, _treeBaseDuration.return = completedWork, _treeBaseDuration = _treeBaseDuration.sibling; 6523 else if ((completedWork.mode & ProfileMode) !== NoMode) { 6524 _treeBaseDuration = completedWork.actualDuration; 6525 _child2 = completedWork.selfBaseDuration; 6526 for (var child = completedWork.child; null !== child;) newChildLanes |= child.lanes | child.childLanes, subtreeFlags |= child.subtreeFlags, subtreeFlags |= child.flags, _treeBaseDuration += child.actualDuration, _child2 += child.treeBaseDuration, child = child.sibling; 6527 completedWork.actualDuration = _treeBaseDuration; 6528 completedWork.treeBaseDuration = _child2; 6529 } else for (_treeBaseDuration = completedWork.child; null !== _treeBaseDuration;) newChildLanes |= _treeBaseDuration.lanes | _treeBaseDuration.childLanes, subtreeFlags |= _treeBaseDuration.subtreeFlags, subtreeFlags |= _treeBaseDuration.flags, _treeBaseDuration.return = completedWork, _treeBaseDuration = _treeBaseDuration.sibling; 6530 completedWork.subtreeFlags |= subtreeFlags; 6531 completedWork.childLanes = newChildLanes; 6532 return didBailout; 6533 } 6534 function completeWork(current, workInProgress, renderLanes) { 6535 var newProps = workInProgress.pendingProps; 6536 popTreeContext(workInProgress); 6537 switch (workInProgress.tag) { 6538 case 16: 6539 case 15: 6540 case 0: 6541 case 11: 6542 case 7: 6543 case 8:
vendor: 8,249 bytes, lines 6544-6670
6544 case 12: 6545 case 9: 6546 case 14: return bubbleProperties(workInProgress), null; 6547 case 1: return bubbleProperties(workInProgress), null; 6548 case 3: 6549 renderLanes = workInProgress.stateNode; 6550 newProps = null; 6551 null !== current && (newProps = current.memoizedState.cache); 6552 workInProgress.memoizedState.cache !== newProps && (workInProgress.flags |= 2048); 6553 popProvider(CacheContext, workInProgress); 6554 popHostContainer(workInProgress); 6555 renderLanes.pendingContext && (renderLanes.context = renderLanes.pendingContext, renderLanes.pendingContext = null); 6556 if (null === current || null === current.child) popHydrationState(workInProgress) ? (emitPendingHydrationWarnings(), markUpdate(workInProgress)) : null === current || current.memoizedState.isDehydrated && 0 === (workInProgress.flags & 256) || (workInProgress.flags |= 1024, upgradeHydrationErrorsToRecoverable()); 6557 bubbleProperties(workInProgress); 6558 return null; 6559 case 26: 6560 var type = workInProgress.type, nextResource = workInProgress.memoizedState; 6561 null === current ? (markUpdate(workInProgress), null !== nextResource ? (bubbleProperties(workInProgress), preloadResourceAndSuspendIfNeeded(workInProgress, nextResource)) : (bubbleProperties(workInProgress), preloadInstanceAndSuspendIfNeeded(workInProgress, type, null, newProps, renderLanes))) : nextResource ? nextResource !== current.memoizedState ? (markUpdate(workInProgress), bubbleProperties(workInProgress), preloadResourceAndSuspendIfNeeded(workInProgress, nextResource)) : (bubbleProperties(workInProgress), workInProgress.flags &= -16777217) : (current = current.memoizedProps, current !== newProps && markUpdate(workInProgress), bubbleProperties(workInProgress), preloadInstanceAndSuspendIfNeeded(workInProgress, type, current, newProps, renderLanes)); 6562 return null; 6563 case 27: 6564 popHostContext(workInProgress); 6565 renderLanes = requiredContext(rootInstanceStackCursor.current); 6566 type = workInProgress.type; 6567 if (null !== current && null != workInProgress.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress); 6568 else { 6569 if (!newProps) { 6570 if (null === workInProgress.stateNode) throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); 6571 bubbleProperties(workInProgress); 6572 workInProgress.subtreeFlags &= -33554433; 6573 return null; 6574 } 6575 current = getHostContext(); 6576 popHydrationState(workInProgress) ? prepareToHydrateHostInstance(workInProgress, current) : (current = resolveSingletonInstance(type, newProps, renderLanes, current, !0), workInProgress.stateNode = current, markUpdate(workInProgress)); 6577 } 6578 bubbleProperties(workInProgress); 6579 workInProgress.subtreeFlags &= -33554433; 6580 return null; 6581 case 5: 6582 popHostContext(workInProgress); 6583 type = workInProgress.type; 6584 if (null !== current && null != workInProgress.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress); 6585 else { 6586 if (!newProps) { 6587 if (null === workInProgress.stateNode) throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); 6588 bubbleProperties(workInProgress); 6589 workInProgress.subtreeFlags &= -33554433; 6590 return null; 6591 } 6592 var _currentHostContext = getHostContext(); 6593 if (popHydrationState(workInProgress)) prepareToHydrateHostInstance(workInProgress, _currentHostContext); 6594 else { 6595 nextResource = requiredContext(rootInstanceStackCursor.current); 6596 validateDOMNesting(type, _currentHostContext.ancestorInfo); 6597 _currentHostContext = _currentHostContext.context; 6598 nextResource = getOwnerDocumentFromRootContainer(nextResource); 6599 switch (_currentHostContext) { 6600 case HostContextNamespaceSvg: 6601 nextResource = nextResource.createElementNS(SVG_NAMESPACE, type); 6602 break; 6603 case HostContextNamespaceMath: 6604 nextResource = nextResource.createElementNS(MATH_NAMESPACE, type); 6605 break; 6606 default: switch (type) { 6607 case "svg": 6608 nextResource = nextResource.createElementNS(SVG_NAMESPACE, type); 6609 break; 6610 case "math": 6611 nextResource = nextResource.createElementNS(MATH_NAMESPACE, type); 6612 break; 6613 case "script": 6614 nextResource = nextResource.createElement("div"); 6615 didWarnScriptTags || isScriptDataBlock(newProps) || (console.error("Encountered a script tag while rendering React component. Scripts inside React components are never executed when rendering on the client. Consider using template tag instead (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)."), didWarnScriptTags = !0); 6616 nextResource.innerHTML = "<script><\/script>"; 6617 nextResource = nextResource.removeChild(nextResource.firstChild); 6618 break; 6619 case "select": 6620 nextResource = "string" === typeof newProps.is ? nextResource.createElement("select", { is: newProps.is }) : nextResource.createElement("select"); 6621 newProps.multiple ? nextResource.multiple = !0 : newProps.size && (nextResource.size = newProps.size); 6622 break; 6623 default: nextResource = "string" === typeof newProps.is ? nextResource.createElement(type, { is: newProps.is }) : nextResource.createElement(type), -1 === type.indexOf("-") && (type !== type.toLowerCase() && console.error("<%s /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.", type), "[object HTMLUnknownElement]" !== Object.prototype.toString.call(nextResource) || hasOwnProperty.call(warnedUnknownTags, type) || (warnedUnknownTags[type] = !0, console.error("The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.", type))); 6624 } 6625 } 6626 nextResource[internalInstanceKey] = workInProgress; 6627 nextResource[internalPropsKey] = newProps; 6628 a: for (_currentHostContext = workInProgress.child; null !== _currentHostContext;) { 6629 if (5 === _currentHostContext.tag || 6 === _currentHostContext.tag) nextResource.appendChild(_currentHostContext.stateNode); 6630 else if (4 !== _currentHostContext.tag && 27 !== _currentHostContext.tag && null !== _currentHostContext.child) { 6631 _currentHostContext.child.return = _currentHostContext; 6632 _currentHostContext = _currentHostContext.child; 6633 continue; 6634 } 6635 if (_currentHostContext === workInProgress) break a; 6636 for (; null === _currentHostContext.sibling;) { 6637 if (null === _currentHostContext.return || _currentHostContext.return === workInProgress) break a; 6638 _currentHostContext = _currentHostContext.return; 6639 } 6640 _currentHostContext.sibling.return = _currentHostContext.return; 6641 _currentHostContext = _currentHostContext.sibling; 6642 } 6643 workInProgress.stateNode = nextResource; 6644 a: switch (setInitialProperties(nextResource, type, newProps), type) { 6645 case "button": 6646 case "input": 6647 case "select": 6648 case "textarea": 6649 newProps = !!newProps.autoFocus; 6650 break a; 6651 case "img": 6652 newProps = !0; 6653 break a; 6654 default: newProps = !1; 6655 } 6656 newProps && markUpdate(workInProgress); 6657 } 6658 } 6659 bubbleProperties(workInProgress); 6660 workInProgress.subtreeFlags &= -33554433; 6661 preloadInstanceAndSuspendIfNeeded(workInProgress, workInProgress.type, null === current ? null : current.memoizedProps, workInProgress.pendingProps, renderLanes); 6662 return null; 6663 case 6: 6664 if (current && null != workInProgress.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress); 6665 else { 6666 if ("string" !== typeof newProps && null === workInProgress.stateNode) throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."); 6667 current = requiredContext(rootInstanceStackCursor.current); 6668 renderLanes = getHostContext(); 6669 if (popHydrationState(workInProgress)) { 6670 current = workInProgress.stateNode;
6671 renderLanes = workInProgress.memoizedProps; 6672 type = !didSuspendOrErrorDEV; 6673 newProps = null; 6674 nextResource = hydrationParentFiber; 6675 if (null !== nextResource) switch (nextResource.tag) { 6676 case 3: 6677 type && (type = diffHydratedTextForDevWarnings(current, renderLanes, newProps), null !== type && (buildHydrationDiffNode(workInProgress, 0).serverProps = type)); 6678 break; 6679 case 27: 6680 case 5: newProps = nextResource.memoizedProps, type && (type = diffHydratedTextForDevWarnings(current, renderLanes, newProps), null !== type && (buildHydrationDiffNode(workInProgress, 0).serverProps = type)); 6681 } 6682 current[internalInstanceKey] = workInProgress; 6683 current = current.nodeValue === renderLanes || null !== newProps && !0 === newProps.suppressHydrationWarning || checkForUnmatchedText(current.nodeValue, renderLanes) ? !0 : !1; 6684 current || throwOnHydrationMismatch(workInProgress, !0); 6685 } else type = renderLanes.ancestorInfo.current, null != type && validateTextNesting(newProps, type.tag, renderLanes.ancestorInfo.implicitRootScope), current = getOwnerDocumentFromRootContainer(current).createTextNode(newProps), current[internalInstanceKey] = workInProgress, workInProgress.stateNode = current; 6686 } 6687 bubbleProperties(workInProgress); 6688 return null; 6689 case 31: 6690 renderLanes = workInProgress.memoizedState; 6691 if (null === current || null !== current.memoizedState) { 6692 newProps = popHydrationState(workInProgress); 6693 if (null !== renderLanes) { 6694 if (null === current) { 6695 if (!newProps) throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React."); 6696 current = workInProgress.memoizedState; 6697 current = null !== current ? current.dehydrated : null; 6698 if (!current) throw Error("Expected to have a hydrated activity instance. This error is likely caused by a bug in React. Please file an issue."); 6699 current[internalInstanceKey] = workInProgress; 6700 bubbleProperties(workInProgress); 6701 (workInProgress.mode & ProfileMode) !== NoMode && null !== renderLanes && (current = workInProgress.child, null !== current && (workInProgress.treeBaseDuration -= current.treeBaseDuration)); 6702 } else emitPendingHydrationWarnings(), resetHydrationState(), 0 === (workInProgress.flags & 128) && (renderLanes = workInProgress.memoizedState = null), workInProgress.flags |= 4, bubbleProperties(workInProgress), (workInProgress.mode & ProfileMode) !== NoMode && null !== renderLanes && (current = workInProgress.child, null !== current && (workInProgress.treeBaseDuration -= current.treeBaseDuration)); 6703 current = !1; 6704 } else renderLanes = upgradeHydrationErrorsToRecoverable(), null !== current && null !== current.memoizedState && (current.memoizedState.hydrationErrors = renderLanes), current = !0; 6705 if (!current) { 6706 if (workInProgress.flags & 256) return popSuspenseHandler(workInProgress), workInProgress; 6707 popSuspenseHandler(workInProgress); 6708 return null; 6709 } 6710 if (0 !== (workInProgress.flags & 128)) throw Error("Client rendering an Activity suspended it again. This is a bug in React."); 6711 } 6712 bubbleProperties(workInProgress); 6713 return null; 6714 case 13: 6715 newProps = workInProgress.memoizedState; 6716 if (null === current || null !== current.memoizedState && null !== current.memoizedState.dehydrated) { 6717 type = newProps; 6718 nextResource = popHydrationState(workInProgress); 6719 if (null !== type && null !== type.dehydrated) { 6720 if (null === current) { 6721 if (!nextResource) throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React."); 6722 nextResource = workInProgress.memoizedState; 6723 nextResource = null !== nextResource ? nextResource.dehydrated : null; 6724 if (!nextResource) throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue."); 6725 nextResource[internalInstanceKey] = workInProgress; 6726 bubbleProperties(workInProgress); 6727 (workInProgress.mode & ProfileMode) !== NoMode && null !== type && (type = workInProgress.child, null !== type && (workInProgress.treeBaseDuration -= type.treeBaseDuration)); 6728 } else emitPendingHydrationWarnings(), resetHydrationState(), 0 === (workInProgress.flags & 128) && (type = workInProgress.memoizedState = null), workInProgress.flags |= 4, bubbleProperties(workInProgress), (workInProgress.mode & ProfileMode) !== NoMode && null !== type && (type = workInProgress.child, null !== type && (workInProgress.treeBaseDuration -= type.treeBaseDuration)); 6729 type = !1; 6730 } else type = upgradeHydrationErrorsToRecoverable(), null !== current && null !== current.memoizedState && (current.memoizedState.hydrationErrors = type), type = !0; 6731 if (!type) { 6732 if (workInProgress.flags & 256) return popSuspenseHandler(workInProgress), workInProgress; 6733 popSuspenseHandler(workInProgress); 6734 return null; 6735 } 6736 } 6737 popSuspenseHandler(workInProgress); 6738 if (0 !== (workInProgress.flags & 128)) return workInProgress.lanes = renderLanes, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress; 6739 renderLanes = null !== newProps; 6740 current = null !== current && null !== current.memoizedState; 6741 renderLanes && (newProps = workInProgress.child, type = null, null !== newProps.alternate && null !== newProps.alternate.memoizedState && null !== newProps.alternate.memoizedState.cachePool && (type = newProps.alternate.memoizedState.cachePool.pool), nextResource = null, null !== newProps.memoizedState && null !== newProps.memoizedState.cachePool && (nextResource = newProps.memoizedState.cachePool.pool), nextResource !== type && (newProps.flags |= 2048)); 6742 renderLanes !== current && renderLanes && (workInProgress.child.flags |= 8192); 6743 scheduleRetryEffect(workInProgress, workInProgress.updateQueue); 6744 bubbleProperties(workInProgress); 6745 (workInProgress.mode & ProfileMode) !== NoMode && renderLanes && (current = workInProgress.child, null !== current && (workInProgress.treeBaseDuration -= current.treeBaseDuration)); 6746 return null; 6747 case 4: return popHostContainer(workInProgress), null === current && listenToAllSupportedEvents(workInProgress.stateNode.containerInfo), workInProgress.flags |= 67108864, bubbleProperties(workInProgress), null;
6748 case 10: return popProvider(workInProgress.type, workInProgress), bubbleProperties(workInProgress), null; 6749 case 19: 6750 popSuspenseListContext(workInProgress); 6751 newProps = workInProgress.memoizedState; 6752 if (null === newProps) return bubbleProperties(workInProgress), null; 6753 type = 0 !== (workInProgress.flags & 128); 6754 nextResource = newProps.rendering; 6755 if (null === nextResource) if (type) cutOffTailIfNeeded(newProps, !1); 6756 else { 6757 if (workInProgressRootExitStatus !== RootInProgress || null !== current && 0 !== (current.flags & 128)) for (current = workInProgress.child; null !== current;) { 6758 nextResource = findFirstSuspended(current); 6759 if (null !== nextResource) { 6760 workInProgress.flags |= 128; 6761 cutOffTailIfNeeded(newProps, !1); 6762 current = nextResource.updateQueue; 6763 workInProgress.updateQueue = current; 6764 scheduleRetryEffect(workInProgress, current); 6765 workInProgress.subtreeFlags = 0; 6766 current = renderLanes; 6767 for (renderLanes = workInProgress.child; null !== renderLanes;) resetWorkInProgress(renderLanes, current), renderLanes = renderLanes.sibling; 6768 pushSuspenseListContext(workInProgress, suspenseStackCursor.current & SubtreeSuspenseContextMask | ForceSuspenseFallback); 6769 isHydrating && pushTreeFork(workInProgress, newProps.treeForkCount); 6770 return workInProgress.child; 6771 } 6772 current = current.sibling; 6773 } 6774 null !== newProps.tail && now$1() > workInProgressRootRenderTargetTime && (workInProgress.flags |= 128, type = !0, cutOffTailIfNeeded(newProps, !1), workInProgress.lanes = 4194304); 6775 } 6776 else { 6777 if (!type) if (current = findFirstSuspended(nextResource), null !== current) { 6778 if (workInProgress.flags |= 128, type = !0, current = current.updateQueue, workInProgress.updateQueue = current, scheduleRetryEffect(workInProgress, current), cutOffTailIfNeeded(newProps, !0), null === newProps.tail && "collapsed" !== newProps.tailMode && "visible" !== newProps.tailMode && !nextResource.alternate && !isHydrating) return bubbleProperties(workInProgress), null; 6779 } else 2 * now$1() - newProps.renderingStartTime > workInProgressRootRenderTargetTime && 536870912 !== renderLanes && (workInProgress.flags |= 128, type = !0, cutOffTailIfNeeded(newProps, !1), workInProgress.lanes = 4194304); 6780 newProps.isBackwards ? (nextResource.sibling = workInProgress.child, workInProgress.child = nextResource) : (current = newProps.last, null !== current ? current.sibling = nextResource : workInProgress.child = nextResource, newProps.last = nextResource); 6781 } 6782 if (null !== newProps.tail) { 6783 current = newProps.tail; 6784 a: { 6785 for (renderLanes = current; null !== renderLanes;) { 6786 if (null !== renderLanes.alternate) { 6787 renderLanes = !1; 6788 break a; 6789 } 6790 renderLanes = renderLanes.sibling; 6791 } 6792 renderLanes = !0; 6793 } 6794 newProps.rendering = current; 6795 newProps.tail = current.sibling; 6796 newProps.renderingStartTime = now$1(); 6797 current.sibling = null; 6798 nextResource = suspenseStackCursor.current; 6799 nextResource = type ? nextResource & SubtreeSuspenseContextMask | ForceSuspenseFallback : nextResource & SubtreeSuspenseContextMask; 6800 "visible" === newProps.tailMode || "collapsed" === newProps.tailMode || !renderLanes || isHydrating ? pushSuspenseListContext(workInProgress, nextResource) : (renderLanes = nextResource, push(suspenseHandlerStackCursor, workInProgress, workInProgress), push(suspenseStackCursor, renderLanes, workInProgress), null === shellBoundary && (shellBoundary = workInProgress)); 6801 isHydrating && pushTreeFork(workInProgress, newProps.treeForkCount); 6802 return current; 6803 } 6804 bubbleProperties(workInProgress); 6805 return null; 6806 case 22: 6807 case 23: return popSuspenseHandler(workInProgress), popHiddenContext(workInProgress), newProps = null !== workInProgress.memoizedState, null !== current ? null !== current.memoizedState !== newProps && (workInProgress.flags |= 8192) : newProps && (workInProgress.flags |= 8192), newProps ? 0 !== (renderLanes & 536870912) && 0 === (workInProgress.flags & 128) && (bubbleProperties(workInProgress), workInProgress.subtreeFlags & 6 && (workInProgress.flags |= 8192)) : bubbleProperties(workInProgress), renderLanes = w
6807orkInProgress.updateQueue, null !== renderLanes && scheduleRetryEffect(workInProgress, renderLanes.retryQueue), renderLanes = null, null !== current && null !== current.memoizedState && null !== current.memoizedState.cachePool && (renderLanes = current.memoizedState.cachePool.pool), newProps = null, null !== workInProgress.memoizedState && null !== workInProgress.memoizedState.cachePool && (newProps = workInProgress.memoizedState.cachePool.pool), newProps !== renderLanes && (workInProgress.flags |= 2048), null !== current && pop(resumedCache, workInProgress), null; 6808 case 24: return renderLanes = null, null !== current && (renderLanes = current.memoizedState.cache), workInProgress.memoizedState.cache !== renderLanes && (workInProgress.flags |= 2048), popProvider(CacheContext, workInProgress), bubbleProperties(workInProgress), null; 6809 case 25: return null; 6810 case 30: return workInProgress.flags |= 33554432, bubbleProperties(workInProgress), null; 6811 } 6812 throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue."); 6813 } 6814 function unwindWork(current, workInProgress) { 6815 popTreeContext(workInProgress); 6816 switch (workInProgress.tag) { 6817 case 1: return current = workInProgress.flags, current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null; 6818 case 3: return popProvider(CacheContext, workInProgress), popHostContainer(workInProgress), current = workInProgress.flags, 0 !== (current & 65536) && 0 === (current & 128) ? (workInProgress.flags = current & -65537 | 128, workInProgress) : null; 6819 case 26: 6820 case 27: 6821 case 5: return popHostContext(workInProgress), null; 6822 case 31: 6823 if (null !== workInProgress.memoizedState) { 6824 popSuspenseHandler(workInProgress); 6825 if (null === workInProgress.alternate) throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue."); 6826 resetHydrationState(); 6827 } 6828 current = workInProgress.flags; 6829 return current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null; 6830 case 13: 6831 popSuspenseHandler(workInProgress); 6832 current = workInProgress.memoizedState; 6833 if (null !== current && null !== current.dehydrated) { 6834 if (null === workInProgress.alternate) throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue."); 6835 resetHydrationState(); 6836 } 6837 current = workInProgress.flags; 6838 return current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null; 6839 case 19: return popSuspenseListContext(workInProgress), current = workInProgress.flags, current & 65536 ? (workInProgress.flags = current & -65537 | 128, current = workInProgress.memoizedState, null !== current && (current.rendering = null, current.tail = null), workInProgress.flags |= 4, workInProgress) : null; 6840 case 4: return popHostContainer(workInProgress), null; 6841 case 10: return popProvider(workInProgress.type, workInProgress), null; 6842 case 22: 6843 case 23: return popSuspenseHandler(workInProgress), popHiddenContext(workInProgress), null !== current && pop(resumedCache, workInProgress), current = workInProgress.flags, current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null; 6844 case 24: return popProvider(CacheContext, workInProgress), null; 6845 case 25: return null; 6846 default: return null; 6847 } 6848 } 6849 function unwindInterruptedWork(current, interruptedWork) { 6850 popTreeContext(interruptedWork); 6851 switch (interruptedWork.tag) { 6852 case 3: 6853 popProvider(CacheContext, interruptedWork); 6854 popHostContainer(interruptedWork); 6855 break; 6856 case 26: 6857 case 27: 6858 case 5: 6859 popHostContext(interruptedWork); 6860 break; 6861 case 4: 6862 popHostContainer(interruptedWork); 6863 break; 6864 case 31: 6865 null !== interruptedWork.memoizedState && popSuspenseHandler(interruptedWork); 6866 break; 6867 case 13: 6868 popSuspenseHandler(interruptedWork); 6869 break; 6870 case 19: 6871 popSuspenseListContext(interruptedWork); 6872 break; 6873 case 10:
vendor: 13,157 bytes, lines 6874-7080
6874 popProvider(interruptedWork.type, interruptedWork); 6875 break; 6876 case 22: 6877 case 23: 6878 popSuspenseHandler(interruptedWork); 6879 popHiddenContext(interruptedWork); 6880 null !== current && pop(resumedCache, interruptedWork); 6881 break; 6882 case 24: popProvider(CacheContext, interruptedWork); 6883 } 6884 } 6885 function shouldProfile(current) { 6886 return (current.mode & ProfileMode) !== NoMode; 6887 } 6888 function commitHookLayoutEffects(finishedWork, hookFlags) { 6889 shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListMount(hookFlags, finishedWork), recordEffectDuration()) : commitHookEffectListMount(hookFlags, finishedWork); 6890 } 6891 function commitHookLayoutUnmountEffects(finishedWork, nearestMountedAncestor, hookFlags) { 6892 shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor), recordEffectDuration()) : commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor); 6893 } 6894 function commitHookEffectListMount(flags, finishedWork) { 6895 try { 6896 var updateQueue = finishedWork.updateQueue, lastEffect = null !== updateQueue ? updateQueue.lastEffect : null; 6897 if (null !== lastEffect) { 6898 var firstEffect = lastEffect.next; 6899 updateQueue = firstEffect; 6900 do { 6901 if ((updateQueue.tag & flags) === flags && (lastEffect = void 0, (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !0), lastEffect = runWithFiberInDEV(finishedWork, callCreateInDEV, updateQueue), (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !1), void 0 !== lastEffect && "function" !== typeof lastEffect)) { 6902 var hookName = void 0; 6903 hookName = 0 !== (updateQueue.tag & Layout) ? "useLayoutEffect" : 0 !== (updateQueue.tag & Insertion) ? "useInsertionEffect" : "useEffect"; 6904 var addendum = void 0; 6905 addendum = null === lastEffect ? " You returned null. If your effect does not require clean up, return undefined (or nothing)." : "function" === typeof lastEffect.then ? "\n\nIt looks like you wrote " + hookName + "(async () => ...) or returned a Promise. Instead, write the async function inside your effect and call it immediately:\n\n" + hookName + "(() => {\n async function fetchData() {\n // You can await here\n const response = await MyAPI.getData(someId);\n // ...\n }\n fetchData();\n}, [someId]); // Or [] if effect doesn't need props or state\n\nLearn more about data fetching with Hooks: https://react.dev/link/hooks-data-fetching" : " You returned: " + lastEffect; 6906 runWithFiberInDEV(finishedWork, function(n, a) { 6907 console.error("%s must not return anything besides a function, which is used for clean-up.%s", n, a); 6908 }, hookName, addendum); 6909 } 6910 updateQueue = updateQueue.next; 6911 } while (updateQueue !== firstEffect); 6912 } 6913 } catch (error) { 6914 captureCommitPhaseError(finishedWork, finishedWork.return, error); 6915 } 6916 } 6917 function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) { 6918 try { 6919 var updateQueue = finishedWork.updateQueue, lastEffect = null !== updateQueue ? updateQueue.lastEffect : null; 6920 if (null !== lastEffect) { 6921 var firstEffect = lastEffect.next; 6922 updateQueue = firstEffect; 6923 do { 6924 if ((updateQueue.tag & flags) === flags) { 6925 var inst = updateQueue.inst, destroy = inst.destroy; 6926 void 0 !== destroy && (inst.destroy = void 0, (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !0), lastEffect = finishedWork, runWithFiberInDEV(lastEffect, callDestroyInDEV, lastEffect, nearestMountedAncestor, destroy), (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !1)); 6927 } 6928 updateQueue = updateQueue.next; 6929 } while (updateQueue !== firstEffect); 6930 } 6931 } catch (error) { 6932 captureCommitPhaseError(finishedWork, finishedWork.return, error); 6933 } 6934 } 6935 function commitHookPassiveMountEffects(finishedWork, hookFlags) { 6936 shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListMount(hookFlags, finishedWork), recordEffectDuration()) : commitHookEffectListMount(hookFlags, finishedWork); 6937 } 6938 function commitHookPassiveUnmountEffects(finishedWork, nearestMountedAncestor, hookFlags) { 6939 shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor), recordEffectDuration()) : commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor); 6940 } 6941 function commitClassCallbacks(finishedWork) { 6942 var updateQueue = finishedWork.updateQueue; 6943 if (null !== updateQueue) { 6944 var instance = finishedWork.stateNode; 6945 finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (instance.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), instance.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance")); 6946 try { 6947 runWithFiberInDEV(finishedWork, commitCallbacks, updateQueue, instance); 6948 } catch (error) { 6949 captureCommitPhaseError(finishedWork, finishedWork.return, error); 6950 } 6951 } 6952 } 6953 function callGetSnapshotBeforeUpdates(instance, prevProps, prevState) { 6954 return instance.getSnapshotBeforeUpdate(prevProps, prevState); 6955 } 6956 function commitClassSnapshot(finishedWork, current) { 6957 var prevProps = current.memoizedProps, prevState = current.memoizedState; 6958 current = finishedWork.stateNode; 6959 finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (current.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), current.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance")); 6960 try { 6961 var resolvedPrevProps = resolveClassComponentProps(finishedWork.type, prevProps); 6962 var snapshot = runWithFiberInDEV(finishedWork, callGetSnapshotBeforeUpdates, current, resolvedPrevProps, prevState); 6963 prevProps = didWarnAboutUndefinedSnapshotBeforeUpdate; 6964 void 0 !== snapshot || prevProps.has(finishedWork.type) || (prevProps.add(finishedWork.type), runWithFiberInDEV(finishedWork, function() { 6965 console.error("%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.", getComponentNameFromFiber(finishedWork)); 6966 })); 6967 current.__reactInternalSnapshotBeforeUpdate = snapshot; 6968 } catch (error) { 6969 captureCommitPhaseError(finishedWork, finishedWork.return, error); 6970 } 6971 } 6972 function safelyCallComponentWillUnmount(current, nearestMountedAncestor, instance) { 6973 instance.props = resolveClassComponentProps(current.type, current.memoizedProps); 6974 instance.state = current.memoizedState; 6975 shouldProfile(current) ? (startEffectTimer(), runWithFiberInDEV(current, callComponentWillUnmountInDEV, current, nearestMountedAncestor, instance), recordEffectDuration()) : runWithFiberInDEV(current, callComponentWillUnmountInDEV, current, nearestMountedAncestor, instance); 6976 } 6977 function commitAttachRef(finishedWork) { 6978 var ref = finishedWork.ref; 6979 if (null !== ref) { 6980 switch (finishedWork.tag) { 6981 case 26: 6982 case 27: 6983 case 5: 6984 var instanceToUse = finishedWork.stateNode; 6985 break; 6986 case 30: 6987 instanceToUse = finishedWork.stateNode; 6988 var name = getViewTransitionName(finishedWork.memoizedProps, instanceToUse); 6989 if (null === instanceToUse.ref || instanceToUse.ref.name !== name) instanceToUse.ref = createViewTransitionInstance(name); 6990 instanceToUse = instanceToUse.ref; 6991 break; 6992 case 7: 6993 null === finishedWork.stateNode && (instanceToUse = new FragmentInstance(finishedWork), traverseFragmentInstancesAndTextInstances(finishedWork, addFragmentHandleToFiber, instanceToUse), finishedWork.stateNode = instanceToUse); 6994 instanceToUse = finishedWork.stateNode; 6995 break; 6996 default: instanceToUse = finishedWork.stateNode; 6997 } 6998 if ("function" === typeof ref) if (shouldProfile(finishedWork)) try { 6999 startEffectTimer(), finishedWork.refCleanup = ref(instanceToUse); 7000 } finally { 7001 recordEffectDuration(); 7002 } 7003 else finishedWork.refCleanup = ref(instanceToUse); 7004 else "string" === typeof ref ? console.error("String refs are no longer supported.") : ref.hasOwnProperty("current") || console.error("Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().", getComponentNameFromFiber(finishedWork)), ref.current = instanceToUse; 7005 } 7006 } 7007 function safelyAttachRef(current, nearestMountedAncestor) { 7008 try { 7009 runWithFiberInDEV(current, commitAttachRef, current); 7010 } catch (error) { 7011 captureCommitPhaseError(current, nearestMountedAncestor, error); 7012 } 7013 } 7014 function safelyDetachRef(current, nearestMountedAncestor) { 7015 var ref = current.ref, refCleanup = current.refCleanup; 7016 if (null !== ref) if ("function" === typeof refCleanup) try { 7017 if (shouldProfile(current)) try { 7018 startEffectTimer(), runWithFiberInDEV(current, refCleanup); 7019 } finally { 7020 recordEffectDuration(current); 7021 } 7022 else runWithFiberInDEV(current, refCleanup); 7023 } catch (error) { 7024 captureCommitPhaseError(current, nearestMountedAncestor, error); 7025 } finally { 7026 current.refCleanup = null, current = current.alternate, null != current && (current.refCleanup = null); 7027 } 7028 else if ("function" === typeof ref) try { 7029 if (shouldProfile(current)) try { 7030 startEffectTimer(), runWithFiberInDEV(current, ref, null); 7031 } finally { 7032 recordEffectDuration(current); 7033 } 7034 else runWithFiberInDEV(current, ref, null); 7035 } catch (error$8) { 7036 captureCommitPhaseError(current, nearestMountedAncestor, error$8); 7037 } 7038 else ref.current = null; 7039 } 7040 function commitProfiler(finishedWork, current, commitStartTime, effectDuration) { 7041 var _finishedWork$memoize = finishedWork.memoizedProps, id = _finishedWork$memoize.id, onCommit = _finishedWork$memoize.onCommit; 7042 _finishedWork$memoize = _finishedWork$memoize.onRender; 7043 current = null === current ? "mount" : "update"; 7044 currentUpdateIsNested && (current = "nested-update"); 7045 "function" === typeof _finishedWork$memoize && _finishedWork$memoize(id, current, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitStartTime); 7046 "function" === typeof onCommit && onCommit(id, current, effectDuration, commitStartTime); 7047 } 7048 function commitProfilerPostCommitImpl(finishedWork, current, commitStartTime, passiveEffectDuration) { 7049 var _finishedWork$memoize2 = finishedWork.memoizedProps; 7050 finishedWork = _finishedWork$memoize2.id; 7051 _finishedWork$memoize2 = _finishedWork$memoize2.onPostCommit; 7052 current = null === current ? "mount" : "update"; 7053 currentUpdateIsNested && (current = "nested-update"); 7054 "function" === typeof _finishedWork$memoize2 && _finishedWork$memoize2(finishedWork, current, passiveEffectDuration, commitStartTime); 7055 } 7056 function commitNewChildToFragmentInstances(fiber, parentFragmentInstances) { 7057 if ((5 === fiber.tag || 27 === fiber.tag || 6 === fiber.tag) && null === fiber.alternate && null !== parentFragmentInstances) for (var i = 0; i < parentFragmentInstances.length; i++) commitNewChildToFragmentInstance(fiber.stateNode, parentFragmentInstances[i]); 7058 } 7059 function commitFragmentInstanceInsertionEffects(fiber) { 7060 for (var parent = fiber.return; null !== parent;) { 7061 isFragmentInstanceParent(parent) && commitNewChildToFragmentInstance(fiber.stateNode, parent.stateNode); 7062 if (isFragmentInstanceHostBoundary(parent)) break; 7063 parent = parent.return; 7064 } 7065 } 7066 function commitFragmentInstanceDeletionEffects(fiber) { 7067 for (var parent = fiber.return; null !== parent;) { 7068 isFragmentInstanceParent(parent) && deleteChildFromFragmentInstance(fiber.stateNode, parent.stateNode); 7069 if (isFragmentInstanceHostBoundary(parent)) break; 7070 parent = parent.return; 7071 } 7072 } 7073 function isFragmentInstanceHostBoundary(fiber) { 7074 return 5 === fiber.tag || 3 === fiber.tag || 27 === fiber.tag; 7075 } 7076 function isFragmentInstanceParent(fiber) { 7077 return fiber && 7 === fiber.tag && null !== fiber.stateNode; 7078 } 7079 function commitHostMount(finishedWork) { 7080 var type = finishedWork.type, props = finishedWork.memoizedProps, instance = f
7080inishedWork.stateNode; 7081 try { 7082 runWithFiberInDEV(finishedWork, commitMount, instance, type, props, finishedWork); 7083 } catch (error) { 7084 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7085 } 7086 } 7087 function commitHostUpdate(finishedWork, newProps, oldProps) { 7088 try { 7089 runWithFiberInDEV(finishedWork, commitUpdate, finishedWork.stateNode, finishedWork.type, oldProps, newProps, finishedWork); 7090 } catch (error) { 7091 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7092 } 7093 } 7094 function isHostParent(fiber) { 7095 return 5 === fiber.tag || 3 === fiber.tag || 26 === fiber.tag || 27 === fiber.tag && isSingletonScope(fiber.type) || 4 === fiber.tag; 7096 } 7097 function getHostSibling(fiber) { 7098 a: for (;;) { 7099 for (; null === fiber.sibling;) { 7100 if (null === fiber.return || isHostParent(fiber.return)) return null; 7101 fiber = fiber.return; 7102 } 7103 fiber.sibling.return = fiber.return; 7104 for (fiber = fiber.sibling; 5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag;) { 7105 if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a; 7106 if (fiber.flags & 2) continue a; 7107 if (null === fiber.child || 4 === fiber.tag) continue a; 7108 else fiber.child.return = fiber, fiber = fiber.child; 7109 } 7110 if (!(fiber.flags & 2)) return fiber.stateNode; 7111 } 7112 } 7113 function insertOrAppendPlacementNodeIntoContainer(node, before, parent, parentFragmentInstances) { 7114 var tag = node.tag; 7115 if (5 === tag || 6 === tag) tag = node.stateNode, before ? (warnForReactChildrenConflict(parent), (9 === parent.nodeType ? parent.body : "HTML" === parent.nodeName ? parent.ownerDocument.body : parent).insertBefore(tag, before)) : (warnForReactChildrenConflict(parent), before = 9 === parent.nodeType ? parent.body : "HTML" === parent.nodeName ? parent.ownerDocument.body : parent, before.appendChild(tag), tag = parent._reactRootContainer, null !== tag && void 0 !== tag || null !== before.onclick || (before.onclick = noop$1)), commitNewChildToFragmentInstances(node, parentFragmentInstances), viewTransitionMutationContext = !0; 7116 else if (4 !== tag && (27 === tag && (commitNewChildToFragmentInstances(node, parentFragmentInstances), parentFragmentInstances = null, isSingletonScope(node.type) && (parent = node.stateNode, before = null)), node = node.child, null !== node)) for (insertOrAppendPlacementNodeIntoContainer(node, before, parent, parentFragmentInstances), node = node.sibling; null !== node;) insertOrAppendPlacementNodeIntoContainer(node, before, parent, parentFragmentInstances), node = node.sibling; 7117 } 7118 function insertOrAppendPlacementNode(node, before, parent, parentFragmentInstances) { 7119 var tag = node.tag; 7120 if (5 === tag || 6 === tag) tag = node.stateNode, before ? parent.insertBefore(tag, before) : parent.appendChild(tag), commitNewChildToFragmentInstances(node, parentFragmentInstances), viewTransitionMutationContext = !0; 7121 else if (4 !== tag && (27 === tag && (commitNewChildToFragmentInstances(node, parentFragmentInstances), parentFragmentInstances = null, isSingletonScope(node.type) && (parent = node.stateNode)), node = node.child, null !== node)) for (insertOrAppendPlacementNode(node, before, parent, parentFragmentInstances), node = node.sibling; null !== node;) insertOrAppendPlacementNode(node, before, parent, parentFragmentInstances), node = node.sibling; 7122 } 7123 function commitPlacement(finishedWork) { 7124 for (var hostParentFiber, parentFiber = finishedWork.return; null !== parentFiber;) { 7125 if (isHostParent(parentFiber)) { 7126 hostParentFiber = parentFiber; 7127 break; 7128 } 7129 parentFiber = parentFiber.return; 7130 } 7131 parentFiber = null; 7132 for (var parent = finishedWork.return; null !== parent;) { 7133 if (isFragmentInstanceParent(parent)) { 7134 var fragmentInstance = parent.stateNode; 7135 null === parentFiber ? parentFiber = [fragmentInstance] : parentFiber.push(fragmentInstance); 7136 } 7137 if (isFragmentInstanceHostBoundary(parent)) break; 7138 parent = parent.return; 7139 } 7140 if (null == hostParentFiber) throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."); 7141 switch (hostParentFiber.tag) { 7142 case 27: 7143 hostParentFiber = hostParentFiber.stateNode; 7144 parent = getHostSibling(finishedWork); 7145 insertOrAppendPlacementNode(finishedWork, parent, hostParentFiber, parentFiber); 7146 break; 7147 case 5: 7148 parent = hostParentFiber.stateNode; 7149 hostParentFiber.flags & 32 && (resetTextContent(parent), hostParentFiber.flags &= -33); 7150 hostParentFiber = getHostSibling(finishedWork); 7151 insertOrAppendPlacementNode(finishedWork, hostParentFiber, parent, parentFiber); 7152 break; 7153 case 3:
7154 case 4: 7155 hostParentFiber = hostParentFiber.stateNode.containerInfo; 7156 parent = getHostSibling(finishedWork); 7157 insertOrAppendPlacementNodeIntoContainer(finishedWork, parent, hostParentFiber, parentFiber); 7158 break; 7159 default: throw Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue."); 7160 } 7161 } 7162 function commitHostSingletonAcquisition(finishedWork) { 7163 var singleton = finishedWork.stateNode, props = finishedWork.memoizedProps; 7164 try { 7165 runWithFiberInDEV(finishedWork, acquireSingletonInstance, finishedWork.type, props, singleton, finishedWork); 7166 } catch (error) { 7167 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7168 } 7169 } 7170 function trackEnterViewTransitions(placement) { 7171 if (30 === placement.tag || 0 !== (placement.subtreeFlags & 33554432)) shouldStartViewTransition = !0; 7172 } 7173 function pushViewTransitionCancelableScope() { 7174 var prevChildren = viewTransitionCancelableChildren; 7175 viewTransitionCancelableChildren = null; 7176 return prevChildren; 7177 } 7178 function applyViewTransitionToHostInstances(fiber, name, className, collectMeasurements, stopAtNestedViewTransitions) { 7179 viewTransitionHostInstanceIdx = 0; 7180 (name = applyViewTransitionToHostInstancesRecursive(fiber.child, name, className, collectMeasurements, stopAtNestedViewTransitions)) && null != fiber._debugTask && null === animatingTask && (animatingTask = fiber._debugTask); 7181 return name; 7182 } 7183 function applyViewTransitionToHostInstancesRecursive(child, name, className, collectMeasurements, stopAtNestedViewTransitions) { 7184 for (var inViewport = !1; null !== child;) { 7185 if (5 === child.tag) { 7186 var _instance = child.stateNode; 7187 if (null !== collectMeasurements) { 7188 var measurement = measureInstance(_instance); 7189 collectMeasurements.push(measurement); 7190 measurement.view && (inViewport = !0); 7191 } else inViewport || measureInstance(_instance).view && (inViewport = !0); 7192 shouldStartViewTransition = !0; 7193 applyViewTransitionName(_instance, 0 === viewTransitionHostInstanceIdx ? name : name + "_" + viewTransitionHostInstanceIdx, className); 7194 viewTransitionHostInstanceIdx++; 7195 } else if (22 !== child.tag || null === child.memoizedState) 30 === child.tag && stopAtNestedViewTransitions || applyViewTransitionToHostInstancesRecursive(child.child, name, className, collectMeasurements, stopAtNestedViewTransitions) && (inViewport = !0); 7196 child = child.sibling; 7197 } 7198 return inViewport; 7199 } 7200 function restoreViewTransitionOnHostInstances(child, stopAtNestedViewTransitions) { 7201 for (; null !== child;) { 7202 if (5 === child.tag) restoreViewTransitionName(child.stateNode, child.memoizedProps); 7203 else if (22 !== child.tag || null === child.memoizedState) 30 === child.tag && stopAtNestedViewTransitions || restoreViewTransitionOnHostInstances(child.child, stopAtNestedViewTransitions); 7204 child = child.sibling; 7205 } 7206 } 7207 function commitAppearingPairViewTransitions(placement) { 7208 if (0 !== (placement.subtreeFlags & 18874368)) for (placement = placement.child; null !== placement;) { 7209 if (22 !== placement.tag || null === placement.memoizedState) { 7210 if (commitAppearingPairViewTransitions(placement), 30 === placement.tag && 0 !== (placement.flags & 18874368) && placement.stateNode.paired) { 7211 var props = placement.memoizedProps; 7212 if (null == props.name || "auto" === props.name) throw Error("Found a pair with an auto name. This is a bug in React."); 7213 var name = props.name; 7214 props = getViewTransitionClassName(props.default, props.share); 7215 "none" !== props && (applyViewTransitionToHostInstances(placement, name, props, null, !1) || restoreViewTransitionOnHostInstances(placement.child, !1)); 7216 } 7217 } 7218 placement = placement.sibling; 7219 } 7220 } 7221 function commitEnterViewTransitions(placement, gesture) { 7222 if (30 === placement.tag) { 7223 var state = placement.stateNode, props = placement.memoizedProps, name = getViewTransitionName(props, state), className = getViewTransitionClassName(props.default, state.paired ? props.share : props.enter); 7224 "none" !== className ? applyViewTransitionToHostInstances(placement, name, className, null, !1) ? (commitAppearingPairViewTransitions(placement), state.paired || gesture || scheduleViewTransitionEvent(placement, props.onEnter)) : restoreViewTransitionOnHostInstances(placement.child, !1) : commitAppearingPairViewTransitions(placement); 7225 } else if (0 !== (placement.subtreeFlags & 33554432)) for (placement = placement.child; null !== placement;) commitEnterViewTransitions(placement, gesture), placement = placement.sibling; 7226 else commitAppearingPairViewTransitions(placement); 7227 } 7228 function commitDeletedPairViewTransitions(deletion) { 7229 if (null !== appearingViewTransitions && 0 !== appearingViewTransitions.size) { 7230 var pairs = appearingViewTransitions; 7231 if (0 !== (deletion.subtreeFlags & 18874368)) for (deletion = deletion.child; null !== deletion;) { 7232 if (22 !== deletion.tag || null === deletion.memoizedState) { 7233 if (30 === deletion.tag && 0 !== (deletion.flags & 18874368)) { 7234 var props = deletion.memoizedProps, name = props.name; 7235 if (null != name && "auto" !== name) { 7236 var pair = pairs.get(name); 7237 if (void 0 !== pair) { 7238 var className = getViewTransitionClassName(props.default, props.share); 7239 "none" !== className && (applyViewTransitionToHostInstances(deletion, name, className, null, !1) ? (className = deletion.stateNode, pair.paired = className, className.paired = pair, scheduleViewTransitionEvent(deletion, props.onShare)) : restoreViewTransitionOnHostInstances(deletion.child, !1)); 7240 pairs.delete(name); 7241 if (0 === pairs.size) break; 7242 } 7243 } 7244 } 7245 commitDeletedPairViewTransitions(deletion); 7246 }
vendor: 1,060 bytes, lines 7247-7256
7247 deletion = deletion.sibling; 7248 } 7249 } 7250 } 7251 function commitExitViewTransitions(deletion) { 7252 if (30 === deletion.tag) { 7253 var props = deletion.memoizedProps, name = getViewTransitionName(props, deletion.stateNode), pair = null !== appearingViewTransitions ? appearingViewTransitions.get(name) : void 0, className = getViewTransitionClassName(props.default, void 0 !== pair ? props.share : props.exit); 7254 "none" !== className && (applyViewTransitionToHostInstances(deletion, name, className, null, !1) ? void 0 !== pair ? (className = deletion.stateNode, pair.paired = className, className.paired = pair, appearingViewTransitions.delete(name), scheduleViewTransitionEvent(deletion, props.onShare)) : scheduleViewTransitionEvent(deletion, props.onExit) : restoreViewTransitionOnHostInstances(deletion.child, !1)); 7255 null !== appearingViewTransitions && commitDeletedPairViewTransitions(deletion); 7256 } else if (0 !== (deletion.subtreeFlags & 33554432)) for (deletion = deletion.child; null !== deletion;) commitExitViewTransitions(deletion), deleti
7256on = deletion.sibling; 7257 else null !== appearingViewTransitions && commitDeletedPairViewTransitions(deletion); 7258 } 7259 function commitNestedViewTransitions(changedParent) { 7260 for (changedParent = changedParent.child; null !== changedParent;) { 7261 if (30 === changedParent.tag) { 7262 var props = changedParent.memoizedProps, name = getViewTransitionName(props, changedParent.stateNode); 7263 props = getViewTransitionClassName(props.default, props.update); 7264 changedParent.flags &= -5; 7265 "none" !== props && applyViewTransitionToHostInstances(changedParent, name, props, changedParent.memoizedState = [], !1); 7266 } else 0 !== (changedParent.subtreeFlags & 33554432) && commitNestedViewTransitions(changedParent); 7267 changedParent = changedParent.sibling; 7268 } 7269 } 7270 function restorePairedViewTransitions(parent) { 7271 if (0 !== (parent.subtreeFlags & 18874368)) for (parent = parent.child; null !== parent;) { 7272 if (22 !== parent.tag || null === parent.memoizedState) { 7273 if (30 === parent.tag && 0 !== (parent.flags & 18874368)) { 7274 var instance = parent.stateNode; 7275 null !== instance.paired && (instance.paired = null, restoreViewTransitionOnHostInstances(parent.child, !1)); 7276 } 7277 restorePairedViewTransitions(parent); 7278 } 7279 parent = parent.sibling; 7280 } 7281 } 7282 function restoreEnterOrExitViewTransitions(fiber) { 7283 if (30 === fiber.tag) fiber.stateNode.paired = null, restoreViewTransitionOnHostInstances(fiber.child, !1), restorePairedViewTransitions(fiber); 7284 else if (0 !== (fiber.subtreeFlags & 33554432)) for (fiber = fiber.child; null !== fiber;) restoreEnterOrExitViewTransitions(fiber), fiber = fiber.sibling; 7285 else restorePairedViewTransitions(fiber); 7286 } 7287 function restoreNestedViewTransitions(changedParent) { 7288 for (changedParent = changedParent.child; null !== changedParent;) 30 === changedParent.tag ? restoreViewTransitionOnHostInstances(changedParent.child, !1) : 0 !== (changedParent.subtreeFlags & 33554432) && restoreNestedViewTransitions(changedParent), changedParent = changedParent.sibling; 7289 } 7290 function measureViewTransitionHostInstancesRecursive(parentViewTransition, child, newName, oldName, className, previousMeasurements, stopAtNestedViewTransitions) { 7291 for (var inViewport = !1; null !== child;) { 7292 if (5 === child.tag) { 7293 var _instance2 = child.stateNode; 7294 if (null !== previousMeasurements && viewTransitionHostInstanceIdx < previousMeasurements.length) { 7295 var previousMeasurement = previousMeasurements[viewTransitionHostInstanceIdx], nextMeasurement = measureInstance(_instance2); 7296 if (previousMeasurement.view || nextMeasurement.view) inViewport = !0; 7297 var JSCompiler_temp; 7298 if (JSCompiler_temp = 0 === (parentViewTransition.flags & 4)) if (nextMeasurement.clip) JSCompiler_temp = !0; 7299 else { 7300 JSCompiler_temp = previousMeasurement.rect; 7301 var newRect = nextMeasurement.rect; 7302 JSCompiler_temp = JSCompiler_temp.y !== newRect.y || JSCompiler_temp.x !== newRect.x || JSCompiler_temp.height !== newRect.height || JSCompiler_temp.width !== newRect.width; 7303 } 7304 JSCompiler_temp && (parentViewTransition.flags |= 4); 7305 nextMeasurement.abs ? nextMeasurement = !previousMeasurement.abs : (previousMeasurement = previousMeasurement.rect, nextMeasurement = nextMeasurement.rect, nextMeasurement = previousMeasurement.height !== nextMeasurement.height || previousMeasurement.width !== nextMeasurement.width); 7306 nextMeasurement && (parentViewTransition.flags |= 32); 7307 } else parentViewTransition.flags |= 32; 7308 0 !== (parentViewTransition.flags & 4) && applyViewTransitionName(_instance2, 0 === viewTransitionHostInstanceIdx ? newName : newName + "_" + viewTransitionHostInstanceIdx, className); 7309 inViewport && 0 !== (parentViewTransition.flags & 4) || (null === viewTransitionCancelableChildren && (viewTransitionCancelableChildren = []), viewTransitionCancelableChildren.push(_instance2, 0 === viewTransitionHostInstanceIdx ? oldName : oldName + "_" + viewTransitionHostInstanceIdx, child.memoizedProps)); 7310 viewTransitionHostInstanceIdx++; 7311 } else if (22 !== child.tag || null === child.memoizedState) 30 === child.tag && stopAtNestedViewTransitions ? parentViewTransition.flags |= child.flags & 32 : measureViewTransitionHostInstancesRecursive(parentViewTransition, child.child, newName, oldName, className, previousMeasurements, stopAtNestedViewTransitions) && (inViewport = !0); 7312 child = child.sibling; 7313 } 7314 return inViewport; 7315 } 7316 function measureNestedViewTransitions(changedParent, gesture) { 7317 for (changedParent = changedParent.child; null !== changedParent;) { 7318 if (30 === changedParent.tag) { 7319 var props = changedParent.memoizedProps, state = changedParent.stateNode, name = getViewTransitionName(props, state), className = getViewTransitionClassName(props.default, props.update); 7320 if (gesture) { 7321 state = state.clones; 7322 var previousMeasurements = null === state ? null : state.map(measureClonedInstance); 7323 } else previousMeasurements = changedParent.memoizedState, changedParent.memoizedState = null; 7324 state = changedParent; 7325 var child = changedParent.child, newName = name; 7326 viewTransitionHostInstanceIdx = 0; 7327 className = measureViewTransitionHostInstancesRecursive(state, child, newName, name, className, previousMeasurements, !1); 7328 0 !== (changedParent.flags & 4) && className && (gesture || scheduleViewTransitionEvent(changedParent, props.onUpdate)); 7329 } else 0 !== (changedParent.subtreeFlags & 33554432) && measureNestedViewTransitions(changedParent, gesture); 7330 changedParent = changedParent.sibling; 7331 } 7332 } 7333 function trackNamedViewTransition(fiber) { 7334 var name = fiber.memoizedProps.name; 7335 if (null != name && "auto" !== name) { 7336 var existing = mountedNamedViewTransitions.get(name); 7337 if (void 0 !== existing) { 7338 if (existing !== fiber && existing !== fiber.alternate && !didWarnAboutName[name]) { 7339 didWarnAboutName[name] = !0; 7340 var stringifiedName = JSON.stringify(name); 7341 runWithFiberInDEV(fiber, function() { 7342 console.error("There are two <ViewTransition name=%s> components with the same name mounted at the same time. This is not supported and will cause View Transitions to error. Try to use a more unique name e.g. by using a namespace prefix and adding the id of an item to the name.", stringifiedName); 7343 }); 7344 runWithFiberInDEV(existing, function() { 7345 console.error("The existing <ViewTransition name=%s> duplicate has this stack trace.", stringifiedName); 7346 }); 7347 } 7348 } else mountedNamedViewTransitions.set(name, fiber); 7349 } 7350 } 7351 function untrackNamedViewTransition(fiber) { 7352 var name = fiber.memoizedProps.name; 7353 if (null != name && "auto" !== name) { 7354 var existing = mountedNamedViewTransitions.get(name); 7355 void 0 === existing || existing !== fiber && existing !== fiber.alternate || mountedNamedViewTransitions.delete(name); 7356 } 7357 } 7358 function isHydratingParent(current, finishedWork) {
7359 return 31 === finishedWork.tag ? (finishedWork = finishedWork.memoizedState, null !== current.memoizedState && null === finishedWork) : 13 === finishedWork.tag ? (current = current.memoizedState, finishedWork = finishedWork.memoizedState, null !== current && null !== current.dehydrated && (null === finishedWork || null === finishedWork.dehydrated)) : 3 === finishedWork.tag ? current.memoizedState.isDehydrated && 0 === (finishedWork.flags & 256) : !1; 7360 } 7361 function commitBeforeMutationEffects(root, firstChild, committedLanes) { 7362 root = root.containerInfo; 7363 eventsEnabled = _enabled; 7364 root = getActiveElementDeep(root); 7365 if (hasSelectionCapabilities(root)) { 7366 if ("selectionStart" in root) var JSCompiler_temp = { 7367 start: root.selectionStart, 7368 end: root.selectionEnd 7369 }; 7370 else a: { 7371 JSCompiler_temp = (JSCompiler_temp = root.ownerDocument) && JSCompiler_temp.defaultView || window; 7372 var selection = JSCompiler_temp.getSelection && JSCompiler_temp.getSelection(); 7373 if (selection && 0 !== selection.rangeCount) { 7374 JSCompiler_temp = selection.anchorNode; 7375 var anchorOffset = selection.anchorOffset, focusNode = selection.focusNode; 7376 selection = selection.focusOffset; 7377 try { 7378 JSCompiler_temp.nodeType, focusNode.nodeType; 7379 } catch (e$3) { 7380 JSCompiler_temp = null; 7381 break a; 7382 } 7383 var length = 0, start = -1, end = -1, indexWithinAnchor = 0, indexWithinFocus = 0, node = root, parentNode = null; 7384 b: for (;;) { 7385 for (var next;;) { 7386 node !== JSCompiler_temp || 0 !== anchorOffset && 3 !== node.nodeType || (start = length + anchorOffset); 7387 node !== focusNode || 0 !== selection && 3 !== node.nodeType || (end = length + selection); 7388 3 === node.nodeType && (length += node.nodeValue.length); 7389 if (null === (next = node.firstChild)) break; 7390 parentNode = node; 7391 node = next; 7392 } 7393 for (;;) { 7394 if (node === root) break b; 7395 parentNode === JSCompiler_temp && ++indexWithinAnchor === anchorOffset && (start = length); 7396 parentNode === focusNode && ++indexWithinFocus === selection && (end = length); 7397 if (null !== (next = node.nextSibling)) break; 7398 node = parentNode; 7399 parentNode = node.parentNode; 7400 } 7401 node = next; 7402 } 7403 JSCompiler_temp = -1 === start || -1 === end ? null : { 7404 start, 7405 end 7406 }; 7407 } else JSCompiler_temp = null; 7408 } 7409 JSCompiler_temp = JSCompiler_temp || { 7410 start: 0, 7411 end: 0 7412 }; 7413 } else JSCompiler_temp = null; 7414 selectionInformation = { 7415 focusedElem: root, 7416 selectionRange: JSCompiler_temp 7417 }; 7418 _enabled = !1; 7419 committedLanes = (committedLanes & 335544064) === committedLanes; 7420 nextEffect = firstChild; 7421 for (firstChild = committedLanes ? 9270 : 1024; null !== nextEffect;) { 7422 root = nextEffect; 7423 if (committedLanes && (JSCompiler_temp = root.deletions, null !== JSCompiler_temp)) for (anchorOffset = 0; anchorOffset < JSCompiler_temp.length; anchorOffset++) committedLanes && commitExitViewTransitions(JSCompiler_temp[anchorOffset]); 7424 if (null === root.alternate && 0 !== (root.flags & 2)) committedLanes && trackEnterViewTransitions(root), commitBeforeMutationEffects_complete(committedLanes); 7425 else { 7426 if (22 === root.tag) { 7427 if (JSCompiler_temp = root.alternate, null !== root.memoizedState) { 7428 null !== JSCompiler_temp && null === JSCompiler_temp.memoizedState && committedLanes && commitExitViewTransitions(JSCompiler_temp); 7429 commitBeforeMutationEffects_complete(committedLanes); 7430 continue; 7431 } else if (null !== JSCompiler_temp && null !== JSCompiler_temp.memoizedState) { 7432 committedLanes && trackEnterViewTransitions(root); 7433 commitBeforeMutationEffects_complete(committedLanes); 7434 continue; 7435 } 7436 } 7437 JSCompiler_temp = root.child; 7438 0 !== (root.subtreeFlags & firstChild) && null !== JSCompiler_temp ? (JSCompiler_temp.return = root, nextEffect = JSCompiler_temp) : (committedLanes && commitNestedViewTransitions(root), commitBeforeMutationEffects_complete(committedLanes)); 7439 } 7440 } 7441 appearingViewTransitions = null; 7442 } 7443 function commitBeforeMutationEffects_complete(isViewTransitionEligible$jscomp$0) { 7444 for (; null !== nextEffect;) { 7445 var fiber = nextEffect, finishedWork = fiber, isViewTransitionEligible = isViewTransitionEligible$jscomp$0, current = finishedWork.alternate, flags = finishedWork.flags; 7446 switch (finishedWork.tag) { 7447 case 0: 7448 case 11: 7449 case 15: break; 7450 case 1: 7451 0 !== (flags & 1024) && null !== current && commitClassSnapshot(finishedWork, current); 7452 break; 7453 case 3: 7454 if (0 !== (flags & 1024)) { 7455 if (isViewTransitionEligible = finishedWork.stateNode.containerInfo, finishedWork = isViewTransitionEligible.nodeType, 9 === finishedWork) clearContainerSparingly(isViewTransitionEligible); 7456 else if (1 === finishedWork) switch (isViewTransitionEligible.nodeName) { 7457 case "HEAD": 7458 case "HTML": 7459 case "BODY": 7460 clearContainerSparingly(isViewTransitionEligible); 7461 break; 7462 default: isViewTransitionEligible.textContent = ""; 7463 } 7464 } 7465 break; 7466 case 5: 7467 case 26: 7468 case 27: 7469 case 6: 7470 case 4: 7471 case 17: break; 7472 case 30: 7473 isViewTransitionEligible && null !== current && (isViewTransitionEligible = current, current = finishedWork, finishedWork = getViewTransitionName(isViewTransitionEligible.memoizedProps, isViewTransitionEligible.stateNode), current = current.memoizedProps, current = getViewTransitionClassName(current.default, current.update), "none" !== current && applyViewTransitionToHostInstances(isViewTransitionEligible, finishedWork, current, isViewTransitionEligible.memoizedState = [], !0)); 7474 break; 7475 default: if (0 !== (flags & 1024)) throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."); 7476 } 7477 isViewTransitionEligible = fiber.sibling; 7478 if (null !== isViewTransitionEligible) { 7479 isViewTransitionEligible.return = fiber.return; 7480 nextEffect = isViewTransitionEligible; 7481 break; 7482 } 7483 nextEffect = fiber.return; 7484 } 7485 } 7486 function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { 7487 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), flags = finishedWork.flags; 7488 switch (finishedWork.tag) { 7489 case 0: 7490 case 11: 7491 case 15: 7492 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7493 flags & 4 && commitHookLayoutEffects(finishedWork, Layout | HasEffect); 7494 break; 7495 case 1: 7496 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7497 if (flags & 4) if (finishedRoot = finishedWork.stateNode, null === current) finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (finishedRoot.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), finishedRoot.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance")), shouldProfile(finishedWork) ? (startEffectTimer(), runWithFiberInDEV(finishedWork, callComponentDidMountInDEV, finishedWork, finishedRoot), recordEffectDuration()) : runWithFiberInDEV(finishedWork, callComponentDidMountInDEV, finishedWork, finishedRoot); 7498 else {
vendor: 4,503 bytes, lines 7499-7574
7499 var prevProps = resolveClassComponentProps(finishedWork.type, current.memoizedProps); 7500 current = current.memoizedState; 7501 finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (finishedRoot.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), finishedRoot.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance")); 7502 shouldProfile(finishedWork) ? (startEffectTimer(), runWithFiberInDEV(finishedWork, callComponentDidUpdateInDEV, finishedWork, finishedRoot, prevProps, current, finishedRoot.__reactInternalSnapshotBeforeUpdate), recordEffectDuration()) : runWithFiberInDEV(finishedWork, callComponentDidUpdateInDEV, finishedWork, finishedRoot, prevProps, current, finishedRoot.__reactInternalSnapshotBeforeUpdate); 7503 } 7504 flags & 64 && commitClassCallbacks(finishedWork); 7505 flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); 7506 break; 7507 case 3: 7508 current = pushNestedEffectDurations(); 7509 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7510 if (flags & 64 && (flags = finishedWork.updateQueue, null !== flags)) { 7511 prevProps = null; 7512 if (null !== finishedWork.child) switch (finishedWork.child.tag) { 7513 case 27: 7514 case 5: 7515 prevProps = finishedWork.child.stateNode; 7516 break; 7517 case 1: prevProps = finishedWork.child.stateNode; 7518 } 7519 try { 7520 runWithFiberInDEV(finishedWork, commitCallbacks, flags, prevProps); 7521 } catch (error) { 7522 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7523 } 7524 } 7525 finishedRoot.effectDuration += popNestedEffectDurations(current); 7526 break; 7527 case 27: null === current && flags & 4 && commitHostSingletonAcquisition(finishedWork); 7528 case 26: 7529 case 5: 7530 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7531 if (null === current) { 7532 if (flags & 4) commitHostMount(finishedWork); 7533 else if (flags & 64) { 7534 finishedRoot = finishedWork.type; 7535 current = finishedWork.memoizedProps; 7536 prevProps = finishedWork.stateNode; 7537 try { 7538 runWithFiberInDEV(finishedWork, commitHydratedInstance, prevProps, finishedRoot, current, finishedWork); 7539 } catch (error) { 7540 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7541 } 7542 } 7543 } 7544 flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); 7545 break; 7546 case 12: 7547 if (flags & 4) { 7548 flags = pushNestedEffectDurations(); 7549 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7550 finishedRoot = finishedWork.stateNode; 7551 finishedRoot.effectDuration += bubbleNestedEffectDurations(flags); 7552 try { 7553 runWithFiberInDEV(finishedWork, commitProfiler, finishedWork, current, commitStartTime, finishedRoot.effectDuration); 7554 } catch (error) { 7555 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7556 } 7557 } else recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7558 break; 7559 case 31: 7560 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7561 flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork); 7562 break; 7563 case 13: 7564 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7565 flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); 7566 flags & 64 && (finishedRoot = finishedWork.memoizedState, null !== finishedRoot && (finishedRoot = finishedRoot.dehydrated, null !== finishedRoot && (flags = retryDehydratedSuspenseBoundary.bind(null, finishedWork), registerSuspenseInstanceRetry(finishedRoot, flags)))); 7567 break; 7568 case 22: 7569 flags = null !== finishedWork.memoizedState || offscreenSubtreeIsHidden; 7570 if (!flags) { 7571 var newOffscreenSubtreeWasHidden = null !== current && null !== current.memoizedState || offscreenSubtreeWasHidden; 7572 current = offscreenSubtreeIsHidden; 7573 prevProps = offscreenSubtreeWasHidden; 7574 offscreenSubtreeIsHidden = flags;
7575 (offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden) && !prevProps ? (flags = IncludeHostSingletons, 0 !== (finishedWork.subtreeFlags & 8772) && (flags |= IncludeWorkInProgressEffects), recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, flags), (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentReappeared(finishedWork, componentEffectStartTime, componentEffectEndTime)) : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7576 offscreenSubtreeIsHidden = current; 7577 offscreenSubtreeWasHidden = prevProps; 7578 } 7579 break; 7580 case 30: 7581 flags & 18874368 && trackNamedViewTransition(finishedWork); 7582 recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7583 flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); 7584 break; 7585 case 7: flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); 7586 default: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); 7587 } 7588 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && ((componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors), null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate && .05 < componentEffectEndTime - componentEffectStartTime && (isHydratingParent(finishedWork.return.alternate, finishedWork.return) || logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Mount"))); 7589 popComponentEffectStart(prevEffectStart); 7590 popComponentEffectDuration(prevEffectDuration); 7591 componentEffectErrors = prevEffectErrors; 7592 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 7593 } 7594 function hideOrUnhideAllChildren(parentFiber, isHidden) { 7595 for (parentFiber = parentFiber.child; null !== parentFiber;) hideOrUnhideAllChildrenOnFiber(parentFiber, isHidden), parentFiber = parentFiber.sibling; 7596 } 7597 function hideOrUnhideAllChildrenOnFiber(fiber, isHidden) { 7598 switch (fiber.tag) { 7599 case 5: 7600 case 26: 7601 try { 7602 var instance = fiber.stateNode; 7603 isHidden ? runWithFiberInDEV(fiber, hideInstance, instance) : runWithFiberInDEV(fiber, unhideInstance, fiber.stateNode, fiber.memoizedProps); 7604 } catch (error) { 7605 captureCommitPhaseError(fiber, fiber.return, error); 7606 } 7607 hideOrUnhideNearestPortals(fiber, isHidden); 7608 break; 7609 case 6: 7610 try { 7611 var instance$jscomp$0 = fiber.stateNode; 7612 isHidden ? runWithFiberInDEV(fiber, hideTextInstance, instance$jscomp$0) : runWithFiberInDEV(fiber, unhideTextInstance, instance$jscomp$0, fiber.memoizedProps); 7613 viewTransitionMutationContext = !0; 7614 } catch (error) { 7615 captureCommitPhaseError(fiber, fiber.return, error); 7616 } 7617 break; 7618 case 18: 7619 try { 7620 var instance$jscomp$1 = fiber.stateNode; 7621 isHidden ? runWithFiberInDEV(fiber, hideDehydratedBoundary, instance$jscomp$1) : runWithFiberInDEV(fiber, unhideDehydratedBoundary, fiber.stateNode); 7622 } catch (error) { 7623 captureCommitPhaseError(fiber, fiber.return, error); 7624 } 7625 break; 7626 case 22: 7627 case 23: 7628 null === fiber.memoizedState && hideOrUnhideAllChildren(fiber, isHidden); 7629 break; 7630 default: hideOrUnhideAllChildren(fiber, isHidden); 7631 } 7632 } 7633 function hideOrUnhideNearestPortals(parentFiber, isHidden$jscomp$0) { 7634 if (parentFiber.subtreeFlags & 67108864) for (parentFiber = parentFiber.child; null !== parentFiber;) { 7635 a: { 7636 var fiber = parentFiber, isHidden = isHidden$jscomp$0; 7637 switch (fiber.tag) { 7638 case 4: 7639 hideOrUnhideAllChildrenOnFiber(fiber, isHidden); 7640 break a; 7641 case 22: 7642 null === fiber.memoizedState && hideOrUnhideNearestPortals(fiber, isHidden); 7643 break a; 7644 default: hideOrUnhideNearestPortals(fiber, isHidden); 7645 } 7646 } 7647 parentFiber = parentFiber.sibling; 7648 } 7649 } 7650 function detachFiberAfterEffects(fiber) { 7651 var alternate = fiber.alternate; 7652 null !== alternate && (fiber.alternate = null, detachFiberAfterEffects(alternate)); 7653 fiber.child = null; 7654 fiber.deletions = null; 7655 fiber.sibling = null; 7656 5 === fiber.tag && (alternate = fiber.stateNode, null !== alternate && detachDeletedInstance(alternate)); 7657 fiber.stateNode = null; 7658 fiber._debugOwner = null; 7659 fiber.return = null; 7660 fiber.dependencies = null; 7661 fiber.memoizedProps = null; 7662 fiber.memoizedState = null; 7663 fiber.pendingProps = null; 7664 fiber.stateNode = null; 7665 fiber.updateQueue = null; 7666 } 7667 function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) { 7668 for (parent = parent.child; null !== parent;
7668) commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, parent), parent = parent.sibling; 7669 } 7670 function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) { 7671 if (injectedHook && "function" === typeof injectedHook.onCommitFiberUnmount) try { 7672 injectedHook.onCommitFiberUnmount(rendererID, deletedFiber); 7673 } catch (err) { 7674 hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err)); 7675 } 7676 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(); 7677 switch (deletedFiber.tag) { 7678 case 26: 7679 offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor); 7680 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7681 deletedFiber.memoizedState ? deletedFiber.memoizedState.count-- : deletedFiber.stateNode && !
vendor: 4,731 bytes, lines 7681-7756
7681offscreenSubtreeWasHidden && (finishedRoot = deletedFiber.stateNode, finishedRoot.parentNode.removeChild(finishedRoot)); 7682 break; 7683 case 27: 7684 offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor); 7685 commitFragmentInstanceDeletionEffects(deletedFiber); 7686 var prevHostParent = hostParent, prevHostParentIsContainer = hostParentIsContainer; 7687 isSingletonScope(deletedFiber.type) && (hostParent = deletedFiber.stateNode, hostParentIsContainer = !1); 7688 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7689 runWithFiberInDEV(deletedFiber, releaseSingletonInstance, deletedFiber.stateNode, deletedFiber.type, deletedFiber.memoizedProps); 7690 hostParent = prevHostParent; 7691 hostParentIsContainer = prevHostParentIsContainer; 7692 break; 7693 case 5: offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor), commitFragmentInstanceDeletionEffects(deletedFiber); 7694 case 6: 7695 6 === deletedFiber.tag && commitFragmentInstanceDeletionEffects(deletedFiber); 7696 prevHostParent = hostParent; 7697 prevHostParentIsContainer = hostParentIsContainer; 7698 hostParent = null; 7699 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7700 hostParent = prevHostParent; 7701 hostParentIsContainer = prevHostParentIsContainer; 7702 if (null !== hostParent) if (hostParentIsContainer) try { 7703 runWithFiberInDEV(deletedFiber, removeChildFromContainer, hostParent, deletedFiber.stateNode), viewTransitionMutationContext = !0; 7704 } catch (error) { 7705 captureCommitPhaseError(deletedFiber, nearestMountedAncestor, error); 7706 } 7707 else try { 7708 runWithFiberInDEV(deletedFiber, removeChild, hostParent, deletedFiber.stateNode), viewTransitionMutationContext = !0; 7709 } catch (error) { 7710 captureCommitPhaseError(deletedFiber, nearestMountedAncestor, error); 7711 } 7712 break; 7713 case 18: 7714 null !== hostParent && (hostParentIsContainer ? (finishedRoot = hostParent, clearHydrationBoundary(9 === finishedRoot.nodeType ? finishedRoot.body : "HTML" === finishedRoot.nodeName ? finishedRoot.ownerDocument.body : finishedRoot, deletedFiber.stateNode), retryIfBlockedOn(finishedRoot)) : clearHydrationBoundary(hostParent, deletedFiber.stateNode)); 7715 break; 7716 case 4: 7717 prevHostParent = hostParent; 7718 prevHostParentIsContainer = hostParentIsContainer; 7719 hostParent = deletedFiber.stateNode.containerInfo; 7720 hostParentIsContainer = !0; 7721 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7722 hostParent = prevHostParent; 7723 hostParentIsContainer = prevHostParentIsContainer; 7724 break; 7725 case 0: 7726 case 11: 7727 case 14: 7728 case 15: 7729 commitHookEffectListUnmount(Insertion, deletedFiber, nearestMountedAncestor); 7730 offscreenSubtreeWasHidden || commitHookLayoutUnmountEffects(deletedFiber, nearestMountedAncestor, Layout); 7731 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7732 break; 7733 case 1: 7734 offscreenSubtreeWasHidden || (safelyDetachRef(deletedFiber, nearestMountedAncestor), prevHostParent = deletedFiber.stateNode, "function" === typeof prevHostParent.componentWillUnmount && safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, prevHostParent)); 7735 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7736 break; 7737 case 21: 7738 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7739 break; 7740 case 22: 7741 offscreenSubtreeWasHidden = (prevHostParent = offscreenSubtreeWasHidden) || null !== deletedFiber.memoizedState; 7742 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7743 offscreenSubtreeWasHidden = prevHostParent; 7744 break; 7745 case 30: 7746 deletedFiber.flags & 18874368 && untrackNamedViewTransition(deletedFiber); 7747 safelyDetachRef(deletedFiber, nearestMountedAncestor); 7748 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7749 break; 7750 case 7: 7751 offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor); 7752 recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7753 break; 7754 default: recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber); 7755 } 7756 (deletedFiber.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(deletedFiber, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
vendor: 4,613 bytes, lines 7757-7846
7757 popComponentEffectStart(prevEffectStart); 7758 popComponentEffectDuration(prevEffectDuration); 7759 componentEffectErrors = prevEffectErrors; 7760 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 7761 } 7762 function commitActivityHydrationCallbacks(finishedRoot, finishedWork) { 7763 if (null === finishedWork.memoizedState && (finishedRoot = finishedWork.alternate, null !== finishedRoot && (finishedRoot = finishedRoot.memoizedState, null !== finishedRoot))) { 7764 finishedRoot = finishedRoot.dehydrated; 7765 try { 7766 runWithFiberInDEV(finishedWork, commitHydratedActivityInstance, finishedRoot); 7767 } catch (error) { 7768 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7769 } 7770 } 7771 } 7772 function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { 7773 if (null === finishedWork.memoizedState && (finishedRoot = finishedWork.alternate, null !== finishedRoot && (finishedRoot = finishedRoot.memoizedState, null !== finishedRoot && (finishedRoot = finishedRoot.dehydrated, null !== finishedRoot)))) try { 7774 runWithFiberInDEV(finishedWork, commitHydratedSuspenseInstance, finishedRoot); 7775 } catch (error) { 7776 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7777 } 7778 } 7779 function getRetryCache(finishedWork) { 7780 switch (finishedWork.tag) { 7781 case 31: 7782 case 13: 7783 case 19: 7784 var retryCache = finishedWork.stateNode; 7785 null === retryCache && (retryCache = finishedWork.stateNode = new PossiblyWeakSet()); 7786 return retryCache; 7787 case 22: return finishedWork = finishedWork.stateNode, retryCache = finishedWork._retryCache, null === retryCache && (retryCache = finishedWork._retryCache = new PossiblyWeakSet()), retryCache; 7788 default: throw Error("Unexpected Suspense handler tag (" + finishedWork.tag + "). This is a bug in React."); 7789 } 7790 } 7791 function attachSuspenseRetryListeners(finishedWork, wakeables) { 7792 var retryCache = getRetryCache(finishedWork); 7793 wakeables.forEach(function(wakeable) { 7794 if (!retryCache.has(wakeable)) { 7795 retryCache.add(wakeable); 7796 if (isDevToolsPresent) if (null !== inProgressLanes && null !== inProgressRoot) restorePendingUpdaters(inProgressRoot, inProgressLanes); 7797 else throw Error("Expected finished root and lanes to be set. This is a bug in React."); 7798 var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable); 7799 wakeable.then(retry, retry); 7800 } 7801 }); 7802 } 7803 function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber, lanes) { 7804 var deletions = parentFiber.deletions; 7805 if (null !== deletions) for (var i = 0; i < deletions.length; i++) { 7806 var root = root$jscomp$0, returnFiber = parentFiber, deletedFiber = deletions[i], prevEffectStart = pushComponentEffectStart(), parent = returnFiber; 7807 a: for (; null !== parent;) { 7808 switch (parent.tag) { 7809 case 27: 7810 if (isSingletonScope(parent.type)) { 7811 hostParent = parent.stateNode; 7812 hostParentIsContainer = !1; 7813 break a; 7814 } 7815 break; 7816 case 5: 7817 hostParent = parent.stateNode; 7818 hostParentIsContainer = !1; 7819 break a; 7820 case 3: 7821 case 4: 7822 hostParent = parent.stateNode.containerInfo; 7823 hostParentIsContainer = !0; 7824 break a; 7825 } 7826 parent = parent.return; 7827 } 7828 if (null === hostParent) throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."); 7829 commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber); 7830 hostParent = null; 7831 hostParentIsContainer = !1; 7832 (deletedFiber.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(deletedFiber, componentEffectStartTime, componentEffectEndTime, "Unmount"); 7833 popComponentEffectStart(prevEffectStart); 7834 root = deletedFiber; 7835 returnFiber = root.alternate; 7836 null !== returnFiber && (returnFiber.return = null); 7837 root.return = null; 7838 } 7839 if (parentFiber.subtreeFlags & 13886) for (parentFiber = parentFiber.child; null !== parentFiber;) commitMutationEffectsOnFiber(parentFiber, root$jscomp$0, lanes), parentFiber = parentFiber.sibling; 7840 } 7841 function commitMutationEffectsOnFiber(finishedWork, root, lanes) { 7842 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), current = finishedWork.alternate, flags = finishedWork.flags; 7843 switch (finishedWork.tag) { 7844 case 0: 7845 case 11: 7846 case 14:
vendor: 14,562 bytes, lines 7847-8041
7847 case 15: 7848 if (flags & 4 && (current = finishedWork.updateQueue, current = null !== current ? current.events : null, null !== current)) for (var ii = 0; ii < current.length; ii++) { 7849 var _eventPayloads$ii2 = current[ii]; 7850 _eventPayloads$ii2.ref.impl = _eventPayloads$ii2.nextImpl; 7851 } 7852 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7853 commitReconciliationEffects(finishedWork); 7854 flags & 4 && (commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return), commitHookEffectListMount(Insertion | HasEffect, finishedWork), commitHookLayoutUnmountEffects(finishedWork, finishedWork.return, Layout | HasEffect)); 7855 break; 7856 case 1: 7857 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7858 commitReconciliationEffects(finishedWork); 7859 flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); 7860 flags & 64 && offscreenSubtreeIsHidden && (root = finishedWork.updateQueue, null !== root && (lanes = root.callbacks, null !== lanes && (flags = root.shared.hiddenCallbacks, root.shared.hiddenCallbacks = null === flags ? lanes : flags.concat(lanes)))); 7861 break; 7862 case 26: 7863 ii = currentHoistableRoot; 7864 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7865 commitReconciliationEffects(finishedWork); 7866 flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); 7867 if (flags & 4) if (flags = null !== current ? current.memoizedState : null, lanes = finishedWork.memoizedState, null === current) if (null === lanes) if (null === finishedWork.stateNode) if (offscreenSubtreeIsHidden) finishedWork.stateNode = createHoistableInstance(finishedWork.type, finishedWork.memoizedProps, root.containerInfo, finishedWork); 7868 else { 7869 a: { 7870 root = finishedWork.type; 7871 lanes = finishedWork.memoizedProps; 7872 flags = ii.ownerDocument || ii; 7873 b: switch (root) { 7874 case "title": 7875 current = flags.getElementsByTagName("title")[0]; 7876 if (!current || current[internalHoistableMarker] || current[internalInstanceKey] || current.namespaceURI === SVG_NAMESPACE || current.hasAttribute("itemprop")) current = flags.createElement(root), flags.head.insertBefore(current, flags.querySelector("head > title")); 7877 setInitialProperties(current, root, lanes); 7878 current[internalInstanceKey] = finishedWork; 7879 markNodeAsHoistable(current); 7880 root = current; 7881 break a; 7882 case "link": 7883 if (ii = getHydratableHoistableCache("link", "href", flags).get(root + (lanes.href || ""))) { 7884 for (_eventPayloads$ii2 = 0; _eventPayloads$ii2 < ii.length; _eventPayloads$ii2++) if (current = ii[_eventPayloads$ii2], current.getAttribute("href") === (null == lanes.href || "" === lanes.href ? null : lanes.href) && current.getAttribute("rel") === (null == lanes.rel ? null : lanes.rel) && current.getAttribute("title") === (null == lanes.title ? null : lanes.title) && current.getAttribute("crossorigin") === (null == lanes.crossOrigin ? null : lanes.crossOrigin)) { 7885 ii.splice(_eventPayloads$ii2, 1); 7886 break b; 7887 } 7888 } 7889 current = flags.createElement(root); 7890 setInitialProperties(current, root, lanes); 7891 flags.head.appendChild(current); 7892 break; 7893 case "meta": 7894 if (ii = getHydratableHoistableCache("meta", "content", flags).get(root + (lanes.content || ""))) { 7895 for (_eventPayloads$ii2 = 0; _eventPayloads$ii2 < ii.length; _eventPayloads$ii2++) if (current = ii[_eventPayloads$ii2], checkAttributeStringCoercion(lanes.content, "content"), current.getAttribute("content") === (null == lanes.content ? null : "" + lanes.content) && current.getAttribute("name") === (null == lanes.name ? null : lanes.name) && current.getAttribute("property") === (null == lanes.property ? null : lanes.property) && current.getAttribute("http-equiv") === (null == lanes.httpEquiv ? null : lanes.httpEquiv) && current.getAttribute("charset") === (null == lanes.charSet ? null : lanes.charSet)) { 7896 ii.splice(_eventPayloads$ii2, 1); 7897 break b; 7898 } 7899 } 7900 current = flags.createElement(root); 7901 setInitialProperties(current, root, lanes); 7902 flags.head.appendChild(current); 7903 break; 7904 default: throw Error("getNodesForType encountered a type it did not expect: \"" + root + "\". This is a bug in React."); 7905 } 7906 current[internalInstanceKey] = finishedWork; 7907 markNodeAsHoistable(current); 7908 root = current; 7909 } 7910 finishedWork.stateNode = root; 7911 } 7912 else offscreenSubtreeIsHidden || mountHoistable(ii, finishedWork.type, finishedWork.stateNode); 7913 else finishedWork.stateNode = acquireResource(ii, lanes, finishedWork.memoizedProps); 7914 else flags !== lanes ? (null === flags ? (root = current.stateNode, null === root || offscreenSubtreeWasHidden || root.parentNode.removeChild(root)) : flags.count--, null === lanes ? offscreenSubtreeIsHidden || mountHoistable(ii, finishedWork.type, finishedWork.stateNode) : acquireResource(ii, lanes, finishedWork.memoizedProps)) : null === lanes && null !== finishedWork.stateNode && commitHostUpdate(finishedWork, finishedWork.memoizedProps, current.memoizedProps); 7915 break; 7916 case 27: 7917 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7918 commitReconciliationEffects(finishedWork); 7919 flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); 7920 null !== current && flags & 4 && commitHostUpdate(finishedWork, finishedWork.memoizedProps, current.memoizedProps); 7921 break; 7922 case 5: 7923 ii = offscreenDirectParentIsHidden; 7924 offscreenDirectParentIsHidden = !1; 7925 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7926 offscreenDirectParentIsHidden = ii; 7927 commitReconciliationEffects(finishedWork); 7928 flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); 7929 if (finishedWork.flags & 32) { 7930 root = finishedWork.stateNode; 7931 try { 7932 runWithFiberInDEV(finishedWork, resetTextContent, root), viewTransitionMutationContext = !0; 7933 } catch (error) { 7934 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7935 } 7936 } 7937 flags & 4 && null != finishedWork.stateNode && (root = finishedWork.memoizedProps, commitHostUpdate(finishedWork, root, null !== current ? current.memoizedProps : root)); 7938 flags & 1024 && (needsFormReset = !0, "form" !== finishedWork.type && console.error("Unexpected host component type. Expected a form. This is a bug in React.")); 7939 break; 7940 case 6: 7941 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7942 commitReconciliationEffects(finishedWork); 7943 if (flags & 4) { 7944 if (null === finishedWork.stateNode) throw Error("This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue."); 7945 root = finishedWork.memoizedProps; 7946 lanes = null !== current ? current.memoizedProps : root; 7947 flags = finishedWork.stateNode; 7948 try { 7949 runWithFiberInDEV(finishedWork, commitTextUpdate, flags, lanes, root), viewTransitionMutationContext = !0; 7950 } catch (error) { 7951 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7952 } 7953 } 7954 break; 7955 case 3: 7956 ii = pushNestedEffectDurations(); 7957 viewTransitionMutationContext = !1; 7958 tagCaches = null; 7959 _eventPayloads$ii2 = currentHoistableRoot; 7960 currentHoistableRoot = getHoistableRoot(root.containerInfo); 7961 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7962 currentHoistableRoot = _eventPayloads$ii2; 7963 commitReconciliationEffects(finishedWork); 7964 if (flags & 4 && null !== current && current.memoizedState.isDehydrated) try { 7965 runWithFiberInDEV(finishedWork, commitHydratedContainer, root.containerInfo); 7966 } catch (error) { 7967 captureCommitPhaseError(finishedWork, finishedWork.return, error); 7968 } 7969 needsFormReset && (needsFormReset = !1, recursivelyResetForms(finishedWork)); 7970 root.effectDuration += popNestedEffectDurations(ii); 7971 viewTransitionMutationContext = !1; 7972 break; 7973 case 4: 7974 flags = offscreenDirectParentIsHidden; 7975 offscreenDirectParentIsHidden = offscreenSubtreeIsHidden; 7976 current = pushMutationContext(); 7977 ii = currentHoistableRoot; 7978 currentHoistableRoot = getHoistableRoot(finishedWork.stateNode.containerInfo); 7979 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7980 commitReconciliationEffects(finishedWork); 7981 currentHoistableRoot = ii; 7982 viewTransitionMutationContext && inUpdateViewTransition && (rootViewTransitionAffected = !0); 7983 viewTransitionMutationContext = current; 7984 offscreenDirectParentIsHidden = flags; 7985 break; 7986 case 12: 7987 flags = pushNestedEffectDurations(); 7988 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7989 commitReconciliationEffects(finishedWork); 7990 finishedWork.stateNode.effectDuration += bubbleNestedEffectDurations(flags); 7991 break; 7992 case 31: 7993 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7994 commitReconciliationEffects(finishedWork); 7995 flags & 4 && (root = finishedWork.updateQueue, null !== root && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, root))); 7996 break; 7997 case 13: 7998 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 7999 commitReconciliationEffects(finishedWork); 8000 finishedWork.child.flags & 8192 && null !== finishedWork.memoizedState !== (null !== current && null !== current.memoizedState) && (globalMostRecentFallbackTime = now$1()); 8001 flags & 4 && (root = finishedWork.updateQueue, null !== root && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, root))); 8002 break; 8003 case 22: 8004 ii = null !== finishedWork.memoizedState; 8005 _eventPayloads$ii2 = null !== current && null !== current.memoizedState; 8006 var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden, prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden, _prevOffscreenDirectParentIsHidden2 = offscreenDirectParentIsHidden; 8007 offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || ii; 8008 offscreenDirectParentIsHidden = _prevOffscreenDirectParentIsHidden2 || ii; 8009 offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _eventPayloads$ii2; 8010 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 8011 offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; 8012 offscreenDirectParentIsHidden = _prevOffscreenDirectParentIsHidden2; 8013 offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden; 8014 _eventPayloads$ii2 && !ii && !prevOffscreenSubtreeIsHidden && !prevOffscreenSubtreeWasHidden && (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentReappeared(finishedWork, componentEffectStartTime, componentEffectEndTime); 8015 commitReconciliationEffects(finishedWork); 8016 flags & 8192 && (root = finishedWork.stateNode, root._visibility = ii ? root._visibility & ~OffscreenVisible : root._visibility | OffscreenVisible, !ii || null === current || _eventPayloads$ii2 || offscreenSubtreeIsHidden || offscreenSubtreeWasHidden || (root = IncludeHostSingletons, lanes = _eventPayloads$ii2 || offscreenSubtreeWasHidden, current = offscreenSubtreeIsHidden, _eventPayloads$ii2 = offscreenSubtreeWasHidden, offscreenSubtreeIsHidden = ii || offscreenSubtreeIsHidden, offscreenSubtreeWasHidden = lanes, recursivelyTraverseDisappearLayoutEffects(finishedWork, root), (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Disconnect"), offscreenSubtreeIsHidden = current, offscreenSubtreeWasHidden = _eventPayloads$ii2), !ii && offscreenDirectParentIsHidden || hideOrUnhideAllChildren(finishedWork, ii)); 8017 flags & 4 && (root = finishedWork.updateQueue, null !== root && (lanes = root.retryQueue, null !== lanes && (root.retryQueue = null, attachSuspenseRetryListeners(finishedWork, lanes)))); 8018 break; 8019 case 19: 8020 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 8021 commitReconciliationEffects(finishedWork); 8022 flags & 4 && (root = finishedWork.updateQueue, null !== root && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, root))); 8023 break; 8024 case 30: 8025 flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); 8026 flags = pushMutationContext(); 8027 ii = inUpdateViewTransition; 8028 _eventPayloads$ii2 = (lanes & 335544064) === lanes; 8029 prevOffscreenSubtreeIsHidden = finishedWork.memoizedProps; 8030 inUpdateViewTransition = _eventPayloads$ii2 && "none" !== getViewTransitionClassName(prevOffscreenSubtreeIsHidden.default, prevOffscreenSubtreeIsHidden.update); 8031 recursivelyTraverseMutationEffects(root, finishedWork, lanes); 8032 commitReconciliationEffects(finishedWork); 8033 _eventPayloads$ii2 && null !== current && viewTransitionMutationContext && (finishedWork.flags |= 4); 8034 inUpdateViewTransition = ii; 8035 viewTransitionMutationContext = flags; 8036 break; 8037 case 21: break; 8038 case 7: flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)), current && null !== current.stateNode && (current.stateNode._fragmentFiber = finishedWork); 8039 default: recursivelyTraverseMutationEffects(root, finishedWork, lanes), commitReconciliationEffects(finishedWork); 8040 } 8041 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && ((componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors), null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate && .05 < componentEffectEndTime - componentEffectStartTime && (isHydratingParent(finishedWork.return.alternate, finishedWork.return) || logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Mount")));
8042 popComponentEffectStart(prevEffectStart); 8043 popComponentEffectDuration(prevEffectDuration); 8044 componentEffectErrors = prevEffectErrors; 8045 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8046 } 8047 function commitReconciliationEffects(finishedWork) { 8048 var flags = finishedWork.flags; 8049 if (flags & 2) { 8050 try { 8051 runWithFiberInDEV(finishedWork, commitPlacement, finishedWork); 8052 } catch (error) { 8053 captureCommitPhaseError(finishedWork, finishedWork.return, error); 8054 } 8055 finishedWork.flags &= -3; 8056 } 8057 flags & 4096 && (finishedWork.flags &= -4097); 8058 } 8059 function recursivelyResetForms(parentFiber) { 8060 if (parentFiber.subtreeFlags & 1024) for (parentFiber = parentFiber.child; null !== parentFiber;) { 8061 var fiber = parentFiber; 8062 recursivelyResetForms(fiber); 8063 5 === fiber.tag && fiber.flags & 1024 && (fiber = fiber.stateNode, _enabled = !0, fiber.reset(), _enabled = !1); 8064 parentFiber = parentFiber.sibling; 8065 } 8066 } 8067 function recursivelyTraverseAfterMutationEffects(root, parentFiber) { 8068 if (parentFiber.subtreeFlags & 9270) for (parentFiber = parentFiber.child; null !== parentFiber;) commitAfterMutationEffectsOnFiber(parentFiber, root), parentFiber = parentFiber.sibling; 8069 else measureNestedViewTransitions(parentFiber, !1); 8070 } 8071 function commitAfterMutationEffectsOnFiber(finishedWork, root) { 8072 var current = finishedWork.alternate; 8073 if (null === current) commitEnterViewTransitions(finishedWork, !1); 8074 else switch (finishedWork.tag) { 8075 case 3: 8076 rootViewTransitionNameCanceled = viewTransitionContextChanged = !1; 8077 pushViewTransitionCancelableScope(); 8078 recursivelyTraverseAfterMutationEffects(root, finishedWork); 8079 if (!viewTransitionContextChanged && !rootViewTransitionAffected) { 8080 finishedWork = viewTransitionCancelableChildren; 8081 if (null !== finishedWork) for (var i = 0; i < finishedWork.length; i += 3) { 8082 current = finishedWork[i]; 8083 var oldName = finishedWork[i + 1]; 8084 restoreViewTransitionName(current, finishedWork[i + 2]); 8085 current = current.ownerDocument.documentElement; 8086 null !== current && current.animate({ 8087 opacity: [0, 0], 8088 pointerEvents: ["none", "none"] 8089 }, { 8090 duration: 0, 8091 fill: "forwards", 8092 pseudoElement: "::view-transition-group(" + oldName + ")" 8093 }); 8094 } 8095 finishedWork = root.containerInfo; 8096 finishedWork = 9 === finishedWork.nodeType ? finishedWork.documentElement : finishedWork.ownerDocument.documentElement; 8097 null !== finishedWork && "" === finishedWork.style.viewTransitionName && (finishedWork.style.viewTransitionName = "none", finishedWork.animate({ 8098 opacity: [0, 0], 8099 pointerEvents: ["none", "none"] 8100 }, { 8101 duration: 0, 8102 fill: "forwards", 8103 pseudoElement: "::view-transition-group(root)" 8104 }), finishedWork.animate({ 8105 width: [0, 0], 8106 height: [0, 0] 8107 }, { 8108 duration: 0, 8109 fill: "forwards", 8110 pseudoElement: "::view-transition" 8111 })); 8112 rootViewTransitionNameCanceled = !0; 8113 } 8114 viewTransitionCancelableChildren = null; 8115 break; 8116 case 5: 8117 recursivelyTraverseAfterMutationEffects(root, finishedWork); 8118 break; 8119 case 4: 8120 i = viewTransitionContextChanged; 8121 viewTransitionContextChanged = !1; 8122 recursivelyTraverseAfterMutationEffects(root, finishedWork); 8123 viewTransitionContextChanged && (rootViewTransitionAffected = !0); 8124 viewTransitionContextChanged = i; 8125 break; 8126 case 22: 8127 null === finishedWork.memoizedState && (null !== current.memoizedState ? commitEnterViewTransitions(finishedWork, !1) : recursivelyTraverseAfterMutationEffects(root, finishedWork)); 8128 break; 8129 case 30: 8130 i = viewTransitionContextChanged; 8131 oldName = pushViewTransitionCancelableScope(); 8132 viewTransitionContextChanged = !1; 8133 recursivelyTraverseAfterMutationEffects(root, finishedWork); 8134 viewTransitionContextChanged && (finishedWork.flags |= 4); 8135 var props = finishedWork.memoizedProps, state = finishedWork.stateNode; 8136 root = getViewTransitionName(props, state); 8137 state = getViewTransitionName(current.memoizedProps, state); 8138 var className = getViewTransitionClassName(props.default, props.update); 8139 "none" === className ? root = !1 : (props = current.memoizedState, current.memoizedState = null, current = finishedWork.child, viewTransitionHostInstanceIdx = 0, root = measureViewTransitionHostInstancesRecursive(finishedWork, current, root, state, className, props, !0), viewTransitionHostInstanceIdx !== (null === props ? 0 : props.length) && (finishedWork.flags |= 32)); 8140 0 !== (finishedWork.flags & 4) && root ? (scheduleViewTransitionEvent(finishedWork, finishedWork.memoizedProps.onUpdate), viewTransitionCancelableChildren = oldName) : null !== oldName && (oldName.push.apply(oldName, viewTransitionCancelableChildren), viewTransitionCancelableChildren = oldName); 8141 viewTransitionContextChanged = 0 !== (finishedWork.flags & 32) ? !0 : i; 8142 break; 8143 default: recursivelyTraverseAfterMutationEffects(root, finishedWork); 8144 } 8145 } 8146 function recursivelyTraverseLayoutEffects(root, parentFiber) { 8147 if (parentFiber.subtreeFlags & 8772) for (parentFiber = parentFiber.child; null !== parentFiber;) commitLayoutEffectOnFiber(root, parentFiber.alternate, parentFiber), parentFiber = parentFiber.sibling; 8148 } 8149 function disappearLayoutEffects(finishedWork, layoutEffectTraversalFlags) { 8150 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(); 8151 switch (finishedWork.tag) { 8152 case 0: 8153 case 11: 8154 case 14:
8155 case 15: 8156 commitHookLayoutUnmountEffects(finishedWork, finishedWork.return, Layout); 8157 recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8158 break; 8159 case 1: 8160 safelyDetachRef(finishedWork, finishedWork.return); 8161 var instance = finishedWork.stateNode; 8162 "function" === typeof instance.componentWillUnmount && safelyCallComponentWillUnmount(finishedWork, finishedWork.return, instance); 8163 recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8164 break; 8165 case 27: (layoutEffectTraversalFlags & IncludeHostSingletons) !== NoLayoutEffectTraversalFlags && runWithFiberInDEV(finishedWork, releaseSingletonInstance, finishedWork.stateNode, finishedWork.type, finishedWork.memoizedProps); 8166 case 5: 8167 safelyDetachRef(finishedWork, finishedWork.return); 8168 5 !== finishedWork.tag && 27 !== finishedWork.tag || commitFragmentInstanceDeletionEffects(finishedWork); 8169 recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8170 break; 8171 case 6: 8172 commitFragmentInstanceDeletionEffects(finishedWork); 8173 break; 8174 case 26: 8175 safelyDetachRef(finishedWork, finishedWork.return); 8176 instance = finishedWork.stateNode; 8177 null !== finishedWork.memoizedState || null === instance || offscreenSubtreeWasHidden || instance.parentNode.removeChild(instance); 8178 recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8179 break; 8180 case 22: 8181 null === finishedWork.memoizedState && recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8182 break; 8183 case 30: 8184 finishedWork.flags & 18874368 && untrackNamedViewTransition(finishedWork); 8185 safelyDetachRef(finishedWork, finishedWork.return); 8186 recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8187 break; 8188 case 7: safelyDetachRef(finishedWork, finishedWork.return); 8189 default: recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags); 8190 } 8191 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors); 8192 popComponentEffectStart(prevEffectStart); 8193 popComponentEffectDuration(prevEffectDuration); 8194 componentEffectErrors = prevEffectErrors; 8195 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8196 } 8197 function recursivelyTraverseDisappearLayoutEffects(parentFiber, layoutEffectTraversalFlags) { 8198 for (parentFiber = parentFiber.child; null !== parentFiber;) disappearLayoutEffects(parentFiber, layoutEffectTraversalFlags), parentFiber = parentFiber.sibling; 8199 } 8200 function reappearLayoutEffects(finishedRoot, current, finishedWork, layoutEffectTraversalFlags) { 8201 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), flags = finishedWork.flags, includeWorkInProgressEffects = (layoutEffectTraversalFlags & IncludeWorkInProgressEffects) !== NoLayoutEffectTraversalFlags; 8202 switch (finishedWork.tag) { 8203 case 0: 8204 case 11: 8205 case 15: 8206 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8207 commitHookLayoutEffects(finishedWork, Layout); 8208 break; 8209 case 1: 8210 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8211 current = finishedWork.stateNode; 8212 "function" === typeof current.componentDidMount && runWithFiberInDEV(finishedWork, callComponentDidMountInDEV, finishedWork, current); 8213 current = finishedWork.updateQueue; 8214 if (null !== current) { 8215 finishedRoot = finishedWork.stateNode; 8216 try { 8217 runWithFiberInDEV(finishedWork, commitHiddenCallbacks, current, finishedRoot); 8218 } catch (error) { 8219 captureCommitPhaseError(finishedWork, finishedWork.return, error); 8220 } 8221 } 8222 includeWorkInProgressEffects && flags & 64 && commitClassCallbacks(finishedWork); 8223 safelyAttachRef(finishedWork, finishedWork.return); 8224 break; 8225 case 27: (layoutEffectTraversalFlags & IncludeHostSingletons) !== NoLayoutEffectTraversalFlags && commitHostSingletonAcquisition(finishedWork); 8226 case 5: 8227 5 !== finishedWork.tag && 27 !== finishedWork.tag || commitFragmentInstanceInsertionEffects(finishedWork); 8228 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8229 includeWorkInProgressEffects && null === current && flags & 4 && commitHostMount(finishedWork); 8230 safelyAttachRef(finishedWork, finishedWork.return); 8231 break; 8232 case 6: 8233 commitFragmentInstanceInsertionEffects(finishedWork); 8234 break; 8235 case 26:
vendor: 4,157 bytes, lines 8236-8295
8236 var instance = finishedWork.stateNode; 8237 null !== finishedWork.memoizedState || null === instance || offscreenSubtreeIsHidden || mountHoistable(getHoistableRoot(instance.ownerDocument), finishedWork.type, instance); 8238 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8239 includeWorkInProgressEffects && null === current && flags & 4 && commitHostMount(finishedWork); 8240 safelyAttachRef(finishedWork, finishedWork.return); 8241 break; 8242 case 12: 8243 if (includeWorkInProgressEffects && flags & 4) { 8244 flags = pushNestedEffectDurations(); 8245 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8246 includeWorkInProgressEffects = finishedWork.stateNode; 8247 includeWorkInProgressEffects.effectDuration += bubbleNestedEffectDurations(flags); 8248 try { 8249 runWithFiberInDEV(finishedWork, commitProfiler, finishedWork, current, commitStartTime, includeWorkInProgressEffects.effectDuration); 8250 } catch (error) { 8251 captureCommitPhaseError(finishedWork, finishedWork.return, error); 8252 } 8253 } else recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8254 break; 8255 case 31: 8256 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8257 includeWorkInProgressEffects && flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork); 8258 break; 8259 case 13: 8260 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8261 includeWorkInProgressEffects && flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); 8262 break; 8263 case 22: 8264 null === finishedWork.memoizedState && recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8265 safelyAttachRef(finishedWork, finishedWork.return); 8266 break; 8267 case 30: 8268 recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8269 flags & 18874368 && trackNamedViewTransition(finishedWork); 8270 safelyAttachRef(finishedWork, finishedWork.return); 8271 break; 8272 case 7: safelyAttachRef(finishedWork, finishedWork.return); 8273 default: recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags); 8274 } 8275 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors); 8276 popComponentEffectStart(prevEffectStart); 8277 popComponentEffectDuration(prevEffectDuration); 8278 componentEffectErrors = prevEffectErrors; 8279 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8280 } 8281 function recursivelyTraverseReappearLayoutEffects(finishedRoot, parentFiber, layoutEffectTraversalFlags) { 8282 layoutEffectTraversalFlags = 0 !== (parentFiber.subtreeFlags & 8772) ? layoutEffectTraversalFlags : layoutEffectTraversalFlags & ~IncludeWorkInProgressEffects; 8283 for (parentFiber = parentFiber.child; null !== parentFiber;) reappearLayoutEffects(finishedRoot, parentFiber.alternate, parentFiber, layoutEffectTraversalFlags), parentFiber = parentFiber.sibling; 8284 } 8285 function commitOffscreenPassiveMountEffects(current, finishedWork) { 8286 var previousCache = null; 8287 null !== current && null !== current.memoizedState && null !== current.memoizedState.cachePool && (previousCache = current.memoizedState.cachePool.pool); 8288 current = null; 8289 null !== finishedWork.memoizedState && null !== finishedWork.memoizedState.cachePool && (current = finishedWork.memoizedState.cachePool.pool); 8290 current !== previousCache && (null != current && retainCache(current), null != previousCache && releaseCache(previousCache)); 8291 } 8292 function commitCachePassiveMountEffect(current, finishedWork) { 8293 current = null; 8294 null !== finishedWork.alternate && (current = finishedWork.alternate.memoizedState.cache); 8295 finishedWork = finishedWork.memoizedState.cache;
8296 finishedWork !== current && (retainCache(finishedWork), null != current && releaseCache(current)); 8297 } 8298 function recursivelyTraversePassiveMountEffects(root, parentFiber, committedLanes, committedTransitions, endTime) { 8299 var isViewTransitionEligible = (committedLanes & 335544064) === committedLanes; 8300 if (parentFiber.subtreeFlags & (isViewTransitionEligible ? 10262 : 10256) || 0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)) for (parentFiber = parentFiber.child; null !== parentFiber;) isViewTransitionEligible = parentFiber.sibling, commitPassiveMountOnFiber(root, parentFiber, committedLanes, committedTransitions, null !== isViewTransitionEligible ? isViewTransitionEligible.actualStartTime : endTime), parentFiber = isViewTransitionEligible; 8301 else isViewTransitionEligible && restoreNestedViewTransitions(parentFiber); 8302 } 8303 function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) { 8304 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), prevDeepEquality = alreadyWarnedForDeepEquality, isViewTransitionEligible = (committedLanes & 335544064) === committedLanes; 8305 isViewTransitionEligible && null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate && restoreEnterOrExitViewTransitions(finishedWork); 8306 var flags = finishedWork.flags; 8307 switch (finishedWork.tag) { 8308 case 0: 8309 case 11: 8310 case 15: 8311 (finishedWork.mode & ProfileMode) !== NoMode && 0 < finishedWork.actualStartTime && 0 !== (finishedWork.flags & 1) && logComponentRender(finishedWork, finishedWork.actualStartTime, endTime, inHydratedSubtree, committedLanes); 8312 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8313 flags & 2048 && commitHookPassiveMountEffects(finishedWork, Passive | HasEffect); 8314 break; 8315 case 1: 8316 (finishedWork.mode & ProfileMode) !== NoMode && 0 < finishedWork.actualStartTime && (0 !== (finishedWork.flags & 128) ? logComponentErrored(finishedWork, finishedWork.actualStartTime, endTime, []) : 0 !== (finishedWork.flags & 1) && logComponentRender(finishedWork, finishedWork.actualStartTime, endTime, inHydratedSubtree, committedLanes)); 8317 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8318 break; 8319 case 3: 8320 var prevProfilerEffectDuration = pushNestedEffectDurations(), wasInHydratedSubtree = inHydratedSubtree; 8321 inHydratedSubtree = null !== finishedWork.alternate && finishedWork.alternate.memoizedState.isDehydrated && 0 === (finishedWork.flags & 256); 8322 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8323 inHydratedSubtree = wasInHydratedSubtree; 8324 isViewTransitionEligible && rootViewTransitionNameCanceled && (committedLanes = finishedRoot.containerInfo, committedLanes = 9 === committedLanes.nodeType ? committedLanes.body : "HTML" === committedLanes.nodeName ? committedLanes.ownerDocument.body : committedLanes, "root" === committedLanes.style.viewTransitionName && (committedLanes.style.viewTransitionName = ""), committedLanes = committedLanes.ownerDocument.documentElement, null !== committedLanes && "none" === committedLanes.style.viewTransitionName && (committedLanes.style.viewTransitionName = "")); 8325 flags & 2048 && (committedLanes = null, null !== finishedWork.alternate && (committedLanes = finishedWork.alternate.memoizedState.cache), committedTransitions = finishedWork.memoizedState.cache, committedTransitions !== committedLanes && (retainCache(committedTransitions), null != committedLanes && releaseCache(committedLanes))); 8326 finishedRoot.passiveEffectDuration += popNestedEffectDurations(prevProfilerEffectDuration); 8327 break; 8328 case 12: 8329 if (flags & 2048) { 8330 flags = pushNestedEffectDurations(); 8331 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8332 finishedRoot = finishedWork.stateNode; 8333 finishedRoot.passiveEffectDuration += bubbleNestedEffectDurations(flags); 8334 try { 8335 runWithFiberInDEV(finishedWork, commitProfilerPostCommitImpl, finishedWork, finishedWork.alternate, commitStartTime, finishedRoot.passiveEffectDuration); 8336 } catch (error) { 8337 captureCommitPhaseError(finishedWork, finishedWork.return, error); 8338 } 8339 } else recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8340 break; 8341 case 31: 8342 flags = inHydratedSubtree; 8343 prevProfilerEffectDuration = null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null; 8344 isViewTransitionEligible = finishedWork.memoizedState; 8345 null !== prevProfilerEffectDuration && null === isViewTransitionEligible ? (isViewTransitionEligible = finishedWork.deleti
8345ons, null !== isViewTransitionEligible && 0 < isViewTransitionEligible.length && 18 === isViewTransitionEligible[0].tag ? (inHydratedSubtree = !1, prevProfilerEffectDuration = prevProfilerEffectDuration.hydrationErrors, null !== prevProfilerEffectDuration && logComponentErrored(finishedWork, finishedWork.actualStartTime, endTime, prevProfilerEffectDuration)) : inHydratedSubtree = !0) : inHydratedSubtree = !1; 8346 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8347 inHydratedSubtree = flags; 8348 break; 8349 case 13: 8350 flags = inHydratedSubtree; 8351 prevProfilerEffectDuration = null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null; 8352 isViewTransitionEligible = finishedWork.memoizedState; 8353 null === prevProfilerEffectDuration || null === prevProfilerEffectDuration.dehydrated || null !== isViewTransitionEligible && null !== isViewTransitionEligible.dehydrated ? inHydratedSubtree = !1 : (isViewTransitionEligible = finishedWork.deletions, null !== isViewTransitionEligible && 0 < isViewTransitionEligible.length && 18 === isViewTransitionEligible[0].tag ? (inHydratedSubtree = !1, prevProfilerEffectDuration = prevProfilerEffectDuration.hydrationErrors, null !== prevProfilerEffectDuration && logComponentErrored(finishedWork, finishedWork.actualStartTime, endTime, prevProfilerEffectDuration)) : inHydratedSubtree = !0); 8354 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8355 inHydratedSubtree = flags; 8356 break; 8357 case 23: break; 8358 case 22: 8359 wasInHydratedSubtree = finishedWork.stateNode; 8360 prevProfilerEffectDuration = finishedWork.alternate; 8361 null !== finishedWork.memoizedState ? (isViewTransitionEligible && null !== prevProfilerEffectDuration && null === prevProfilerEffectDuration.memoizedState && restoreEnterOrExitViewTransitions(prevProfilerEffectDuration), wasInHydratedSubtree._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime)) : (isViewTransitionEligible && null !== prevProfilerEffectDuration && null !== prevProfilerEffectDuration.memoizedState && restoreEnterOrExitViewTransitions(finishedWork), wasInHydratedSubtree._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) : (wasInHydratedSubtree._visibility |= OffscreenPassiveEffectsConnected, recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, 0 !== (finishedWork.subtreeFlags & 10256) || 0 !== finishedWork.actualDuration && (null === finishedWork.alternate || finishedWork.alternate.child !== finishedWork.child), endTime), (finishedWork.mode & ProfileMode) === NoMode || inHydratedSubtree || (finishedRoot = finishedWork.actualStartTime, 0 <= finishedRoot && .05 < endTime - finishedRoot && logComponentReappeared(finishedWork, finishedRoot, endTime), 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentReappeared(finishedWork, componentEffectStartTime, componentEffectEndTime)))); 8362 flags & 2048 && commitOffscreenPassiveMountEffects(prevProfilerEffectDuration, finishedWork); 8363 break; 8364 case 24: 8365 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8366 flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); 8367 break; 8368 case 30: 8369 isViewTransitionEligible && (flags = finishedWork.alternate, null !== flags && (restoreViewTransitionOnHostInstances(flags.child, !0), restoreViewTransitionOnHostInstances(finishedWork.child, !0))); 8370 recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8371 break; 8372 default: recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime); 8373 } 8374 if ((finishedWork.mode & ProfileMode) !== NoMode) { 8375 if (finishedRoot = !inHydratedSubtree && null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate) committedLanes = finishedWork.actualStartTime, 0 <= committedLanes && .05 < endTime - committedLanes && logComponentTrigger(finishedWork, committedLanes, endTime, "Mount"); 8376 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && ((componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors), finishedRoot && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Mount")); 8377 }
vendor: 6,534 bytes, lines 8378-8456
8378 popComponentEffectStart(prevEffectStart); 8379 popComponentEffectDuration(prevEffectDuration); 8380 componentEffectErrors = prevEffectErrors; 8381 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8382 alreadyWarnedForDeepEquality = prevDeepEquality; 8383 } 8384 function recursivelyTraverseReconnectPassiveEffects(finishedRoot, parentFiber, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime) { 8385 includeWorkInProgressEffects = includeWorkInProgressEffects && (0 !== (parentFiber.subtreeFlags & 10256) || 0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)); 8386 for (parentFiber = parentFiber.child; null !== parentFiber;) { 8387 var nextSibling = parentFiber.sibling; 8388 reconnectPassiveEffects(finishedRoot, parentFiber, committedLanes, committedTransitions, includeWorkInProgressEffects, null !== nextSibling ? nextSibling.actualStartTime : endTime); 8389 parentFiber = nextSibling; 8390 } 8391 } 8392 function reconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime) { 8393 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), prevDeepEquality = alreadyWarnedForDeepEquality; 8394 includeWorkInProgressEffects && (finishedWork.mode & ProfileMode) !== NoMode && 0 < finishedWork.actualStartTime && 0 !== (finishedWork.flags & 1) && logComponentRender(finishedWork, finishedWork.actualStartTime, endTime, inHydratedSubtree, committedLanes); 8395 var flags = finishedWork.flags; 8396 switch (finishedWork.tag) { 8397 case 0: 8398 case 11: 8399 case 15: 8400 recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime); 8401 commitHookPassiveMountEffects(finishedWork, Passive); 8402 break; 8403 case 23: break; 8404 case 22: 8405 var _instance4 = finishedWork.stateNode; 8406 null !== finishedWork.memoizedState ? _instance4._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime) : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) : (_instance4._visibility |= OffscreenPassiveEffectsConnected, recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime)); 8407 includeWorkInProgressEffects && flags & 2048 && commitOffscreenPassiveMountEffects(finishedWork.alternate, finishedWork); 8408 break; 8409 case 24: 8410 recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime); 8411 includeWorkInProgressEffects && flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); 8412 break; 8413 default: recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime); 8414 } 8415 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors); 8416 popComponentEffectStart(prevEffectStart); 8417 popComponentEffectDuration(prevEffectDuration); 8418 componentEffectErrors = prevEffectErrors; 8419 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8420 alreadyWarnedForDeepEquality = prevDeepEquality; 8421 } 8422 function recursivelyTraverseAtomicPassiveEffects(finishedRoot$jscomp$0, parentFiber, committedLanes$jscomp$0, committedTransitions$jscomp$0, endTime$jscomp$0) { 8423 if (parentFiber.subtreeFlags & 10256 || 0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)) for (var child = parentFiber.child; null !== child;) { 8424 parentFiber = child.sibling; 8425 var finishedRoot = finishedRoot$jscomp$0, committedLanes = committedLanes$jscomp$0, committedTransitions = committedTransitions$jscomp$0, endTime = null !== parentFiber ? parentFiber.actualStartTime : endTime$jscomp$0, prevDeepEquality = alreadyWarnedForDeepEquality; 8426 (child.mode & ProfileMode) !== NoMode && 0 < child.actualStartTime && 0 !== (child.flags & 1) && logComponentRender(child, child.actualStartTime, endTime, inHydratedSubtree, committedLanes); 8427 var flags = child.flags; 8428 switch (child.tag) { 8429 case 22: 8430 recursivelyTraverseAtomicPassiveEffects(finishedRoot, child, committedLanes, committedTransitions, endTime); 8431 flags & 2048 && commitOffscreenPassiveMountEffects(child.alternate, child); 8432 break; 8433 case 24: 8434 recursivelyTraverseAtomicPassiveEffects(finishedRoot, child, committedLanes, committedTransitions, endTime); 8435 flags & 2048 && commitCachePassiveMountEffect(child.alternate, child); 8436 break; 8437 default: recursivelyTraverseAtomicPassiveEffects(finishedRoot, child, committedLanes, committedTransitions, endTime); 8438 } 8439 alreadyWarnedForDeepEquality = prevDeepEquality; 8440 child = parentFiber; 8441 } 8442 } 8443 function recursivelyAccumulateSuspenseyCommit(parentFiber, committedLanes, suspendedState) { 8444 if (parentFiber.subtreeFlags & suspenseyCommitFlag) for (parentFiber = parentFiber.child; null !== parentFiber;) accumulateSuspenseyCommitOnFiber(parentFiber, committedLanes, suspendedState), parentFiber = parentFiber.sibling; 8445 } 8446 function accumulateSuspenseyCommitOnFiber(fiber, committedLanes, suspendedState) { 8447 switch (fiber.tag) { 8448 case 26: 8449 recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState); 8450 fiber.flags & suspenseyCommitFlag && (null !== fiber.memoizedState ? suspendResource(suspendedState, currentHoistableRoot, fiber.memoizedState, fiber.memoizedProps) : (fiber = fiber.stateNode, (committedLanes & 335544128) === committedLanes && suspendInstance(suspendedState, fiber))); 8451 break; 8452 case 5: 8453 recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState); 8454 fiber.flags & suspenseyCommitFlag && (fiber = fiber.stateNode, (committedLanes & 335544128) === committedLanes && suspendInstance(suspendedState, fiber)); 8455 break; 8456 case 3:
8457 case 4: 8458 var previousHoistableRoot = currentHoistableRoot; 8459 currentHoistableRoot = getHoistableRoot(fiber.stateNode.containerInfo); 8460 recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState); 8461 currentHoistableRoot = previousHoistableRoot; 8462 break; 8463 case 22: 8464 null === fiber.memoizedState && (previousHoistableRoot = fiber.alternate, null !== previousHoistableRoot && null !== previousHoistableRoot.memoizedState ? (previousHoistableRoot = suspenseyCommitFlag, suspenseyCommitFlag = 16777216, recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState), suspenseyCommitFlag = previousHoistableRoot) : recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState)); 8465 break; 8466 case 30: 8467 if (0 !== (fiber.flags & suspenseyCommitFlag) && (previousHoistableRoot = fiber.memoizedProps.name, null != previousHoistableRoot && "auto" !== previousHoistableRoot)) { 8468 var state = fiber.stateNode; 8469 state.paired = null; 8470 null === appearingViewTransitions && (appearingViewTransitions = /* @__PURE__ */ new Map()); 8471 appearingViewTransitions.set(previousHoistableRoot, state); 8472 } 8473 recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState); 8474 break; 8475 default: recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState); 8476 } 8477 } 8478 function detachAlternateSiblings(parentFiber) { 8479 var previousFiber = parentFiber.alternate; 8480 if (null !== previousFiber && (parentFiber = previousFiber.child, null !== parentFiber)) { 8481 previousFiber.child = null; 8482 do 8483 previousFiber = parentFiber.sibling, parentFiber.sibling = null, parentFiber = previousFiber; 8484 while (null !== parentFiber); 8485 } 8486 } 8487 function recursivelyTraversePassiveUnmountEffects(parentFiber) { 8488 var deletions = parentFiber.deletions; 8489 if (0 !== (parentFiber.flags & 16)) { 8490 if (null !== deletions) for (var i = 0; i < deletions.length; i++) { 8491 var childToDelete = deletions[i], prevEffectStart = pushComponentEffectStart(); 8492 nextEffect = childToDelete; 8493 commitPassiveUnmountEffectsInsideOfDeletedTree_begin(childToDelete, parentFiber); 8494 (childToDelete.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(childToDelete, componentEffectStartTime, componentEffectEndTime, "Unmount"); 8495 popComponentEffectStart(prevEffectStart); 8496 } 8497 detachAlternateSiblings(parentFiber); 8498 } 8499 if (parentFiber.subtreeFlags & 10256) for (parentFiber = parentFiber.child; null !== parentFiber;) commitPassiveUnmountOnFiber(parentFiber), parentFiber = parentFiber.sibling; 8500 } 8501 function commitPassiveUnmountOnFiber(finishedWork) { 8502 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(); 8503 switch (finishedWork.tag) { 8504 case 0: 8505 case 11: 8506 case 15: 8507 recursivelyTraversePassiveUnmountEffects(finishedWork); 8508 finishedWork.flags & 2048 && commitHookPassiveUnmountEffects(finishedWork, finishedWork.return, Passive | HasEffect); 8509 break; 8510 case 3: 8511 var prevProfilerEffectDuration = pushNestedEffectDurations(); 8512 recursivelyTraversePassiveUnmountEffects(finishedWork); 8513 finishedWork.stateNode.passiveEffectDuration += popNestedEffectDurations(prevProfilerEffectDuration); 8514 break; 8515 case 12: 8516 prevProfilerEffectDuration = pushNestedEffectDurations(); 8517 recursivelyTraversePassiveUnmountEffects(finishedWork); 8518 finishedWork.stateNode.passiveEffectDuration += bubbleNestedEffectDurations(prevProfilerEffectDuration); 8519 break; 8520 case 22: 8521 prevProfilerEffectDuration = finishedWork.stateNode; 8522 null !== finishedWork.memoizedState && prevProfilerEffectDuration._visibility & OffscreenPassiveEffectsConnected && (null === finishedWork.return || 13 !== finishedWork.return.tag) ? (prevProfilerEffectDuration._visibility &= ~OffscreenPassiveEffectsConnected, recursivelyTraverseDisconnectPassiveEffects(finishedWork), (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Disconnect")) : recursivelyTraversePassiveUnmountEffects(finishedWork); 8523 break; 8524 default: recursivelyTraversePassiveUnmountEffects(finishedWork); 8525 } 8526 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
vendor: 4,659 bytes, lines 8527-8611
8527 popComponentEffectStart(prevEffectStart); 8528 popComponentEffectDuration(prevEffectDuration); 8529 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8530 componentEffectErrors = prevEffectErrors; 8531 } 8532 function recursivelyTraverseDisconnectPassiveEffects(parentFiber) { 8533 var deletions = parentFiber.deletions; 8534 if (0 !== (parentFiber.flags & 16)) { 8535 if (null !== deletions) for (var i = 0; i < deletions.length; i++) { 8536 var childToDelete = deletions[i], prevEffectStart = pushComponentEffectStart(); 8537 nextEffect = childToDelete; 8538 commitPassiveUnmountEffectsInsideOfDeletedTree_begin(childToDelete, parentFiber); 8539 (childToDelete.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(childToDelete, componentEffectStartTime, componentEffectEndTime, "Unmount"); 8540 popComponentEffectStart(prevEffectStart); 8541 } 8542 detachAlternateSiblings(parentFiber); 8543 } 8544 for (parentFiber = parentFiber.child; null !== parentFiber;) disconnectPassiveEffect(parentFiber), parentFiber = parentFiber.sibling; 8545 } 8546 function disconnectPassiveEffect(finishedWork) { 8547 var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(); 8548 switch (finishedWork.tag) { 8549 case 0: 8550 case 11: 8551 case 15: 8552 commitHookPassiveUnmountEffects(finishedWork, finishedWork.return, Passive); 8553 recursivelyTraverseDisconnectPassiveEffects(finishedWork); 8554 break; 8555 case 22: 8556 var instance = finishedWork.stateNode; 8557 instance._visibility & OffscreenPassiveEffectsConnected && (instance._visibility &= ~OffscreenPassiveEffectsConnected, recursivelyTraverseDisconnectPassiveEffects(finishedWork)); 8558 break; 8559 default: recursivelyTraverseDisconnectPassiveEffects(finishedWork); 8560 } 8561 (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors); 8562 popComponentEffectStart(prevEffectStart); 8563 popComponentEffectDuration(prevEffectDuration); 8564 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8565 componentEffectErrors = prevEffectErrors; 8566 } 8567 function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor$jscomp$0) { 8568 for (; null !== nextEffect;) { 8569 var fiber = nextEffect, current = fiber, nearestMountedAncestor = nearestMountedAncestor$jscomp$0, prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(); 8570 switch (current.tag) { 8571 case 0: 8572 case 11: 8573 case 15: 8574 commitHookPassiveUnmountEffects(current, nearestMountedAncestor, Passive); 8575 break; 8576 case 23: 8577 case 22: 8578 null !== current.memoizedState && null !== current.memoizedState.cachePool && (nearestMountedAncestor = current.memoizedState.cachePool.pool, null != nearestMountedAncestor && retainCache(nearestMountedAncestor)); 8579 break; 8580 case 24: releaseCache(current.memoizedState.cache); 8581 } 8582 (current.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(current, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors); 8583 popComponentEffectStart(prevEffectStart); 8584 popComponentEffectDuration(prevEffectDuration); 8585 componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate; 8586 componentEffectErrors = prevEffectErrors; 8587 current = fiber.child; 8588 if (null !== current) current.return = fiber, nextEffect = current; 8589 else a: for (fiber = deletedSubtreeRoot; null !== nextEffect;) { 8590 current = nextEffect; 8591 prevEffectStart = current.sibling; 8592 prevEffectDuration = current.return; 8593 detachFiberAfterEffects(current); 8594 if (current === fiber) { 8595 nextEffect = null; 8596 break a; 8597 } 8598 if (null !== prevEffectStart) { 8599 prevEffectStart.return = prevEffectDuration; 8600 nextEffect = prevEffectStart; 8601 break a; 8602 } 8603 nextEffect = prevEffectDuration; 8604 } 8605 } 8606 } 8607 function onCommitRoot() { 8608 commitHooks.forEach(function(commitHook) { 8609 return commitHook(); 8610 }); 8611 }
8612 function isConcurrentActEnvironment() { 8613 var isReactActEnvironmentGlobal = "undefined" !== typeof IS_REACT_ACT_ENVIRONMENT ? IS_REACT_ACT_ENVIRONMENT : void 0; 8614 isReactActEnvironmentGlobal || null === ReactSharedInternals.actQueue || console.error("The current testing environment is not configured to support act(...)"); 8615 return isReactActEnvironmentGlobal; 8616 } 8617 function requestUpdateLane(fiber) { 8618 if ((executionContext & RenderContext) !== NoContext && 0 !== workInProgressRootRenderLanes) return workInProgressRootRenderLanes & -workInProgressRootRenderLanes; 8619 var transition = ReactSharedInternals.T; 8620 if (null !== transition) return transition._updatedFibers || (transition._updatedFibers = /* @__PURE__ */ new Set()), transition._updatedFibers.add(fiber), null !== lastSuspendedFiber && resolveUpdatePriority() === DiscreteEventPriority && (lastSuspendedFiber = null), requestTransitionLane(); 8621 fiber = resolveUpdatePriority(); 8622 fiber === DiscreteEventPriority && (lastSuspendedFiber = null); 8623 return fiber; 8624 } 8625 function requestDeferredLane() { 8626 if (0 === workInProgressDeferredLane) if (0 === (workInProgressRootRenderLanes & 536870912) || isHydrating) { 8627 var lane = nextTransitionDeferredLane; 8628 nextTransitionDeferredLane <<= 1; 8629 0 === (nextTransitionDeferredLane & 3932160) && (nextTransitionDeferredLane = 262144); 8630 workInProgressDeferredLane = lane; 8631 } else workInProgressDeferredLane = 536870912; 8632 lane = suspenseHandlerStackCursor.current; 8633 null !== lane && (lane.flags |= 32); 8634 return workInProgressDeferredLane; 8635 } 8636 function scheduleViewTransitionEvent(fiber, callback) { 8637 if (null != callback) { 8638 var state = fiber.stateNode, instance = state.ref; 8639 null === instance && (instance = state.ref = createViewTransitionInstance(getViewTransitionName(fiber.memoizedProps, state))); 8640 null === pendingViewTransitionEvents && (pendingViewTransitionEvents = []); 8641 pendingViewTransitionEvents.push(callback.bind(null, instance)); 8642 } 8643 } 8644 function scheduleUpdateOnFiber(root, fiber, lane) { 8645 isRunningInsertionEffect && console.error("useInsertionEffect must not schedule updates."); 8646 isFlushingPassiveEffects && (didScheduleUpdateDuringPassiveEffects = !0); 8647 if (root === workInProgressRoot && (workInProgressSuspendedReason === SuspendedOnData || workInProgressSuspendedReason === SuspendedOnAction) || null !== root.cancelPendingCommit) prepareFreshStack(root, 0), markRootSuspended(root, workInProgressRootRenderLanes, workInProgressDeferredLane, !1); 8648 markRootUpdated$1(root, lane); 8649 if ((executionContext & RenderContext) !== NoContext && root === workInProgressRoot) { 8650 if (isRendering) switch (fiber.tag) { 8651 case 0: 8652 case 11: 8653 case 15: 8654 root = workInProgress && getComponentNameFromFiber(workInProgress) || "Unknown"; 8655 didWarnAboutUpdateInRenderForAnotherComponent.has(root) || (didWarnAboutUpdateInRenderForAnotherComponent.add(root), fiber = getComponentNameFromFiber(fiber) || "Unknown", console.error("Cannot update a component (`%s`) while rendering a different component (`%s`). To locate the bad setState() call inside `%s`, follow the stack trace as described in https://react.dev/link/setstate-in-render", fiber, root, root)); 8656 break; 8657 case 1: didWarnAboutUpdateInRender || (console.error("Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state."), didWarnAboutUpdateInRender = !0); 8658 } 8659 } else isDevToolsPresent && addFiberToLanesMap(root, fiber, lane), warnIfUpdatesNotWrappedWithActDEV(fiber), root === workInProgressRoot && ((executionContext & RenderContext) === NoContext && (workInProgressRootInterleavedUpdatedLanes |= lane), workInProgressRootExitStatus === RootSuspendedWithDelay && markRootSuspended(root, workInProgressRootRenderLanes, workInProgressDeferredLane, !1)), ensureRootIsScheduled(root); 8660 } 8661 function performWorkOnRoot(root, lanes, forceSync) { 8662 if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Should not already be working."); 8663 if (0 !== workInProgressRootRenderLanes && null !== workInProgress) { 8664 var yieldedFiber = workInProgress, yieldEndTime = now$1(); 8665 switch (yieldReason) { 8666 case SuspendedOnImmediate: 8667 case SuspendedOnData: 8668 var startTime = yieldStartTime; 8669 supportsUserTiming && ((yieldedFiber = yieldedFiber._debugTask) ? yieldedFiber.run(console.timeStamp.bind(console, "Suspended", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light")) : console.timeStamp("Suspended", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light")); 8670 break; 8671 case SuspendedOnAction: 8672 startTime = yieldStartTime; 8673 supportsUserTiming && ((yieldedFiber = yieldedFiber._debugTask) ? yieldedFiber.run(console.timeStamp.bind(console, "Action", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light")) : console.timeStamp("Action", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light")); 8674 break; 8675 default: supportsUserTiming && (yieldedFiber = yieldEndTime - yieldStartTime, 3 > yieldedFiber || console.timeStamp("Blocked", yieldStartTime, yieldEndTime, COMPONENTS_TRACK, void 0, 5 > yieldedFiber ? "primary-light" : 10 > yieldedFiber ? "primary" : 100 > yieldedFiber ? "primary-dark" : "error")); 8676 } 8677 } 8678 startTime = (forceSync = !forceSync && 0 === (lanes & 127) && 0 === (lanes & root.expiredLanes) || checkIfRootIsPrerendering(root, lanes)) ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes, !0); 8679 var renderWasConcurrent = forceSync; 8680 do { 8681 if (startTime === RootInProgress) { 8682 workInProgressRootIsPrerendering && !forceSync && markRootSuspended(root, lanes, 0, !1); 8683 lanes = workInProgressSuspendedReason;
vendor: 4,308 bytes, lines 8684-8763
8684 yieldStartTime = now(); 8685 yieldReason = lanes; 8686 break; 8687 } else { 8688 yieldedFiber = now$1(); 8689 yieldEndTime = root.current.alternate; 8690 if (renderWasConcurrent && !isRenderConsistentWithExternalStores(yieldEndTime)) { 8691 setCurrentTrackFromLanes(lanes); 8692 yieldEndTime = renderStartTime; 8693 startTime = yieldedFiber; 8694 !supportsUserTiming || startTime <= yieldEndTime || (workInProgressUpdateTask ? workInProgressUpdateTask.run(console.timeStamp.bind(console, "Teared Render", yieldEndTime, startTime, currentTrack, LANES_TRACK_GROUP, "error")) : console.timeStamp("Teared Render", yieldEndTime, startTime, currentTrack, LANES_TRACK_GROUP, "error")); 8695 finalizeRender(lanes, yieldedFiber); 8696 startTime = renderRootSync(root, lanes, !1); 8697 renderWasConcurrent = !1; 8698 continue; 8699 } 8700 if (startTime === RootErrored) { 8701 renderWasConcurrent = lanes; 8702 if (root.errorRecoveryDisabledLanes & renderWasConcurrent) var errorRetryLanes = 0; 8703 else errorRetryLanes = root.pendingLanes & -536870913, errorRetryLanes = 0 !== errorRetryLanes ? errorRetryLanes : errorRetryLanes & 536870912 ? 536870912 : 0; 8704 if (0 !== errorRetryLanes) { 8705 setCurrentTrackFromLanes(lanes); 8706 logErroredRenderPhase(renderStartTime, yieldedFiber, lanes, workInProgressUpdateTask); 8707 finalizeRender(lanes, yieldedFiber); 8708 lanes = errorRetryLanes; 8709 a: { 8710 yieldedFiber = root; 8711 startTime = renderWasConcurrent; 8712 renderWasConcurrent = workInProgressRootConcurrentErrors; 8713 var wasRootDehydrated = yieldedFiber.current.memoizedState.isDehydrated; 8714 wasRootDehydrated && (prepareFreshStack(yieldedFiber, errorRetryLanes).flags |= 256); 8715 errorRetryLanes = renderRootSync(yieldedFiber, errorRetryLanes, !1); 8716 if (errorRetryLanes !== RootErrored && errorRetryLanes !== RootSuspendedAtTheShell) { 8717 if (workInProgressRootDidAttachPingListener && !wasRootDehydrated) { 8718 yieldedFiber.errorRecoveryDisabledLanes |= startTime; 8719 workInProgressRootInterleavedUpdatedLanes |= startTime; 8720 startTime = RootSuspendedWithDelay; 8721 break a; 8722 } 8723 yieldedFiber = workInProgressRootRecoverableErrors; 8724 workInProgressRootRecoverableErrors = renderWasConcurrent; 8725 null !== yieldedFiber && (null === workInProgressRootRecoverableErrors ? workInProgressRootRecoverableErrors = yieldedFiber : workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, yieldedFiber)); 8726 } 8727 startTime = errorRetryLanes; 8728 } 8729 renderWasConcurrent = !1; 8730 if (startTime !== RootErrored) continue; 8731 else yieldedFiber = now$1(); 8732 } 8733 } 8734 if (startTime === RootFatalErrored) { 8735 setCurrentTrackFromLanes(lanes); 8736 logErroredRenderPhase(renderStartTime, yieldedFiber, lanes, workInProgressUpdateTask); 8737 finalizeRender(lanes, yieldedFiber); 8738 prepareFreshStack(root, 0); 8739 markRootSuspended(root, lanes, 0, !0); 8740 break; 8741 } 8742 a: { 8743 forceSync = root; 8744 switch (startTime) { 8745 case RootInProgress: 8746 case RootFatalErrored: throw Error("Root did not complete. This is a bug in React."); 8747 case RootSuspendedWithDelay: if ((lanes & 4194048) !== lanes && (lanes & 62914560) !== lanes) break; 8748 case RootSuspendedAtTheShell: 8749 setCurrentTrackFromLanes(lanes); 8750 logSuspendedRenderPhase(renderStartTime, yieldedFiber, lanes, workInProgressUpdateTask); 8751 finalizeRender(lanes, yieldedFiber); 8752 yieldEndTime = lanes; 8753 0 !== (yieldEndTime & 127) ? blockingSuspendedTime = yieldedFiber : 0 !== (yieldEndTime & 4194048) && (transitionSuspendedTime = yieldedFiber); 8754 markRootSuspended(forceSync, lanes, workInProgressDeferredLane, !workInProgressRootDidSkipSuspendedSiblings); 8755 break a; 8756 case RootErrored: 8757 workInProgressRootRecoverableErrors = null; 8758 break; 8759 case RootSuspended: 8760 case RootCompleted: break; 8761 default: throw Error("Unknown root exit status."); 8762 } 8763 if (null !== ReactSharedInternals.actQueue) completeRoot(forceSync, yieldEndTime, lanes, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpd
8763ate, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, startTime, null, null, renderStartTime, yieldedFiber); 8764 else { 8765 if ((lanes & 62914560) === lanes && (renderWasConcurrent = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now$1(), 10 < renderWasConcurrent)) { 8766 markRootSuspended(forceSync, lanes, workInProgressDeferredLane, !workInProgressRootDidSkipSuspendedSiblings); 8767 if (0 !== getNextLanes(forceSync, 0, !0)) break a; 8768 pendingEffectsLanes = lanes; 8769 forceSync.timeoutHandle = scheduleTimeout(completeRootWhenReady.bind(null, forceSync, yieldEndTime, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpdate, lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, startTime, "Throttled", renderStartTime, yieldedFiber), renderWasConcurrent); 8770 break a; 8771 } 8772 completeRootWhenReady(forceSync, yieldEndTime, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpdate, lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, startTime, null, renderStartTime, yieldedFiber); 8773 } 8774 } 8775 } 8776 break; 8777 } while (1); 8778 ensureRootIsScheduled(root); 8779 } 8780 function completeRootWhenReady(root, finishedWork, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime) { 8781 root.timeoutHandle = noTimeout; 8782 var subtreeFlags = finishedWork.subtreeFlags, isViewTransitionEligible = (lanes & 335544064) === lanes, suspendedState = null; 8783 if (isViewTransitionEligible || subtreeFlags & 8192 || 16785408 === (subtreeFlags & 16785408)) { 8784 if (suspendedState = { 8785 stylesheets: null, 8786 count: 0, 8787 imgCount: 0, 8788 imgBytes: 0, 8789 suspenseyImages: [], 8790 waitingForImages: !0, 8791 waitingForViewTransition: !1, 8792 unsuspend: noop$1 8793 }, appearingViewTransitions = null, accumulateSuspenseyCommitOnFiber(finishedWork, lanes, suspendedState), isViewTransitionEligible && (subtreeFlags = suspendedState, isViewTransitionEligible = root.containerInfo, isViewTransitionEligible = (9 === isViewTransitionEligible.nodeType ? isViewTransitionEligible : isViewTransitionEligible.ownerDocument).__reactViewTransition, null != isViewTransitionEligible && (subtreeFlags.count++, subtreeFlags.waitingForViewTransition = !0, subtreeFlags = onUnsuspend.bind(subtreeFlags), isViewTransitionEligible.finished.then(subtreeFlags, subtreeFlags))), subtreeFlags = (lanes & 62914560) === lanes ? globalMostRecentFallbackTime - now$1() : (lanes & 4194048) === lanes ? globalMostRecentTransitionTime - now$1() : 0, subtreeFlags = waitForCommitToBeReady(suspendedState, subtreeFlags), null !== subtreeFlags) { 8794 pendingEffectsLanes = lanes; 8795 root.cancelPendingCommit = subtreeFlags(completeRoot.bind(null, root, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedState.waitingForViewTransition ? "Waiting for the previous Animation" : 0 < suspendedState.count ? 0 < suspendedState.imgCount ? "Suspended on CSS and Images" : "Suspended on CSS" : 1 === suspendedState.imgCount ? "Suspended on an Image" : 0 < suspendedState.imgCount ? "Suspended on Images" : null, completedRenderStartTime, completedRenderEndTime)); 8796 markRootSuspended(root, lanes, spawnedLane, !didSkipSuspendedSiblings); 8797 return; 8798 } 8799 } 8800 completeRoot(root, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime); 8801 } 8802 function isRenderConsistentWithExternalStores(finishedWork) { 8803 for (var node = finishedWork;;) { 8804 var tag = node.tag; 8805 if ((0 === tag || 11 === tag || 15 === tag) && node.flags & 16384 && (tag = node.updateQueue, null !== tag && (tag = tag.stores, null !== tag))) for (var i = 0; i < tag.length; i++) {
vendor: 6,289 bytes, lines 8806-8898
8806 var check = tag[i], getSnapshot = check.getSnapshot; 8807 check = check.value; 8808 try { 8809 if (!objectIs(getSnapshot(), check)) return !1; 8810 } catch (error) { 8811 return !1; 8812 } 8813 } 8814 tag = node.child; 8815 if (node.subtreeFlags & 16384 && null !== tag) tag.return = node, node = tag; 8816 else { 8817 if (node === finishedWork) break; 8818 for (; null === node.sibling;) { 8819 if (null === node.return || node.return === finishedWork) return !0; 8820 node = node.return; 8821 } 8822 node.sibling.return = node.return; 8823 node = node.sibling; 8824 } 8825 } 8826 return !0; 8827 } 8828 function markRootSuspended(root, suspendedLanes, spawnedLane, didAttemptEntireTree) { 8829 suspendedLanes = getEntangledLanes(root, suspendedLanes); 8830 suspendedLanes &= ~workInProgressRootPingedLanes; 8831 suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; 8832 root.suspendedLanes |= suspendedLanes; 8833 root.pingedLanes &= ~suspendedLanes; 8834 didAttemptEntireTree && (root.warmLanes |= suspendedLanes); 8835 didAttemptEntireTree = root.expirationTimes; 8836 for (var lanes = suspendedLanes; 0 < lanes;) { 8837 var index = 31 - clz32(lanes), lane = 1 << index; 8838 didAttemptEntireTree[index] = -1; 8839 lanes &= ~lane; 8840 } 8841 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, suspendedLanes); 8842 } 8843 function flushSyncWork$1() { 8844 return (executionContext & (RenderContext | CommitContext)) === NoContext ? (flushSyncWorkAcrossRoots_impl(0, !1), !1) : !0; 8845 } 8846 function resetWorkInProgressStack() { 8847 if (null !== workInProgress) { 8848 if (workInProgressSuspendedReason === NotSuspended) var interruptedWork = workInProgress.return; 8849 else interruptedWork = workInProgress, resetContextDependencies(), resetHooksOnUnwind(interruptedWork), thenableState$1 = null, thenableIndexCounter$1 = 0, interruptedWork = workInProgress; 8850 for (; null !== interruptedWork;) unwindInterruptedWork(interruptedWork.alternate, interruptedWork), interruptedWork = interruptedWork.return; 8851 workInProgress = null; 8852 } 8853 } 8854 function finalizeRender(lanes, finalizationTime) { 8855 0 !== (lanes & 127) && (blockingClampTime = finalizationTime); 8856 0 !== (lanes & 4194048) && (transitionClampTime = finalizationTime); 8857 0 !== (lanes & 62914560) && (retryClampTime = finalizationTime); 8858 0 !== (lanes & 2080374784) && (idleClampTime = finalizationTime); 8859 } 8860 function prepareFreshStack(root, lanes) { 8861 supportsUserTiming && (console.timeStamp("Blocking Track", .003, .003, "Blocking", LANES_TRACK_GROUP, "primary-light"), console.timeStamp("Transition Track", .003, .003, "Transition", LANES_TRACK_GROUP, "primary-light"), console.timeStamp("Suspense Track", .003, .003, "Suspense", LANES_TRACK_GROUP, "primary-light"), console.timeStamp("Idle Track", .003, .003, "Idle", LANES_TRACK_GROUP, "primary-light")); 8862 var previousRenderStartTime = renderStartTime; 8863 renderStartTime = now(); 8864 if (0 !== workInProgressRootRenderLanes && 0 < previousRenderStartTime) { 8865 setCurrentTrackFromLanes(workInProgressRootRenderLanes); 8866 if (workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootSuspendedWithDelay) logSuspendedRenderPhase(previousRenderStartTime, renderStartTime, lanes, workInProgressUpdateTask); 8867 else { 8868 var endTime = renderStartTime, debugTask = workInProgressUpdateTask; 8869 if (supportsUserTiming && !(endTime <= previousRenderStartTime)) { 8870 var color = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", label = (lanes & 536870912) === lanes ? "Prewarm" : (lanes & 201326741) === lanes ? "Interrupted Hydration" : "Interrupted Render"; 8871 debugTask ? debugTask.run(console.timeStamp.bind(console, label, previousRenderStartTime, endTime, currentTrack, LANES_TRACK_GROUP, color)) : console.timeStamp(label, previousRenderStartTime, endTime, currentTrack, LANES_TRACK_GROUP, color); 8872 } 8873 } 8874 finalizeRender(workInProgressRootRenderLanes, renderStartTime); 8875 } 8876 previousRenderStartTime = workInProgressUpdateTask; 8877 workInProgressUpdateTask = null; 8878 if (0 !== (lanes & 127)) { 8879 workInProgressUpdateTask = blockingUpdateTask; 8880 debugTask = 0 <= blockingUpdateTime && blockingUpdateTime < blockingClampTime ? blockingClampTime : blockingUpdateTime; 8881 endTime = 0 <= blockingEventTime && blockingEventTime < blockingClampTime ? blockingClampTime : blockingEventTime; 8882 color = 0 <= endTime ? endTime : 0 <= debugTask ? debugTask : renderStartTime; 8883 0 <= blockingSuspendedTime ? (setCurrentTrackFromLanes(2), logSuspendedWithDelayPhase(blockingSuspendedTime, color, lanes, previousRenderStartTime)) : 0 !== (animatingLanes & 127) && (setCurrentTrackFromLanes(2), logAnimatingPhase(blockingClampTime, color, animatingTask)); 8884 previousRenderStartTime = debugTask; 8885 var eventTime = endTime, eventType = blockingEventType, eventIsRepeat = 0 < blockingEventRepeatTime, isSpawnedUpdate = blockingUpdateType === SPAWNED_UPDATE, isPingedUpdate = blockingUpdateType === PINGED_UPDATE; 8886 debugTask = renderStartTime; 8887 endTime = blockingUpdateTask; 8888 color = blockingUpdateMethodName; 8889 label = blockingUpdateComponentName; 8890 if (supportsUserTiming) { 8891 currentTrack = "Blocking"; 8892 0 < previousRenderStartTime ? previousRenderStartTime > debugTask && (previousRenderStartTime = debugTask) : previousRenderStartTime = debugTask; 8893 0 < eventTime ? eventTime > previousRenderStartTime && (eventTime = previousRenderStartTime) : eventTime = previousRenderStartTime; 8894 if (null !== eventType && previousRenderStartTime > eventTime) { 8895 var color$jscomp$0 = eventIsRepeat ? "secondary-light" : "warning"; 8896 endTime ? endTime.run(console.timeStamp.bind(console, eventIsRepeat ? "Consecutive" : "Event: " + eventType, eventTime, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, color$jscomp$0)) : console.timeStamp(eventIsRepeat ? "Consecutive" : "Event: " + eventType, eventTime, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, color$jscomp$0); 8897 } 8898 debugTask > previousRenderStartTime && (eventTime = isSpawnedUpdate ? "error" : (lanes & 738197653) === lanes ? "tertiary-light" : "primary-light", isSpawnedUpdate = isPingedUpdate ? "Promise Resolved" : isSpawnedUpdate ? "Cascading Update" : 5 < debugTask - previousRenderStartTime ? "Upd
vendor: 3,404 bytes, lines 8898-8917
8898ate Blocked" : "Update", isPingedUpdate = [], null != label && isPingedUpdate.push(["Component name", label]), null != color && isPingedUpdate.push(["Method name", color]), previousRenderStartTime = { 8899 start: previousRenderStartTime, 8900 end: debugTask, 8901 detail: { devtools: { 8902 properties: isPingedUpdate, 8903 track: currentTrack, 8904 trackGroup: LANES_TRACK_GROUP, 8905 color: eventTime 8906 } } 8907 }, endTime ? endTime.run(performance.measure.bind(performance, isSpawnedUpdate, previousRenderStartTime)) : performance.measure(isSpawnedUpdate, previousRenderStartTime), performance.clearMeasures(isSpawnedUpdate)); 8908 } 8909 blockingUpdateTime = -1.1; 8910 blockingUpdateType = 0; 8911 blockingUpdateComponentName = blockingUpdateMethodName = null; 8912 blockingSuspendedTime = -1.1; 8913 blockingEventRepeatTime = blockingEventTime; 8914 blockingEventTime = -1.1; 8915 blockingClampTime = now(); 8916 } 8917 0 !== (lanes & 4194048) && (workInProgressUpdateTask = transitionUpdateTask, debugTask = 0 <= transitionStartTime && transitionStartTime < transitionClampTime ? transitionClampTime : transitionStartTime, previousRenderStartTime = 0 <= transitionUpdateTime && transitionUpdateTime < transitionClampTime ? transitionClampTime : transitionUpdateTime, endTime = 0 <= transitionEventTime && transitionEventTime < transitionClampTime ? transitionClampTime : transitionEventTime, color = 0 <= endTime ? endTime : 0 <= previousRenderStartTime ? previousRenderStartTime : renderStartTime, 0 <= transitionSuspendedTime ? (setCurrentTrackFromLanes(256), logSuspendedWithDelayPhase(transitionSuspendedTime, color, lanes, workInProgressUpdateTask)) : 0 !== (animatingLanes & 4194048) && (setCurrentTrackFromLanes(256), logAnimatingPhase(transitionClampTime, color, animatingTask)), isPingedUpdate = endTime, eventTime = transitionEventType, eventType = 0 < transitionEventRepeatTime, eventIsRepeat = transitionUpdateType === PINGED_UPDATE, color = renderStartTime, endTime = transitionUpdateTask, label = transitionUpdateMethodName, isSpawnedUpdate = transitionUpdateComponentName, supportsUserTiming && (currentTrack = "Transition", 0 < previousRenderStartTime ? previousRenderStartTime > color && (previousRenderStartTime = color) : previousRenderStartTime = color, 0 < debugTask ? debugTask > previousRenderStartTime && (debugTask = previousRenderStartTime) : debugTask = previousRenderStartTime, 0 < isPingedUpdate ? isPingedUpdate > debugTask && (isPingedUpdate = debugTask) : isPingedUpdate = debugTask, debugTask > isPingedUpdate && null !== eventTime && (color$jscomp$0 = eventType ? "secondary-light" : "warning", endTime ? endTime.run(console.timeStamp.bind(console, eventType ? "Consecutive" : "Event: " + eventTime, isPingedUpdate, debugTask, currentTrack, LANES_TRACK_GROUP, color$jscomp$0)) : console.timeStamp(eventType ? "Consecutive" : "Event: " + eventTime, isPingedUpdate, debugTask, currentTrack, LANES_TRACK_GROUP, color$jscomp$0)), previousRenderStartTime > debugTask && (endTime ? endTime.run(console.timeStamp.bind(console, "Action", debugTask, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, "primary-dark")) : console.timeStamp("Action", debugTask, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, "primary-dark")), color > previousRenderStartTime && (debugTask = eventIsRepeat ? "Promise Resolved" : 5 < color - previousRenderStartTime ? "Upd
8917ate Blocked" : "Update", isPingedUpdate = [], null != isSpawnedUpdate && isPingedUpdate.push(["Component name", isSpawnedUpdate]), null != label && isPingedUpdate.push(["Method name", label]), previousRenderStartTime = { 8918 start: previousRenderStartTime, 8919 end: color, 8920 detail: { devtools: { 8921 properties: isPingedUpdate, 8922 track: currentTrack, 8923 trackGroup: LANES_TRACK_GROUP, 8924 color: "primary-light" 8925 } } 8926 }, endTime ? endTime.run(performance.measure.bind(performance, debugTask, previousRenderStartTime)) : performance.measure(debugTask, previousRenderStartTime), performance.clearMeasures(debugTask))), transitionUpdateTime = transitionStartTime = -1.1, transitionUpdateType = 0, transitionSuspendedTime = -1.1, transitionEventRepeatTime = transitionEventTime, transitionEventTime = -1.1, transitionClampTime = now()); 8927 0 !== (lanes & 62914560) && 0 !== (animatingLanes & 62914560) && (setCurrentTrackFromLanes(4194304), logAnimatingPhase(retryClampTime, renderStartTime, animatingTask)); 8928 0 !== (lanes & 2080374784) && 0 !== (animatingLanes & 2080374784) && (setCurrentTrackFromLanes(268435456), logAnimatingPhase(idleClampTime, renderStartTime, animatingTask)); 8929 previousRenderStartTime = root.timeoutHandle; 8930 previousRenderStartTime !== noTimeout && (root.timeoutHandle = noTimeout, cancelTimeout(previousRenderStartTime)); 8931 previousRenderStartTime = root.cancelPendingCommit; 8932 null !== previousRenderStartTime && (root.cancelPendingCommit = null, previousRenderStartTime()); 8933 pendingEffectsLanes = 0; 8934 resetWorkInProgressStack(); 8935 workInProgressRoot = root; 8936 workInProgress = previousRenderStartTime = createWorkInProgress(root.current, null); 8937 workInProgressRootRenderLanes = lanes; 8938 workInProgressSuspendedReason = NotSuspended; 8939 workInProgressThrownValue = null; 8940 workInProgressRootDidSkipSuspendedSiblings = !1; 8941 workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes); 8942 workInProgressRootDidAttachPingListener = !1; 8943 workInProgressRootExitStatus = RootInProgress; 8944 workInProgressSuspendedRetryLanes = workInProgressDeferredLane = workInProgressRootPingedLanes = w
8944orkInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = 0; 8945 workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors = null; 8946 workInProgressRootDidIncludeRecursiveRenderUpdate = !1; 8947 entangledRenderLanes = getEntangledLanes(root, lanes); 8948 finishQueueingConcurrentUpdates(); 8949 root = getCurrentTime(); 8950 1e3 < root - lastResetTime && (ReactSharedInternals.recentlyCreatedOwnerStacks = 0, lastResetTime = root); 8951 ReactStrictModeWarnings.discardPendingWarnings(); 8952 return previousRenderStartTime; 8953 } 8954 function handleThrow(root, thrownValue) { 8955 currentlyRenderingFiber = null; 8956 ReactSharedInternals.H = ContextOnlyDispatcher; 8957 ReactSharedInternals.getCurrentStack = null; 8958 isRendering = !1; 8959 current = null; 8960 thrownValue === SuspenseException || thrownValue === SuspenseActionException ? (thrownValue = getSuspendedThenable(), workInProgressSuspendedReason = SuspendedOnImmediate) : thrownValue === SuspenseyCommitException ? (thrownValue = getSuspendedThenable(), workInProgressSuspendedReason = SuspendedOnInstance) : workInProgressSuspendedReason = thrownValue === SelectiveHydrationException ? SuspendedOnHydration : null !== thrownValue && "object" === typeof thrownValue && "function" === typeof thrownValue.then ? SuspendedOnDeprecatedThrowPromise : SuspendedOnError; 8961 workInProgressThrownValue = thrownValue; 8962 var erroredWork = workInProgress; 8963 null === erroredWork ? (workInProgressRootExitStatus = RootFatalErrored, logUncaughtError(root, createCapturedValueAtFiber(thrownValue, root.current))) : erroredWork.mode & ProfileMode && stopProfilerTimerIfRunningAndRecordDuration(erroredWork); 8964 } 8965 function shouldRemainOnPreviousScreen() { 8966 var handler = suspenseHandlerStackCursor.current; 8967 return null === handler ? !0 : (workInProgressRootRenderLanes & 4194048) === workInProgressRootRenderLanes ? null === shellBoundary ? !0 : !1 : (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes || 0 !== (workInProgressRootRenderLanes & 536870912) ? handler === shellBoundary : !1; 8968 } 8969 function pushDispatcher() { 8970 var prevDispatcher = ReactSharedInternals.H; 8971 ReactSharedInternals.H = ContextOnlyDispatcher; 8972 return null === prevDispatcher ? ContextOnlyDispatcher : prevDispatcher; 8973 } 8974 function pushAsyncDispatcher() { 8975 var prevAsyncDispatcher = ReactSharedInternals.A; 8976 ReactSharedInternals.A = DefaultAsyncDispatcher; 8977 return prevAsyncDispatcher; 8978 } 8979 function markRenderDerivedCause(fiber) { 8980 null === workInProgressUpdateTask && (workInProgressUpdateTask = null == fiber._debugTask ? null : fiber._debugTask); 8981 } 8982 function renderDidSuspendDelayIfPossible() { 8983 workInProgressRootExitStatus = RootSuspendedWithDelay; 8984 workInProgressRootDidSkipSuspendedSiblings || (workInProgressRootRenderLanes & 4194048) !== workInProgressRootRenderLanes && null !== suspenseHandlerStackCursor.current || (workInProgressRootIsPrerendering = !0); 8985 0 === (workInProgressRootSkippedLanes & 134217727) && 0 === (workInProgressRootInterleavedUpdatedLanes & 134217727) || null === workInProgressRoot || markRootSuspended(workInProgressRoot, workInProgressRootRenderLanes, workInProgressDeferredLane, !1); 8986 } 8987 function renderRootSync(root, lanes, shouldYieldForPrerendering) { 8988 var prevExecutionContext = executionContext; 8989 executionContext |= RenderContext; 8990 var prevDispatcher = pushDispatcher(), prevAsyncDispatcher = pushAsyncDispatcher(); 8991 if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { 8992 if (isDevToolsPresent) { 8993 var memoizedUpdaters = root.memoizedUpdaters; 8994 0 < memoizedUpdaters.size && (restorePendingUpdaters(root, workInProgressRootRenderLanes), memoizedUpdaters.clear()); 8995 movePendingFibersToMemoized(root, lanes); 8996 } 8997 workInProgressTransitions = null; 8998 prepareFreshStack(root, lanes); 8999 } 9000 lanes = !1; 9001 memoizedUpdaters = workInProgressRootExitStatus; 9002 a: do 9003 try { 9004 if (workInProgressSuspendedReason !== NotSuspended && null !== workInProgress) { 9005 var unitOfWork = workInProgress, thrownValue = workInProgressThrownValue; 9006 switch (workInProgressSuspendedReason) { 9007 case SuspendedOnHydration: 9008 resetWorkInProgressStack(); 9009 memoizedUpdaters = RootSuspendedAtTheShell; 9010 break a; 9011 case SuspendedOnImmediate: 9012 case SuspendedOnData: 9013 case SuspendedOnAction: 9014 case SuspendedOnDeprecatedThrowPromise: 9015 null === suspenseHandlerStackCursor.current && (lanes = !0); 9016 var reason = workInProgressSuspendedReason; 9017 workInProgressSuspendedReason = NotSuspended; 9018 workInProgressThrownValue = null; 9019 throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason); 9020 if (shouldYieldForPrerendering && workInProgressRootIsPrerendering) { 9021 memoizedUpdaters = RootInProgress; 9022 break a; 9023 } 9024 break; 9025 default: reason = workInProgressSuspendedReason, workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason); 9026 } 9027 } 9028 workLoopSync(); 9029 memoizedUpdaters = workInProgressRootExitStatus; 9030 break; 9031 } catch (thrownValue$9) { 9032 handleThrow(root, thrownValue$9); 9033 } 9034 while (1); 9035 lanes && root.shellSuspendCounter++; 9036 resetContextDependencies(); 9037 executionContext = prevExecutionContext; 9038 ReactSharedInternals.H = prevDispatcher; 9039 ReactSharedInternals.A = prevAsyncDispatcher; 9040 null === workInProgress && (workInProgressRoot = null, workInProgressRootRenderLanes = 0, finishQueueingConcurrentUpdates()); 9041 return memoizedUpdaters; 9042 } 9043 function workLoopSync() { 9044 for (; null !== workInProgress;) performUnitOfWork(workInProgress); 9045 } 9046 function renderRootConcurrent(root, lanes) { 9047 var prevExecutionContext = executionContext; 9048 executionContext |= RenderContext;
vendor: 6,267 bytes, lines 9049-9171
9049 var prevDispatcher = pushDispatcher(), prevAsyncDispatcher = pushAsyncDispatcher(); 9050 if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { 9051 if (isDevToolsPresent) { 9052 var memoizedUpdaters = root.memoizedUpdaters; 9053 0 < memoizedUpdaters.size && (restorePendingUpdaters(root, workInProgressRootRenderLanes), memoizedUpdaters.clear()); 9054 movePendingFibersToMemoized(root, lanes); 9055 } 9056 workInProgressTransitions = null; 9057 workInProgressRootRenderTargetTime = now$1() + RENDER_TIMEOUT_MS; 9058 prepareFreshStack(root, lanes); 9059 } else workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes); 9060 a: do 9061 try { 9062 if (workInProgressSuspendedReason !== NotSuspended && null !== workInProgress) b: switch (lanes = workInProgress, memoizedUpdaters = workInProgressThrownValue, workInProgressSuspendedReason) { 9063 case SuspendedOnError: 9064 workInProgressSuspendedReason = NotSuspended; 9065 workInProgressThrownValue = null; 9066 throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedOnError); 9067 break; 9068 case SuspendedOnData: 9069 case SuspendedOnAction: 9070 if (isThenableResolved(memoizedUpdaters)) { 9071 workInProgressSuspendedReason = NotSuspended; 9072 workInProgressThrownValue = null; 9073 replaySuspendedUnitOfWork(lanes); 9074 break; 9075 } 9076 lanes = function() { 9077 workInProgressSuspendedReason !== SuspendedOnData && workInProgressSuspendedReason !== SuspendedOnAction || workInProgressRoot !== root || (workInProgressSuspendedReason = SuspendedAndReadyToContinue); 9078 ensureRootIsScheduled(root); 9079 }; 9080 memoizedUpdaters.then(lanes, lanes); 9081 break a; 9082 case SuspendedOnImmediate: 9083 workInProgressSuspendedReason = SuspendedAndReadyToContinue; 9084 break a; 9085 case SuspendedOnInstance: 9086 workInProgressSuspendedReason = SuspendedOnInstanceAndReadyToContinue; 9087 break a; 9088 case SuspendedAndReadyToContinue: 9089 isThenableResolved(memoizedUpdaters) ? (workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, replaySuspendedUnitOfWork(lanes)) : (workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedAndReadyToContinue)); 9090 break; 9091 case SuspendedOnInstanceAndReadyToContinue: 9092 var resource = null; 9093 switch (workInProgress.tag) { 9094 case 26: resource = workInProgress.memoizedState; 9095 case 5: 9096 case 27: 9097 var hostFiber = workInProgress; 9098 if (resource ? preloadResource(resource) : hostFiber.stateNode.complete) { 9099 workInProgressSuspendedReason = NotSuspended; 9100 workInProgressThrownValue = null; 9101 var sibling = hostFiber.sibling; 9102 if (null !== sibling) workInProgress = sibling; 9103 else { 9104 var returnFiber = hostFiber.return; 9105 null !== returnFiber ? (workInProgress = returnFiber, completeUnitOfWork(returnFiber)) : workInProgress = null; 9106 } 9107 break b; 9108 } 9109 break; 9110 default: console.error("Unexpected type of fiber triggered a suspensey commit. This is a bug in React."); 9111 } 9112 workInProgressSuspendedReason = NotSuspended; 9113 workInProgressThrownValue = null; 9114 throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedOnInstanceAndReadyToContinue); 9115 break; 9116 case SuspendedOnDeprecatedThrowPromise: 9117 workInProgressSuspendedReason = NotSuspended; 9118 workInProgressThrownValue = null; 9119 throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedOnDeprecatedThrowPromise); 9120 break; 9121 case SuspendedOnHydration: 9122 resetWorkInProgressStack(); 9123 workInProgressRootExitStatus = RootSuspendedAtTheShell; 9124 break a; 9125 default: throw Error("Unexpected SuspendedReason. This is a bug in React."); 9126 } 9127 null !== ReactSharedInternals.actQueue ? workLoopSync() : workLoopConcurrentByScheduler(); 9128 break; 9129 } catch (thrownValue$10) { 9130 handleThrow(root, thrownValue$10); 9131 } 9132 while (1); 9133 resetContextDependencies(); 9134 ReactSharedInternals.H = prevDispatcher; 9135 ReactSharedInternals.A = prevAsyncDispatcher; 9136 executionContext = prevExecutionContext; 9137 if (null !== workInProgress) return RootInProgress; 9138 workInProgressRoot = null; 9139 workInProgressRootRenderLanes = 0; 9140 finishQueueingConcurrentUpdates(); 9141 return workInProgressRootExitStatus; 9142 } 9143 function workLoopConcurrentByScheduler() { 9144 for (; null !== workInProgress && !shouldYield();) performUnitOfWork(workInProgress); 9145 } 9146 function performUnitOfWork(unitOfWork) { 9147 var current = unitOfWork.alternate; 9148 (unitOfWork.mode & ProfileMode) !== NoMode ? (startProfilerTimer(unitOfWork), current = runWithFiberInDEV(unitOfWork, beginWork, current, unitOfWork, entangledRenderLanes), stopProfilerTimerIfRunningAndRecordDuration(unitOfWork)) : current = runWithFiberInDEV(unitOfWork, beginWork, current, unitOfWork, entangledRenderLanes); 9149 unitOfWork.memoizedProps = unitOfWork.pendingProps; 9150 null === current ? completeUnitOfWork(unitOfWork) : workInProgress = current; 9151 } 9152 function replaySuspendedUnitOfWork(unitOfWork) { 9153 var next = runWithFiberInDEV(unitOfWork, replayBeginWork, unitOfWork); 9154 unitOfWork.memoizedProps = unitOfWork.pendingProps; 9155 null === next ? completeUnitOfWork(unitOfWork) : workInProgress = next; 9156 } 9157 function replayBeginWork(unitOfWork) { 9158 var current = unitOfWork.alternate, isProfilingMode = (unitOfWork.mode & ProfileMode) !== NoMode; 9159 isProfilingMode && startProfilerTimer(unitOfWork); 9160 switch (unitOfWork.tag) { 9161 case 15: 9162 case 0: 9163 current = replayFunctionComponent(current, unitOfWork, unitOfWork.pendingProps, unitOfWork.type, void 0, workInProgressRootRenderLanes); 9164 break; 9165 case 11: 9166 current = replayFunctionComponent(current, unitOfWork, unitOfWork.pendingProps, unitOfWork.type.render, unitOfWork.ref, workInProgressRootRenderLanes); 9167 break; 9168 case 5: 9169 resetHooksOnUnwind(unitOfWork); 9170 var fiber = unitOfWork; 9171 fiber === hydrationParentFiber && (isHydrating ? (popToNextHostParent(fiber), 5 === fiber.tag && null != fiber.stateNode && (nextHydratableInstance = f
9171iber.stateNode)) : (popToNextHostParent(fiber), isHydrating = !0)); 9172 default: unwindInterruptedWork(current, unitOfWork), unitOfWork = workInProgress = resetWorkInProgress(unitOfWork, entangledRenderLanes), current = beginWork(current, unitOfWork, entangledRenderLanes); 9173 } 9174 isProfilingMode && stopProfilerTimerIfRunningAndRecordDuration(unitOfWork); 9175 return current; 9176 } 9177 function throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, suspendedReason) { 9178 resetContextDependencies(); 9179 resetHooksOnUnwind(unitOfWork); 9180 thenableState$1 = null; 9181 thenableIndexCounter$1 = 0; 9182 var returnFiber = unitOfWork.return; 9183 try { 9184 if (throwException(root, returnFiber, unitOfWork, thrownValue, workInProgressRootRenderLanes)) { 9185 workInProgressRootExitStatus = RootFatalErrored; 9186 logUncaughtError(root, createCapturedValueAtFiber(thrownValue, root.current)); 9187 workInProgress = null; 9188 return; 9189 } 9190 } catch (error) { 9191 if (null !== returnFiber) throw workInProgress = returnFiber, error; 9192 workInProgressRootExitStatus = RootFatalErrored; 9193 logUncaughtError(root, createCapturedValueAtFiber(thrownValue, root.current)); 9194 workInProgress = null; 9195 return; 9196 } 9197 if (unitOfWork.flags & 32768) { 9198 if (isHydrating || suspendedReason === SuspendedOnError) root = !0; 9199 else if (workInProgressRootIsPrerendering || 0 !== (workInProgressRootRenderLanes & 536870912)) root = !1; 9200 else if (workInProgressRootDidSkipSuspendedSiblings = root = !0, suspendedReason === SuspendedOnData || suspendedReason === SuspendedOnAction || suspendedReason === SuspendedOnImmediate || suspendedReason === SuspendedOnDeprecatedThrowPromise) suspendedReason = suspenseHandlerStackCursor.current, null !== suspendedReason && 13 === suspendedReason.tag && (suspendedReason.flags |= 16384); 9201 unwindUnitOfWork(unitOfWork, root); 9202 } else completeUnitOfWork(unitOfWork); 9203 } 9204 function completeUnitOfWork(unitOfWork) { 9205 var completedWork = unitOfWork; 9206 do { 9207 if (0 !== (completedWork.flags & 32768)) { 9208 unwindUnitOfWork(completedWork, workInProgressRootDidSkipSuspendedSiblings); 9209 return; 9210 } 9211 var current = completedWork.alternate; 9212 unitOfWork = completedWork.return; 9213 startProfilerTimer(completedWork); 9214 current = runWithFiberInDEV(completedWork, completeWork, current, completedWork, entangledRenderLanes); 9215 (completedWork.mode & ProfileMode) !== NoMode && stopProfilerTimerIfRunningAndRecordIncompleteDuration(completedWork); 9216 if (null !== current) { 9217 workInProgress = current; 9218 return; 9219 } 9220 completedWork = completedWork.sibling; 9221 if (null !== completedWork) { 9222 workInProgress = completedWork; 9223 return; 9224 } 9225 workInProgress = completedWork = unitOfWork; 9226 } while (null !== completedWork); 9227 workInProgressRootExitStatus === RootInProgress && (workInProgressRootExitStatus = RootCompleted); 9228 } 9229 function unwindUnitOfWork(unitOfWork, skipSiblings) { 9230 do { 9231 var next = unwindWork(unitOfWork.alternate, unitOfWork); 9232 if (null !== next) { 9233 next.flags &= 32767; 9234 workInProgress = next; 9235 return; 9236 } 9237 if ((unitOfWork.mode & ProfileMode) !== NoMode) { 9238 stopProfilerTimerIfRunningAndRecordIncompleteDuration(unitOfWork); 9239 next = unitOfWork.actualDuration; 9240 for (var child = unitOfWork.child; null !== child;) next += child.actualDuration, child = child.sibling; 9241 unitOfWork.actualDuration = next; 9242 } 9243 next = unitOfWork.return; 9244 null !== next && (next.flags |= 32768, next.subtreeFlags = 0, next.deletions = null); 9245 if (!skipSiblings && (unitOfWork = unitOfWork.sibling, null !== unitOfWork)) { 9246 workInProgress = unitOfWork; 9247 return; 9248 } 9249 workInProgress = unitOfWork = next; 9250 } while (null !== unitOfWork); 9251 workInProgressRootExitStatus = RootSuspendedAtTheShell; 9252 workInProgress = null; 9253 } 9254 function completeRoot(root, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime) { 9255 root.cancelPendingCommit = null; 9256 do 9257 flushPendingEffects(); 9258 while (pendingEffectsStatus !== NO_PENDING_EFFECTS); 9259 ReactStrictModeWarnings.flushLegacyContextWarning(); 9260 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(); 9261 if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Should not already be working."); 9262 setCurrentTrackFromLanes(lanes); 9263 if (exitStatus === RootErrored) logErroredRenderPhase(completedRenderStartTime, completedRenderEndTime, lanes, workInProgressUpdateTask); 9264 else if (null !== recoverableErrors) {
vendor: 4,112 bytes, lines 9265-9315
9265 if (didSkipSuspendedSiblings = null !== finishedWork && null !== finishedWork.alternate && finishedWork.alternate.memoizedState.isDehydrated && 0 !== (finishedWork.flags & 256), didIncludeRenderPhaseUpdate = workInProgressUpdateTask, supportsUserTiming && !(completedRenderEndTime <= completedRenderStartTime)) { 9266 exitStatus = []; 9267 for (var i = 0; i < recoverableErrors.length; i++) { 9268 var error = recoverableErrors[i].value; 9269 exitStatus.push(["Recoverable Error", "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error)]); 9270 } 9271 completedRenderStartTime = { 9272 start: completedRenderStartTime, 9273 end: completedRenderEndTime, 9274 detail: { devtools: { 9275 color: "primary-dark", 9276 track: currentTrack, 9277 trackGroup: LANES_TRACK_GROUP, 9278 tooltipText: didSkipSuspendedSiblings ? "Hydration Failed" : "Recovered after Error", 9279 properties: exitStatus 9280 } } 9281 }; 9282 didIncludeRenderPhaseUpdate ? didIncludeRenderPhaseUpdate.run(performance.measure.bind(performance, "Recovered", completedRenderStartTime)) : performance.measure("Recovered", completedRenderStartTime); 9283 performance.clearMeasures("Recovered"); 9284 } 9285 } else didIncludeRenderPhaseUpdate = workInProgressUpdateTask, !supportsUserTiming || completedRenderEndTime <= completedRenderStartTime || (didSkipSuspendedSiblings = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", exitStatus = (lanes & 536870912) === lanes ? "Prepared" : (lanes & 201326741) === lanes ? "Hydrated" : "Render", didIncludeRenderPhaseUpdate ? didIncludeRenderPhaseUpdate.run(console.timeStamp.bind(console, exitStatus, completedRenderStartTime, completedRenderEndTime, currentTrack, LANES_TRACK_GROUP, didSkipSuspendedSiblings)) : console.timeStamp(exitStatus, completedRenderStartTime, completedRenderEndTime, currentTrack, LANES_TRACK_GROUP, didSkipSuspendedSiblings)); 9286 if (null !== finishedWork) { 9287 0 === lanes && console.error("finishedLanes should not be empty during a commit. This is a bug in React."); 9288 if (finishedWork === root.current) throw Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue."); 9289 root === workInProgressRoot && (workInProgress = workInProgressRoot = null, workInProgressRootRenderLanes = 0); 9290 pendingFinishedWork = finishedWork; 9291 pendingEffectsRoot = root; 9292 pendingEffectsLanes = lanes; 9293 pendingPassiveTransitions = transitions; 9294 pendingRecoverableErrors = recoverableErrors; 9295 pendingEffectsRenderEndTime = completedRenderEndTime; 9296 pendingSuspendedCommitReason = suspendedCommitReason; 9297 pendingDelayedCommitReason = IMMEDIATE_COMMIT; 9298 pendingSuspendedViewTransitionReason = null; 9299 commitRoot(root, finishedWork, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, suspendedState, suspendedCommitReason, completedRenderEndTime); 9300 } 9301 } 9302 function commitRoot(root, finishedWork, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, suspendedState, suspendedCommitReason, completedRenderEndTime) { 9303 var remainingLanes = finishedWork.lanes | finishedWork.childLanes; 9304 pendingEffectsRemainingLanes = remainingLanes; 9305 remainingLanes |= concurrentlyUpdatedLanes; 9306 markRootFinished(root, lanes, remainingLanes, spawnedLane, updatedLanes, suspendedRetryLanes); 9307 pendingViewTransitionEvents = null; 9308 (lanes & 335544064) === lanes ? (pendingTransitionTypes = claimQueuedTransitionTypes(root), spawnedLane = 10262) : (pendingTransitionTypes = null, spawnedLane = 10256); 9309 0 !== finishedWork.actualDuration || 0 !== (finishedWork.subtreeFlags & spawnedLane) || 0 !== (finishedWork.flags & spawnedLane) ? (root.callbackNode = null, root.callbackPriority = 0, scheduleCallback$1(NormalPriority$1, function() { 9310 schedulerEvent = window.event; 9311 pendingDelayedCommitReason === IMMEDIATE_COMMIT && (pendingDelayedCommitReason = DELAYED_PASSIVE_COMMIT); 9312 flushPassiveEffects(); 9313 return null; 9314 })) : (root.callbackNode = null, root.callbackPriority = 0); 9315 commitErrors = null;
9316 commitStartTime = now(); 9317 null !== suspendedCommitReason && logSuspendedCommitPhase(completedRenderEndTime, commitStartTime, suspendedCommitReason, workInProgressUpdateTask); 9318 shouldStartViewTransition = !1; 9319 suspendedCommitReason = 0 !== (finishedWork.flags & 13878); 9320 if (0 !== (finishedWork.subtreeFlags & 13878) || suspendedCommitReason) { 9321 suspendedCommitReason = ReactSharedInternals.T; 9322 ReactSharedInternals.T = null; 9323 completedRenderEndTime = ReactDOMSharedInternals.p; 9324 ReactDOMSharedInternals.p = DiscreteEventPriority; 9325 spawnedLane = executionContext; 9326 executionContext |= CommitContext; 9327 try { 9328 commitBeforeMutationEffects(root, finishedWork, lanes); 9329 } finally { 9330 executionContext = spawnedLane, ReactDOMSharedInternals.p = completedRenderEndTime, ReactSharedInternals.T = suspendedCommitReason; 9331 } 9332 } 9333 pendingEffectsStatus = PENDING_MUTATION_PHASE; 9334 shouldStartViewTransition ? (animatingLanes |= lanes, animatingTask = null, pendingViewTransition = startViewTransition(suspendedState, root.containerInfo, pendingTransitionTypes, flushMutationEffects, flushLayoutEffects, flushAfterMutationEffects, flushSpawnedWork, flushPassiveEffects, reportViewTransitionError, suspendedViewTransition, finishedViewTransition.bind(null, lanes))) : (flushMutationEffects(), flushLayoutEffects(), flushSpawnedWork()); 9335 } 9336 function reportViewTransitionError(error) { 9337 if (pendingEffectsStatus !== NO_PENDING_EFFECTS) { 9338 var onRecoverableError = pendingEffectsRoot.onRecoverableError; 9339 onRecoverableError(error, makeErrorInfo(null)); 9340 } 9341 } 9342 function suspendedViewTransition(reason) { 9343 commitEndTime = now(); 9344 logCommitPhase(null === pendingSuspendedCommitReason ? pendingEffectsRenderEndTime : commitStartTime, commitEndTime, commitErrors, pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, workInProgressUpdateTask); 9345 pendingSuspendedCommitReason = pendingSuspendedViewTransitionReason = reason; 9346 } 9347 function finishedViewTransition(lanes) { 9348 if (0 !== (animatingLanes & lanes)) { 9349 var task = animatingTask; 9350 animatingLanes &= ~lanes; 9351 animatingTask = null; 9352 0 !== (lanes & 4194048) && 0 === (workInProgressRootRenderLanes & 4194048) && 0 === (pendingEffectsLanes & 4194048) && (setCurrentTrackFromLanes(256), logAnimatingPhase(transitionClampTime, now$1(), task)); 9353 0 !== (lanes & 62914560) && 0 === (workInProgressRootRenderLanes & 62914560) && 0 === (pendingEffectsLanes & 62914560) && (setCurrentTrackFromLanes(4194304), logAnimatingPhase(retryClampTime, now$1(), task)); 9354 0 !== (lanes & 2080374784) && 0 === (workInProgressRootRenderLanes & 2080374784) && 0 === (pendingEffectsLanes & 2080374784) && (setCurrentTrackFromLanes(268435456), logAnimatingPhase(idleClampTime, now$1(), task)); 9355 } 9356 } 9357 function flushAfterMutationEffects() { 9358 pendingEffectsStatus === PENDING_AFTER_MUTATION_PHASE && (pendingEffectsStatus = NO_PENDING_EFFECTS, commitAfterMutationEffectsOnFiber(pendingFinishedWork, pendingEffectsRoot), pendingEffectsStatus = PENDING_SPAWNED_WORK); 9359 } 9360 function flushMutationEffects() { 9361 if (pendingEffectsStatus === PENDING_MUTATION_PHASE) { 9362 pendingEffectsStatus = NO_PENDING_EFFECTS; 9363 var root = pendingEffectsRoot, finishedWork = pendingFinishedWork, lanes = pendingEffectsLanes, rootMutationHasEffect = 0 !== (finishedWork.flags & 13878); 9364 if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) { 9365 rootMutationHasEffect = ReactSharedInternals.T; 9366 ReactSharedInternals.T = null; 9367 var previousPriority = ReactDOMSharedInternals.p; 9368 ReactDOMSharedInternals.p = DiscreteEventPriority; 9369 var prevExecutionContext = executionContext; 9370 executionContext |= CommitContext; 9371 try { 9372 inProgressLanes = lanes; 9373 inProgressRoot = root; 9374 inUpdateViewTransition = rootViewTransitionAffected = !1; 9375 resetComponentEffectTimers(); 9376 commitMutationEffectsOnFiber(finishedWork, root, lanes); 9377 inProgressRoot = inProgressLanes = null; 9378 lanes = selectionInformation; 9379 var curFocusedElem = getActiveElementDeep(root.containerInfo), priorFocusedElem = lanes.focusedElem, priorSelectionRange = lanes.selectionRange; 9380 if (curFocusedElem !== priorFocusedElem && priorFocusedElem && priorFocusedElem.ownerDocument && containsNode(priorFocusedElem.ownerDocument.documentElement, priorFocusedElem)) { 9381 if (null !== priorSelectionRange && hasSelectionCapabilities(priorFocusedElem)) { 9382 var start = priorSelectionRange.start, end = priorSelectionRange.end; 9383 void 0 === end && (end = start); 9384 if ("selectionStart" in priorFocusedElem) priorFocusedElem.selectionStart = start, priorFocusedElem.selectionEnd = Math.min(end, priorFocusedElem.value.length); 9385 else { 9386 var doc = priorFocusedElem.ownerDocument || document, win = doc && doc.defaultView || window;
vendor: 5,354 bytes, lines 9387-9463
9387 if (win.getSelection) { 9388 var selection = win.getSelection(), length = priorFocusedElem.textContent.length, start$jscomp$0 = Math.min(priorSelectionRange.start, length), end$jscomp$0 = void 0 === priorSelectionRange.end ? start$jscomp$0 : Math.min(priorSelectionRange.end, length); 9389 !selection.extend && start$jscomp$0 > end$jscomp$0 && (curFocusedElem = end$jscomp$0, end$jscomp$0 = start$jscomp$0, start$jscomp$0 = curFocusedElem); 9390 var startMarker = getNodeForCharacterOffset(priorFocusedElem, start$jscomp$0), endMarker = getNodeForCharacterOffset(priorFocusedElem, end$jscomp$0); 9391 if (startMarker && endMarker && (1 !== selection.rangeCount || selection.anchorNode !== startMarker.node || selection.anchorOffset !== startMarker.offset || selection.focusNode !== endMarker.node || selection.focusOffset !== endMarker.offset)) { 9392 var range = doc.createRange(); 9393 range.setStart(startMarker.node, startMarker.offset); 9394 selection.removeAllRanges(); 9395 start$jscomp$0 > end$jscomp$0 ? (selection.addRange(range), selection.extend(endMarker.node, endMarker.offset)) : (range.setEnd(endMarker.node, endMarker.offset), selection.addRange(range)); 9396 } 9397 } 9398 } 9399 } 9400 doc = []; 9401 for (selection = priorFocusedElem; selection = selection.parentNode;) 1 === selection.nodeType && doc.push({ 9402 element: selection, 9403 left: selection.scrollLeft, 9404 top: selection.scrollTop 9405 }); 9406 "function" === typeof priorFocusedElem.focus && priorFocusedElem.focus(); 9407 for (priorFocusedElem = 0; priorFocusedElem < doc.length; priorFocusedElem++) { 9408 var info = doc[priorFocusedElem]; 9409 info.element.scrollLeft = info.left; 9410 info.element.scrollTop = info.top; 9411 } 9412 } 9413 _enabled = !!eventsEnabled; 9414 selectionInformation = eventsEnabled = null; 9415 } finally { 9416 executionContext = prevExecutionContext, ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = rootMutationHasEffect; 9417 } 9418 } 9419 root.current = finishedWork; 9420 pendingEffectsStatus = PENDING_LAYOUT_PHASE; 9421 } 9422 } 9423 function flushLayoutEffects() { 9424 if (pendingEffectsStatus === PENDING_LAYOUT_PHASE) { 9425 pendingEffectsStatus = NO_PENDING_EFFECTS; 9426 var suspendedViewTransitionReason = pendingSuspendedViewTransitionReason; 9427 if (null !== suspendedViewTransitionReason) { 9428 commitStartTime = now(); 9429 var startTime = commitEndTime, endTime = commitStartTime; 9430 !supportsUserTiming || endTime <= startTime || (animatingTask ? animatingTask.run(console.timeStamp.bind(console, suspendedViewTransitionReason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")) : console.timeStamp(suspendedViewTransitionReason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")); 9431 } 9432 suspendedViewTransitionReason = pendingEffectsRoot; 9433 startTime = pendingFinishedWork; 9434 endTime = pendingEffectsLanes; 9435 var rootHasLayoutEffect = 0 !== (startTime.flags & 8772); 9436 if (0 !== (startTime.subtreeFlags & 8772) || rootHasLayoutEffect) { 9437 rootHasLayoutEffect = ReactSharedInternals.T; 9438 ReactSharedInternals.T = null; 9439 var _previousPriority = ReactDOMSharedInternals.p; 9440 ReactDOMSharedInternals.p = DiscreteEventPriority; 9441 var _prevExecutionContext = executionContext; 9442 executionContext |= CommitContext; 9443 try { 9444 inProgressLanes = endTime, inProgressRoot = suspendedViewTransitionReason, resetComponentEffectTimers(), commitLayoutEffectOnFiber(suspendedViewTransitionReason, startTime.alternate, startTime), inProgressRoot = inProgressLanes = null; 9445 } finally { 9446 executionContext = _prevExecutionContext, ReactDOMSharedInternals.p = _previousPriority, ReactSharedInternals.T = rootHasLayoutEffect; 9447 } 9448 } 9449 suspendedViewTransitionReason = pendingEffectsRenderEndTime; 9450 startTime = pendingSuspendedCommitReason; 9451 commitEndTime = now(); 9452 logCommitPhase(null === startTime ? suspendedViewTransitionReason : commitStartTime, commitEndTime, commitErrors, pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, workInProgressUpdateTask); 9453 pendingEffectsStatus = PENDING_AFTER_MUTATION_PHASE; 9454 } 9455 } 9456 function flushSpawnedWork() { 9457 if (pendingEffectsStatus === PENDING_SPAWNED_WORK || pendingEffectsStatus === PENDING_AFTER_MUTATION_PHASE) { 9458 if (pendingEffectsStatus === PENDING_SPAWNED_WORK) { 9459 var startViewTransitionStartTime = commitEndTime; 9460 commitEndTime = now(); 9461 var endTime = commitEndTime, abortedViewTransition = pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT; 9462 !supportsUserTiming || endTime <= startViewTransitionStartTime || (animatingTask ? animatingTask.run(console.timeStamp.bind(console, abortedViewTransition ? "Interrupted View Transition" : "Starting Animation", startViewTransitionStartTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? "error" : "secondary-light")) : console.timeStamp(abortedViewTransition ? "Interrupted View Transition" : "Starting Animation", startViewTransitionStartTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? " error" : "secondary-light")); 9463 pendingDelayedCommitReason !== ABORTED_VIEW_TRANSITION_COMMIT && (pendingDelayedCommitReason = ANIMATION_
9463STARTED_COMMIT); 9464 } 9465 pendingEffectsStatus = NO_PENDING_EFFECTS; 9466 startViewTransitionStartTime = pendingViewTransition; 9467 pendingViewTransition = null; 9468 requestPaint(); 9469 endTime = pendingEffectsRoot; 9470 var finishedWork = pendingFinishedWork; 9471 abortedViewTransition = pendingEffectsLanes; 9472 var recoverableErrors = pendingRecoverableErrors, passiveSubtreeMask = (abortedViewTransition & 335544064) === abortedViewTransition ? 10262 : 10256; 9473 (passiveSubtreeMask = 0 !== finishedWork.actualDuration || 0 !== (finishedWork.subtreeFlags & passiveSubtreeMask) || 0 !== (finishedWork.flags & passiveSubtreeMask)) ? pendingEffectsStatus = PENDING_PASSIVE_PHASE : (pendingEffectsStatus = NO_PENDING_EFFECTS, pendingFinishedWork = pendingEffectsRoot = null, releaseRootPooledCache(endTime, endTime.pendingLanes), nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null); 9474 var remainingLanes = endTime.pendingLanes; 9475 0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null); 9476 passiveSubtreeMask || commitDoubleInvokeEffectsInDEV(endTime); 9477 remainingLanes = lanesToEventPriority(abortedViewTransition); 9478 finishedWork = finishedWork.stateNode; 9479 if (injectedHook && "function" === typeof injectedHook.onCommitFiberRoot) try { 9480 var didError = 128 === (finishedWork.current.flags & 128); 9481 switch (remainingLanes) { 9482 case DiscreteEventPriority: 9483 var schedulerPriority = ImmediatePriority; 9484 break; 9485 case ContinuousEventPriority: 9486 schedulerPriority = UserBlockingPriority; 9487 break; 9488 case DefaultEventPriority: 9489 schedulerPriority = NormalPriority$1; 9490 break; 9491 case IdleEventPriority: 9492 schedulerPriority = IdlePriority; 9493 break; 9494 default: schedulerPriority = NormalPriority$1; 9495 } 9496 injectedHook.onCommitFiberRoot(rendererID, finishedWork, schedulerPriority, didError); 9497 } catch (err) { 9498 hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err)); 9499 } 9500 isDevToolsPresent && endTime.memoizedUpdaters.clear(); 9501 onCommitRoot(); 9502 if (null !== recoverableErrors) { 9503 didError = ReactSharedInternals.T; 9504 schedulerPriority = ReactDOMSharedInternals.p; 9505 ReactDOMSharedInternals.p = DiscreteEventPriority; 9506 ReactSharedInternals.T = null; 9507 try { 9508 var onRecoverableError = endTime.onRecoverableError; 9509 for (finishedWork = 0; finishedWork < recoverableErrors.length; finishedWork++) { 9510 var recoverableError = recoverableErrors[finishedWork], errorInfo = makeErrorInfo(recoverableError.stack); 9511 runWithFiberInDEV(recoverableError.source, onRecoverableError, recoverableError.value, errorInfo); 9512 } 9513 } finally { 9514 ReactSharedInternals.T = didError, ReactDOMSharedInternals.p = schedulerPriority; 9515 } 9516 } 9517 onRecoverableError = pendingViewTransitionEvents; 9518 recoverableError = pendingTransitionTypes; 9519 pendingTransitionTypes = null; 9520 if (null !== onRecoverableError && (pendingViewTransitionEvents = null, null === recoverableError && (recoverableError = []), null !== startViewTransitionStartTime)) for (errorInfo = 0; errorInfo < onRecoverableError.length; errorInfo++) recoverableErrors = (0, onRecoverableError[errorInfo])(recoverableError), void 0 !== recoverableErrors && startViewTransitionStartTime.finished.finally(recoverableErrors); 9521 0 !== (pendingEffectsLanes & 3) && flushPendingEffects(); 9522 ensureRootIsScheduled(endTime); 9523 remainingLanes = endTime.pendingLanes; 9524 0 !== (abortedViewTransition & 261930) && 0 !== (remainingLanes & 42) ? (nestedUpdateScheduled = !0, endTime === rootWithNestedUpdates ? nestedUpdateCount++ : (nestedUpdateCount = 0, rootWithNestedUpdates = endTime)) : (nestedUpdateCount = 0, rootWithNestedUpdates = null); 9525 passiveSubtreeMask || finalizeRender(abortedViewTransition, commitEndTime); 9526 flushSyncWorkAcrossRoots_impl(0, !1); 9527 } 9528 } 9529 function makeErrorInfo(componentStack) { 9530 componentStack = { componentStack }; 9531 Object.defineProperty(componentStack, "digest", { get: function() { 9532 console.error("You are accessing \"digest\" from the errorInfo object passed to onRecoverableError. This property is no longer provided as part of errorInfo but can be accessed as a property of the Error instance itself."); 9533 } }); 9534 return componentStack; 9535 } 9536 function releaseRootPooledCache(root, remainingLanes) { 9537 0 === (root.pooledCacheLanes &= remainingLanes) && (remainingLanes = root.pooledCache, null != remainingLanes && (root.pooledCache = null, releaseCache(remainingLanes))); 9538 } 9539 function flushPendingEffects() { 9540 null !== pendingViewTransition && (pendingViewTransition.skipTransition(), didWarnAboutInterruptedViewTransitions || (didWarnAboutInterruptedViewTransitions = !0, console.warn("A flushSync update cancelled a View Transition because it was called while the View Transition was still preparing. To preserve the synchronous semantics, React had to skip the View Transition. If you can, try to avoid flushSync() in a scenario that's likely to interfere.")), pendingViewTransition = null, pendingDelayedCommitReason = ABORTED_VIEW_TRANSITION_COMMIT); 9541 flushMutationEffects(); 9542 flushLayoutEffects(); 9543 flushSpawnedWork(); 9544 return flushPassiveEffects(); 9545 } 9546 function flushPassiveEffects() { 9547 if (pendingEffectsStatus !== PENDING_PASSIVE_PHASE) return !1; 9548 var root = pendingEffectsRoot, remainingLanes = pendingEffectsRemainingLanes; 9549 pendingEffectsRemainingLanes = 0;
vendor: 4,403 bytes, lines 9550-9615
9550 var renderPriority = lanesToEventPriority(pendingEffectsLanes), priority = 0 === DefaultEventPriority || DefaultEventPriority > renderPriority ? DefaultEventPriority : renderPriority; 9551 renderPriority = ReactSharedInternals.T; 9552 var previousPriority = ReactDOMSharedInternals.p; 9553 try { 9554 ReactDOMSharedInternals.p = priority; 9555 ReactSharedInternals.T = null; 9556 var transitions = pendingPassiveTransitions; 9557 pendingPassiveTransitions = null; 9558 priority = pendingEffectsRoot; 9559 var lanes = pendingEffectsLanes; 9560 pendingEffectsStatus = NO_PENDING_EFFECTS; 9561 pendingFinishedWork = pendingEffectsRoot = null; 9562 pendingEffectsLanes = 0; 9563 if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Cannot flush passive effects while already rendering."); 9564 setCurrentTrackFromLanes(lanes); 9565 isFlushingPassiveEffects = !0; 9566 didScheduleUpdateDuringPassiveEffects = !1; 9567 var passiveEffectStartTime = 0; 9568 commitErrors = null; 9569 passiveEffectStartTime = now$1(); 9570 if (pendingDelayedCommitReason === ANIMATION_STARTED_COMMIT) logAnimatingPhase(commitEndTime, passiveEffectStartTime, animatingTask); 9571 else { 9572 var startTime = commitEndTime, endTime = passiveEffectStartTime, delayedUntilPaint = pendingDelayedCommitReason === DELAYED_PASSIVE_COMMIT; 9573 !supportsUserTiming || endTime <= startTime || (workInProgressUpdateTask ? workInProgressUpdateTask.run(console.timeStamp.bind(console, delayedUntilPaint ? "Waiting for Paint" : "Waiting", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")) : console.timeStamp(delayedUntilPaint ? "Waiting for Paint" : "Waiting", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")); 9574 } 9575 startTime = executionContext; 9576 executionContext |= CommitContext; 9577 var finishedWork = priority.current; 9578 resetComponentEffectTimers(); 9579 commitPassiveUnmountOnFiber(finishedWork); 9580 var finishedWork$jscomp$0 = priority.current; 9581 finishedWork = pendingEffectsRenderEndTime; 9582 resetComponentEffectTimers(); 9583 commitPassiveMountOnFiber(priority, finishedWork$jscomp$0, lanes, transitions, finishedWork); 9584 commitDoubleInvokeEffectsInDEV(priority); 9585 executionContext = startTime; 9586 var passiveEffectsEndTime = now$1(); 9587 finishedWork$jscomp$0 = passiveEffectStartTime; 9588 finishedWork = workInProgressUpdateTask; 9589 null !== commitErrors ? logCommitErrored(finishedWork$jscomp$0, passiveEffectsEndTime, commitErrors, !0, finishedWork) : !supportsUserTiming || passiveEffectsEndTime <= finishedWork$jscomp$0 || (finishedWork ? finishedWork.run(console.timeStamp.bind(console, "Remaining Effects", finishedWork$jscomp$0, passiveEffectsEndTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark")) : console.timeStamp("Remaining Effects", finishedWork$jscomp$0, passiveEffectsEndTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark")); 9590 finalizeRender(lanes, passiveEffectsEndTime); 9591 flushSyncWorkAcrossRoots_impl(0, !1); 9592 didScheduleUpdateDuringPassiveEffects ? priority === rootWithPassiveNestedUpdates ? nestedPassiveUpdateCount++ : (nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = priority) : nestedPassiveUpdateCount = 0; 9593 didScheduleUpdateDuringPassiveEffects = isFlushingPassiveEffects = !1; 9594 if (injectedHook && "function" === typeof injectedHook.onPostCommitFiberRoot) try { 9595 injectedHook.onPostCommitFiberRoot(rendererID, priority); 9596 } catch (err) { 9597 hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err)); 9598 } 9599 var stateNode = priority.current.stateNode; 9600 stateNode.effectDuration = 0; 9601 stateNode.passiveEffectDuration = 0; 9602 return !0; 9603 } finally { 9604 ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = renderPriority, releaseRootPooledCache(root, remainingLanes); 9605 } 9606 } 9607 function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) { 9608 sourceFiber = createCapturedValueAtFiber(error, sourceFiber); 9609 recordEffectError(sourceFiber); 9610 sourceFiber = createRootErrorUpdate(rootFiber.stateNode, sourceFiber, 2); 9611 rootFiber = enqueueUpdate(rootFiber, sourceFiber, 2); 9612 null !== rootFiber && (markRootUpdated$1(rootFiber, 2), ensureRootIsScheduled(rootFiber)); 9613 } 9614 function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error) { 9615 isRunningInsertionEffect = !1;
9616 if (3 === sourceFiber.tag) captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error); 9617 else { 9618 for (; null !== nearestMountedAncestor;) { 9619 if (3 === nearestMountedAncestor.tag) { 9620 captureCommitPhaseErrorOnRoot(nearestMountedAncestor, sourceFiber, error); 9621 return; 9622 } 9623 if (1 === nearestMountedAncestor.tag) { 9624 var instance = nearestMountedAncestor.stateNode; 9625 if ("function" === typeof nearestMountedAncestor.type.getDerivedStateFromError || "function" === typeof instance.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(instance))) { 9626 sourceFiber = createCapturedValueAtFiber(error, sourceFiber); 9627 recordEffectError(sourceFiber); 9628 error = createClassErrorUpdate(2); 9629 instance = enqueueUpdate(nearestMountedAncestor, error, 2); 9630 null !== instance && (initializeClassErrorUpdate(error, instance, nearestMountedAncestor, sourceFiber), markRootUpdated$1(instance, 2), ensureRootIsScheduled(instance)); 9631 return; 9632 } 9633 } 9634 nearestMountedAncestor = nearestMountedAncestor.return; 9635 } 9636 console.error("Internal React error: Attempted to capture a commit phase error inside a detached tree. This indicates a bug in React. Potential causes include deleting the same fiber more than once, committing an already-finished tree, or an inconsistent return pointer.\n\nError message:\n\n%s", error); 9637 } 9638 } 9639 function attachPingListener(root, wakeable, lanes) { 9640 var pingCache = root.pingCache; 9641 if (null === pingCache) { 9642 pingCache = root.pingCache = new PossiblyWeakMap(); 9643 var threadIDs = /* @__PURE__ */ new Set(); 9644 pingCache.set(wakeable, threadIDs); 9645 } else threadIDs = pingCache.get(wakeable), void 0 === threadIDs && (threadIDs = /* @__PURE__ */ new Set(), pingCache.set(wakeable, threadIDs)); 9646 threadIDs.has(lanes) || (workInProgressRootDidAttachPingListener = !0, threadIDs.add(lanes), pingCache = pingSuspendedRoot.bind(null, root, wakeable, lanes), isDevToolsPresent && restorePendingUpdaters(root, lanes), wakeable.then(pingCache, pingCache)); 9647 } 9648 function pingSuspendedRoot(root, wakeable, pingedLanes) { 9649 var pingCache = root.pingCache; 9650 null !== pingCache && pingCache.delete(wakeable); 9651 root.pingedLanes |= root.suspendedLanes & pingedLanes; 9652 root.warmLanes &= ~pingedLanes; 9653 0 !== (pingedLanes & 127) ? 0 > blockingUpdateTime && (blockingClampTime = blockingUpdateTime = now(), blockingUpdateTask = createTask("Promise Resolved"), blockingUpdateType = PINGED_UPDATE) : 0 !== (pingedLanes & 4194048) && 0 > transitionUpdateTime && (transitionClampTime = transitionUpdateTime = now(), transitionUpdateTask = createTask("Promise Resolved"), transitionUpdateType = PINGED_UPDATE); 9654 isConcurrentActEnvironment() && null === ReactSharedInternals.actQueue && console.error("A suspended resource finished loading inside a test, but the event was not wrapped in act(...).\n\nWhen testing, code that resolves suspended data should be wrapped into act(...):\n\nact(() => {\n /* finish loading suspended data */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act"); 9655 workInProgressRoot === root && (workInProgressRootRenderLanes & pingedLanes) === pingedLanes && (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes && now$1() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS ? (executionContext & RenderContext) === NoContext ? prepareFreshStack(root, 0) : workInProgressRootPingedLanes |= pingedLanes : workInProgressRootPingedLanes |= pingedLanes, workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes && (workInProgressSuspendedRetryLanes = 0)); 9656 ensureRootIsScheduled(root); 9657 } 9658 function retryTimedOutBoundary(boundaryFiber, retryLane) { 9659 0 === retryLane && (retryLane = claimNextRetryLane()); 9660 boundaryFiber = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
vendor: 4,351 bytes, lines 9661-9735
9661 null !== boundaryFiber && (markRootUpdated$1(boundaryFiber, retryLane), ensureRootIsScheduled(boundaryFiber)); 9662 } 9663 function retryDehydratedSuspenseBoundary(boundaryFiber) { 9664 var suspenseState = boundaryFiber.memoizedState, retryLane = 0; 9665 null !== suspenseState && (retryLane = suspenseState.retryLane); 9666 retryTimedOutBoundary(boundaryFiber, retryLane); 9667 } 9668 function resolveRetryWakeable(boundaryFiber, wakeable) { 9669 var retryLane = 0; 9670 switch (boundaryFiber.tag) { 9671 case 31: 9672 case 13: 9673 var retryCache = boundaryFiber.stateNode; 9674 var suspenseState = boundaryFiber.memoizedState; 9675 null !== suspenseState && (retryLane = suspenseState.retryLane); 9676 break; 9677 case 19: 9678 retryCache = boundaryFiber.stateNode; 9679 break; 9680 case 22: 9681 retryCache = boundaryFiber.stateNode._retryCache; 9682 break; 9683 default: throw Error("Pinged unknown suspense boundary type. This is probably a bug in React."); 9684 } 9685 null !== retryCache && retryCache.delete(wakeable); 9686 retryTimedOutBoundary(boundaryFiber, retryLane); 9687 } 9688 function recursivelyTraverseAndDoubleInvokeEffectsInDEV(root$jscomp$0, parentFiber, isInStrictMode) { 9689 if (0 !== (parentFiber.subtreeFlags & 134225920)) for (parentFiber = parentFiber.child; null !== parentFiber;) { 9690 var root = root$jscomp$0, fiber = parentFiber, isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE; 9691 isStrictModeFiber = isInStrictMode || isStrictModeFiber; 9692 22 !== fiber.tag ? fiber.flags & 134217728 ? isStrictModeFiber && runWithFiberInDEV(fiber, doubleInvokeEffectsOnFiber, root, fiber) : recursivelyTraverseAndDoubleInvokeEffectsInDEV(root, fiber, isStrictModeFiber) : null === fiber.memoizedState && (isStrictModeFiber && fiber.flags & 134225920 ? runWithFiberInDEV(fiber, doubleInvokeEffectsOnFiber, root, fiber) : fiber.subtreeFlags & 134217728 && runWithFiberInDEV(fiber, recursivelyTraverseAndDoubleInvokeEffectsInDEV, root, fiber, isStrictModeFiber)); 9693 parentFiber = parentFiber.sibling; 9694 } 9695 } 9696 function doubleInvokeEffectsOnFiber(root, fiber) { 9697 setIsStrictModeForDevtools(!0); 9698 try { 9699 disappearLayoutEffects(fiber, NoLayoutEffectTraversalFlags), disconnectPassiveEffect(fiber), reappearLayoutEffects(root, fiber.alternate, fiber, NoLayoutEffectTraversalFlags), reconnectPassiveEffects(root, fiber, 0, null, !1, 0); 9700 } finally { 9701 setIsStrictModeForDevtools(!1); 9702 } 9703 } 9704 function commitDoubleInvokeEffectsInDEV(root) { 9705 var doubleInvokeEffects = !0; 9706 root.current.mode & (StrictLegacyMode | StrictEffectsMode) || (doubleInvokeEffects = !1); 9707 recursivelyTraverseAndDoubleInvokeEffectsInDEV(root, root.current, doubleInvokeEffects); 9708 } 9709 function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) { 9710 if ((executionContext & RenderContext) === NoContext) { 9711 var tag = fiber.tag; 9712 if (3 === tag || 1 === tag || 0 === tag || 11 === tag || 14 === tag || 15 === tag) { 9713 tag = getComponentNameFromFiber(fiber) || "ReactComponent"; 9714 if (null !== didWarnStateUpdateForNotYetMountedComponent) { 9715 if (didWarnStateUpdateForNotYetMountedComponent.has(tag)) return; 9716 didWarnStateUpdateForNotYetMountedComponent.add(tag); 9717 } else didWarnStateUpdateForNotYetMountedComponent = /* @__PURE__ */ new Set([tag]); 9718 runWithFiberInDEV(fiber, function() { 9719 console.error("Can't perform a React state update on a component that hasn't mounted yet. This indicates that you have a side-effect in your render function that asynchronously tries to update the component. Move this work to useEffect instead."); 9720 }); 9721 } 9722 } 9723 } 9724 function restorePendingUpdaters(root, lanes) { 9725 isDevToolsPresent && root.memoizedUpdaters.forEach(function(schedulingFiber) { 9726 addFiberToLanesMap(root, schedulingFiber, lanes); 9727 }); 9728 } 9729 function scheduleCallback$1(priorityLevel, callback) { 9730 var actQueue = ReactSharedInternals.actQueue; 9731 return null !== actQueue ? (actQueue.push(callback), fakeActCallbackNode$1) : scheduleCallback$3(priorityLevel, callback); 9732 } 9733 function warnIfUpdatesNotWrappedWithActDEV(fiber) { 9734 isConcurrentActEnvironment() && null === ReactSharedInternals.actQueue && runWithFiberInDEV(fiber, function() { 9735 console.error("An update to %s inside a test was not wrapped in act(...).\n\nWhen testing, code that causes React state updates should be wrapped into act(...):\n\nact(() =>
vendor: 4,281 bytes, lines 9735-9795
9735 {\n /* fire events that update state */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act", getComponentNameFromFiber(fiber)); 9736 }); 9737 } 9738 function ensureRootIsScheduled(root) { 9739 root !== lastScheduledRoot && null === root.next && (null === lastScheduledRoot ? firstScheduledRoot = lastScheduledRoot = root : lastScheduledRoot = lastScheduledRoot.next = root); 9740 mightHavePendingSyncWork = !0; 9741 null !== ReactSharedInternals.actQueue ? didScheduleMicrotask_act || (didScheduleMicrotask_act = !0, scheduleImmediateRootScheduleTask()) : didScheduleMicrotask || (didScheduleMicrotask = !0, scheduleImmediateRootScheduleTask()); 9742 } 9743 function flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) { 9744 if (!isFlushingWork && mightHavePendingSyncWork) { 9745 isFlushingWork = !0; 9746 do { 9747 var didPerformSomeWork = !1; 9748 for (var root = firstScheduledRoot; null !== root;) { 9749 if (!onlyLegacy) if (0 !== syncTransitionLanes) { 9750 var pendingLanes = root.pendingLanes; 9751 if (0 === pendingLanes) var nextLanes = 0; 9752 else { 9753 var suspendedLanes = root.suspendedLanes, pingedLanes = root.pingedLanes; 9754 nextLanes = (1 << 31 - clz32(42 | syncTransitionLanes) + 1) - 1; 9755 nextLanes &= pendingLanes & ~(suspendedLanes & ~pingedLanes); 9756 nextLanes = nextLanes & 201326741 ? nextLanes & 201326741 | 1 : nextLanes ? nextLanes | 2 : 0; 9757 } 9758 0 !== nextLanes && (didPerformSomeWork = !0, performSyncWorkOnRoot(root, nextLanes)); 9759 } else nextLanes = workInProgressRootRenderLanes, nextLanes = getNextLanes(root, root === workInProgressRoot ? nextLanes : 0, null !== root.cancelPendingCommit || root.timeoutHandle !== noTimeout), 0 === (nextLanes & 3) || checkIfRootIsPrerendering(root, nextLanes) || (didPerformSomeWork = !0, performSyncWorkOnRoot(root, nextLanes)); 9760 root = root.next; 9761 } 9762 } while (didPerformSomeWork); 9763 isFlushingWork = !1; 9764 } 9765 } 9766 function processRootScheduleInImmediateTask() { 9767 schedulerEvent = window.event; 9768 processRootScheduleInMicrotask(); 9769 } 9770 function processRootScheduleInMicrotask() { 9771 mightHavePendingSyncWork = didScheduleMicrotask_act = didScheduleMicrotask = !1; 9772 var syncTransitionLanes = 0; 9773 0 !== currentEventTransitionLane && shouldAttemptEagerTransition() && (syncTransitionLanes = currentEventTransitionLane); 9774 for (var currentTime = now$1(), prev = null, root = firstScheduledRoot; null !== root;) { 9775 var next = root.next, nextLanes = scheduleTaskForRootDuringMicrotask(root, currentTime); 9776 if (0 === nextLanes) root.next = null, null === prev ? firstScheduledRoot = next : prev.next = next, null === next && (lastScheduledRoot = prev); 9777 else if (prev = root, 0 !== syncTransitionLanes || 0 !== (nextLanes & 3)) mightHavePendingSyncWork = !0; 9778 root = next; 9779 } 9780 pendingEffectsStatus !== NO_PENDING_EFFECTS && pendingEffectsStatus !== PENDING_PASSIVE_PHASE || flushSyncWorkAcrossRoots_impl(syncTransitionLanes, !1); 9781 0 !== currentEventTransitionLane && (currentEventTransitionLane = 0); 9782 } 9783 function scheduleTaskForRootDuringMicrotask(root, currentTime) { 9784 for (var suspendedLanes = root.suspendedLanes, pingedLanes = root.pingedLanes, expirationTimes = root.expirationTimes, lanes = root.pendingLanes & -62914561; 0 < lanes;) { 9785 var index = 31 - clz32(lanes), lane = 1 << index, expirationTime = expirationTimes[index]; 9786 if (-1 === expirationTime) { 9787 if (0 === (lane & suspendedLanes) || 0 !== (lane & pingedLanes)) expirationTimes[index] = computeExpirationTime(lane, currentTime); 9788 } else expirationTime <= currentTime && (root.expiredLanes |= lane); 9789 lanes &= ~lane; 9790 } 9791 currentTime = workInProgressRoot; 9792 suspendedLanes = workInProgressRootRenderLanes; 9793 suspendedLanes = getNextLanes(root, root === currentTime ? suspendedLanes : 0, null !== root.cancelPendingCommit || root.timeoutHandle !== noTimeout); 9794 pingedLanes = root.callbackNode; 9795 if (0 === suspendedLanes || root === currentTime && (workInProgressSuspendedReason === SuspendedOnData || workInProgressSuspendedReason === SuspendedOnAction) || null !== root.cancelPendingCommit) return null !== pingedLanes && c
vendor: 5,893 bytes, lines 9795-9911
9795ancelCallback(pingedLanes), root.callbackNode = null, root.callbackPriority = 0; 9796 if (0 === (suspendedLanes & 3) || checkIfRootIsPrerendering(root, suspendedLanes)) { 9797 currentTime = suspendedLanes & -suspendedLanes; 9798 if (currentTime !== root.callbackPriority || null !== ReactSharedInternals.actQueue && pingedLanes !== fakeActCallbackNode) cancelCallback(pingedLanes); 9799 else return currentTime; 9800 switch (lanesToEventPriority(suspendedLanes)) { 9801 case DiscreteEventPriority: 9802 case ContinuousEventPriority: 9803 suspendedLanes = UserBlockingPriority; 9804 break; 9805 case DefaultEventPriority: 9806 suspendedLanes = NormalPriority$1; 9807 break; 9808 case IdleEventPriority: 9809 suspendedLanes = IdlePriority; 9810 break; 9811 default: suspendedLanes = NormalPriority$1; 9812 } 9813 pingedLanes = performWorkOnRootViaSchedulerTask.bind(null, root); 9814 null !== ReactSharedInternals.actQueue ? (ReactSharedInternals.actQueue.push(pingedLanes), suspendedLanes = fakeActCallbackNode) : suspendedLanes = scheduleCallback$3(suspendedLanes, pingedLanes); 9815 root.callbackPriority = currentTime; 9816 root.callbackNode = suspendedLanes; 9817 return currentTime; 9818 } 9819 null !== pingedLanes && cancelCallback(pingedLanes); 9820 root.callbackPriority = 2; 9821 root.callbackNode = null; 9822 return 2; 9823 } 9824 function performWorkOnRootViaSchedulerTask(root, didTimeout) { 9825 nestedUpdateScheduled = currentUpdateIsNested = !1; 9826 schedulerEvent = window.event; 9827 if (pendingEffectsStatus !== NO_PENDING_EFFECTS && pendingEffectsStatus !== PENDING_PASSIVE_PHASE) return root.callbackNode = null, root.callbackPriority = 0, null; 9828 var originalCallbackNode = root.callbackNode; 9829 pendingDelayedCommitReason === IMMEDIATE_COMMIT && (pendingDelayedCommitReason = DELAYED_PASSIVE_COMMIT); 9830 if (flushPendingEffects() && root.callbackNode !== originalCallbackNode) return null; 9831 var workInProgressRootRenderLanes$jscomp$0 = workInProgressRootRenderLanes; 9832 workInProgressRootRenderLanes$jscomp$0 = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes$jscomp$0 : 0, null !== root.cancelPendingCommit || root.timeoutHandle !== noTimeout); 9833 if (0 === workInProgressRootRenderLanes$jscomp$0) return null; 9834 performWorkOnRoot(root, workInProgressRootRenderLanes$jscomp$0, didTimeout); 9835 scheduleTaskForRootDuringMicrotask(root, now$1()); 9836 return null != root.callbackNode && root.callbackNode === originalCallbackNode ? performWorkOnRootViaSchedulerTask.bind(null, root) : null; 9837 } 9838 function performSyncWorkOnRoot(root, lanes) { 9839 if (flushPendingEffects()) return null; 9840 currentUpdateIsNested = nestedUpdateScheduled; 9841 nestedUpdateScheduled = !1; 9842 performWorkOnRoot(root, lanes, !0); 9843 } 9844 function cancelCallback(callbackNode) { 9845 callbackNode !== fakeActCallbackNode && null !== callbackNode && cancelCallback$1(callbackNode); 9846 } 9847 function scheduleImmediateRootScheduleTask() { 9848 null !== ReactSharedInternals.actQueue && ReactSharedInternals.actQueue.push(function() { 9849 processRootScheduleInMicrotask(); 9850 return null; 9851 }); 9852 scheduleMicrotask(function() { 9853 (executionContext & (RenderContext | CommitContext)) !== NoContext ? scheduleCallback$3(ImmediatePriority, processRootScheduleInImmediateTask) : processRootScheduleInMicrotask(); 9854 }); 9855 } 9856 function requestTransitionLane() { 9857 if (0 === currentEventTransitionLane) { 9858 var actionScopeLane = currentEntangledLane; 9859 0 === actionScopeLane && (actionScopeLane = nextTransitionUpdateLane, nextTransitionUpdateLane <<= 1, 0 === (nextTransitionUpdateLane & 261888) && (nextTransitionUpdateLane = 256)); 9860 currentEventTransitionLane = actionScopeLane; 9861 } 9862 return currentEventTransitionLane; 9863 } 9864 function coerceFormActionProp(actionProp) { 9865 if (null == actionProp || "symbol" === typeof actionProp || "boolean" === typeof actionProp) return null; 9866 if ("function" === typeof actionProp) return actionProp; 9867 checkAttributeStringCoercion(actionProp, "action"); 9868 return sanitizeURL(actionProp); 9869 } 9870 function extractEvents$1(dispatchQueue, domEventName, maybeTargetInst, nativeEvent, nativeEventTarget) { 9871 if ("submit" === domEventName && maybeTargetInst && maybeTargetInst.stateNode === nativeEventTarget) { 9872 var action = coerceFormActionProp((nativeEventTarget[internalPropsKey] || null).action), submitter = nativeEvent.submitter; 9873 submitter && (domEventName = (domEventName = submitter[internalPropsKey] || null) ? coerceFormActionProp(domEventName.formAction) : submitter.getAttribute("formAction"), null !== domEventName && (action = domEventName, submitter = null)); 9874 var event = new SyntheticEvent("action", "action", null, nativeEvent, nativeEventTarget); 9875 dispatchQueue.push({ 9876 event, 9877 listeners: [{ 9878 instance: null, 9879 listener: function() { 9880 if (nativeEvent.defaultPrevented) { 9881 if (0 !== currentEventTransitionLane) { 9882 var formData = new FormData(nativeEventTarget, submitter), pendingState = { 9883 pending: !0, 9884 data: formData, 9885 method: nativeEventTarget.method, 9886 action 9887 }; 9888 Object.freeze(pendingState); 9889 startHostTransition(maybeTargetInst, pendingState, null, formData); 9890 } 9891 } else "function" === typeof action && (event.preventDefault(), formData = new FormData(nativeEventTarget, submitter), pendingState = { 9892 pending: !0, 9893 data: formData, 9894 method: nativeEventTarget.method, 9895 action 9896 }, Object.freeze(pendingState), startHostTransition(maybeTargetInst, pendingState, action, formData)); 9897 }, 9898 currentTarget: nativeEventTarget 9899 }] 9900 }); 9901 } 9902 } 9903 function executeDispatch(event, listener, currentTarget) { 9904 event.currentTarget = currentTarget; 9905 try { 9906 listener(event); 9907 } catch (error) { 9908 reportGlobalError(error); 9909 } 9910 event.currentTarget = null; 9911 }
vendor: 16,729 bytes, lines 9912-10200
9912 function processDispatchQueue(dispatchQueue, eventSystemFlags) { 9913 eventSystemFlags = 0 !== (eventSystemFlags & 4); 9914 for (var i = 0; i < dispatchQueue.length; i++) { 9915 var _dispatchQueue$i = dispatchQueue[i]; 9916 a: { 9917 var previousInstance = void 0, event = _dispatchQueue$i.event; 9918 _dispatchQueue$i = _dispatchQueue$i.listeners; 9919 if (eventSystemFlags) for (var i$jscomp$0 = _dispatchQueue$i.length - 1; 0 <= i$jscomp$0; i$jscomp$0--) { 9920 var _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0], instance = _dispatchListeners$i.instance, currentTarget = _dispatchListeners$i.currentTarget; 9921 _dispatchListeners$i = _dispatchListeners$i.listener; 9922 if (instance !== previousInstance && event.isPropagationStopped()) break a; 9923 null !== instance ? runWithFiberInDEV(instance, executeDispatch, event, _dispatchListeners$i, currentTarget) : executeDispatch(event, _dispatchListeners$i, currentTarget); 9924 previousInstance = instance; 9925 } 9926 else for (i$jscomp$0 = 0; i$jscomp$0 < _dispatchQueue$i.length; i$jscomp$0++) { 9927 _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0]; 9928 instance = _dispatchListeners$i.instance; 9929 currentTarget = _dispatchListeners$i.currentTarget; 9930 _dispatchListeners$i = _dispatchListeners$i.listener; 9931 if (instance !== previousInstance && event.isPropagationStopped()) break a; 9932 null !== instance ? runWithFiberInDEV(instance, executeDispatch, event, _dispatchListeners$i, currentTarget) : executeDispatch(event, _dispatchListeners$i, currentTarget); 9933 previousInstance = instance; 9934 } 9935 } 9936 } 9937 } 9938 function listenToNonDelegatedEvent(domEventName, targetElement) { 9939 nonDelegatedEvents.has(domEventName) || console.error("Did not expect a listenToNonDelegatedEvent() call for \"%s\". This is a bug in React. Please file an issue.", domEventName); 9940 var listenerSet = targetElement[internalEventHandlersKey]; 9941 void 0 === listenerSet && (listenerSet = targetElement[internalEventHandlersKey] = /* @__PURE__ */ new Set()); 9942 var listenerSetKey = domEventName + "__bubble"; 9943 listenerSet.has(listenerSetKey) || (addTrappedEventListener(targetElement, domEventName, 2, !1), listenerSet.add(listenerSetKey)); 9944 } 9945 function listenToNativeEvent(domEventName, isCapturePhaseListener, target) { 9946 nonDelegatedEvents.has(domEventName) && !isCapturePhaseListener && console.error("Did not expect a listenToNativeEvent() call for \"%s\" in the bubble phase. This is a bug in React. Please file an issue.", domEventName); 9947 var eventSystemFlags = 0; 9948 isCapturePhaseListener && (eventSystemFlags |= 4); 9949 addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener); 9950 } 9951 function listenToAllSupportedEvents(rootContainerElement) { 9952 if (!rootContainerElement[listeningMarker]) { 9953 rootContainerElement[listeningMarker] = !0; 9954 allNativeEvents.forEach(function(domEventName) { 9955 "selectionchange" !== domEventName && (nonDelegatedEvents.has(domEventName) || listenToNativeEvent(domEventName, !1, rootContainerElement), listenToNativeEvent(domEventName, !0, rootContainerElement)); 9956 }); 9957 var ownerDocument = 9 === rootContainerElement.nodeType ? rootContainerElement : rootContainerElement.ownerDocument; 9958 null === ownerDocument || ownerDocument[listeningMarker] || (ownerDocument[listeningMarker] = !0, listenToNativeEvent("selectionchange", !1, ownerDocument)); 9959 } 9960 } 9961 function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener) { 9962 switch (getEventPriority(domEventName)) { 9963 case DiscreteEventPriority: 9964 var listenerWrapper = dispatchDiscreteEvent; 9965 break; 9966 case ContinuousEventPriority: 9967 listenerWrapper = dispatchContinuousEvent; 9968 break; 9969 default: listenerWrapper = dispatchEvent; 9970 } 9971 eventSystemFlags = listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer); 9972 listenerWrapper = void 0; 9973 !passiveBrowserEventsSupported || "touchstart" !== domEventName && "touchmove" !== domEventName && "wheel" !== domEventName || (listenerWrapper = !0); 9974 isCapturePhaseListener ? void 0 !== listenerWrapper ? targetContainer.addEventListener(domEventName, eventSystemFlags, { 9975 capture: !0, 9976 passive: listenerWrapper 9977 }) : targetContainer.addEventListener(domEventName, eventSystemFlags, !0) : void 0 !== listenerWrapper ? targetContainer.addEventListener(domEventName, eventSystemFlags, { passive: listenerWrapper }) : targetContainer.addEventListener(domEventName, eventSystemFlags, !1); 9978 } 9979 function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst$jscomp$0, targetContainer) { 9980 var ancestorInst = targetInst$jscomp$0; 9981 if (0 === (eventSystemFlags & 1) && 0 === (eventSystemFlags & 2) && null !== targetInst$jscomp$0) a: for (;;) { 9982 if (null === targetInst$jscomp$0) return; 9983 var nodeTag = targetInst$jscomp$0.tag; 9984 if (3 === nodeTag || 4 === nodeTag) { 9985 var container = targetInst$jscomp$0.stateNode.containerInfo; 9986 if (container === targetContainer) break; 9987 if (4 === nodeTag) for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag;) { 9988 var grandTag = nodeTag.tag; 9989 if ((3 === grandTag || 4 === grandTag) && nodeTag.stateNode.containerInfo === targetContainer) return; 9990 nodeTag = nodeTag.return; 9991 } 9992 for (; null !== container;) { 9993 nodeTag = getClosestInstanceFromNode(container); 9994 if (null === nodeTag) return; 9995 grandTag = nodeTag.tag; 9996 if (5 === grandTag || 6 === grandTag || 26 === grandTag || 27 === grandTag) { 9997 targetInst$jscomp$0 = ancestorInst = nodeTag; 9998 continue a; 9999 } 10000 container = container.parentNode; 10001 } 10002 } 10003 targetInst$jscomp$0 = targetInst$jscomp$0.return; 10004 } 10005 batchedUpdates$1(function() { 10006 var targetInst = ancestorInst, nativeEventTarget = getEventTarget(nativeEvent), dispatchQueue = []; 10007 a: { 10008 var reactName = topLevelEventsToReactNames.get(domEventName); 10009 if (void 0 !== reactName) { 10010 var SyntheticEventCtor = SyntheticEvent, reactEventType = domEventName; 10011 switch (domEventName) { 10012 case "keypress": if (0 === getEventCharCode(nativeEvent)) break a; 10013 case "keydown": 10014 case "keyup": 10015 SyntheticEventCtor = SyntheticKeyboardEvent; 10016 break; 10017 case "focusin": 10018 reactEventType = "focus"; 10019 SyntheticEventCtor = SyntheticFocusEvent; 10020 break; 10021 case "focusout": 10022 reactEventType = "blur"; 10023 SyntheticEventCtor = SyntheticFocusEvent; 10024 break; 10025 case "beforeblur": 10026 case "afterblur": 10027 SyntheticEventCtor = SyntheticFocusEvent; 10028 break; 10029 case "click": if (2 === nativeEvent.button) break a; 10030 case "auxclick": 10031 case "dblclick": 10032 case "mousedown": 10033 case "mousemove": 10034 case "mouseup": 10035 case "mouseout": 10036 case "mouseover": 10037 case "contextmenu": 10038 SyntheticEventCtor = SyntheticMouseEvent; 10039 break; 10040 case "drag": 10041 case "dragend": 10042 case "dragenter": 10043 case "dragexit": 10044 case "dragleave": 10045 case "dragover": 10046 case "dragstart": 10047 case "drop": 10048 SyntheticEventCtor = SyntheticDragEvent; 10049 break; 10050 case "touchcancel": 10051 case "touchend": 10052 case "touchmove": 10053 case "touchstart": 10054 SyntheticEventCtor = SyntheticTouchEvent; 10055 break; 10056 case ANIMATION_END: 10057 case ANIMATION_ITERATION: 10058 case ANIMATION_START: 10059 SyntheticEventCtor = SyntheticAnimationEvent; 10060 break; 10061 case TRANSITION_END: 10062 SyntheticEventCtor = SyntheticTransitionEvent; 10063 break; 10064 case "scroll": 10065 case "scrollend": 10066 SyntheticEventCtor = SyntheticUIEvent; 10067 break; 10068 case "wheel": 10069 SyntheticEventCtor = SyntheticWheelEvent; 10070 break; 10071 case "copy": 10072 case "cut": 10073 case "paste": 10074 SyntheticEventCtor = SyntheticClipboardEvent; 10075 break; 10076 case "gotpointercapture": 10077 case "lostpointercapture": 10078 case "pointercancel": 10079 case "pointerdown": 10080 case "pointermove": 10081 case "pointerout": 10082 case "pointerover": 10083 case "pointerup": 10084 SyntheticEventCtor = SyntheticPointerEvent; 10085 break; 10086 case "submit": 10087 SyntheticEventCtor = SyntheticSubmitEvent; 10088 break; 10089 case "toggle": 10090 case "beforetoggle": SyntheticEventCtor = SyntheticToggleEvent; 10091 } 10092 var inCapturePhase = 0 !== (eventSystemFlags & 4), accumulateTargetOnly = !inCapturePhase && ("scroll" === domEventName || "scrollend" === domEventName), reactEventName = inCapturePhase ? null !== reactName ? reactName + "Capture" : null : reactName; 10093 inCapturePhase = []; 10094 for (var instance = targetInst, lastHostComponent; null !== instance;) { 10095 var _instance2 = instance; 10096 lastHostComponent = _instance2.stateNode; 10097 _instance2 = _instance2.tag; 10098 5 !== _instance2 && 26 !== _instance2 && 27 !== _instance2 || null === lastHostComponent || null === reactEventName || (_instance2 = getListener(instance, reactEventName), null != _instance2 && inCapturePhase.push(createDispatchListener(instance, _instance2, lastHostComponent))); 10099 if (accumulateTargetOnly) break; 10100 instance = instance.return; 10101 } 10102 0 < inCapturePhase.length && (reactName = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget), dispatchQueue.push({ 10103 event: reactName, 10104 listeners: inCapturePhase 10105 })); 10106 } 10107 } 10108 if (0 === (eventSystemFlags & 7)) { 10109 a: { 10110 SyntheticEventCtor = "mouseover" === domEventName || "pointerover" === domEventName; 10111 reactName = "mouseout" === domEventName || "pointerout" === domEventName; 10112 if (SyntheticEventCtor && nativeEvent !== currentReplayingEvent && (reactEventType = nativeEvent.relatedTarget || nativeEvent.fromElement) && (getClosestInstanceFromNode(reactEventType) || reactEventType[internalContainerInstanceKey])) break a; 10113 if (reactName || SyntheticEventCtor) { 10114 reactEventType = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget : (SyntheticEventCtor = nativeEventTarget.ownerDocument) ? SyntheticEventCtor.defaultView || SyntheticEventCtor.parentWindow : window; 10115 if (reactName) { 10116 if (SyntheticEventCtor = nativeEvent.relatedTarget || nativeEvent.toElement, reactName = targetInst, SyntheticEventCtor = SyntheticEventCtor ? getClosestInstanceFromNode(SyntheticEventCtor) : null, null !== SyntheticEventCtor && (accumulateTargetOnly = getNearestMountedFiber(SyntheticEventCtor), inCapturePhase = SyntheticEventCtor.tag, SyntheticEventCtor !== accumulateTargetOnly || 5 !== inCapturePhase && 27 !== inCapturePhase && 6 !== inCapturePhase)) SyntheticEventCtor = null; 10117 } else reactName = null, SyntheticEventCtor = targetInst; 10118 if (reactName !== SyntheticEventCtor) { 10119 inCapturePhase = SyntheticMouseEvent; 10120 _instance2 = "onMouseLeave"; 10121 reactEventName = "onMouseEnter"; 10122 instance = "mouse"; 10123 if ("pointerout" === domEventName || "pointerover" === domEventName) inCapturePhase = SyntheticPointerEvent, _instance2 = "onPointerLeave", reactEventName = "onPointerEnter", instance = "pointer"; 10124 accumulateTargetOnly = null == reactName ? reactEventType : getNodeFromInstance(reactName); 10125 lastHostComponent = null == SyntheticEventCtor ? reactEventType : getNodeFromInstance(SyntheticEventCtor); 10126 reactEventType = new inCapturePhase(_instance2, instance + "leave", reactName, nativeEvent, nativeEventTarget); 10127 reactEventType.target = accumulateTargetOnly; 10128 reactEventType.relatedTarget = lastHostComponent; 10129 _instance2 = null; 10130 getClosestInstanceFromNode(nativeEventTarget) === targetInst && (inCapturePhase = new inCapturePhase(reactEventName, instance + "enter", SyntheticEventCtor, nativeEvent, nativeEventTarget), inCapturePhase.target = lastHostComponent, inCapturePhase.relatedTarget = accumulateTargetOnly, _instance2 = inCapturePhase); 10131 accumulateTargetOnly = _instance2; 10132 inCapturePhase = reactName && SyntheticEventCtor ? getLowestCommonAncestor(reactName, SyntheticEventCtor, getParent) : null; 10133 null !== reactName && accumulateEnterLeaveListenersForEvent(dispatchQueue, reactEventType, reactName, inCapturePhase, !1); 10134 null !== SyntheticEventCtor && null !== accumulateTargetOnly && accumulateEnterLeaveListenersForEvent(dispatchQueue, accumulateTargetOnly, SyntheticEventCtor, inCapturePhase, !0); 10135 } 10136 } 10137 } 10138 a: { 10139 reactName = targetInst ? getNodeFromInstance(targetInst) : window; 10140 SyntheticEventCtor = reactName.nodeName && reactName.nodeName.toLowerCase(); 10141 if ("select" === SyntheticEventCtor || "input" === SyntheticEventCtor && "file" === reactName.type) var getTargetInstFunc = getTargetInstForChangeEvent; 10142 else if (isTextInputElement(reactName)) if (isInputEventSupported) getTargetInstFunc = getTargetInstForInputOrChangeEvent; 10143 else { 10144 getTargetInstFunc = getTargetInstForInputEventPolyfill; 10145 var handleEventFunc = handleEventsForInputEventPolyfill; 10146 } 10147 else SyntheticEventCtor = reactName.nodeName, !SyntheticEventCtor || "input" !== SyntheticEventCtor.toLowerCase() || "checkbox" !== reactName.type && "radio" !== reactName.type ? targetInst && isCustomElement(targetInst.elementType) && (getTargetInstFunc = getTargetInstForChangeEvent) : getTargetInstFunc = getTargetInstForClickEvent; 10148 if (getTargetInstFunc && (getTargetInstFunc = getTargetInstFunc(domEventName, targetInst))) { 10149 createAndAccumulateChangeEvent(dispatchQueue, getTargetInstFunc, nativeEvent, nativeEventTarget); 10150 break a; 10151 } 10152 handleEventFunc && handleEventFunc(domEventName, reactName, targetInst); 10153 } 10154 handleEventFunc = targetInst ? getNodeFromInstance(targetInst) : window; 10155 switch (domEventName) { 10156 case "focusin": 10157 if (isTextInputElement(handleEventFunc) || "true" === handleEventFunc.contentEditable) activeElement = handleEventFunc, activeElementInst = targetInst, lastSelection = null; 10158 break; 10159 case "focusout": 10160 lastSelection = activeElementInst = activeElement = null; 10161 break; 10162 case "mousedown": 10163 mouseDown = !0; 10164 break; 10165 case "contextmenu": 10166 case "mouseup": 10167 case "dragend": 10168 mouseDown = !1; 10169 constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); 10170 break; 10171 case "selectionchange": if (skipSelectionChangeEvent) break; 10172 case "keydown": 10173 case "keyup": constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); 10174 } 10175 var fallbackData; 10176 if (canUseCompositionEvent) b: { 10177 switch (domEventName) { 10178 case "compositionstart": 10179 var eventType = "onCompositionStart"; 10180 break b; 10181 case "compositionend": 10182 eventType = "onCompositionEnd"; 10183 break b; 10184 case "compositionupdate": 10185 eventType = "onCompositionUpdate"; 10186 break b; 10187 } 10188 eventType = void 0; 10189 } 10190 else isComposing ? isFallbackCompositionEnd(domEventName, nativeEvent) && (eventType = "onCompositionEnd") : "keydown" === domEventName && nativeEvent.keyCode === START_KEYCODE && (eventType = "onCompositionStart"); 10191 eventType && (useFallbackCompositionData && "ko" !== nativeEvent.locale && (isComposing || "onCompositionStart" !== eventType ? "onCompositionEnd" === eventType && isComposing && (fallbackData = getData()) : (root = nativeEventTarget, startText = "value" in root ? root.value : root.textContent, isComposing = !0)), handleEventFunc = accumulateTwoPhaseListeners(targetInst, eventType), 0 < handleEventFunc.length && (eventType = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget), dispatchQueue.push({ 10192 event: eventType, 10193 listeners: handleEventFunc 10194 }), fallbackData ? eventType.data = fallbackData : (fallbackData = getDataFromCustomEvent(nativeEvent), null !== fallbackData && (eventType.data = fallbackData)))); 10195 if (fallbackData = canUseTextInputEvent ? getNativeBeforeInputChars(domEventName, nativeEvent) : getFallbackBeforeInputChars(domEventName, nativeEvent)) eventType = accumulateTwoPhaseListeners(targetInst, "onBeforeInput"), 0 < eventType.length && (handleEventFunc = new SyntheticInputEvent("onBeforeInput", "beforeinput", null, nativeEvent, nativeEventTarget), dispatchQueue.push({ 10196 event: handleEventFunc, 10197 listeners: eventType 10198 }), handleEventFunc.data = fallbackData); 10199 extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); 10200 }
10201 processDispatchQueue(dispatchQueue, eventSystemFlags); 10202 }); 10203 } 10204 function createDispatchListener(instance, listener, currentTarget) { 10205 return { 10206 instance, 10207 listener, 10208 currentTarget 10209 }; 10210 } 10211 function accumulateTwoPhaseListeners(targetFiber, reactName) { 10212 for (var captureName = reactName + "Capture", listeners = []; null !== targetFiber;) { 10213 var _instance3 = targetFiber, stateNode = _instance3.stateNode; 10214 _instance3 = _instance3.tag; 10215 5 !== _instance3 && 26 !== _instance3 && 27 !== _instance3 || null === stateNode || (_instance3 = getListener(targetFiber, captureName), null != _instance3 && listeners.unshift(createDispatchListener(targetFiber, _instance3, stateNode)), _instance3 = getListener(targetFiber, reactName), null != _instance3 && listeners.push(createDispatchListener(targetFiber, _instance3, stateNode))); 10216 if (3 === targetFiber.tag) return listeners; 10217 targetFiber = targetFiber.return; 10218 } 10219 return []; 10220 } 10221 function getParent(inst) { 10222 if (null === inst) return null; 10223 do 10224 inst = inst.return; 10225 while (inst && 5 !== inst.tag && 27 !== inst.tag); 10226 return inst ? inst : null; 10227 } 10228 function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) { 10229 for (var registrationName = event._reactName, listeners = []; null !== target && target !== common;) { 10230 var _instance4 = target, alternate = _instance4.alternate, stateNode = _instance4.stateNode; 10231 _instance4 = _instance4.tag; 10232 if (null !== alternate && alternate === common) break; 10233 5 !== _instance4 && 26 !== _instance4 && 27 !== _instance4 || null === stateNode || (alternate = stateNode, inCapturePhase ? (stateNode = getListener(target, registrationName), null != stateNode && listeners.unshift(createDispatchListener(target, stateNode, alternate))) : inCapturePhase || (stateNode = getListener(target, registrationName), null != stateNode && listeners.push(createDispatchListener(target, stateNode, alternate)))); 10234 target = target.return; 10235 } 10236 0 !== listeners.length && dispatchQueue.push({ 10237 event, 10238 listeners 10239 }); 10240 } 10241 function validatePropertiesInDevelopment(type, props) { 10242 validateProperties$2(type, props); 10243 "input" !== type && "textarea" !== type && "select" !== type || null == props || null !== props.value || didWarnValueNull || (didWarnValueNull = !0, "select" === type && props.multiple ? console.error("`value` prop on `%s` should not be null. Consider using an empty array when `multiple` is set to `true` to clear the component or `undefined` for uncontrolled components.", type) : console.error("`value` prop on `%s` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components.", type)); 10244 var eventRegistry = { 10245 registrationNameDependencies, 10246 possibleRegistrationNames 10247 }; 10248 isCustomElement(type) || "string" === typeof props.is || warnUnknownProperties(type, props, eventRegistry); 10249 props.contentEditable && !props.suppressContentEditableWarning && null != props.children && console.error("A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional."); 10250 } 10251 function warnForPropDifference(propName, serverValue, clientValue, serverDifferences) { 10252 serverValue !== clientValue && (clientValue = normalizeMarkupForTextOrAttribute(clientValue), normalizeMarkupForTextOrAttribute(serverValue) !== clientValue && (serverDifferences[propName] = serverValue)); 10253 } 10254 function hasViewTransition(htmlElement) { 10255 return !!(htmlElement.getAttribute("vt-share") || htmlElement.getAttribute("vt-exit") || htmlElement.getAttribute("vt-enter") || htmlElement.getAttribute("vt-update")); 10256 } 10257 function isExpectedViewTransitionName(htmlElement) { 10258 if (!hasViewTransition(htmlElement)) return !1; 10259 var expectedVtName = htmlElement.getAttribute("vt-name"); 10260 htmlElement = htmlElement.style["view-transition-name"]; 10261 return expectedVtName ? expectedVtName === htmlElement : htmlElement.startsWith("_T_"); 10262 } 10263 function warnForExtraAttributes(domElement, attributeNames, serverDifferences) {
vendor: 11,643 bytes, lines 10264-10428
10264 attributeNames.forEach(function(attributeName) { 10265 "style" === attributeName ? "" !== domElement.getAttribute(attributeName) && (attributeName = domElement.style, (1 === attributeName.length && "view-transition-name" === attributeName[0] || 2 === attributeName.length && "view-transition-class" === attributeName[0] && "view-transition-name" === attributeName[1]) && isExpectedViewTransitionName(domElement) || (serverDifferences.style = getStylesObjectFromElement(domElement))) : serverDifferences[getPropNameFromAttributeName(attributeName)] = domElement.getAttribute(attributeName); 10266 }); 10267 } 10268 function warnForInvalidEventListener(registrationName, listener) { 10269 !1 === listener ? console.error("Expected `%s` listener to be a function, instead got `false`.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.", registrationName, registrationName, registrationName) : console.error("Expected `%s` listener to be a function, instead got a value of `%s` type.", registrationName, typeof listener); 10270 } 10271 function normalizeHTML(parent, html) { 10272 parent = parent.namespaceURI === MATH_NAMESPACE || parent.namespaceURI === SVG_NAMESPACE ? parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName) : parent.ownerDocument.createElement(parent.tagName); 10273 parent.innerHTML = html; 10274 return parent.innerHTML; 10275 } 10276 function normalizeMarkupForTextOrAttribute(markup) { 10277 willCoercionThrow(markup) && (console.error("The provided HTML markup uses a value of unsupported type %s. This value must be coerced to a string before using it here.", typeName(markup)), testStringCoercion(markup)); 10278 return ("string" === typeof markup ? markup : "" + markup).replace(NORMALIZE_NEWLINES_REGEX, "\n").replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, ""); 10279 } 10280 function checkForUnmatchedText(serverText, clientText) { 10281 clientText = normalizeMarkupForTextOrAttribute(clientText); 10282 return normalizeMarkupForTextOrAttribute(serverText) === clientText ? !0 : !1; 10283 } 10284 function setProp(domElement, tag, key, value, props, prevValue) { 10285 switch (key) { 10286 case "children": 10287 if ("string" === typeof value) validateTextNesting(value, tag, !1), "body" === tag || "textarea" === tag && "" === value || setTextContent(domElement, value); 10288 else if ("number" === typeof value || "bigint" === typeof value) validateTextNesting("" + value, tag, !1), "body" !== tag && setTextContent(domElement, "" + value); 10289 else return; 10290 break; 10291 case "className": 10292 setValueForKnownAttribute(domElement, "class", value); 10293 break; 10294 case "tabIndex": 10295 setValueForKnownAttribute(domElement, "tabindex", value); 10296 break; 10297 case "dir": 10298 case "role": 10299 case "viewBox": 10300 case "width": 10301 case "height": 10302 setValueForKnownAttribute(domElement, key, value); 10303 break; 10304 case "style": 10305 setValueForStyles(domElement, value, prevValue); 10306 return; 10307 case "data": if ("object" !== tag) { 10308 setValueForKnownAttribute(domElement, "data", value); 10309 break; 10310 } 10311 case "src": 10312 case "href": 10313 if ("" === value && ("a" !== tag || "href" !== key)) { 10314 "src" === key ? console.error("An empty string (\"\") was passed to the %s attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", key, key) : console.error("An empty string (\"\") was passed to the %s attribute. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", key, key); 10315 domElement.removeAttribute(key); 10316 break; 10317 } 10318 if (null == value || "function" === typeof value || "symbol" === typeof value || "boolean" === typeof value) { 10319 domElement.removeAttribute(key); 10320 break; 10321 } 10322 checkAttributeStringCoercion(value, key); 10323 value = sanitizeURL(value); 10324 domElement.setAttribute(key, value); 10325 break; 10326 case "action": 10327 case "formAction": 10328 null != value && ("form" === tag ? "formAction" === key ? console.error("You can only pass the formAction prop to <input> or <button>. Use the action prop on <form>.") : "function" === typeof value && (null == props.encType && null == props.method || didWarnFormActionMethod || (didWarnFormActionMethod = !0, console.error("Cannot specify a encType or method for a form that specifies a function as the action. React provides those automatically. They will get overridden.")), null == props.target || didWarnFormActionTarget || (didWarnFormActionTarget = !0, console.error("Cannot specify a target for a form that specifies a function as the action. The function will always be executed in the same window."))) : "input" === tag || "button" === tag ? "action" === key ? console.error("You can only pass the action prop to <form>. Use the formAction prop on <input> or <button>.") : "input" !== tag || "submit" === props.type || "image" === props.type || didWarnFormActionType ? "button" !== tag || null == props.type || "submit" === props.type || didWarnFormActionType ? "function" === typeof value && (null == props.name || didWarnFormActionName || (didWarnFormActionName = !0, console.error("Cannot specify a \"name\" prop for a button that specifies a function as a formAction. React needs it to encode which action should be invoked. It will get overridden.")), null == props.formEncType && null == props.formMethod || didWarnFormActionMethod || (didWarnFormActionMethod = !0, console.error("Cannot specify a formEncType or formMethod for a button that specifies a function as a formAction. React provides those automatically. They will get overridden.")), null == props.formTarget || didWarnFormActionTarget || (didWarnFormActionTarget = !0, console.error("Cannot specify a formTarget for a button that specifies a function as a formAction. The function will always be executed in the same window."))) : (didWarnFormActionType = !0, console.error("A button can only specify a formAction along with type=\"submit\" or no type.")) : (didWarnFormActionType = !0, console.error("An input can only specify a formAction along with type=\"submit\" or type=\"image\".")) : "action" === key ? console.error("You can only pass the action prop to <form>.") : console.error("You can only pass the formAction prop to <input> or <button>.")); 10329 if ("function" === typeof value) { 10330 domElement.setAttribute(key, "javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')"); 10331 break; 10332 } else "function" === typeof prevValue && ("formAction" === key ? ("input" !== tag && setProp(domElement, tag, "name", props.name, props, null), setProp(domElement, tag, "formEncType", props.formEncType, props, null), setProp(domElement, tag, "formMethod", props.formMethod, props, null), setProp(domElement, tag, "formTarget", props.formTarget, props, null)) : (setProp(domElement, tag, "encType", props.encType, props, null), setProp(domElement, tag, "method", props.method, props, null), setProp(domElement, tag, "target", props.target, props, null))); 10333 if (null == value || "symbol" === typeof value || "boolean" === typeof value) { 10334 domElement.removeAttribute(key); 10335 break; 10336 } 10337 checkAttributeStringCoercion(value, key); 10338 value = sanitizeURL(value); 10339 domElement.setAttribute(key, value); 10340 break; 10341 case "onClick": 10342 null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), domElement.onclick = noop$1); 10343 return; 10344 case "onScroll": 10345 null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scroll", domElement)); 10346 return; 10347 case "onScrollEnd": 10348 null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scrollend", domElement)); 10349 return; 10350 case "dangerouslySetInnerHTML": 10351 if (null != value) { 10352 if ("object" !== typeof value || !("__html" in value)) throw Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://react.dev/link/dangerously-set-inner-html for more information."); 10353 key = value.__html; 10354 if (null != key) { 10355 if (null != props.children) throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`."); 10356 (null != prevValue ? prevValue.__html : void 0) !== key && (domElement.innerHTML = key); 10357 } 10358 } 10359 break; 10360 case "multiple": 10361 domElement.multiple = value && "function" !== typeof value && "symbol" !== typeof value; 10362 break; 10363 case "muted": 10364 domElement.muted = value && "function" !== typeof value && "symbol" !== typeof value; 10365 break; 10366 case "suppressContentEditableWarning": 10367 case "suppressHydrationWarning": 10368 case "defaultValue": 10369 case "defaultChecked": 10370 case "innerHTML": 10371 case "ref": break; 10372 case "autoFocus": break; 10373 case "xlinkHref": 10374 if (null == value || "function" === typeof value || "boolean" === typeof value || "symbol" === typeof value) { 10375 domElement.removeAttribute("xlink:href"); 10376 break; 10377 } 10378 checkAttributeStringCoercion(value, key); 10379 key = sanitizeURL(value); 10380 domElement.setAttributeNS(xlinkNamespace, "xlink:href", key); 10381 break; 10382 case "contentEditable": 10383 case "spellCheck": 10384 case "draggable": 10385 case "value": 10386 case "autoReverse": 10387 case "externalResourcesRequired": 10388 case "focusable": 10389 case "preserveAlpha": 10390 null != value && "function" !== typeof value && "symbol" !== typeof value ? (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)) : domElement.removeAttribute(key); 10391 break; 10392 case "inert": "" !== value || didWarnForNewBooleanPropsWithEmptyValue[key] || (didWarnForNewBooleanPropsWithEmptyValue[key] = !0, console.error("Received an empty string for a boolean attribute `%s`. This will treat the attribute as if it were false. Either pass `false` to silence this warning, or pass `true` if you used an empty string in earlier versions of React to indicate this attribute is true.", key)); 10393 case "allowFullScreen": 10394 case "async": 10395 case "autoPlay": 10396 case "controls": 10397 case "credentialless": 10398 case "default": 10399 case "defer": 10400 case "disabled": 10401 case "disablePictureInPicture": 10402 case "disableRemotePlayback": 10403 case "formNoValidate": 10404 case "hidden": 10405 case "loop": 10406 case "noModule": 10407 case "noValidate": 10408 case "open": 10409 case "playsInline": 10410 case "readOnly": 10411 case "required": 10412 case "reversed": 10413 case "scoped": 10414 case "seamless": 10415 case "itemScope": 10416 value && "function" !== typeof value && "symbol" !== typeof value ? domElement.setAttribute(key, "") : domElement.removeAttribute(key); 10417 break; 10418 case "capture": 10419 case "download": 10420 !0 === value ? domElement.setAttribute(key, "") : !1 !== value && null != value && "function" !== typeof value && "symbol" !== typeof value ? (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)) : domElement.removeAttribute(key); 10421 break; 10422 case "cols": 10423 case "rows": 10424 case "size": 10425 case "span": 10426 null != value && "function" !== typeof value && "symbol" !== typeof value && !isNaN(value) && 1 <= value ? (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)) : domElement.removeAttribute(key); 10427 break; 10428 case "rowSpan":
10429 case "start": 10430 null == value || "function" === typeof value || "symbol" === typeof value || isNaN(value) ? domElement.removeAttribute(key) : (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)); 10431 break; 10432 case "popover": 10433 listenToNonDelegatedEvent("beforetoggle", domElement); 10434 listenToNonDelegatedEvent("toggle", domElement); 10435 setValueForAttribute(domElement, "popover", value); 10436 break; 10437 case "xlinkActuate": 10438 setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:actuate", value); 10439 break; 10440 case "xlinkArcrole": 10441 setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:arcrole", value); 10442 break; 10443 case "xlinkRole": 10444 setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:role", value); 10445 break; 10446 case "xlinkShow": 10447 setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:show", value); 10448 break; 10449 case "xlinkTitle": 10450 setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:title", value); 10451 break; 10452 case "xlinkType": 10453 setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:type", value); 10454 break; 10455 case "xmlBase": 10456 setValueForNamespacedAttribute(domElement, xmlNamespace, "xml:base", value); 10457 break; 10458 case "xmlLang": 10459 setValueForNamespacedAttribute(domElement, xmlNamespace, "xml:lang", value); 10460 break; 10461 case "xmlSpace": 10462 setValueForNamespacedAttribute(domElement, xmlNamespace, "xml:space", value); 10463 break; 10464 case "is": 10465 null != prevValue && console.error("Cannot update the \"is\" prop after it has been initialized."); 10466 setValueForAttribute(domElement, "is", value); 10467 break; 10468 case "innerText": 10469 case "textContent": return; 10470 case "popoverTarget": didWarnPopoverTargetObject || null == value || "object" !== typeof value || (didWarnPopoverTargetObject = !0, console.error("The `popoverTarget` prop expects the ID of an Element as a string. Received %s instead.", value)); 10471 default: if (!(2 < key.length) || "o" !== key[0] && "O" !== key[0] || "n" !== key[1] && "N" !== key[1]) key = getAttributeAlias(key), setValueForAttribute(domElement, key, value); 10472 else { 10473 registrationNameDependencies.hasOwnProperty(key) && null != value && "function" !== typeof value && warnForInvalidEventListener(key, value); 10474 return; 10475 } 10476 } 10477 viewTransitionMutationContext = !0; 10478 } 10479 function setPropOnCustomElement(domElement, tag, key, value, props, prevValue) { 10480 switch (key) { 10481 case "style": 10482 setValueForStyles(domElement, value, prevValue); 10483 return; 10484 case "dangerouslySetInnerHTML": 10485 if (null != value) { 10486 if ("object" !== typeof value || !("__html" in value)) throw Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://react.dev/link/dangerously-set-inner-html for more information."); 10487 key = value.__html; 10488 if (null != key) { 10489 if (null != props.children) throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`."); 10490 (null != prevValue ? prevValue.__html : void 0) !== key && (domElement.innerHTML = key); 10491 } 10492 } 10493 break; 10494 case "children": 10495 if ("string" === typeof value) setTextContent(domElement, value); 10496 else if ("number" === typeof value || "bigint" === typeof value) setTextContent(domElement, "" + value); 10497 else return; 10498 break; 10499 case "onScroll": 10500 null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scroll", domElement)); 10501 return; 10502 case "onScrollEnd": 10503 null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scrollend", domElement)); 10504 return; 10505 case "onClick": 10506 null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), domElement.onclick = noop$1); 10507 return; 10508 case "suppressContentEditableWarning": 10509 case "suppressHydrationWarning": 10510 case "innerHTML": 10511 case "ref": return; 10512 case "innerText": 10513 case "textContent": return; 10514 default: 10515 if (registrationNameDependencies.hasOwnProperty(key)) null != value && "function" !== typeof value && warnForInvalidEventListener(key, value); 10516 else a: { 10517 if ("o" === key[0] && "n" === key[1] && (props = key.endsWith("Capture"), prevValue = key.slice(2, props ? key.length - 7 : void 0), tag = domElement[internalPropsKey] || null, tag = null != tag ? tag[key] : null, "function" === typeof tag && domElement.removeEventListener(prevValue, tag, props), "function" === typeof value)) { 10518 "function" !== typeof tag && null !== tag && (key in domElement ? domElement[key] = null : domElement.hasAttribute(key) && domElement.removeAttribute(key)); 10519 domElement.addEventListener(prevValue, value, props); 10520 break a; 10521 } 10522 viewTransitionMutationContext = !0; 10523 key in domElement ? domElement[key] = value : !0 === value ? domElement.setAttribute(key, "") : setValueForAttribute(domElement, key, value); 10524 } 10525 return; 10526 } 10527 viewTransitionMutationContext = !0; 10528 } 10529 function setInitialProperties(domElement, tag, props) { 10530 validatePropertiesInDevelopment(tag, props); 10531 switch (tag) { 10532 case "div": 10533 case "span":
vendor: 4,769 bytes, lines 10534-10657
10534 case "svg": 10535 case "path": 10536 case "a": 10537 case "g": 10538 case "p": 10539 case "li": break; 10540 case "img": 10541 listenToNonDelegatedEvent("error", domElement); 10542 listenToNonDelegatedEvent("load", domElement); 10543 var hasSrc = !1, hasSrcSet = !1, propKey; 10544 for (propKey in props) if (props.hasOwnProperty(propKey)) { 10545 var propValue = props[propKey]; 10546 if (null != propValue) switch (propKey) { 10547 case "src": 10548 hasSrc = !0; 10549 break; 10550 case "srcSet": 10551 hasSrcSet = !0; 10552 break; 10553 case "children": 10554 case "dangerouslySetInnerHTML": throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`."); 10555 default: setProp(domElement, tag, propKey, propValue, props, null); 10556 } 10557 } 10558 hasSrcSet && setProp(domElement, tag, "srcSet", props.srcSet, props, null); 10559 hasSrc && setProp(domElement, tag, "src", props.src, props, null); 10560 return; 10561 case "input": 10562 checkControlledValueProps("input", props); 10563 listenToNonDelegatedEvent("invalid", domElement); 10564 var defaultValue = propKey = propValue = hasSrcSet = null, checked = null, defaultChecked = null; 10565 for (hasSrc in props) if (props.hasOwnProperty(hasSrc)) { 10566 var _propValue = props[hasSrc]; 10567 if (null != _propValue) switch (hasSrc) { 10568 case "name": 10569 hasSrcSet = _propValue; 10570 break; 10571 case "type": 10572 propValue = _propValue; 10573 break; 10574 case "checked": 10575 checked = _propValue; 10576 break; 10577 case "defaultChecked": 10578 defaultChecked = _propValue; 10579 break; 10580 case "value": 10581 propKey = _propValue; 10582 break; 10583 case "defaultValue": 10584 defaultValue = _propValue; 10585 break; 10586 case "children": 10587 case "dangerouslySetInnerHTML": 10588 if (null != _propValue) throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`."); 10589 break; 10590 default: setProp(domElement, tag, hasSrc, _propValue, props, null); 10591 } 10592 } 10593 validateInputProps(domElement, props); 10594 initInput(domElement, propKey, defaultValue, checked, defaultChecked, propValue, hasSrcSet, !1); 10595 return; 10596 case "select": 10597 checkControlledValueProps("select", props); 10598 listenToNonDelegatedEvent("invalid", domElement); 10599 hasSrc = propValue = propKey = null; 10600 for (hasSrcSet in props) if (props.hasOwnProperty(hasSrcSet) && (defaultValue = props[hasSrcSet], null != defaultValue)) switch (hasSrcSet) { 10601 case "value": 10602 propKey = defaultValue; 10603 break; 10604 case "defaultValue": 10605 propValue = defaultValue; 10606 break; 10607 case "multiple": hasSrc = defaultValue; 10608 default: setProp(domElement, tag, hasSrcSet, defaultValue, props, null); 10609 } 10610 validateSelectProps(domElement, props); 10611 tag = propKey; 10612 props = propValue; 10613 domElement.multiple = !!hasSrc; 10614 null != tag ? updateOptions(domElement, !!hasSrc, tag, !1) : null != props && updateOptions(domElement, !!hasSrc, props, !0); 10615 return; 10616 case "textarea": 10617 checkControlledValueProps("textarea", props); 10618 listenToNonDelegatedEvent("invalid", domElement); 10619 propKey = hasSrcSet = hasSrc = null; 10620 for (propValue in props) if (props.hasOwnProperty(propValue) && (defaultValue = props[propValue], null != defaultValue)) switch (propValue) { 10621 case "value": 10622 hasSrc = defaultValue; 10623 break; 10624 case "defaultValue": 10625 hasSrcSet = defaultValue; 10626 break; 10627 case "children": 10628 propKey = defaultValue; 10629 break; 10630 case "dangerouslySetInnerHTML": 10631 if (null != defaultValue) throw Error("`dangerouslySetInnerHTML` does not make sense on <textarea>."); 10632 break; 10633 default: setProp(domElement, tag, propValue, defaultValue, props, null); 10634 } 10635 validateTextareaProps(domElement, props); 10636 initTextarea(domElement, hasSrc, hasSrcSet, propKey); 10637 return; 10638 case "option": 10639 validateOptionProps(domElement, props); 10640 for (checked in props) if (props.hasOwnProperty(checked) && (hasSrc = props[checked], null != hasSrc)) switch (checked) { 10641 case "selected": 10642 domElement.selected = hasSrc && "function" !== typeof hasSrc && "symbol" !== typeof hasSrc; 10643 break; 10644 default: setProp(domElement, tag, checked, hasSrc, props, null); 10645 } 10646 return; 10647 case "dialog": 10648 listenToNonDelegatedEvent("beforetoggle", domElement); 10649 listenToNonDelegatedEvent("toggle", domElement); 10650 listenToNonDelegatedEvent("cancel", domElement); 10651 listenToNonDelegatedEvent("close", domElement); 10652 break; 10653 case "iframe": 10654 case "object": 10655 listenToNonDelegatedEvent("load", domElement); 10656 break; 10657 case "video":
vendor: 7,246 bytes, lines 10658-10795
10658 case "audio": 10659 for (hasSrc = 0; hasSrc < mediaEventTypes.length; hasSrc++) listenToNonDelegatedEvent(mediaEventTypes[hasSrc], domElement); 10660 break; 10661 case "image": 10662 listenToNonDelegatedEvent("error", domElement); 10663 listenToNonDelegatedEvent("load", domElement); 10664 break; 10665 case "details": 10666 listenToNonDelegatedEvent("toggle", domElement); 10667 break; 10668 case "embed": 10669 case "source": 10670 case "link": listenToNonDelegatedEvent("error", domElement), listenToNonDelegatedEvent("load", domElement); 10671 case "area": 10672 case "base": 10673 case "br": 10674 case "col": 10675 case "hr": 10676 case "keygen": 10677 case "meta": 10678 case "param": 10679 case "track": 10680 case "wbr": 10681 case "menuitem": 10682 for (defaultChecked in props) if (props.hasOwnProperty(defaultChecked) && (hasSrc = props[defaultChecked], null != hasSrc)) switch (defaultChecked) { 10683 case "children": 10684 case "dangerouslySetInnerHTML": throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`."); 10685 default: setProp(domElement, tag, defaultChecked, hasSrc, props, null); 10686 } 10687 return; 10688 default: if (isCustomElement(tag)) { 10689 for (_propValue in props) props.hasOwnProperty(_propValue) && (hasSrc = props[_propValue], void 0 !== hasSrc && setPropOnCustomElement(domElement, tag, _propValue, hasSrc, props, void 0)); 10690 return; 10691 } 10692 } 10693 for (defaultValue in props) props.hasOwnProperty(defaultValue) && (hasSrc = props[defaultValue], null != hasSrc && setProp(domElement, tag, defaultValue, hasSrc, props, null)); 10694 } 10695 function updateProperties(domElement, tag, lastProps, nextProps) { 10696 validatePropertiesInDevelopment(tag, nextProps); 10697 switch (tag) { 10698 case "div": 10699 case "span": 10700 case "svg": 10701 case "path": 10702 case "a": 10703 case "g": 10704 case "p": 10705 case "li": break; 10706 case "input": 10707 var name = null, type = null, value = null, defaultValue = null, lastDefaultValue = null, checked = null, defaultChecked = null; 10708 for (propKey in lastProps) { 10709 var lastProp = lastProps[propKey]; 10710 if (lastProps.hasOwnProperty(propKey) && null != lastProp) switch (propKey) { 10711 case "checked": break; 10712 case "value": break; 10713 case "defaultValue": lastDefaultValue = lastProp; 10714 default: nextProps.hasOwnProperty(propKey) || setProp(domElement, tag, propKey, null, nextProps, lastProp); 10715 } 10716 } 10717 for (var _propKey8 in nextProps) { 10718 var propKey = nextProps[_propKey8]; 10719 lastProp = lastProps[_propKey8]; 10720 if (nextProps.hasOwnProperty(_propKey8) && (null != propKey || null != lastProp)) switch (_propKey8) { 10721 case "type": 10722 propKey !== lastProp && (viewTransitionMutationContext = !0); 10723 type = propKey; 10724 break; 10725 case "name": 10726 propKey !== lastProp && (viewTransitionMutationContext = !0); 10727 name = propKey; 10728 break; 10729 case "checked": 10730 propKey !== lastProp && (viewTransitionMutationContext = !0); 10731 checked = propKey; 10732 break; 10733 case "defaultChecked": 10734 propKey !== lastProp && (viewTransitionMutationContext = !0); 10735 defaultChecked = propKey; 10736 break; 10737 case "value": 10738 propKey !== lastProp && (viewTransitionMutationContext = !0); 10739 value = propKey; 10740 break; 10741 case "defaultValue": 10742 propKey !== lastProp && (viewTransitionMutationContext = !0); 10743 defaultValue = propKey; 10744 break; 10745 case "children": 10746 case "dangerouslySetInnerHTML": 10747 if (null != propKey) throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`."); 10748 break; 10749 default: propKey !== lastProp && setProp(domElement, tag, _propKey8, propKey, nextProps, lastProp); 10750 } 10751 } 10752 tag = "checkbox" === lastProps.type || "radio" === lastProps.type ? null != lastProps.checked : null != lastProps.value; 10753 nextProps = "checkbox" === nextProps.type || "radio" === nextProps.type ? null != nextProps.checked : null != nextProps.value; 10754 tag || !nextProps || didWarnUncontrolledToControlled || (console.error("A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://react.dev/link/controlled-components"), didWarnUncontrolledToControlled = !0); 10755 !tag || nextProps || didWarnControlledToUncontrolled || (console.error("A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://react.dev/link/controlled-components"), didWarnControlledToUncontrolled = !0); 10756 updateInput(domElement, value, defaultValue, lastDefaultValue, checked, defaultChecked, type, name); 10757 return; 10758 case "select": 10759 propKey = value = defaultValue = _propKey8 = null; 10760 for (type in lastProps) if (lastDefaultValue = lastProps[type], lastProps.hasOwnProperty(type) && null != lastDefaultValue) switch (type) { 10761 case "value": break; 10762 case "multiple": propKey = lastDefaultValue; 10763 default: nextProps.hasOwnProperty(type) || setProp(domElement, tag, type, null, nextProps, lastDefaultValue); 10764 } 10765 for (name in nextProps) if (type = nextProps[name], lastDefaultValue = lastProps[name], nextProps.hasOwnProperty(name) && (null != type || null != lastDefaultValue)) switch (name) { 10766 case "value": 10767 type !== lastDefaultValue && (viewTransitionMutationContext = !0); 10768 _propKey8 = type; 10769 break; 10770 case "defaultValue": 10771 type !== lastDefaultValue && (viewTransitionMutationContext = !0); 10772 defaultValue = type; 10773 break; 10774 case "multiple": type !== lastDefaultValue && (viewTransitionMutationContext = !0), value = type; 10775 default: type !== lastDefaultValue && setProp(domElement, tag, name, type, nextProps, lastDefaultValue); 10776 } 10777 nextProps = defaultValue; 10778 tag = value; 10779 lastProps = propKey; 10780 null != _propKey8 ? updateOptions(domElement, !!tag, _propKey8, !1) : !!lastProps !== !!tag && (null != nextProps ? updateOptions(domElement, !!tag, nextProps, !0) : updateOptions(domElement, !!tag, tag ? [] : "", !1)); 10781 return; 10782 case "textarea": 10783 propKey = _propKey8 = null; 10784 for (defaultValue in lastProps) if (name = lastProps[defaultValue], lastProps.hasOwnProperty(defaultValue) && null != name && !nextProps.hasOwnProperty(defaultValue)) switch (defaultValue) { 10785 case "value": break; 10786 case "children": break; 10787 default: setProp(domElement, tag, defaultValue, null, nextProps, name); 10788 } 10789 for (value in nextProps) if (name = nextProps[value], type = lastProps[value], nextProps.hasOwnProperty(value) && (null != name || null != type)) switch (value) { 10790 case "value": 10791 name !== type && (viewTransitionMutationContext = !0); 10792 _propKey8 = name; 10793 break; 10794 case "defaultValue": 10795 name !== type && (viewTransitionMutationContext = !0);
10796 propKey = name; 10797 break; 10798 case "children": break; 10799 case "dangerouslySetInnerHTML": 10800 if (null != name) throw Error("`dangerouslySetInnerHTML` does not make sense on <textarea>."); 10801 break; 10802 default: name !== type && setProp(domElement, tag, value, name, nextProps, type); 10803 } 10804 updateTextarea(domElement, _propKey8, propKey); 10805 return; 10806 case "option": 10807 for (var _propKey13 in lastProps) if (_propKey8 = lastProps[_propKey13], lastProps.hasOwnProperty(_propKey13) && null != _propKey8 && !nextProps.hasOwnProperty(_propKey13)) switch (_propKey13) { 10808 case "selected": 10809 domElement.selected = !1; 10810 break; 10811 default: setProp(domElement, tag, _propKey13, null, nextProps, _propKey8); 10812 } 10813 for (lastDefaultValue in nextProps) if (_propKey8 = nextProps[lastDefaultValue], propKey = lastProps[lastDefaultValue], nextProps.hasOwnProperty(lastDefaultValue) && _propKey8 !== propKey && (null != _propKey8 || null != propKey)) switch (lastDefaultValue) { 10814 case "selected": 10815 _propKey8 !== propKey && (viewTransitionMutationContext = !0); 10816 domElement.selected = _propKey8 && "function" !== typeof _propKey8 && "symbol" !== typeof _propKey8; 10817 break; 10818 default: setProp(domElement, tag, lastDefaultValue, _propKey8, nextProps, propKey); 10819 } 10820 return; 10821 case "img": 10822 case "link": 10823 case "area": 10824 case "base": 10825 case "br": 10826 case "col": 10827 case "embed": 10828 case "hr": 10829 case "keygen": 10830 case "meta": 10831 case "param": 10832 case "source": 10833 case "track": 10834 case "wbr": 10835 case "menuitem": 10836 for (var _propKey15 in lastProps) _propKey8 = lastProps[_propKey15], lastProps.hasOwnProperty(_propKey15) && null != _propKey8 && !nextProps.hasOwnProperty(_propKey15) && setProp(domElement, tag, _propKey15, null, nextProps, _propKey8); 10837 for (checked in nextProps) if (_propKey8 = nextProps[checked], propKey = lastProps[checked], nextProps.hasOwnProperty(checked) && _propKey8 !== propKey && (null != _propKey8 || null != propKey)) switch (checked) { 10838 case "children": 10839 case "dangerouslySetInnerHTML": 10840 if (null != _propKey8) throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`."); 10841 break; 10842 default: setProp(domElement, tag, checked, _propKey8, nextProps, propKey); 10843 } 10844 return; 10845 default: if (isCustomElement(tag)) { 10846 for (var _propKey17 in lastProps) _propKey8 = lastProps[_propKey17], lastProps.hasOwnProperty(_propKey17) && void 0 !== _propKey8 && !nextProps.hasOwnProperty(_propKey17) && setPropOnCustomElement(domElement, tag, _propKey17, void 0, nextProps, _propKey8); 10847 for (defaultChecked in nextProps) _propKey8 = nextProps[defaultChecked], propKey = lastProps[defaultChecked], !nextProps.hasOwnProperty(defaultChecked) || _propKey8 === propKey || void 0 === _propKey8 && void 0 === propKey || setPropOnCustomElement(domElement, tag, defaultChecked, _propKey8, nextProps, propKey); 10848 return; 10849 } 10850 } 10851 for (var _propKey19 in lastProps) _propKey8 = lastProps[_propKey19], lastProps.hasOwnProperty(_propKey19) && null != _propKey8 && !nextProps.hasOwnProperty(_propKey19) && setProp(domElement, tag, _propKey19, null, nextProps, _propKey8); 10852 for (lastProp in nextProps) _propKey8 = nextProps[lastProp], propKey = lastProps[lastProp], !nextProps.hasOwnProperty(lastProp) || _propKey8 === propKey || null == _propKey8 && null == propKey || setProp(domElement, tag, lastProp, _propKey8, nextProps, propKey); 10853 } 10854 function getPropNameFromAttributeName(attrName) { 10855 switch (attrName) { 10856 case "class": return "className"; 10857 case "for": return "htmlFor"; 10858 default: return attrName; 10859 } 10860 } 10861 function getStylesObjectFromElement(domElement) { 10862 for (var serverValueInObjectForm = {}, style = domElement.style, i = 0; i < style.length; i++) { 10863 var styleName = style[i]; 10864 "view-transition-name" === styleName && isExpectedViewTransitionName(domElement) || (serverValueInObjectForm[styleName] = style.getPropertyValue(styleName)); 10865 } 10866 return serverValueInObjectForm; 10867 } 10868 function diffHydratedStyles(domElement, value$jscomp$0, serverDifferences) { 10869 if (null != value$jscomp$0 && "object" !== typeof value$jscomp$0) console.error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX."); 10870 else { 10871 var clientValue; 10872 var delimiter = clientValue = "", styleName; 10873 for (styleName in value$jscomp$0) if (value$jscomp$0.hasOwnProperty(styleName)) { 10874 var value = value$jscomp$0[styleName]; 10875 null != value && "boolean" !== typeof value && "" !== value && (0 === styleName.indexOf("--") ? (checkCSSPropertyStringCoercion(value, styleName), clientValue += delimiter + styleName + ":" + ("" + value).trim()) : "number" !== typeof value || 0 === value || unitlessNumbers.has(styleName) ? (checkCSSPropertyStringCoercion(value, styleName), clientValue += delimiter + styleName.replace(uppercasePattern, "-$1").toLowerCase().replace(msPattern$1, "-ms-") + ":" + ("" + value).trim()) : clientValue += delimiter + styleName.replace(uppercasePattern, "-$1").toLowerCase().replace(msPattern$1, "-ms-") + ":" + value + "px", delimiter = ";"); 10876 } 10877 clientValue = clientValue || null; 10878 value$jscomp$0 = domElement.getAttribute("style"); 10879 value$jscomp$0 !== clientValue && (clientValue = normalizeMarkupForTextOrAttribute(clientValue), value$jscomp$0 = normalizeMarkupForTextOrAttribute(value$jscomp$0), value$jscomp$0 === clientValue || ";" === value$jscomp$0[value$jscomp$0.length - 1] && hasViewTransition(domElement) || (serverDifferences.style = getStylesObjectFromElement(domElement))); 10880 } 10881 } 10882 function hydrateAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) { 10883 extraAttributes.delete(attributeName); 10884 domElement = domElement.getAttribute(attributeName); 10885 if (null === domElement) switch (typeof value) { 10886 case "undefined":
vendor: 10,623 bytes, lines 10887-11124
10887 case "function": 10888 case "symbol": 10889 case "boolean": return; 10890 } 10891 else if (null != value) switch (typeof value) { 10892 case "function": 10893 case "symbol": 10894 case "boolean": break; 10895 default: if (checkAttributeStringCoercion(value, propKey), domElement === "" + value) return; 10896 } 10897 warnForPropDifference(propKey, domElement, value, serverDifferences); 10898 } 10899 function hydrateBooleanAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) { 10900 extraAttributes.delete(attributeName); 10901 domElement = domElement.getAttribute(attributeName); 10902 if (null === domElement) { 10903 switch (typeof value) { 10904 case "function": 10905 case "symbol": return; 10906 } 10907 if (!value) return; 10908 } else switch (typeof value) { 10909 case "function": 10910 case "symbol": break; 10911 default: if (value) return; 10912 } 10913 warnForPropDifference(propKey, domElement, value, serverDifferences); 10914 } 10915 function hydrateBooleanishAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) { 10916 extraAttributes.delete(attributeName); 10917 domElement = domElement.getAttribute(attributeName); 10918 if (null === domElement) switch (typeof value) { 10919 case "undefined": 10920 case "function": 10921 case "symbol": return; 10922 } 10923 else if (null != value) switch (typeof value) { 10924 case "function": 10925 case "symbol": break; 10926 default: if (checkAttributeStringCoercion(value, attributeName), domElement === "" + value) return; 10927 } 10928 warnForPropDifference(propKey, domElement, value, serverDifferences); 10929 } 10930 function hydrateNumericAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) { 10931 extraAttributes.delete(attributeName); 10932 domElement = domElement.getAttribute(attributeName); 10933 if (null === domElement) switch (typeof value) { 10934 case "undefined": 10935 case "function": 10936 case "symbol": 10937 case "boolean": return; 10938 default: if (isNaN(value)) return; 10939 } 10940 else if (null != value) switch (typeof value) { 10941 case "function": 10942 case "symbol": 10943 case "boolean": break; 10944 default: if (!isNaN(value) && (checkAttributeStringCoercion(value, propKey), domElement === "" + value)) return; 10945 } 10946 warnForPropDifference(propKey, domElement, value, serverDifferences); 10947 } 10948 function hydrateSanitizedAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) { 10949 extraAttributes.delete(attributeName); 10950 domElement = domElement.getAttribute(attributeName); 10951 if (null === domElement) switch (typeof value) { 10952 case "undefined": 10953 case "function": 10954 case "symbol": 10955 case "boolean": return; 10956 } 10957 else if (null != value) switch (typeof value) { 10958 case "function": 10959 case "symbol": 10960 case "boolean": break; 10961 default: if (checkAttributeStringCoercion(value, propKey), attributeName = sanitizeURL("" + value), domElement === attributeName) return; 10962 } 10963 warnForPropDifference(propKey, domElement, value, serverDifferences); 10964 } 10965 function diffHydratedProperties(domElement, tag, props, hostContext) { 10966 for (var serverDifferences = {}, extraAttributes = /* @__PURE__ */ new Set(), attributes = domElement.attributes, i = 0; i < attributes.length; i++) switch (attributes[i].name.toLowerCase()) { 10967 case "value": break; 10968 case "checked": break; 10969 case "selected": break; 10970 case "vt-name": 10971 case "vt-update": 10972 case "vt-enter": 10973 case "vt-exit": 10974 case "vt-share": 10975 case "vt-parent-enter": 10976 case "vt-parent-exit": break; 10977 default: extraAttributes.add(attributes[i].name); 10978 } 10979 if (isCustomElement(tag)) { 10980 for (var propKey in props) if (props.hasOwnProperty(propKey)) { 10981 var value = props[propKey]; 10982 if (null != value) { 10983 if (registrationNameDependencies.hasOwnProperty(propKey)) "function" !== typeof value && warnForInvalidEventListener(propKey, value); 10984 else if (!0 !== props.suppressHydrationWarning) switch (propKey) { 10985 case "children": 10986 "string" !== typeof value && "number" !== typeof value || warnForPropDifference("children", domElement.textContent, value, serverDifferences); 10987 continue; 10988 case "suppressContentEditableWarning": 10989 case "suppressHydrationWarning": 10990 case "defaultValue": 10991 case "defaultChecked": 10992 case "innerHTML": 10993 case "ref": continue; 10994 case "dangerouslySetInnerHTML": 10995 attributes = domElement.innerHTML; 10996 value = value ? value.__html : void 0; 10997 null != value && (value = normalizeHTML(domElement, value), warnForPropDifference(propKey, attributes, value, serverDifferences)); 10998 continue; 10999 case "style": 11000 extraAttributes.delete(propKey); 11001 diffHydratedStyles(domElement, value, serverDifferences); 11002 continue; 11003 case "offsetParent": 11004 case "offsetTop": 11005 case "offsetLeft": 11006 case "offsetWidth": 11007 case "offsetHeight": 11008 case "isContentEditable": 11009 case "outerText": 11010 case "outerHTML": 11011 extraAttributes.delete(propKey.toLowerCase()); 11012 console.error("Assignment to read-only property will result in a no-op: `%s`", propKey); 11013 continue; 11014 case "className": 11015 extraAttributes.delete("class"); 11016 attributes = getValueForAttributeOnCustomComponent(domElement, "class", value); 11017 warnForPropDifference("className", attributes, value, serverDifferences); 11018 continue; 11019 default: hostContext.context === HostContextNamespaceNone && "svg" !== tag && "math" !== tag ? extraAttributes.delete(propKey.toLowerCase()) : extraAttributes.delete(propKey), attributes = getValueForAttributeOnCustomComponent(domElement, propKey, value), warnForPropDifference(propKey, attributes, value, serverDifferences); 11020 } 11021 } 11022 } 11023 } else for (value in props) if (props.hasOwnProperty(value) && (propKey = props[value], null != propKey)) { 11024 if (registrationNameDependencies.hasOwnProperty(value)) "function" !== typeof propKey && warnForInvalidEventListener(value, propKey); 11025 else if (!0 !== props.suppressHydrationWarning) switch (value) { 11026 case "children": 11027 "string" !== typeof propKey && "number" !== typeof propKey || warnForPropDifference("children", domElement.textContent, propKey, serverDifferences); 11028 continue; 11029 case "suppressContentEditableWarning": 11030 case "suppressHydrationWarning": 11031 case "value": 11032 case "checked": 11033 case "selected": 11034 case "defaultValue": 11035 case "defaultChecked": 11036 case "innerHTML": 11037 case "ref": continue; 11038 case "dangerouslySetInnerHTML": 11039 attributes = domElement.innerHTML; 11040 propKey = propKey ? propKey.__html : void 0; 11041 null != propKey && (propKey = normalizeHTML(domElement, propKey), attributes !== propKey && (serverDifferences[value] = { __html: attributes })); 11042 continue; 11043 case "className": 11044 hydrateAttribute(domElement, value, "class", propKey, extraAttributes, serverDifferences); 11045 continue; 11046 case "tabIndex": 11047 hydrateAttribute(domElement, value, "tabindex", propKey, extraAttributes, serverDifferences); 11048 continue; 11049 case "style": 11050 extraAttributes.delete(value); 11051 diffHydratedStyles(domElement, propKey, serverDifferences); 11052 continue; 11053 case "multiple": 11054 extraAttributes.delete(value); 11055 warnForPropDifference(value, domElement.multiple, propKey, serverDifferences); 11056 continue; 11057 case "muted": 11058 extraAttributes.delete(value); 11059 warnForPropDifference(value, domElement.muted, propKey, serverDifferences); 11060 continue; 11061 case "autoFocus": 11062 extraAttributes.delete("autofocus"); 11063 warnForPropDifference(value, domElement.autofocus, propKey, serverDifferences); 11064 continue; 11065 case "data": if ("object" !== tag) { 11066 extraAttributes.delete(value); 11067 attributes = domElement.getAttribute("data"); 11068 warnForPropDifference(value, attributes, propKey, serverDifferences); 11069 continue; 11070 } 11071 case "src": 11072 case "href": 11073 if (!("" !== propKey || "a" === tag && "href" === value || "object" === tag && "data" === value)) { 11074 "src" === value ? console.error("An empty string (\"\") was passed to the %s attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", value, value) : console.error("An empty string (\"\") was passed to the %s attribute. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", value, value); 11075 continue; 11076 } 11077 hydrateSanitizedAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences); 11078 continue; 11079 case "action": 11080 case "formAction": 11081 attributes = domElement.getAttribute(value); 11082 if ("function" === typeof propKey) { 11083 extraAttributes.delete(value.toLowerCase()); 11084 "formAction" === value ? (extraAttributes.delete("name"), extraAttributes.delete("formenctype"), extraAttributes.delete("formmethod"), extraAttributes.delete("formtarget")) : (extraAttributes.delete("enctype"), extraAttributes.delete("method"), extraAttributes.delete("target")); 11085 continue; 11086 } else if (attributes === EXPECTED_FORM_ACTION_URL) { 11087 extraAttributes.delete(value.toLowerCase()); 11088 warnForPropDifference(value, "function", propKey, serverDifferences); 11089 continue; 11090 } 11091 hydrateSanitizedAttribute(domElement, value, value.toLowerCase(), propKey, extraAttributes, serverDifferences); 11092 continue; 11093 case "xlinkHref": 11094 hydrateSanitizedAttribute(domElement, value, "xlink:href", propKey, extraAttributes, serverDifferences); 11095 continue; 11096 case "contentEditable": 11097 hydrateBooleanishAttribute(domElement, value, "contenteditable", propKey, extraAttributes, serverDifferences); 11098 continue; 11099 case "spellCheck": 11100 hydrateBooleanishAttribute(domElement, value, "spellcheck", propKey, extraAttributes, serverDifferences); 11101 continue; 11102 case "draggable": 11103 case "autoReverse": 11104 case "externalResourcesRequired": 11105 case "focusable": 11106 case "preserveAlpha": 11107 hydrateBooleanishAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences); 11108 continue; 11109 case "allowFullScreen": 11110 case "async": 11111 case "autoPlay": 11112 case "controls": 11113 case "credentialless": 11114 case "default": 11115 case "defer": 11116 case "disabled": 11117 case "disablePictureInPicture": 11118 case "disableRemotePlayback": 11119 case "formNoValidate": 11120 case "hidden": 11121 case "loop": 11122 case "noModule": 11123 case "noValidate": 11124 case "open":
11125 case "playsInline": 11126 case "readOnly": 11127 case "required": 11128 case "reversed": 11129 case "scoped": 11130 case "seamless": 11131 case "itemScope": 11132 hydrateBooleanAttribute(domElement, value, value.toLowerCase(), propKey, extraAttributes, serverDifferences); 11133 continue; 11134 case "capture": 11135 case "download": 11136 a: { 11137 i = domElement; 11138 var attributeName = attributes = value, serverDifferences$jscomp$0 = serverDifferences; 11139 extraAttributes.delete(attributeName); 11140 i = i.getAttribute(attributeName); 11141 if (null === i) switch (typeof propKey) { 11142 case "undefined": 11143 case "function": 11144 case "symbol": break a; 11145 default: if (!1 === propKey) break a; 11146 } 11147 else if (null != propKey) switch (typeof propKey) { 11148 case "function": 11149 case "symbol": break; 11150 case "boolean": 11151 if (!0 === propKey && "" === i) break a; 11152 break; 11153 default: if (checkAttributeStringCoercion(propKey, attributes), i === "" + propKey) break a; 11154 } 11155 warnForPropDifference(attributes, i, propKey, serverDifferences$jscomp$0); 11156 } 11157 continue; 11158 case "cols": 11159 case "rows": 11160 case "size": 11161 case "span": 11162 a: { 11163 i = domElement; 11164 attributeName = attributes = value; 11165 serverDifferences$jscomp$0 = serverDifferences; 11166 extraAttributes.delete(attributeName); 11167 i = i.getAttribute(attributeName); 11168 if (null === i) switch (typeof propKey) { 11169 case "undefined": 11170 case "function": 11171 case "symbol": 11172 case "boolean": break a; 11173 default: if (isNaN(propKey) || 1 > propKey) break a; 11174 } 11175 else if (null != propKey) switch (typeof propKey) { 11176 case "function": 11177 case "symbol": 11178 case "boolean": break; 11179 default: if (!(isNaN(propKey) || 1 > propKey) && (checkAttributeStringCoercion(propKey, attributes), i === "" + propKey)) break a; 11180 } 11181 warnForPropDifference(attributes, i, propKey, serverDifferences$jscomp$0); 11182 } 11183 continue; 11184 case "rowSpan": 11185 hydrateNumericAttribute(domElement, value, "rowspan", propKey, extraAttributes, serverDifferences); 11186 continue; 11187 case "start": 11188 hydrateNumericAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences); 11189 continue; 11190 case "xHeight": 11191 hydrateAttribute(domElement, value, "x-height", propKey, extraAttributes, serverDifferences); 11192 continue; 11193 case "xlinkActuate": 11194 hydrateAttribute(domElement, value, "xlink:actuate", propKey, extraAttributes, serverDifferences); 11195 continue; 11196 case "xlinkArcrole": 11197 hydrateAttribute(domElement, value, "xlink:arcrole", propKey, extraAttributes, serverDifferences); 11198 continue; 11199 case "xlinkRole": 11200 hydrateAttribute(domElement, value, "xlink:role", propKey, extraAttributes, serverDifferences); 11201 continue; 11202 case "xlinkShow": 11203 hydrateAttribute(domElement, value, "xlink:show", propKey, extraAttributes, serverDifferences); 11204 continue; 11205 case "xlinkTitle": 11206 hydrateAttribute(domElement, value, "xlink:title", propKey, extraAttributes, serverDifferences); 11207 continue; 11208 case "xlinkType": 11209 hydrateAttribute(domElement, value, "xlink:type", propKey, extraAttributes, serverDifferences); 11210 continue; 11211 case "xmlBase": 11212 hydrateAttribute(domElement, value, "xml:base", propKey, extraAttributes, serverDifferences); 11213 continue; 11214 case "xmlLang": 11215 hydrateAttribute(domElement, value, "xml:lang", propKey, extraAttributes, serverDifferences); 11216 continue; 11217 case "xmlSpace": 11218 hydrateAttribute(domElement, value, "xml:space", propKey, extraAttributes, serverDifferences); 11219 continue; 11220 case "inert": 11221 "" !== propKey || didWarnForNewBooleanPropsWithEmptyValue[value] || (didWarnForNewBooleanPropsWithEmptyValue[value] = !0, console.error("Received an empty string for a boolean attribute `%s`. This will treat the attribute as if it were false. Either pass `false` to silence this warning, or pass `true` if you used an empty string in earlier versions of React to indicate this attribute is true.", value)); 11222 hydrateBooleanAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences); 11223 continue; 11224 default: if (!(2 < value.length) || "o" !== value[0] && "O" !== value[0] || "n" !== value[1] && "N" !== value[1]) { 11225 i = getAttributeAlias(value); 11226 attributes = !1; 11227 hostContext.context === HostContextNamespaceNone && "svg" !== tag && "math" !== tag ? extraAttributes.delete(i.toLowerCase()) : (attributeName = value.toLowerCase(), attributeName = possibleStandardNames.hasOwnProperty(attributeName) ? possibleStandardNames[attributeName] || null : null, null !== attributeName && attributeName !== value && (attributes = !0, extraAttributes.delete(attributeName)), extraAttributes.delete(i)); 11228 a: if (attributeName = domElement, serverDifferences$jscomp$0 = i, i = propKey, isAttributeNameSafe(serverDifferences$jscomp$0)) if (attributeName.hasAttribute(serverDifferences$jscomp$0)) attributeName = "nonce" === serverDifferences$jscomp$0.toLowerCase() ? attributeName.nonce : attributeName.getAttribute(serverDifferences$jscomp$0), checkAttributeStringCoercion(i, serverDifferences$jscomp$0), i = attributeName === "" + i ? i : attributeName; 11229 else { 11230 switch (typeof i) { 11231 case "function": 11232 case "symbol": break a; 11233 case "boolean": if (attributeName = serverDifferences$jscomp$0.toLowerCase().slice(0, 5), "data-" !== attributeName && "aria-" !== attributeName) break a; 11234 } 11235 i = void 0 === i ? void 0 : null; 11236 } 11237 else i = void 0; 11238 attributes || warnForPropDifference(value, i, propKey, serverDifferences); 11239 } 11240 } 11241 } 11242 0 < extraAttributes.size && !0 !== props.suppressHydrationWarning && warnForExtraAttributes(domElement, extraAttributes, serverDifferences); 11243 return 0 === Object.keys(serverDifferences).length ? null : serverDifferences; 11244 } 11245 function propNamesListJoin(list, combinator) { 11246 switch (list.length) { 11247 case 0: return ""; 11248 case 1: return list[0]; 11249 case 2: return list[0] + " " + combinator + " " + list[1]; 11250 default: return list.slice(0, -1).join(", ") + ", " + combinator + " " + list[list.length - 1]; 11251 } 11252 } 11253 function isLikelyStaticResource(initiatorType) { 11254 switch (initiatorType) { 11255 case "css":
11256 case "script": 11257 case "font": 11258 case "img": 11259 case "image": 11260 case "input": 11261 case "link": return !0; 11262 default: return !1; 11263 } 11264 } 11265 function estimateBandwidth() { 11266 if ("function" === typeof performance.getEntriesByType) { 11267 for (var count = 0, bits = 0, resourceEntries = performance.getEntriesByType("resource"), i = 0; i < resourceEntries.length; i++) { 11268 var entry = resourceEntries[i], transferSize = entry.transferSize, initiatorType = entry.initiatorType, duration = entry.duration; 11269 if (transferSize && duration && isLikelyStaticResource(initiatorType)) { 11270 initiatorType = 0; 11271 duration = entry.responseEnd; 11272 for (i += 1; i < resourceEntries.length; i++) { 11273 var overlapEntry = resourceEntries[i], overlapStartTime = overlapEntry.startTime; 11274 if (overlapStartTime > duration) break; 11275 var overlapTransferSize = overlapEntry.transferSize, overlapInitiatorType = overlapEntry.initiatorType; 11276 overlapTransferSize && isLikelyStaticResource(overlapInitiatorType) && (overlapEntry = overlapEntry.responseEnd, initiatorType += overlapTransferSize * (overlapEntry < duration ? 1 : (duration - overlapStartTime) / (overlapEntry - overlapStartTime))); 11277 } 11278 --i; 11279 bits += 8 * (transferSize + initiatorType) / (entry.duration / 1e3); 11280 count++; 11281 if (10 < count) break; 11282 } 11283 } 11284 if (0 < count) return bits / count / 1e6; 11285 } 11286 return navigator.connection && (count = navigator.connection.downlink, "number" === typeof count) ? count : 5; 11287 } 11288 function getOwnerDocumentFromRootContainer(rootContainerElement) { 11289 return 9 === rootContainerElement.nodeType ? rootContainerElement : rootContainerElement.ownerDocument; 11290 } 11291 function getOwnHostContext(namespaceURI) { 11292 switch (namespaceURI) { 11293 case SVG_NAMESPACE: return HostContextNamespaceSvg; 11294 case MATH_NAMESPACE: return HostContextNamespaceMath; 11295 default: return HostContextNamespaceNone; 11296 } 11297 } 11298 function getChildHostContextProd(parentNamespace, type) { 11299 if (parentNamespace === HostContextNamespaceNone) switch (type) { 11300 case "svg": return HostContextNamespaceSvg; 11301 case "math": return HostContextNamespaceMath; 11302 default: return HostContextNamespaceNone; 11303 } 11304 return parentNamespace === HostContextNamespaceSvg && "foreignObject" === type ? HostContextNamespaceNone : parentNamespace; 11305 } 11306 function createHoistableInstance(type, props, rootContainerInstance, internalInstanceHandle) { 11307 rootContainerInstance = getOwnerDocumentFromRootContainer(rootContainerInstance).createElement(type); 11308 rootContainerInstance[internalInstanceKey] = internalInstanceHandle; 11309 rootContainerInstance[internalPropsKey] = props; 11310 setInitialProperties(rootContainerInstance, type, props); 11311 markNodeAsHoistable(rootContainerInstance); 11312 return rootContainerInstance; 11313 } 11314 function isScriptDataBlock(props) { 11315 props = props.type; 11316 if ("string" !== typeof props || "" === props) return !1; 11317 props = props.toLowerCase(); 11318 if ("module" === props || "importmap" === props || "speculationrules" === props) return !1; 11319 switch (props) { 11320 case "application/ecmascript": 11321 case "application/javascript": 11322 case "application/x-ecmascript": 11323 case "application/x-javascript": 11324 case "text/ecmascript": 11325 case "text/javascript": 11326 case "text/javascript1.0": 11327 case "text/javascript1.1": 11328 case "text/javascript1.2": 11329 case "text/javascript1.3": 11330 case "text/javascript1.4": 11331 case "text/javascript1.5": 11332 case "text/jscript": 11333 case "text/livescript": 11334 case "text/x-ecmascript": 11335 case "text/x-javascript": return !1; 11336 } 11337 return !0; 11338 } 11339 function shouldSetTextContent(type, props) { 11340 return "textarea" === type || "noscript" === type || "string" === typeof props.children || "number" === typeof props.children || "bigint" === typeof props.children || "object" === typeof props.dangerouslySetInnerHTML && null !== props.dangerouslySetInnerHTML && null != props.dangerouslySetInnerHTML.__html; 11341 } 11342 function shouldAttemptEagerTransition() { 11343 var event = window.event; 11344 if (event && "popstate" === event.type) { 11345 if (event === currentPopstateTransitionEvent) return !1; 11346 currentPopstateTransitionEvent = event; 11347 return !0; 11348 } 11349 currentPopstateTransitionEvent = null; 11350 return !1; 11351 } 11352 function resolveEventType() { 11353 var event = window.event; 11354 return event && event !== schedulerEvent ? event.type : null; 11355 } 11356 function resolveEventTimeStamp() { 11357 var event = window.event; 11358 return event && event !== schedulerEvent ? event.timeStamp : -1.1; 11359 } 11360 function handleErrorInNextTick(error) { 11361 setTimeout(function() { 11362 throw error; 11363 }); 11364 } 11365 function commitMount(domElement, type, newProps) { 11366 switch (type) { 11367 case "button":
11368 case "input": 11369 case "select": 11370 case "textarea": 11371 newProps.autoFocus && domElement.focus(); 11372 break; 11373 case "img": newProps.src ? domElement.src = newProps.src : newProps.srcSet && (domElement.srcset = newProps.srcSet); 11374 } 11375 } 11376 function commitHydratedInstance() {} 11377 function commitUpdate(domElement, type, oldProps, newProps) { 11378 updateProperties(domElement, type, oldProps, newProps); 11379 domElement[internalPropsKey] = newProps; 11380 } 11381 function resetTextContent(domElement) { 11382 setTextContent(domElement, ""); 11383 } 11384 function commitTextUpdate(textInstance, oldText, newText) { 11385 textInstance.nodeValue = newText; 11386 } 11387 function warnForReactChildrenConflict(container) { 11388 if (!container.__reactWarnedAboutChildrenConflict) { 11389 var props = container[internalPropsKey] || null; 11390 if (null !== props) { 11391 var fiber = getInstanceFromNode(container); 11392 null !== fiber && ("string" === typeof props.children || "number" === typeof props.children ? (container.__reactWarnedAboutChildrenConflict = !0, runWithFiberInDEV(fiber, function() { 11393 console.error("Cannot use a ref on a React element as a container to `createRoot` or `createPortal` if that element also sets \"children\" text content using React. It should be a leaf with no children. Otherwise it's ambiguous which children should be used."); 11394 })) : null != props.dangerouslySetInnerHTML && (container.__reactWarnedAboutChildrenConflict = !0, runWithFiberInDEV(fiber, function() { 11395 console.error("Cannot use a ref on a React element as a container to `createRoot` or `createPortal` if that element also sets \"dangerouslySetInnerHTML\" using React. It should be a leaf with no children. Otherwise it's ambiguous which children should be used."); 11396 }))); 11397 } 11398 } 11399 } 11400 function isSingletonScope(type) { 11401 return "head" === type; 11402 } 11403 function removeChild(parentInstance, child) { 11404 parentInstance.removeChild(child); 11405 } 11406 function removeChildFromContainer(container, child) { 11407 (9 === container.nodeType ? container.body : "HTML" === container.nodeName ? container.ownerDocument.body : container).removeChild(child); 11408 } 11409 function clearHydrationBoundary(parentInstance, hydrationInstance) { 11410 var node = hydrationInstance, depth = 0; 11411 do { 11412 var nextNode = node.nextSibling; 11413 parentInstance.removeChild(node); 11414 if (nextNode && 8 === nextNode.nodeType) if (node = nextNode.data, node === SUSPENSE_END_DATA || node === ACTIVITY_END_DATA) { 11415 if (0 === depth) { 11416 parentInstance.removeChild(nextNode); 11417 retryIfBlockedOn(hydrationInstance); 11418 return; 11419 } 11420 depth--; 11421 } else if (node === SUSPENSE_START_DATA || node === SUSPENSE_PENDING_START_DATA || node === SUSPENSE_QUEUED_START_DATA || node === SUSPENSE_FALLBACK_START_DATA || node === ACTIVITY_START_DATA) depth++; 11422 else if (node === PREAMBLE_CONTRIBUTION_HTML) clearSingletonPreambleContribution(parentInstance.ownerDocument.documentElement); 11423 else if (node === PREAMBLE_CONTRIBUTION_HEAD) { 11424 node = parentInstance.ownerDocument.head; 11425 clearSingletonPreambleContribution(node); 11426 for (var node$jscomp$0 = node.firstChild; node$jscomp$0;) { 11427 var nextNode$jscomp$0 = node$jscomp$0.nextSibling, nodeName = node$jscomp$0.nodeName; 11428 node$jscomp$0[internalHoistableMarker] || "SCRIPT" === nodeName || "STYLE" === nodeName || "LINK" === nodeName && "stylesheet" === node$jscomp$0.rel.toLowerCase() || node.removeChild(node$jscomp$0); 11429 node$jscomp$0 = nextNode$jscomp$0; 11430 } 11431 } else node === PREAMBLE_CONTRIBUTION_BODY && clearSingletonPreambleContribution(parentInstance.ownerDocument.body); 11432 node = nextNode; 11433 } while (node); 11434 retryIfBlockedOn(hydrationInstance); 11435 } 11436 function hideOrUnhideDehydratedBoundary(suspenseInstance, isHidden) { 11437 var node = suspenseInstance; 11438 suspenseInstance = 0; 11439 do { 11440 var nextNode = node.nextSibling; 11441 1 === node.nodeType ? isHidden ? (node._stashedDisplay = node.style.display, node.style.display = "none") : (node.style.display = node._stashedDisplay || "", "" === node.getAttribute("style") && node.removeAttribute("style")) : 3 === node.nodeType && (isHidden ? (node._stashedText = node.nodeValue, node.nodeValue = "") : node.nodeValue = node._stashedText || ""); 11442 if (nextNode && 8 === nextNode.nodeType) if (node = nextNode.data, node === SUSPENSE_END_DATA) if (0 === suspenseInstance) break; 11443 else suspenseInstance--; 11444 else node !== SUSPENSE_START_DATA && node !== SUSPENSE_PENDING_START_DATA && node !== SUSPENSE_QUEUED_START_DATA && node !== SUSPENSE_FALLBACK_START_DATA || suspenseInstance++; 11445 node = nextNode; 11446 } while (node); 11447 } 11448 function hideDehydratedBoundary(suspenseInstance) { 11449 hideOrUnhideDehydratedBoundary(suspenseInstance, !0); 11450 } 11451 function hideInstance(instance) { 11452 instance = instance.style; 11453 "function" === typeof instance.setProperty ? instance.setProperty("display", "none", "important") : instance.display = "none"; 11454 } 11455 function hideTextInstance(textInstance) { 11456 textInstance.nodeValue = ""; 11457 } 11458 function unhideDehydratedBoundary(dehydratedInstance) { 11459 hideOrUnhideDehydratedBoundary(dehydratedInstance, !1); 11460 } 11461 function unhideInstance(instance, props) { 11462 props = props[STYLE]; 11463 props = void 0 !== props && null !== props && props.hasOwnProperty("display") ? props.display : null; 11464 instance.style.display = null == props || "boolean" === typeof props ? "" : ("" + props).trim(); 11465 } 11466 function unhideTextInstance(textInstance, text) { 11467 textInstance.nodeValue = text; 11468 } 11469 function warnForBlockInsideInline(instance) { 11470 for (var nextNode = instance.firstChild; null != nextNode;) { 11471 if (1 === nextNode.nodeType && "block" === getComputedStyle(nextNode).display) { 11472 runWithFiberInDEV(getInstanceFromNode(nextNode) || getInstanceFromNode(instance), function(parentTag, childTag) { 11473 console.error("You're about to start a <ViewTransition> around a display: inline element <%s>, which itself has a display: block element <%s> inside it. This might trigger a bug in Safari which causes the View Transition to be skipped with a duplicate name error.\nhttps://bugs.webkit.org/show_bug.cgi?id=290923", parentTag.toLocaleLowerCase(), childTag.toLocaleLowerCase()); 11474 }, instance.tagName, nextNode.tagName); 11475 break; 11476 } 11477 if (null != nextNode.firstChild) nextNode = nextNode.firstChild; 11478 else { 11479 if (nextNode === instance) break; 11480 for (; null == nextNode.nextSibling && null != nextNode.parentNode && nextNode.parentNode !== instance;) nextNode = nextNode.parentNode; 11481 nextNode = nextNode.nextSibling; 11482 } 11483 } 11484 } 11485 function applyViewTransitionName(instance, name, className) { 11486 name = CSS.escape(name) !== name ? "r-" + btoa(name).replace(/=/g, "") : name; 11487 instance.style.viewTransitionName = name; 11488 null != className && (instance.style.viewTransitionClass = className); 11489 className = getComputedStyle(instance); 11490 if ("inline" === className.display) { 11491 name = instance.getClientRects(); 11492 if (1 === name.length) var JSCompiler_inline_result = 1; 11493 else for (var i = JSCompiler_inline_result = 0; i < name.length; i++) { 11494 var rect = name[i]; 11495 0 < rect.width && 0 < rect.height && JSCompiler_inline_result++; 11496 } 11497 1 === JSCompiler_inline_result ? (instance = instance.style, instance.display = 1 === name.length ? "inline-block" : "block", instance.marginTop = "-" + className.paddingTop, instance.marginBottom = "-" + className.paddingBottom) : warnForBlockInsideInline(instance); 11498 } 11499 } 11500 function restoreViewTransitionName(instance, props) { 11501 instance = instance.style; 11502 props = props[STYLE]; 11503 var viewTransitionName = null != props ? props.hasOwnProperty("viewTransitionName") ? props.viewTransitionName : props.hasOwnProperty("view-transition-name") ? props["view-transition-name"] : null : null; 11504 instance.viewTransitionName = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : ("" + viewTransitionName).trim(); 11505 viewTransitionName = null != props ? props.hasOwnProperty("viewTransitionClass") ? props.viewTransitionClass : props.hasOwnProperty("view-transition-class") ? props["view-transition-class"] : null : null; 11506 instance.viewTransitionClass = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : ("" + viewTransitionName).trim(); 11507 "inline-block" === instance.display && (null == props ? instance.display = instance.margin = "" : (viewTransitionName = props.display, instance.display = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : viewTransitionName, viewTransitionName = props.margin, null != viewTransitionName ? instance.margin = viewTransitionName : (viewTransitionName = props.hasOwnProperty("marginTop") ? props.marginTop : props["margin-top"], instance.marginTop = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : viewTransitionName, props = props.hasOwnProperty("marginBottom") ? props.marginBottom : props["margin-bottom"], instance.marginBottom = null == props || "boolean" === typeof props ? "" : props))); 11508 } 11509 function createMeasurement(rect, computedStyle, element) { 11510 element = element.ownerDocument.defaultView; 11511 return { 11512 rect, 11513 abs: "absolute" === computedStyle.position || "fixed" === computedStyle.position, 11514 clip: "none" !== computedStyle.clipPath || "visible" !== computedStyle.overflow || "none" !== computedStyle.filter || "none" !== computedStyle.mask || "none" !== computedStyle.mask || "0px" !== computedStyle.borderRadius, 11515 view: 0 <= rect.bottom && 0 <= rect.right && rect.top <= element.innerHe
11515ight && rect.left <= element.innerWidth 11516 }; 11517 } 11518 function measureInstance(instance) { 11519 return createMeasurement(instance.getBoundingClientRect(), getComputedStyle(instance), instance); 11520 } 11521 function measureClonedInstance(instance) { 11522 var measuredRect = instance.getBoundingClientRect(); 11523 measuredRect = new DOMRect(measuredRect.x + 2e4, measuredRect.y + 2e4, measuredRect.width, measuredRect.height); 11524 var computedStyle = getComputedStyle(instance); 11525 return createMeasurement(measuredRect, computedStyle, instance); 11526 } 11527 function customizeViewTransitionError(error, ignoreAbort) { 11528 if ("object" === typeof error && null !== error) switch (error.name) { 11529 case "TimeoutError": return Error("A ViewTransition timed out because a Navigation stalled. This can happen if a Navigation is blocked on React itself. Such as if it's resolved inside useEffect. This can be solved by moving the resolution to useLayoutEffect.", { cause: error }); 11530 case "AbortError": return ignoreAbort ? null : Error("A ViewTransition was aborted early. This might be because you have other View Transition libraries on the page and only one can run at a time. To avoid this, use only React's built-in <ViewTransition> to coordinate.", { cause: error }); 11531 case "InvalidStateError": if ("View transition was skipped because document visibility state is hidden." === error.message || "Skipping view transition because document visibility state has become hidden." === error.message || "Skipping view transition because viewport size changed." === error.message || "Transition was aborted because of invalid state" === error.message) return null; 11532 } 11533 return error; 11534 } 11535 function forceLayout(ownerDocument) { 11536 return ownerDocument.documentElement.clientHeight; 11537 } 11538 function waitForImageToLoad(resolve) { 11539 this.addEventListener("load", resolve); 11540 this.addEventListener("error", resolve); 11541 } 11542 function startViewTransition(suspendedState, rootContainer, transitionTypes, mutationCallback, layoutCallback, afterMutationCallback, spawnedWorkCallback, passiveCallback, errorCallback, blockedCallback, finishedAnimation) { 11543 var ownerDocument = 9 === rootContainer.nodeType ? rootContainer : rootContainer.ownerDocument; 11544 try { 11545 var transition = ownerDocument.startViewTransition({ 11546 update: function() { 11547 var ownerWindow = ownerDocument.defaultView, pendingNavigation = ownerWindow.navigation && ownerWindow.navigation.transition, previousFontLoadingStatus = ownerDocument.fonts.status; 11548 mutationCallback(); 11549 var blockingPromises = []; 11550 "loaded" === previousFontLoadingStatus && (forceLayout(ownerDocument), "loading" === ownerDocument.fonts.status && blockingPromises.push(ownerDocument.fonts.ready)); 11551 previousFontLoadingStatus = blockingPromises.length; 11552 if (null !== suspendedState) for (var suspenseyImages = suspendedState.suspenseyImages, imgBytes = 0, i = 0; i < suspenseyImages.length; i++) { 11553 var suspenseyImage = suspenseyImages[i]; 11554 if (!suspenseyImage.complete) { 11555 var rect = suspenseyImage.getBoundingClientRect(); 11556 if (0 < rect.bottom && 0 < rect.right && rect.top < ownerWindow.innerHeight && rect.left < ownerWindow.innerWidth) { 11557 imgBytes += estimateImageBytes(suspenseyImage); 11558 if (imgBytes > estimatedBytesWithinLimit) { 11559 blockingPromises.length = previousFontLoadingStatus; 11560 break; 11561 } 11562 suspenseyImage = new Promise(waitForImageToLoad.bind(suspenseyImage)); 11563 blockingPromises.push(suspenseyImage); 11564 } 11565 } 11566 } 11567 if (0 < blockingPromises.length) return blockedCallback(0 < previousFontLoadingStatus ? blockingPromises.length > previousFontLoadingStatus ? "Waiting on Fonts and Images" : "Waiting on Fonts" : "Waiting on Images"), ownerWindow = Promise.race([Promise.all(blockingPromises), new Promise(function(resolve) { 11568 return setTimeout(resolve, SUSPENSEY_FONT_AND_IMAGE_TIMEOUT); 11569 })]).then(layoutCallback, layoutCallback), (pendingNavigation ? Promise.allSettled([pendingNavigation.finished, ownerWindow]) : ownerWindow).then(afterMutationCallback, afterMutationCallback); 11570 layoutCallback(); 11571 if (pendingNavigation) return pendingNavigation.finished.then(afterMutationCallback, afterMutationCallback); 11572 afterMutationCallback(); 11573 }, 11574 types: transitionTypes 11575 }); 11576 ownerDocument.__reactViewTransition = transition; 11577 var viewTransitionAnimations = []; 11578 transition.ready.then(function() { 11579 for (var animations = ownerDocument.documentElement.getAnimations({ subtree: !0 }), i = 0; i < animations.length; i++) { 11580 var animation = animations[i], effect = animation.effect, pseudoElement = effect.pseudoElement; 11581 if (null != pseudoElement && pseudoElement.startsWith("::view-transition")) { 11582 viewTransitionAnimations.push(animation); 11583 animation = effect.getKeyframes(); 11584 for (var height = pseudoElement = void 0, unchangedDimensions = !0, j = 0; j < animation.length; j++) { 11585 var keyframe = animation[j], w = keyframe.width; 11586 if (void 0 === pseudoElement) pseudoElement = w; 11587 else if (pseudoElement !== w) { 11588 unchangedDimensions = !1; 11589 break; 11590 } 11591 w = keyframe.height; 11592 if (void 0 === height) height = w; 11593 else if (height !== w) { 11594 unchangedDimensions = !1; 11595 break; 11596 } 11597 delete keyframe.width; 11598 delete keyframe.height; 11599 "none" === keyframe.transform && delete keyframe.transform; 11600 } 11601 unchangedDimensions && void 0 !== pseudoElement && void 0 !== height && (effect.setKeyframes(animation), unchangedDimensions = getComputedStyle(effect.target, effect.pseudoElement), unchangedDimensions.width !== pseudoElement || unchangedDimensions.height !== height) && (unchangedDimensions = animation[0], unchangedDimensions.width = pseudoElement, unchangedDimensions.height = height, unchangedDimensions = animation[animation.length - 1], unchangedDimensions.width = pseudoElement, unchangedDimensions.height = height, effect.setKeyframes(animation)); 11602 } 11603 } 11604 spawnedWorkCallback(); 11605 }, function(error) {
11606 ownerDocument.__reactViewTransition === transition && (ownerDocument.__reactViewTransition = null); 11607 try { 11608 error = customizeViewTransitionError(error, !1), null !== error && errorCallback(error); 11609 } finally { 11610 mutationCallback(), layoutCallback(), spawnedWorkCallback(), finishedAnimation(); 11611 } 11612 }); 11613 transition.finished.finally(function() { 11614 for (var i = 0; i < viewTransitionAnimations.length; i++) viewTransitionAnimations[i].cancel(); 11615 ownerDocument.__reactViewTransition === transition && (ownerDocument.__reactViewTransition = null); 11616 finishedAnimation(); 11617 passiveCallback(); 11618 }); 11619 return transition; 11620 } catch (x) { 11621 return mutationCallback(), layoutCallback(), finishedAnimation(), spawnedWorkCallback(), null; 11622 } 11623 } 11624 function ViewTransitionPseudoElement(pseudo, name) { 11625 this._scope = document.documentElement; 11626 this._selector = "::view-transition-" + pseudo + "(" + name + ")"; 11627 } 11628 function createViewTransitionInstance(name) { 11629 return { 11630 name, 11631 group: new ViewTransitionPseudoElement("group", name), 11632 imagePair: new ViewTransitionPseudoElement("image-pair", name), 11633 old: new ViewTransitionPseudoElement("old", name), 11634 new: new ViewTransitionPseudoElement("new", name) 11635 }; 11636 } 11637 function FragmentInstance(fragmentFiber) { 11638 this._fragmentFiber = fragmentFiber; 11639 this._observers = this._eventListeners = null; 11640 } 11641 function addEventListenerToChild(child, type, listener, optionsOrUseCapture) { 11642 getInstanceFromHostFiber(child).addEventListener(type, listener, optionsOrUseCapture); 11643 return !1; 11644 } 11645 function removeEventListenerFromChild(child, type, listener, optionsOrUseCapture) { 11646 getInstanceFromHostFiber(child).removeEventListener(type, listener, optionsOrUseCapture); 11647 return !1; 11648 } 11649 function getAttachOptions(opts) { 11650 return null != opts && "boolean" !== typeof opts && (!0 === opts.once || opts.signal instanceof AbortSignal) ? { 11651 capture: opts.capture, 11652 passive: opts.passive 11653 } : opts; 11654 } 11655 function normalizeListenerOptions(opts) { 11656 return null == opts ? "c=0" : "boolean" === typeof opts ? "c=" + (opts ? "1" : "0") : "c=" + (opts.capture ? "1" : "0"); 11657 } 11658 function indexOfEventListener(eventListeners, type, listener, optionsOrUseCapture) { 11659 if (0 === eventListeners.length) return -1; 11660 optionsOrUseCapture = normalizeListenerOptions(optionsOrUseCapture); 11661 for (var i = 0; i < eventListeners.length; i++) { 11662 var item = eventListeners[i]; 11663 if (item.type === type && item.listener === listener && normalizeListenerOptions(item.optionsOrUseCapture) === optionsOrUseCapture) return i; 11664 } 11665 return -1; 11666 } 11667 function setFocusOnFiberIfFocusable(fiber, focusOptions) { 11668 if (6 === fiber.tag) return !1; 11669 fiber = getInstanceFromHostFiber(fiber); 11670 return setFocusIfFocusable(fiber, focusOptions); 11671 } 11672 function collectChildren(child, collection) { 11673 collection.push(child); 11674 return !1; 11675 } 11676 function blurActiveElementWithinFragment(child, activeElement) { 11677 if (6 === child.tag) return !1; 11678 child = getInstanceFromHostFiber(child); 11679 return child === activeElement || child.contains(activeElement) ? (activeElement.blur(), !0) : !1; 11680 } 11681 function observeChild(child, observer) { 11682 if (6 === child.tag) return !1; 11683 child = getInstanceFromHostFiber(child); 11684 observer.observe(child); 11685 return !1; 11686 } 11687 function unobserveChild(child, observer) { 11688 if (6 === child.tag) return !1; 11689 child = getInstanceFromHostFiber(child); 11690 observer.unobserve(child); 11691 return !1; 11692 } 11693 function schedulePendingIntersectionUnobserve(fragmentInstance, observer, instance) { 11694 pendingIntersectionUnobserves.push({ 11695 fragmentInstance, 11696 observer, 11697 instance 11698 }); 11699 intersectionUnobserveScheduled || (intersectionUnobserveScheduled = !0, requestPostPaintCallback(function() { 11700 intersectionUnobserveScheduled = !1; 11701 var pending = pendingIntersectionUnobserves; 11702 pendingIntersectionUnobserves = []; 11703 for (var i = 0; i < pending.length; i++) { 11704 var item = pending[i]; 11705 item.observer.unobserve(item.instance); 11706 } 11707 })); 11708 } 11709 function collectClientRects(child, rects) { 11710 if (6 === child.tag) { 11711 child = child.stateNode; 11712 var range = child.ownerDocument.createRange(); 11713 range.selectNodeContents(child); 11714 rects.push.apply(rects, range.getClientRects()); 11715 } else child = getInstanceFromHostFiber(child), rects.push.apply(rects, child.getClientRects()); 11716 return !1; 11717 } 11718 function validateDocumentPositionWithFiberTree(documentPosition, fragmentFiber, precedingBoundaryFiber, followingBoundaryFiber, otherNode) { 11719 var otherFiber = getClosestInstanceFromNode(otherNode); 11720 if (documentPosition & Node.DOCUMENT_POSITION_CONTAINED_BY) { 11721 if (precedingBoundaryFiber = !!otherFiber) a: { 11722 for (; null !== otherFiber;) { 11723 if (7 === otherFiber.tag && (otherFiber === fragmentFiber || otherFiber.alternate === fragmentFiber)) { 11724 precedingBoundaryFiber = !0; 11725 break a; 11726 } 11727 otherFiber = otherFiber.return; 11728 } 11729 precedingBoundaryFiber = !1; 11730 } 11731 return precedingBoundaryFiber; 11732 } 11733 if (documentPosition & Node.DOCUMENT_POSITION_CONTAINS) { 11734 if (null === otherFiber) return otherFiber = otherNode.ownerDocument, otherNode === otherFiber || otherNode === otherFiber.documentElement || otherNode === otherFiber.body; 11735 a: { 11736 otherFiber = fragmentFiber; 11737 for (fragmentFiber = getFragmentParentInstanceOrContainerFiber(fragmentFiber); null !== otherFiber;) { 11738 if (!(5 !== otherFiber.tag && 3 !== otherFiber.tag && 27 !== otherFiber.tag || otherFiber !== fragmentFiber && otherFiber.alternate !== fragmentFiber)) { 11739 otherFiber = !0; 11740 break a; 11741 } 11742 otherFiber = otherFiber.return; 11743 } 11744 otherFiber = !1; 11745 } 11746 return otherFiber; 11747 } 11748 return documentPosition & Node.DOCUMENT_POSITION_PRECEDING ? ((fragmentFiber = !!otherFiber) && !(fragmentFiber = otherFiber === precedingBoundaryFiber) && (fragmentFiber = getLowestCommonAncestor(precedingBoundaryFiber, otherFiber, getParentForFragmentAncestors), null === fragmentFiber ? fragmentFiber = !1 : (traverseVisibleInstancesAndTextInstances(fragmentFiber, !0, isFiberPrecedingCheck, otherFiber, precedingBoundaryFiber), otherFiber = searchTarget, searchTarget = null, fragmentFiber = null !== otherFiber)), fragmentFiber) : documentPosition & Node.DOCUMENT_POSITION_FOLLOWING ? ((fragmentFiber = !!otherFiber) && !(fragmentFiber = otherFiber === followingBoundaryFiber) && (fragmentFiber = getLowestCommonAncestor(followingBoundaryFiber, otherFiber, getParentForFragmentAncestors), null === fragmentFiber ? fragmentFiber = !1 : (traverseVisibleInstancesAndTextInstances(fragmentFiber, !0, isFiberFollowingCheck, otherFiber, followingBoundaryFiber), otherFiber = searchTarget, searchBoundary = searchTarget = null, fragmentFiber = null !== otherFiber)), fragmentFiber) : !1; 11749 } 11750 function scrollTextNodeIntoView(textNode, resolvedAlignToTop) { 11751 var range = textNode.ownerDocument.createRange(); 11752 range.selectNodeContents(textNode); 11753 textNode = range.getBoundingClientRect(); 11754 window.scrollTo(window.scrollX + textNode.left, resolvedAlignToTop ? window.scrollY + textNode.top : window.scrollY + textNode.bottom - window.innerHeight); 11755 } 11756 function addFragmentHandleToFiber(child, fragmentInstance) { 11757 child = getInstanceFromHostFiber(child); 11758 addFragmentHandleToInstance(child, fragmentInstance); 11759 return !1; 11760 } 11761 function addFragmentHandleToInstance(instance, fragmentInstance) { 11762 instance.reactFragments ??= /* @__PURE__ */ new Set(); 11763 instance.reactFragments.add(fragmentInstance); 11764 } 11765 function commitNewChildToFragmentInstance(childInstance, fragmentInstance) { 11766 var eventListeners = fragmentInstance._eventListeners; 11767 if (null !== eventListeners) for (var i$jscomp$0 = 0; i$jscomp$0 < eventListeners.length; i$jscomp$0++) { 11768 var _eventListeners$i2 = eventListeners[i$jscomp$0]; 11769 childInstance.addEventListener(_eventListeners$i2.type, _eventListeners$i2.attachedListener, getAttachOptions(_eventListeners$i2.optionsOrUseCapture)); 11770 } 11771 3 !== childInstance.nodeType && (eventListeners = fragmentInstance._observers, null !== eventListeners && eventListeners.forEac
vendor: 5,804 bytes, lines 11771-11881
11771h(function(observer) { 11772 for (var writeIdx = 0, i = 0; i < pendingIntersectionUnobserves.length; i++) { 11773 var pending = pendingIntersectionUnobserves[i]; 11774 if (pending.fragmentInstance !== fragmentInstance || pending.observer !== observer || pending.instance !== childInstance) pendingIntersectionUnobserves[writeIdx++] = pending; 11775 } 11776 pendingIntersectionUnobserves.length = writeIdx; 11777 observer.observe(childInstance); 11778 }), addFragmentHandleToInstance(childInstance, fragmentInstance)); 11779 } 11780 function deleteChildFromFragmentInstance(childInstance, fragmentInstance) { 11781 var eventListeners = fragmentInstance._eventListeners; 11782 if (null !== eventListeners) for (var i = 0; i < eventListeners.length; i++) { 11783 var _eventListeners$i3 = eventListeners[i]; 11784 childInstance.removeEventListener(_eventListeners$i3.type, _eventListeners$i3.attachedListener, getAttachOptions(_eventListeners$i3.optionsOrUseCapture)); 11785 } 11786 3 !== childInstance.nodeType && (eventListeners = fragmentInstance._observers, null !== eventListeners && eventListeners.forEach(function(observer) { 11787 "string" === typeof observer.rootMargin ? schedulePendingIntersectionUnobserve(fragmentInstance, observer, childInstance) : observer.unobserve(childInstance); 11788 }), null != childInstance.reactFragments && childInstance.reactFragments.delete(fragmentInstance)); 11789 } 11790 function clearContainerSparingly(container) { 11791 var nextNode = container.firstChild; 11792 nextNode && 10 === nextNode.nodeType && (nextNode = nextNode.nextSibling); 11793 for (; nextNode;) { 11794 var node = nextNode; 11795 nextNode = nextNode.nextSibling; 11796 switch (node.nodeName) { 11797 case "HTML": 11798 case "HEAD": 11799 case "BODY": 11800 clearContainerSparingly(node); 11801 detachDeletedInstance(node); 11802 continue; 11803 case "SCRIPT": 11804 case "STYLE": continue; 11805 case "LINK": if ("stylesheet" === node.rel.toLowerCase()) continue; 11806 } 11807 container.removeChild(node); 11808 } 11809 } 11810 function canHydrateInstance(instance, type, props, inRootOrSingleton) { 11811 for (; 1 === instance.nodeType;) { 11812 var anyProps = props; 11813 if (instance.nodeName.toLowerCase() !== type.toLowerCase()) { 11814 if (!inRootOrSingleton && ("INPUT" !== instance.nodeName || "hidden" !== instance.type)) break; 11815 } else if (!inRootOrSingleton) if ("input" === type && "hidden" === instance.type) { 11816 checkAttributeStringCoercion(anyProps.name, "name"); 11817 var name = null == anyProps.name ? null : "" + anyProps.name; 11818 if ("hidden" === anyProps.type && instance.getAttribute("name") === name) return instance; 11819 } else return instance; 11820 else if (!instance[internalHoistableMarker]) switch (type) { 11821 case "meta": 11822 if (!instance.hasAttribute("itemprop")) break; 11823 return instance; 11824 case "link": 11825 name = instance.getAttribute("rel"); 11826 if ("stylesheet" === name && instance.hasAttribute("data-precedence")) break; 11827 else if (name !== anyProps.rel || instance.getAttribute("href") !== (null == anyProps.href || "" === anyProps.href ? null : anyProps.href) || instance.getAttribute("crossorigin") !== (null == anyProps.crossOrigin ? null : anyProps.crossOrigin) || instance.getAttribute("title") !== (null == anyProps.title ? null : anyProps.title)) break; 11828 return instance; 11829 case "style": 11830 if (instance.hasAttribute("data-precedence")) break; 11831 return instance; 11832 case "script": 11833 name = instance.getAttribute("src"); 11834 if ((name !== (null == anyProps.src ? null : anyProps.src) || instance.getAttribute("type") !== (null == anyProps.type ? null : anyProps.type) || instance.getAttribute("crossorigin") !== (null == anyProps.crossOrigin ? null : anyProps.crossOrigin)) && name && instance.hasAttribute("async") && !instance.hasAttribute("itemprop")) break; 11835 return instance; 11836 default: return instance; 11837 } 11838 instance = getNextHydratable(instance.nextSibling); 11839 if (null === instance) break; 11840 } 11841 return null; 11842 } 11843 function canHydrateTextInstance(instance, text, inRootOrSingleton) { 11844 if ("" === text) return null; 11845 for (; 3 !== instance.nodeType;) { 11846 if ((1 !== instance.nodeType || "INPUT" !== instance.nodeName || "hidden" !== instance.type) && !inRootOrSingleton) return null; 11847 instance = getNextHydratable(instance.nextSibling); 11848 if (null === instance) return null; 11849 } 11850 return instance; 11851 } 11852 function canHydrateHydrationBoundary(instance, inRootOrSingleton) { 11853 for (; 8 !== instance.nodeType;) { 11854 if ((1 !== instance.nodeType || "INPUT" !== instance.nodeName || "hidden" !== instance.type) && !inRootOrSingleton) return null; 11855 instance = getNextHydratable(instance.nextSibling); 11856 if (null === instance) return null; 11857 } 11858 return instance; 11859 } 11860 function isSuspenseInstancePending(instance) { 11861 return instance.data === SUSPENSE_PENDING_START_DATA || instance.data === SUSPENSE_QUEUED_START_DATA; 11862 } 11863 function isSuspenseInstanceFallback(instance) { 11864 return instance.data === SUSPENSE_FALLBACK_START_DATA || instance.data === SUSPENSE_PENDING_START_DATA && instance.ownerDocument.readyState !== DOCUMENT_READY_STATE_LOADING; 11865 } 11866 function registerSuspenseInstanceRetry(instance, callback) { 11867 var ownerDocument = instance.ownerDocument; 11868 if (instance.data === SUSPENSE_QUEUED_START_DATA) instance._reactRetry = callback; 11869 else if (instance.data !== SUSPENSE_PENDING_START_DATA || ownerDocument.readyState !== DOCUMENT_READY_STATE_LOADING) callback(); 11870 else { 11871 var listener = function() { 11872 callback(); 11873 ownerDocument.removeEventListener("DOMContentLoaded", listener); 11874 }; 11875 ownerDocument.addEventListener("DOMContentLoaded", listener); 11876 instance._reactRetry = listener; 11877 } 11878 } 11879 function getNextHydratable(node) { 11880 for (; null != node; node = node.nextSibling) { 11881 var nodeType = node.nodeType;
11882 if (1 === nodeType || 3 === nodeType) break; 11883 if (8 === nodeType) { 11884 nodeType = node.data; 11885 if (nodeType === SUSPENSE_START_DATA || nodeType === SUSPENSE_FALLBACK_START_DATA || nodeType === SUSPENSE_PENDING_START_DATA || nodeType === SUSPENSE_QUEUED_START_DATA || nodeType === ACTIVITY_START_DATA || nodeType === FORM_STATE_IS_MATCHING || nodeType === FORM_STATE_IS_NOT_MATCHING) break; 11886 if (nodeType === SUSPENSE_END_DATA || nodeType === ACTIVITY_END_DATA) return null; 11887 } 11888 } 11889 return node; 11890 } 11891 function describeHydratableInstanceForDevWarnings(instance) { 11892 if (1 === instance.nodeType) { 11893 for (var JSCompiler_temp_const = instance.nodeName.toLowerCase(), serverDifferences = {}, attributes = instance.attributes, i = 0; i < attributes.length; i++) { 11894 var attr = attributes[i]; 11895 serverDifferences[getPropNameFromAttributeName(attr.name)] = "style" === attr.name.toLowerCase() ? getStylesObjectFromElement(instance) : attr.value; 11896 } 11897 return { 11898 type: JSCompiler_temp_const, 11899 props: serverDifferences 11900 }; 11901 } 11902 return 8 === instance.nodeType ? instance.data === ACTIVITY_START_DATA ? { 11903 type: "Activity", 11904 props: {} 11905 } : { 11906 type: "Suspense", 11907 props: {} 11908 } : instance.nodeValue; 11909 } 11910 function diffHydratedTextForDevWarnings(textInstance, text, parentProps) { 11911 return null === parentProps || !0 !== parentProps[SUPPRESS_HYDRATION_WARNING] ? (textInstance.nodeValue === text ? textInstance = null : (text = normalizeMarkupForTextOrAttribute(text), textInstance = normalizeMarkupForTextOrAttribute(textInstance.nodeValue) === text ? null : textInstance.nodeValue), textInstance) : null; 11912 } 11913 function getNextHydratableInstanceAfterHydrationBoundary(hydrationInstance) { 11914 hydrationInstance = hydrationInstance.nextSibling; 11915 for (var depth = 0; hydrationInstance;) { 11916 if (8 === hydrationInstance.nodeType) { 11917 var data = hydrationInstance.data; 11918 if (data === SUSPENSE_END_DATA || data === ACTIVITY_END_DATA) { 11919 if (0 === depth) return getNextHydratable(hydrationInstance.nextSibling); 11920 depth--; 11921 } else data !== SUSPENSE_START_DATA && data !== SUSPENSE_FALLBACK_START_DATA && data !== SUSPENSE_PENDING_START_DATA && data !== SUSPENSE_QUEUED_START_DATA && data !== ACTIVITY_START_DATA || depth++; 11922 } 11923 hydrationInstance = hydrationInstance.nextSibling; 11924 } 11925 return null; 11926 } 11927 function getParentHydrationBoundary(targetInstance) { 11928 targetInstance = targetInstance.previousSibling; 11929 for (var depth = 0; targetInstance;) { 11930 if (8 === targetInstance.nodeType) { 11931 var data = targetInstance.data; 11932 if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_QUEUED_START_DATA || data === ACTIVITY_START_DATA) { 11933 if (0 === depth) return targetInstance; 11934 depth--; 11935 } else data !== SUSPENSE_END_DATA && data !== ACTIVITY_END_DATA || depth++; 11936 } 11937 targetInstance = targetInstance.previousSibling; 11938 } 11939 return null; 11940 } 11941 function commitHydratedContainer(container) { 11942 retryIfBlockedOn(container); 11943 } 11944 function commitHydratedActivityInstance(activityInstance) { 11945 retryIfBlockedOn(activityInstance); 11946 } 11947 function commitHydratedSuspenseInstance(suspenseInstance) { 11948 retryIfBlockedOn(suspenseInstance); 11949 } 11950 function setFocusIfFocusable(node, focusOptions) { 11951 function handleFocus() { 11952 didFocus = !0; 11953 } 11954 if (node.ownerDocument.activeElement === node) return !0; 11955 var didFocus = !1; 11956 try { 11957 node.ownerDocument.addEventListener("focus", handleFocus, !0), (node.focus || HTMLElement.prototype.focus).call(node, focusOptions); 11958 } finally { 11959 node.ownerDocument.removeEventListener("focus", handleFocus, !0); 11960 } 11961 return didFocus; 11962 } 11963 function requestPostPaintCallback(callback) { 11964 localRequestAnimationFrame(function() { 11965 localRequestAnimationFrame(function(time) { 11966 return callback(time); 11967 }); 11968 }); 11969 } 11970 function resolveSingletonInstance(type, props, rootContainerInstance, hostContext, validateDOMNestingDev) { 11971 validateDOMNestingDev && validateDOMNesting(type, hostContext.ancestorInfo); 11972 props = getOwnerDocumentFromRootContainer(rootContainerInstance); 11973 switch (type) { 11974 case "html": 11975 type = props.documentElement; 11976 if (!type) throw Error("React expected an <html> element (document.documentElement) to exist in the Document but one was not found. React never removes the documentElement for any Document it renders into so the cause is likely in some other script running on this page."); 11977 return type; 11978 case "head": 11979 type = props.head; 11980 if (!type) throw Error("React expected a <head> element (document.head) to exist in the Document but one was not found. React never removes the head for any Document it renders into so the cause is likely in some other script running on this page."); 11981 return type; 11982 case "body": 11983 type = props.body; 11984 if (!type) throw Error("React expected a <body> element (document.body) to exist in the Document but one was not found. React never removes the body for any Document it renders into so the cause is likely in some other script running on this page."); 11985 return type; 11986 default: throw Error("resolveSingletonInstance was called with an element type that is not supported. This is a bug in React."); 11987 } 11988 } 11989 function acquireSingletonInstance(type, props, instance, internalInstanceHandle) { 11990 if (!instance[internalContainerInstanceKey] && getInstanceFromNode(instance)) { 11991 var tagName = instance.tagName.toLowerCase(); 11992 console.error("You are mounting a new %s component when a previous one has not first unmounted. It is an error to render more than one %s component at a time and attributes and children of these components will likely fail in unpredictable ways. Please only render a single instance of <%s> and if you need to mount a new one, ensure any previous ones have unmounted first.", tagName, tagName, tagName); 11993 } 11994 switch (type) { 11995 case "html": 11996 case "head":
vendor: 13,358 bytes, lines 11997-12220
11997 case "body": break; 11998 default: console.error("acquireSingletonInstance was called with an element type that is not supported. This is a bug in React."); 11999 } 12000 for (tagName = instance.attributes; tagName.length;) instance.removeAttributeNode(tagName[0]); 12001 setInitialProperties(instance, type, props); 12002 instance[internalInstanceKey] = internalInstanceHandle; 12003 instance[internalPropsKey] = props; 12004 } 12005 function releaseSingletonInstance(instance, type, props) { 12006 for (var propKey in props) { 12007 var propValue = props[propKey]; 12008 props.hasOwnProperty(propKey) && null != propValue && setProp(instance, type, propKey, null, emptyProps, propValue); 12009 } 12010 null != props.dangerouslySetInnerHTML && (instance.textContent = ""); 12011 instance.onclick === noop$1 && (instance.onclick = null); 12012 detachDeletedInstance(instance); 12013 } 12014 function clearSingletonPreambleContribution(instance) { 12015 for (var attributes = instance.attributes; attributes.length;) instance.removeAttributeNode(attributes[0]); 12016 detachDeletedInstance(instance); 12017 } 12018 function getHoistableRoot(container) { 12019 if ("function" === typeof container.getRootNode) { 12020 var rootNode = container.getRootNode(); 12021 if (9 === rootNode.nodeType || 11 === rootNode.nodeType) return rootNode; 12022 } 12023 return 9 === container.nodeType ? container : container.ownerDocument; 12024 } 12025 function preconnectAs(rel, href, crossOrigin) { 12026 var ownerDocument = globalDocument; 12027 if (ownerDocument && "string" === typeof href && href) { 12028 var limitedEscapedHref = escapeSelectorAttributeValueInsideDoubleQuotes(href); 12029 limitedEscapedHref = "link[rel=\"" + rel + "\"][href=\"" + limitedEscapedHref + "\"]"; 12030 "string" === typeof crossOrigin && (limitedEscapedHref += "[crossorigin=\"" + crossOrigin + "\"]"); 12031 preconnectsSet.has(limitedEscapedHref) || (preconnectsSet.add(limitedEscapedHref), rel = { 12032 rel, 12033 crossOrigin, 12034 href 12035 }, null === ownerDocument.querySelector(limitedEscapedHref) && (href = ownerDocument.createElement("link"), setInitialProperties(href, "link", rel), markNodeAsHoistable(href), ownerDocument.head.appendChild(href))); 12036 } 12037 } 12038 function getResource(type, currentProps, pendingProps, currentResource) { 12039 var resourceRoot = (resourceRoot = rootInstanceStackCursor.current) ? getHoistableRoot(resourceRoot) : null; 12040 if (!resourceRoot) throw Error("\"resourceRoot\" was expected to exist. This is a bug in React."); 12041 switch (type) { 12042 case "meta": 12043 case "title": return null; 12044 case "style": return "string" === typeof pendingProps.precedence && "string" === typeof pendingProps.href ? (pendingProps = getStyleKey(pendingProps.href), currentProps = getResourcesFromRoot(resourceRoot).hoistableStyles, currentResource = currentProps.get(pendingProps), currentResource || (currentResource = { 12045 type: "style", 12046 instance: null, 12047 count: 0, 12048 state: null 12049 }, currentProps.set(pendingProps, currentResource)), currentResource) : { 12050 type: "void", 12051 instance: null, 12052 count: 0, 12053 state: null 12054 }; 12055 case "link": 12056 if ("stylesheet" === pendingProps.rel && "string" === typeof pendingProps.href && "string" === typeof pendingProps.precedence) { 12057 type = getStyleKey(pendingProps.href); 12058 var _styles = getResourcesFromRoot(resourceRoot).hoistableStyles, _resource = _styles.get(type); 12059 _resource || (resourceRoot = resourceRoot.ownerDocument || resourceRoot, _resource = { 12060 type: "stylesheet", 12061 instance: null, 12062 count: 0, 12063 state: { 12064 loading: NotLoaded, 12065 preload: null 12066 } 12067 }, _styles.set(type, _resource), (_styles = resourceRoot.querySelector(getStylesheetSelectorFromKey(type))) ? _styles._p || (_resource.instance = _styles, _resource.state.loading = Loaded | Inserted) : (_styles = preloadPropsMap.get(type), _styles || (_styles = { 12068 rel: "preload", 12069 as: "style", 12070 href: pendingProps.href, 12071 crossOrigin: pendingProps.crossOrigin, 12072 integrity: pendingProps.integrity, 12073 media: pendingProps.media, 12074 hrefLang: pendingProps.hrefLang, 12075 referrerPolicy: pendingProps.referrerPolicy 12076 }, preloadPropsMap.set(type, _styles)), preloadStylesheet(resourceRoot, type, _styles, _resource.state))); 12077 if (currentProps && null === currentResource) throw pendingProps = "\n\n - " + describeLinkForResourceErrorDEV(currentProps) + "\n + " + describeLinkForResourceErrorDEV(pendingProps), Error("Expected <link> not to update to be updated to a stylesheet with precedence. Check the `rel`, `href`, and `precedence` props of this component. Alternatively, check whether two different <link> components render in the same slot or share the same key." + pendingProps); 12078 return _resource; 12079 } 12080 if (currentProps && null !== currentResource) throw pendingProps = "\n\n - " + describeLinkForResourceErrorDEV(currentProps) + "\n + " + describeLinkForResourceErrorDEV(pendingProps), Error("Expected stylesheet with precedence to not be updated to a different kind of <link>. Check the `rel`, `href`, and `precedence` props of this component. Alternatively, check whether two different <link> components render in the same slot or share the same key." + pendingProps); 12081 return null; 12082 case "script": return currentProps = pendingProps.async, pendingProps = pendingProps.src, "string" === typeof pendingProps && currentProps && "function" !== typeof currentProps && "symbol" !== typeof currentProps ? (pendingProps = getScriptKey(pendingProps), currentProps = getResourcesFromRoot(resourceRoot).hoistableScripts, currentResource = currentProps.get(pendingProps), currentResource || (currentResource = { 12083 type: "script", 12084 instance: null, 12085 count: 0, 12086 state: null 12087 }, currentProps.set(pendingProps, currentResource)), currentResource) : { 12088 type: "void", 12089 instance: null, 12090 count: 0, 12091 state: null 12092 }; 12093 default: throw Error("getResource encountered a type it did not expect: \"" + type + "\". this is a bug in React."); 12094 } 12095 } 12096 function describeLinkForResourceErrorDEV(props) { 12097 var describedProps = 0, description = "<link"; 12098 "string" === typeof props.rel ? (describedProps++, description += " rel=\"" + props.rel + "\"") : hasOwnProperty.call(props, "rel") && (describedProps++, description += " rel=\"" + (null === props.rel ? "null" : "invalid type " + typeof props.rel) + "\""); 12099 "string" === typeof props.href ? (describedProps++, description += " href=\"" + props.href + "\"") : hasOwnProperty.call(props, "href") && (describedProps++, description += " href=\"" + (null === props.href ? "null" : "invalid type " + typeof props.href) + "\""); 12100 "string" === typeof props.precedence ? (describedProps++, description += " precedence=\"" + props.precedence + "\"") : hasOwnProperty.call(props, "precedence") && (describedProps++, description += " precedence={" + (null === props.precedence ? "null" : "invalid type " + typeof props.precedence) + "}"); 12101 Object.getOwnPropertyNames(props).length > describedProps && (description += " ..."); 12102 return description + " />"; 12103 } 12104 function getStyleKey(href) { 12105 return "href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\""; 12106 } 12107 function getStylesheetSelectorFromKey(key) { 12108 return "link[rel=\"stylesheet\"][" + key + "]"; 12109 } 12110 function stylesheetPropsFromRawProps(rawProps) { 12111 return assign({}, rawProps, { 12112 "data-precedence": rawProps.precedence, 12113 precedence: null 12114 }); 12115 } 12116 function preloadStylesheet(ownerDocument, key, preloadProps, state) { 12117 if (key = ownerDocument.querySelector("link[rel=\"preload\"][as=\"style\"][" + key + "]")) { 12118 if (!0 !== key[internalLoadPendingKey]) { 12119 state.loading = Loaded; 12120 return; 12121 } 12122 } else key = ownerDocument.createElement("link"), key[internalLoadPendingKey] = !0, key.onload = key.onerror = clearPendingLoadOnNode.bind(null, key), setInitialProperties(key, "link", preloadProps), markNodeAsHoistable(key), ownerDocument.head.appendChild(key); 12123 state.preload = key; 12124 key.addEventListener("load", function() { 12125 return state.loading |= Loaded; 12126 }); 12127 key.addEventListener("error", function() { 12128 return state.loading |= Errored; 12129 }); 12130 } 12131 function getScriptKey(src) { 12132 return "[src=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(src) + "\"]"; 12133 } 12134 function getScriptSelectorFromKey(key) { 12135 return "script[async]" + key; 12136 } 12137 function acquireResource(hoistableRoot, resource, props) { 12138 resource.count++; 12139 if (null === resource.instance) switch (resource.type) { 12140 case "style": 12141 var instance = hoistableRoot.querySelector("style[data-href~=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(props.href) + "\"]"); 12142 if (instance) return resource.instance = instance, markNodeAsHoistable(instance), instance; 12143 var styleProps = assign({}, props, { 12144 "data-href": props.href, 12145 "data-precedence": props.precedence, 12146 href: null, 12147 precedence: null 12148 }); 12149 instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement("style"); 12150 markNodeAsHoistable(instance); 12151 setInitialProperties(instance, "style", styleProps); 12152 insertStylesheet(instance, props.precedence, hoistableRoot); 12153 return resource.instance = instance; 12154 case "stylesheet": 12155 styleProps = getStyleKey(props.href); 12156 var _instance = hoistableRoot.querySelector(getStylesheetSelectorFromKey(styleProps)); 12157 if (_instance) return resource.state.loading |= Inserted, resource.instance = _instance, markNodeAsHoistable(_instance), _instance; 12158 instance = stylesheetPropsFromRawProps(props); 12159 (styleProps = preloadPropsMap.get(styleProps)) && adoptPreloadPropsForStylesheet(instance, styleProps); 12160 _instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement("link"); 12161 markNodeAsHoistable(_instance); 12162 var linkInstance = _instance; 12163 linkInstance._p = new Promise(function(resolve, reject) { 12164 linkInstance.onload = resolve; 12165 linkInstance.onerror = reject; 12166 }); 12167 setInitialProperties(_instance, "link", instance); 12168 resource.state.loading |= Inserted; 12169 insertStylesheet(_instance, props.precedence, hoistableRoot); 12170 return resource.instance = _instance; 12171 case "script": 12172 _instance = getScriptKey(props.src); 12173 if (styleProps = hoistableRoot.querySelector(getScriptSelectorFromKey(_instance))) return resource.instance = styleProps, markNodeAsHoistable(styleProps), styleProps; 12174 instance = props; 12175 if (styleProps = preloadPropsMap.get(_instance)) instance = assign({}, props), adoptPreloadPropsForScript(instance, styleProps); 12176 hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot; 12177 styleProps = hoistableRoot.createElement("script"); 12178 markNodeAsHoistable(styleProps); 12179 setInitialProperties(styleProps, "link", instance); 12180 hoistableRoot.head.appendChild(styleProps); 12181 return resource.instance = styleProps; 12182 case "void": return null; 12183 default: throw Error("acquireResource encountered a resource type it did not expect: \"" + resource.type + "\". this is a bug in React."); 12184 } 12185 else "stylesheet" === resource.type && (resource.state.loading & Inserted) === NotLoaded && (instance = resource.instance, resource.state.loading |= Inserted, insertStylesheet(instance, props.precedence, hoistableRoot)); 12186 return resource.instance; 12187 } 12188 function insertStylesheet(instance, precedence, root) { 12189 for (var nodes = root.querySelectorAll("link[rel=\"stylesheet\"][data-precedence],style[data-precedence]"), last = nodes.length ? nodes[nodes.length - 1] : null, prior = last, i = 0; i < nodes.length; i++) { 12190 var node = nodes[i]; 12191 if (node.dataset.precedence === precedence) prior = node; 12192 else if (prior !== last) break; 12193 } 12194 prior ? prior.parentNode.insertBefore(instance, prior.nextSibling) : (precedence = 9 === root.nodeType ? root.head : root, precedence.insertBefore(instance, precedence.firstChild)); 12195 } 12196 function adoptPreloadPropsForStylesheet(stylesheetProps, preloadProps) { 12197 stylesheetProps.crossOrigin ??= preloadProps.crossOrigin; 12198 stylesheetProps.referrerPolicy ??= preloadProps.referrerPolicy; 12199 stylesheetProps.title ??= preloadProps.title; 12200 } 12201 function adoptPreloadPropsForScript(scriptProps, preloadProps) { 12202 scriptProps.crossOrigin ??= preloadProps.crossOrigin; 12203 scriptProps.referrerPolicy ??= preloadProps.referrerPolicy; 12204 scriptProps.integrity ??= preloadProps.integrity; 12205 } 12206 function getHydratableHoistableCache(type, keyAttribute, ownerDocument) { 12207 if (null === tagCaches) { 12208 var cache = /* @__PURE__ */ new Map(); 12209 var caches = tagCaches = /* @__PURE__ */ new Map(); 12210 caches.set(ownerDocument, cache); 12211 } else caches = tagCaches, cache = caches.get(ownerDocument), cache || (cache = /* @__PURE__ */ new Map(), caches.set(ownerDocument, cache)); 12212 if (cache.has(type)) return cache; 12213 cache.set(type, null); 12214 ownerDocument = ownerDocument.getElementsByTagName(type); 12215 for (caches = 0; caches < ownerDocument.length; caches++) { 12216 var node = ownerDocument[caches]; 12217 if (!(node[internalHoistableMarker] || node[internalInstanceKey] || "link" === type && "stylesheet" === node.getAttribute("rel")) && node.namespaceURI !== SVG_NAMESPACE) { 12218 var nodeKey = node.getAttribute(keyAttribute) || ""; 12219 nodeKey = type + nodeKey; 12220 var existing = cache.get(nodeKey);
12221 existing ? existing.push(node) : cache.set(nodeKey, [node]); 12222 } 12223 } 12224 return cache; 12225 } 12226 function mountHoistable(hoistableRoot, type, instance) { 12227 hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot; 12228 hoistableRoot.head.insertBefore(instance, "title" === type ? hoistableRoot.querySelector("head > title") : null); 12229 } 12230 function isHostHoistableType(type, props, hostContext) { 12231 var outsideHostContainerContext = !hostContext.ancestorInfo.containerTagInScope; 12232 if (hostContext.context === HostContextNamespaceSvg || null != props.itemProp) return !outsideHostContainerContext || null == props.itemProp || "meta" !== type && "title" !== type && "style" !== type && "link" !== type && "script" !== type || console.error("Cannot render a <%s> outside the main document if it has an `itemProp` prop. `itemProp` suggests the tag belongs to an `itemScope` which can appear anywhere in the DOM. If you were intending for React to hoist this <%s> remove the `itemProp` prop. Otherwise, try moving this tag into the <head> or <body> of the Document.", type, type), !1; 12233 switch (type) { 12234 case "meta": 12235 case "title": return !0; 12236 case "style": 12237 if ("string" !== typeof props.precedence || "string" !== typeof props.href || "" === props.href) { 12238 outsideHostContainerContext && console.error("Cannot render a <style> outside the main document without knowing its precedence and a unique href key. React can hoist and deduplicate <style> tags if you provide a `precedence` prop along with an `href` prop that does not conflict with the `href` values used in any other hoisted <style> or <link rel=\"stylesheet\" ...> tags. Note that hoisting <style> tags is considered an advanced feature that most will not use directly. Consider moving the <style> tag to the <head> or consider adding a `precedence=\"default\"` and `href=\"some unique resource identifier\"`."); 12239 break; 12240 } 12241 return !0; 12242 case "link": 12243 if ("string" !== typeof props.rel || "string" !== typeof props.href || "" === props.href || props.onLoad || props.onError) { 12244 if ("stylesheet" === props.rel && "string" === typeof props.precedence) { 12245 type = props.href; 12246 var onError = props.onError, disabled = props.disabled; 12247 hostContext = []; 12248 props.onLoad && hostContext.push("`onLoad`"); 12249 onError && hostContext.push("`onError`"); 12250 null != disabled && hostContext.push("`disabled`"); 12251 onError = propNamesListJoin(hostContext, "and"); 12252 onError += 1 === hostContext.length ? " prop" : " props"; 12253 disabled = 1 === hostContext.length ? "an " + onError : "the " + onError; 12254 hostContext.length && console.error("React encountered a <link rel=\"stylesheet\" href=\"%s\" ... /> with a `precedence` prop that also included %s. The presence of loading and error handlers indicates an intent to manage the stylesheet loading state from your from your Component code and React will not hoist or deduplicate this stylesheet. If your intent was to have React hoist and deduplciate this stylesheet using the `precedence` prop remove the %s, otherwise remove the `precedence` prop.", type, disabled, onError); 12255 } 12256 outsideHostContainerContext && ("string" !== typeof props.rel || "string" !== typeof props.href || "" === props.href ? console.error("Cannot render a <link> outside the main document without a `rel` and `href` prop. Try adding a `rel` and/or `href` prop to this <link> or moving the link into the <head> tag") : (props.onError || props.onLoad) && console.error("Cannot render a <link> with onLoad or onError listeners outside the main document. Try removing onLoad={...} and onError={...} or moving it into the root <head> tag or somewhere in the <body>.")); 12257 break; 12258 } 12259 switch (props.rel) { 12260 case "stylesheet": return type = props.precedence, props = props.disabled, "string" !== typeof type && outsideHostContainerContext && console.error("Cannot render a <link rel=\"stylesheet\" /> outside the main document without knowing its precedence. Consider adding precedence=\"default\" or moving it into the root <head> tag."), "string" === typeof type && null == props; 12261 default: return !0; 12262 } 12263 case "script": 12264 type = props.async && "function" !== typeof props.async && "symbol" !== typeof props.async; 12265 if (!type || props.onLoad || props.onError || !props.src || "string" !== typeof props.src) { 12266 outsideHostContainerContext && (type ? props.onLoad || props.onError ? console.error("Cannot render a <script> with onLoad or onError listeners outside the main document. Try removing onLoad={...} and onError={...} or moving it into the root <head> tag or somewhere in the <body>.") : console.error("Cannot render a <script> outside the main document without `async={true}` and a non-empty `src` prop. Ensure there is a valid `src` and either make the script async or move it into the root <head> tag or somewhere in the <body>.") : console.error("Cannot render a sync or defer <script> outside the main document without knowing its order. Try adding async=\"\" or moving it into the root <head> tag.")); 12267 break; 12268 } 12269 return !0; 12270 case "noscript": 12271 case "template": outsideHostContainerContext && console.error("Cannot render <%s> outside the main document. Try moving it into the root <head> tag.", type); 12272 } 12273 return !1; 12274 } 12275 function maySuspendCommit(type, props) { 12276 return "img" === type && null != props.src && "" !== props.src && null == props.onLoad && "lazy" !== props.loading; 12277 } 12278 function preloadResource(resource) { 12279 return "stylesheet" === resource.type && (resource.state.loading & Settled) === NotLoaded ? !1 : !0; 12280 } 12281 function estimateImageBytes(instance) { 12282 return (instance.width || 100) * (instance.height || 100) * ("number" === typeof devicePixelRatio ? devicePixelRatio : 1) * .25; 12283 } 12284 function suspendInstance(state, instance) { 12285 "function" === typeof instance.decode && (state.imgCount++, instance.complete || (state.imgBytes += estimateImageBytes(instance), state.suspenseyImages.push(instance)), state = onUnsuspendImg.b
vendor: 11,964 bytes, lines 12285-12517
12285ind(state), instance.decode().then(state, state)); 12286 } 12287 function suspendResource(state, hoistableRoot, resource, props) { 12288 if ("stylesheet" === resource.type && ("string" !== typeof props.media || !1 !== matchMedia(props.media).matches) && (resource.state.loading & Inserted) === NotLoaded) { 12289 if (null === resource.instance) { 12290 var key = getStyleKey(props.href), instance = hoistableRoot.querySelector(getStylesheetSelectorFromKey(key)); 12291 if (instance) { 12292 hoistableRoot = instance._p; 12293 null !== hoistableRoot && "object" === typeof hoistableRoot && "function" === typeof hoistableRoot.then && (state.count++, state = onUnsuspend.bind(state), hoistableRoot.then(state, state)); 12294 resource.state.loading |= Inserted; 12295 resource.instance = instance; 12296 markNodeAsHoistable(instance); 12297 return; 12298 } 12299 instance = hoistableRoot.ownerDocument || hoistableRoot; 12300 props = stylesheetPropsFromRawProps(props); 12301 (key = preloadPropsMap.get(key)) && adoptPreloadPropsForStylesheet(props, key); 12302 instance = instance.createElement("link"); 12303 markNodeAsHoistable(instance); 12304 var linkInstance = instance; 12305 linkInstance._p = new Promise(function(resolve, reject) { 12306 linkInstance.onload = resolve; 12307 linkInstance.onerror = reject; 12308 }); 12309 setInitialProperties(instance, "link", props); 12310 resource.instance = instance; 12311 } 12312 null === state.stylesheets && (state.stylesheets = /* @__PURE__ */ new Map()); 12313 state.stylesheets.set(resource, hoistableRoot); 12314 (hoistableRoot = resource.state.preload) && (resource.state.loading & Settled) === NotLoaded && (state.count++, resource = onUnsuspend.bind(state), hoistableRoot.addEventListener("load", resource), hoistableRoot.addEventListener("error", resource)); 12315 } 12316 } 12317 function waitForCommitToBeReady(state, timeoutOffset) { 12318 state.stylesheets && 0 === state.count && insertSuspendedStylesheets(state, state.stylesheets); 12319 return 0 < state.count || 0 < state.imgCount ? function(commit) { 12320 var stylesheetTimer = setTimeout(function() { 12321 state.stylesheets && insertSuspendedStylesheets(state, state.stylesheets); 12322 if (state.unsuspend) { 12323 var unsuspend = state.unsuspend; 12324 state.unsuspend = null; 12325 unsuspend(); 12326 } 12327 }, SUSPENSEY_STYLESHEET_TIMEOUT + timeoutOffset); 12328 0 < state.imgBytes && 0 === estimatedBytesWithinLimit && (estimatedBytesWithinLimit = 125 * estimateBandwidth() * SUSPENSEY_IMAGE_TIME_ESTIMATE); 12329 var imgTimer = setTimeout(function() { 12330 state.waitingForImages = !1; 12331 if (0 === state.count && (state.stylesheets && insertSuspendedStylesheets(state, state.stylesheets), state.unsuspend)) { 12332 var unsuspend = state.unsuspend; 12333 state.unsuspend = null; 12334 unsuspend(); 12335 } 12336 }, (state.imgBytes > estimatedBytesWithinLimit ? 50 : SUSPENSEY_IMAGE_TIMEOUT) + timeoutOffset); 12337 state.unsuspend = commit; 12338 return function() { 12339 state.unsuspend = null; 12340 clearTimeout(stylesheetTimer); 12341 clearTimeout(imgTimer); 12342 }; 12343 } : null; 12344 } 12345 function checkIfFullyUnsuspended(state) { 12346 if (0 === state.count && (0 === state.imgCount || !state.waitingForImages)) { 12347 if (state.stylesheets) insertSuspendedStylesheets(state, state.stylesheets); 12348 else if (state.unsuspend) { 12349 var unsuspend = state.unsuspend; 12350 state.unsuspend = null; 12351 unsuspend(); 12352 } 12353 } 12354 } 12355 function onUnsuspend() { 12356 this.count--; 12357 checkIfFullyUnsuspended(this); 12358 } 12359 function onUnsuspendImg() { 12360 this.imgCount--; 12361 checkIfFullyUnsuspended(this); 12362 } 12363 function insertSuspendedStylesheets(state, resources) { 12364 state.stylesheets = null; 12365 null !== state.unsuspend && (state.count++, precedencesByRoot = /* @__PURE__ */ new Map(), resources.forEach(insertStylesheetIntoRoot, state), precedencesByRoot = null, onUnsuspend.call(state)); 12366 } 12367 function insertStylesheetIntoRoot(root, resource) { 12368 if (!(resource.state.loading & Inserted)) { 12369 var precedences = precedencesByRoot.get(root); 12370 if (precedences) var last = precedences.get(LAST_PRECEDENCE); 12371 else { 12372 precedences = /* @__PURE__ */ new Map(); 12373 precedencesByRoot.set(root, precedences); 12374 for (var nodes = root.querySelectorAll("link[data-precedence],style[data-precedence]"), i = 0; i < nodes.length; i++) { 12375 var node = nodes[i]; 12376 if ("LINK" === node.nodeName || "not all" !== node.getAttribute("media")) precedences.set(node.dataset.precedence, node), last = node; 12377 } 12378 last && precedences.set(LAST_PRECEDENCE, last); 12379 } 12380 nodes = resource.instance; 12381 node = nodes.getAttribute("data-precedence"); 12382 i = precedences.get(node) || last; 12383 i === last && precedences.set(LAST_PRECEDENCE, nodes); 12384 precedences.set(node, nodes); 12385 this.count++; 12386 last = onUnsuspend.bind(this); 12387 nodes.addEventListener("load", last); 12388 nodes.addEventListener("error", last); 12389 i ? i.parentNode.insertBefore(nodes, i.nextSibling) : (root = 9 === root.nodeType ? root.head : root, root.insertBefore(nodes, root.firstChild)); 12390 resource.state.loading |= Inserted; 12391 } 12392 } 12393 function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator, formState) { 12394 this.tag = 1; 12395 this.containerInfo = containerInfo; 12396 this.pingCache = this.current = this.pendingChildren = null; 12397 this.timeoutHandle = noTimeout; 12398 this.callbackNode = this.next = this.pendingContext = this.context = this.cancelPendingCommit = null; 12399 this.callbackPriority = 0; 12400 this.expirationTimes = createLaneMap(-1); 12401 this.entangledLanes = this.shellSuspendCounter = this.errorRecoveryDisabledLanes = this.expiredLanes = this.warmLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0; 12402 this.entanglements = createLaneMap(0); 12403 this.hiddenUpdates = createLaneMap(null); 12404 this.identifierPrefix = identifierPrefix; 12405 this.onUncaughtError = onUncaughtError; 12406 this.onCaughtError = onCaughtError; 12407 this.onRecoverableError = onRecoverableError; 12408 this.pooledCache = null; 12409 this.pooledCacheLanes = 0; 12410 this.formState = formState; 12411 this.transitionTypes = null; 12412 this.incompleteTransitions = /* @__PURE__ */ new Map(); 12413 this.passiveEffectDuration = this.effectDuration = -0; 12414 this.memoizedUpdaters = /* @__PURE__ */ new Set(); 12415 containerInfo = this.pendingUpdatersLaneMap = []; 12416 for (tag = 0; 31 > tag; tag++) containerInfo.push(/* @__PURE__ */ new Set()); 12417 this._debugRootType = hydrate ? "hydrateRoot()" : "createRoot()"; 12418 } 12419 function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, identifierPrefix, formState, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator) { 12420 containerInfo = new FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator, formState); 12421 tag = ConcurrentMode; 12422 !0 === isStrictMode && (tag |= StrictLegacyMode | StrictEffectsMode); 12423 tag |= ProfileMode; 12424 isStrictMode = createFiber(3, null, null, tag); 12425 containerInfo.current = isStrictMode; 12426 isStrictMode.stateNode = containerInfo; 12427 tag = createCache(); 12428 retainCache(tag); 12429 containerInfo.pooledCache = tag; 12430 retainCache(tag); 12431 isStrictMode.memoizedState = { 12432 element: initialChildren, 12433 isDehydrated: hydrate, 12434 cache: tag 12435 }; 12436 initializeUpdateQueue(isStrictMode); 12437 return containerInfo; 12438 } 12439 function getContextForSubtree(parentComponent) { 12440 if (!parentComponent) return emptyContextObject; 12441 parentComponent = emptyContextObject; 12442 return parentComponent; 12443 } 12444 function updateContainerImpl(rootFiber, lane, element, container, parentComponent, callback) { 12445 if (injectedHook && "function" === typeof injectedHook.onScheduleFiberRoot) try { 12446 injectedHook.onScheduleFiberRoot(rendererID, container, element); 12447 } catch (err) { 12448 hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err)); 12449 } 12450 parentComponent = getContextForSubtree(parentComponent); 12451 null === container.context ? container.context = parentComponent : container.pendingContext = parentComponent; 12452 isRendering && null !== current && !didWarnAboutNestedUpdates && (didWarnAboutNestedUpdates = !0, console.error("Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\n\nCheck the render method of %s.", getComponentNameFromFiber(current) || "Unknown")); 12453 container = createUpdate(lane); 12454 container.payload = { element }; 12455 callback = void 0 === callback ? null : callback; 12456 null !== callback && ("function" !== typeof callback && console.error("Expected the last optional `callback` argument to be a function. Instead received: %s.", callback), container.callback = callback); 12457 element = enqueueUpdate(rootFiber, container, lane); 12458 null !== element && (startUpdateTimerByLane(lane, "root.render()", null), scheduleUpdateOnFiber(element, rootFiber, lane), entangleTransitions(element, rootFiber, lane)); 12459 } 12460 function markRetryLaneImpl(fiber, retryLane) { 12461 fiber = fiber.memoizedState; 12462 if (null !== fiber && null !== fiber.dehydrated) { 12463 var a = fiber.retryLane; 12464 fiber.retryLane = 0 !== a && a < retryLane ? a : retryLane; 12465 } 12466 } 12467 function markRetryLaneIfNotHydrated(fiber, retryLane) { 12468 markRetryLaneImpl(fiber, retryLane); 12469 (fiber = fiber.alternate) && markRetryLaneImpl(fiber, retryLane); 12470 } 12471 function attemptContinuousHydration(fiber) { 12472 if (13 === fiber.tag || 31 === fiber.tag) { 12473 var root = enqueueConcurrentRenderForLane(fiber, 67108864); 12474 null !== root && scheduleUpdateOnFiber(root, fiber, 67108864); 12475 markRetryLaneIfNotHydrated(fiber, 67108864); 12476 } 12477 } 12478 function attemptHydrationAtCurrentPriority(fiber) { 12479 if (13 === fiber.tag || 31 === fiber.tag) { 12480 var lane = requestUpdateLane(fiber); 12481 lane = getBumpedLaneForHydrationByLane(lane); 12482 var root = enqueueConcurrentRenderForLane(fiber, lane); 12483 null !== root && scheduleUpdateOnFiber(root, fiber, lane); 12484 markRetryLaneIfNotHydrated(fiber, lane); 12485 } 12486 } 12487 function getCurrentFiberForDevTools() { 12488 return current; 12489 } 12490 function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) { 12491 var prevTransition = ReactSharedInternals.T; 12492 ReactSharedInternals.T = null; 12493 var previousPriority = ReactDOMSharedInternals.p; 12494 try { 12495 ReactDOMSharedInternals.p = DiscreteEventPriority, dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent); 12496 } finally { 12497 ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition; 12498 } 12499 } 12500 function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) { 12501 var prevTransition = ReactSharedInternals.T; 12502 ReactSharedInternals.T = null; 12503 var previousPriority = ReactDOMSharedInternals.p; 12504 try { 12505 ReactDOMSharedInternals.p = ContinuousEventPriority, dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent); 12506 } finally { 12507 ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition; 12508 } 12509 } 12510 function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) { 12511 if (_enabled) { 12512 var blockedOn = findInstanceBlockingEvent(nativeEvent); 12513 if (null === blockedOn) dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer), clearIfContinuousEvent(domEventName, nativeEvent); 12514 else if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) nativeEvent.stopPropagation(); 12515 else if (clearIfContinuousEvent(domEventName, nativeEvent), eventSystemFlags & 4 && -1 < discreteReplayableEvents.indexOf(domEventName)) { 12516 for (; null !== blockedOn;) { 12517 var fiber = getInstanceFromNode(blockedOn);
vendor: 9,582 bytes, lines 12518-12751
12518 if (null !== fiber) switch (fiber.tag) { 12519 case 3: 12520 fiber = fiber.stateNode; 12521 if (fiber.current.memoizedState.isDehydrated) { 12522 var lanes = getHighestPriorityLanes(fiber.pendingLanes); 12523 if (0 !== lanes) { 12524 var root = fiber; 12525 root.pendingLanes |= 2; 12526 for (root.entangledLanes |= 2; lanes;) { 12527 var lane = 1 << 31 - clz32(lanes); 12528 root.entanglements[1] |= lane; 12529 lanes &= ~lane; 12530 } 12531 ensureRootIsScheduled(fiber); 12532 (executionContext & (RenderContext | CommitContext)) === NoContext && (workInProgressRootRenderTargetTime = now$1() + RENDER_TIMEOUT_MS, flushSyncWorkAcrossRoots_impl(0, !1)); 12533 } 12534 } 12535 break; 12536 case 31: 12537 case 13: root = enqueueConcurrentRenderForLane(fiber, 2), null !== root && scheduleUpdateOnFiber(root, fiber, 2), flushSyncWork$1(), markRetryLaneIfNotHydrated(fiber, 2); 12538 } 12539 fiber = findInstanceBlockingEvent(nativeEvent); 12540 null === fiber && dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer); 12541 if (fiber === blockedOn) break; 12542 blockedOn = fiber; 12543 } 12544 null !== blockedOn && nativeEvent.stopPropagation(); 12545 } else dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer); 12546 } 12547 } 12548 function findInstanceBlockingEvent(nativeEvent) { 12549 nativeEvent = getEventTarget(nativeEvent); 12550 return findInstanceBlockingTarget(nativeEvent); 12551 } 12552 function findInstanceBlockingTarget(targetNode) { 12553 return_targetInst = null; 12554 targetNode = getClosestInstanceFromNode(targetNode); 12555 if (null !== targetNode) { 12556 var nearestMounted = getNearestMountedFiber(targetNode); 12557 if (null === nearestMounted) targetNode = null; 12558 else { 12559 var tag = nearestMounted.tag; 12560 if (13 === tag) { 12561 targetNode = getSuspenseInstanceFromFiber(nearestMounted); 12562 if (null !== targetNode) return targetNode; 12563 targetNode = null; 12564 } else if (31 === tag) { 12565 targetNode = getActivityInstanceFromFiber(nearestMounted); 12566 if (null !== targetNode) return targetNode; 12567 targetNode = null; 12568 } else if (3 === tag) { 12569 if (nearestMounted.stateNode.current.memoizedState.isDehydrated) return 3 === nearestMounted.tag ? nearestMounted.stateNode.containerInfo : null; 12570 targetNode = null; 12571 } else nearestMounted !== targetNode && (targetNode = null); 12572 } 12573 } 12574 return_targetInst = targetNode; 12575 return null; 12576 } 12577 function getEventPriority(domEventName) { 12578 switch (domEventName) { 12579 case "beforetoggle": 12580 case "cancel": 12581 case "click": 12582 case "close": 12583 case "contextmenu": 12584 case "copy": 12585 case "cut": 12586 case "auxclick": 12587 case "dblclick": 12588 case "dragend": 12589 case "dragstart": 12590 case "drop": 12591 case "focusin": 12592 case "focusout": 12593 case "input": 12594 case "invalid": 12595 case "keydown": 12596 case "keypress": 12597 case "keyup": 12598 case "mousedown": 12599 case "mouseup": 12600 case "paste": 12601 case "pause": 12602 case "play": 12603 case "pointercancel": 12604 case "pointerdown": 12605 case "pointerup": 12606 case "ratechange": 12607 case "reset": 12608 case "seeked": 12609 case "submit": 12610 case "toggle": 12611 case "touchcancel": 12612 case "touchend": 12613 case "touchstart": 12614 case "volumechange": 12615 case "change": 12616 case "selectionchange": 12617 case "textInput": 12618 case "compositionstart": 12619 case "compositionend": 12620 case "compositionupdate": 12621 case "beforeblur": 12622 case "afterblur": 12623 case "beforeinput": 12624 case "blur": 12625 case "fullscreenchange": 12626 case "fullscreenerror": 12627 case "focus": 12628 case "hashchange": 12629 case "popstate": 12630 case "select": 12631 case "selectstart": return DiscreteEventPriority; 12632 case "drag": 12633 case "dragenter": 12634 case "dragexit": 12635 case "dragleave": 12636 case "dragover": 12637 case "mousemove": 12638 case "mouseout": 12639 case "mouseover": 12640 case "pointermove": 12641 case "pointerout": 12642 case "pointerover": 12643 case "resize": 12644 case "scroll": 12645 case "touchmove": 12646 case "wheel": 12647 case "mouseenter": 12648 case "mouseleave": 12649 case "pointerenter": 12650 case "pointerleave": return ContinuousEventPriority; 12651 case "message": switch (getCurrentPriorityLevel()) { 12652 case ImmediatePriority: return DiscreteEventPriority; 12653 case UserBlockingPriority: return ContinuousEventPriority; 12654 case NormalPriority$1: 12655 case LowPriority: return DefaultEventPriority; 12656 case IdlePriority: return IdleEventPriority; 12657 default: return DefaultEventPriority; 12658 } 12659 default: return DefaultEventPriority; 12660 } 12661 } 12662 function clearIfContinuousEvent(domEventName, nativeEvent) { 12663 switch (domEventName) { 12664 case "focusin": 12665 case "focusout": 12666 queuedFocus = null; 12667 break; 12668 case "dragenter": 12669 case "dragleave": 12670 queuedDrag = null; 12671 break; 12672 case "mouseover": 12673 case "mouseout": 12674 queuedMouse = null; 12675 break; 12676 case "pointerover": 12677 case "pointerout": 12678 queuedPointers.delete(nativeEvent.pointerId); 12679 break; 12680 case "gotpointercapture": 12681 case "lostpointercapture": queuedPointerCaptures.delete(nativeEvent.pointerId); 12682 } 12683 } 12684 function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { 12685 if (null === existingQueuedEvent || existingQueuedEvent.nativeEvent !== nativeEvent) return existingQueuedEvent = { 12686 blockedOn, 12687 domEventName, 12688 eventSystemFlags, 12689 nativeEvent, 12690 targetContainers: [targetContainer] 12691 }, null !== blockedOn && (blockedOn = getInstanceFromNode(blockedOn), null !== blockedOn && attemptContinuousHydration(blockedOn)), existingQueuedEvent; 12692 existingQueuedEvent.eventSystemFlags |= eventSystemFlags; 12693 blockedOn = existingQueuedEvent.targetContainers; 12694 null !== targetContainer && -1 === blockedOn.indexOf(targetContainer) && blockedOn.push(targetContainer); 12695 return existingQueuedEvent; 12696 } 12697 function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { 12698 switch (domEventName) { 12699 case "focusin": return queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent), !0; 12700 case "dragenter": return queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent), !0; 12701 case "mouseover": return queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent), !0; 12702 case "pointerover": 12703 var pointerId = nativeEvent.pointerId; 12704 queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)); 12705 return !0; 12706 case "gotpointercapture": return pointerId = nativeEvent.pointerId, queuedPointerCaptures.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)), !0; 12707 } 12708 return !1; 12709 } 12710 function attemptExplicitHydrationTarget(queuedTarget) { 12711 var targetInst = getClosestInstanceFromNode(queuedTarget.target); 12712 if (null !== targetInst) { 12713 var nearestMounted = getNearestMountedFiber(targetInst); 12714 if (null !== nearestMounted) { 12715 if (targetInst = nearestMounted.tag, 13 === targetInst) { 12716 if (targetInst = getSuspenseInstanceFromFiber(nearestMounted), null !== targetInst) { 12717 queuedTarget.blockedOn = targetInst; 12718 runWithPriority(queuedTarget.priority, function() { 12719 attemptHydrationAtCurrentPriority(nearestMounted); 12720 }); 12721 return; 12722 } 12723 } else if (31 === targetInst) { 12724 if (targetInst = getActivityInstanceFromFiber(nearestMounted), null !== targetInst) { 12725 queuedTarget.blockedOn = targetInst; 12726 runWithPriority(queuedTarget.priority, function() { 12727 attemptHydrationAtCurrentPriority(nearestMounted); 12728 }); 12729 return; 12730 } 12731 } else if (3 === targetInst && nearestMounted.stateNode.current.memoizedState.isDehydrated) { 12732 queuedTarget.blockedOn = 3 === nearestMounted.tag ? nearestMounted.stateNode.containerInfo : null; 12733 return; 12734 } 12735 } 12736 } 12737 queuedTarget.blockedOn = null; 12738 } 12739 function attemptReplayContinuousQueuedEvent(queuedEvent) { 12740 if (null !== queuedEvent.blockedOn) return !1; 12741 for (var targetContainers = queuedEvent.targetContainers; 0 < targetContainers.length;) { 12742 var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.nativeEvent); 12743 if (null === nextBlockedOn) { 12744 nextBlockedOn = queuedEvent.nativeEvent; 12745 var nativeEventClone = new nextBlockedOn.constructor(nextBlockedOn.type, nextBlockedOn), event = nativeEventClone; 12746 null !== currentReplayingEvent && console.error("Expected currently replaying event to be null. This error is likely caused by a bug in React. Please file an issue."); 12747 currentReplayingEvent = event; 12748 nextBlockedOn.target.dispatchEvent(nativeEventClone); 12749 null === currentReplayingEvent && console.error("Expected currently replaying event to not be null. This error is likely caused by a bug in React. Please file an issue."); 12750 currentReplayingEvent = null; 12751 } else return targetContainers = getInstanceFromNode(nextBlockedOn), null !== targetContainers && attemptContinuousHydration(targetContainers
vendor: 7,950 bytes, lines 12751-12875
12751), queuedEvent.blockedOn = nextBlockedOn, !1; 12752 targetContainers.shift(); 12753 } 12754 return !0; 12755 } 12756 function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) { 12757 attemptReplayContinuousQueuedEvent(queuedEvent) && map.delete(key); 12758 } 12759 function replayUnblockedEvents() { 12760 hasScheduledReplayAttempt = !1; 12761 null !== queuedFocus && attemptReplayContinuousQueuedEvent(queuedFocus) && (queuedFocus = null); 12762 null !== queuedDrag && attemptReplayContinuousQueuedEvent(queuedDrag) && (queuedDrag = null); 12763 null !== queuedMouse && attemptReplayContinuousQueuedEvent(queuedMouse) && (queuedMouse = null); 12764 queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap); 12765 queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap); 12766 } 12767 function scheduleCallbackIfUnblocked(queuedEvent, unblocked) { 12768 queuedEvent.blockedOn === unblocked && (queuedEvent.blockedOn = null, hasScheduledReplayAttempt || (hasScheduledReplayAttempt = !0, Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents))); 12769 } 12770 function scheduleReplayQueueIfNeeded(formReplayingQueue) { 12771 lastScheduledReplayQueue !== formReplayingQueue && (lastScheduledReplayQueue = formReplayingQueue, Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, function() { 12772 lastScheduledReplayQueue === formReplayingQueue && (lastScheduledReplayQueue = null); 12773 for (var i = 0; i < formReplayingQueue.length; i += 3) { 12774 var form = formReplayingQueue[i], submitterOrAction = formReplayingQueue[i + 1], formData = formReplayingQueue[i + 2]; 12775 if ("function" !== typeof submitterOrAction) if (null === findInstanceBlockingTarget(submitterOrAction || form)) continue; 12776 else break; 12777 var formInst = getInstanceFromNode(form); 12778 null !== formInst && (formReplayingQueue.splice(i, 3), i -= 3, form = { 12779 pending: !0, 12780 data: formData, 12781 method: form.method, 12782 action: submitterOrAction 12783 }, Object.freeze(form), startHostTransition(formInst, form, submitterOrAction, formData)); 12784 } 12785 })); 12786 } 12787 function retryIfBlockedOn(unblocked) { 12788 function unblock(queuedEvent) { 12789 return scheduleCallbackIfUnblocked(queuedEvent, unblocked); 12790 } 12791 null !== queuedFocus && scheduleCallbackIfUnblocked(queuedFocus, unblocked); 12792 null !== queuedDrag && scheduleCallbackIfUnblocked(queuedDrag, unblocked); 12793 null !== queuedMouse && scheduleCallbackIfUnblocked(queuedMouse, unblocked); 12794 queuedPointers.forEach(unblock); 12795 queuedPointerCaptures.forEach(unblock); 12796 for (var i = 0; i < queuedExplicitHydrationTargets.length; i++) { 12797 var queuedTarget = queuedExplicitHydrationTargets[i]; 12798 queuedTarget.blockedOn === unblocked && (queuedTarget.blockedOn = null); 12799 } 12800 for (; 0 < queuedExplicitHydrationTargets.length && (i = queuedExplicitHydrationTargets[0], null === i.blockedOn);) attemptExplicitHydrationTarget(i), null === i.blockedOn && queuedExplicitHydrationTargets.shift(); 12801 i = (unblocked.ownerDocument || unblocked).$$reactFormReplay; 12802 if (null != i) for (queuedTarget = 0; queuedTarget < i.length; queuedTarget += 3) { 12803 var form = i[queuedTarget], submitterOrAction = i[queuedTarget + 1], formProps = form[internalPropsKey] || null; 12804 if ("function" === typeof submitterOrAction) formProps || scheduleReplayQueueIfNeeded(i); 12805 else if (formProps) { 12806 var action = null; 12807 if (submitterOrAction && submitterOrAction.hasAttribute("formAction")) { 12808 if (form = submitterOrAction, formProps = submitterOrAction[internalPropsKey] || null) action = formProps.formAction; 12809 else if (null !== findInstanceBlockingTarget(form)) continue; 12810 } else action = formProps.action; 12811 "function" === typeof action ? i[queuedTarget + 1] = action : (i.splice(queuedTarget, 3), queuedTarget -= 3); 12812 scheduleReplayQueueIfNeeded(i); 12813 } 12814 } 12815 } 12816 function defaultOnDefaultTransitionIndicator() { 12817 function handleNavigate(event) { 12818 event.canIntercept && "react-transition" === event.info && event.intercept({ 12819 handler: function() { 12820 return new Promise(function(resolve) { 12821 return pendingResolve = resolve; 12822 }); 12823 }, 12824 focusReset: "manual", 12825 scroll: "manual" 12826 }); 12827 } 12828 function handleNavigateComplete() { 12829 null !== pendingResolve && (pendingResolve(), pendingResolve = null); 12830 isCancelled || setTimeout(startFakeNavigation, 20); 12831 } 12832 function startFakeNavigation() { 12833 if (!isCancelled && !navigation.transition) { 12834 var currentEntry = navigation.currentEntry; 12835 currentEntry && null != currentEntry.url && navigation.navigate(currentEntry.url, { 12836 state: currentEntry.getState(), 12837 info: "react-transition", 12838 history: "replace" 12839 }); 12840 } 12841 } 12842 if ("object" === typeof navigation) { 12843 var isCancelled = !1, pendingResolve = null; 12844 navigation.addEventListener("navigate", handleNavigate); 12845 navigation.addEventListener("navigatesuccess", handleNavigateComplete); 12846 navigation.addEventListener("navigateerror", handleNavigateComplete); 12847 setTimeout(startFakeNavigation, 100); 12848 return function() { 12849 isCancelled = !0; 12850 navigation.removeEventListener("navigate", handleNavigate); 12851 navigation.removeEventListener("navigatesuccess", handleNavigateComplete); 12852 navigation.removeEventListener("navigateerror", handleNavigateComplete); 12853 null !== pendingResolve && (pendingResolve(), pendingResolve = null); 12854 }; 12855 } 12856 } 12857 function ReactDOMRoot(internalRoot) { 12858 this._internalRoot = internalRoot; 12859 } 12860 function ReactDOMHydrationRoot(internalRoot) { 12861 this._internalRoot = internalRoot; 12862 } 12863 function warnIfReactDOMContainerInDEV(container) { 12864 container[internalContainerInstanceKey] && (container._reactRootContainer ? console.error("You are calling ReactDOMClient.createRoot() on a container that was previously passed to ReactDOM.render(). This is not supported.") : console.error("You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it.")); 12865 } 12866 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 12867 var Scheduler = require_scheduler(), React = require_react(), ReactDOM = require_react_dom(), searchTarget = null, searchBoundary = null, assign = Object.assign, REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"), REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"); 12868 var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"), REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); 12869 var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"), REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), REACT_RECOVERABLE_TYPE = Symbol.for("react.recoverable"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"), isArrayImpl = Array.isArray, ReactSharedInternals = React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, ReactDOMSharedInternals = ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, NotPending = Object.freeze({ 12870 pending: !1, 12871 data: null, 12872 method: null, 12873 action: null 12874 }), valueStack = []; 12875 var fiberStack = [];
12876 var index$jscomp$0 = -1, contextStackCursor = createCursor(null), contextFiberStackCursor = createCursor(null), rootInstanceStackCursor = createCursor(null), hostTransitionProviderCursor = createCursor(null), disabledDepth = 0, prevLog, prevInfo, prevWarn, prevError, prevGroup, prevGroupCollapsed, prevGroupEnd; 12877 disabledLog.__reactDisabledLog = !0; 12878 var prefix, suffix, reentry = !1; 12879 var componentFrameCache = new ("function" === typeof WeakMap ? WeakMap : Map)(); 12880 var current = null, isRendering = !1, hasOwnProperty = Object.prototype.hasOwnProperty, scheduleCallback$3 = Scheduler.unstable_scheduleCallback, cancelCallback$1 = Scheduler.unstable_cancelCallback, shouldYield = Scheduler.unstable_shouldYield, requestPaint = Scheduler.unstable_requestPaint, now$1 = Scheduler.unstable_now, getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel, ImmediatePriority = Scheduler.unstable_ImmediatePriority, UserBlockingPriority = Scheduler.unstable_UserBlockingPriority, NormalPriority$1 = Scheduler.unstable_NormalPriority, LowPriority = Scheduler.unstable_LowPriority, IdlePriority = Scheduler.unstable_IdlePriority, log$1 = Scheduler.log, unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue, rendererID = null, injectedHook = null, hasLoggedError = !1, isDevToolsPresent = "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__, clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, log = Math.log, LN2 = Math.LN2, nextTransitionUpdateLane = 256, nextTransitionDeferredLane = 262144, nextRetryLane = 4194304, DiscreteEventPriority = 2, ContinuousEventPriority = 8, DefaultEventPriority = 32, IdleEventPriority = 268435456, randomKey = Math.random().toString(36).slice(2), internalInstanceKey = "__reactFiber$" + randomKey, internalPropsKey = "__reactProps$" + randomKey, internalContainerInstanceKey = "__reactContainer$" + randomKey, internalEventHandlersKey = "__reactEvents$" + randomKey, internalEventHandlerListenersKey = "__reactListeners$" + randomKey, internalEventHandlesSetKey = "__reactHandles$" + randomKey, internalRootNodeResourcesKey = "__reactResources$" + randomKey, internalHoistableMarker = "__reactMarker$" + randomKey, internalLoadPendingKey = "__reactLoad$" + randomKey, allNativeEvents = /* @__PURE__ */ new Set(), registrationNameDependencies = {}, possibleRegistrationNames = {}, hasReadOnlyValue = { 12881 button: !0, 12882 checkbox: !0, 12883 image: !0, 12884 hidden: !0, 12885 radio: !0, 12886 reset: !0, 12887 submit: !0 12888 }, VALID_ATTRIBUTE_NAME_REGEX = RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), illegalAttributeNameCache = {}, validatedAttributeNameCache = {}, viewTransitionMutationContext = !1, escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\n"\\]/g, didWarnValueDefaultValue$1 = !1, didWarnCheckedDefaultChecked = !1, didWarnSelectedSetOnOption = !1, didWarnInvalidChild = !1, didWarnInvalidInnerHTML = !1; 12889 var didWarnValueDefaultValue = !1; 12890 var valuePropNames = ["value", "defaultValue"], didWarnValDefaultVal = !1, needsEscaping = /["'&<>\n\t]|^\s|\s$/, specialTags = "address applet area article aside base basefont bgsound blockquote body br button caption center col
12890colgroup dd details dir div dl dt embed fieldset figcaption figure footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html iframe img input isindex li link listing main marquee menu menuitem meta nav noembed noframes noscript object ol p param plaintext pre script section select source style summary table tbody td template textarea tfoot th thead title tr track ul wbr xmp".split(" "), inScopeTags = "applet caption html table td th marquee object select template foreignObject desc title".split(" "), buttonScopeTags = inScopeTags.concat(["button"]), impliedEndTags = "dd dt li option optgroup p rp rt".split(" "), emptyAncestorInfoDev = { 12891 current: null, 12892 formTag: null, 12893 aTagInScope: null, 12894 buttonTagInScope: null, 12895 nobrTagInScope: null, 12896 pTagInButtonScope: null, 12897 listItemTagAutoclosing: null, 12898 dlItemTagAutoclosing: null, 12899 containerTagInScope: null, 12900 implicitRootScope: !1 12901 }, didWarn = {}, shorthandToLonghand = { 12902 animation: "animationDelay animationDirection animationDuration animationFillMode animationIterationCount animationName animationPlayState animationTimingFunction".split(" "), 12903 background: "backgroundAttachment backgroundClip backgroundColor backgroundImage backgroundOrigin backgroundPositionX backgroundPositionY backgroundRepeat backgroundSize".split(" "), 12904 backgroundPosition: ["backgroundPositionX", "backgroundPositionY"], 12905 border: "borderBottomColor borderBottomStyle borderBottomWidth borderImageOutset borderImageRepeat borderImageSlice borderImageSource borderImageWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderTopColor borderTopStyle borderTopWidth".split(" "), 12906 borderBlock: "borderBlockEndColor borderBlockEndStyle borderBlockEndWidth borderBlockStartColor borderBlockStartStyle borderBlockStartWidth".split(" "), 12907 borderBlockColor: ["borderBlockEndColor", "borderBlockStartColor"], 12908 borderBlockEnd: [ 12909 "borderBlockEndColor", 12910 "borderBlockEndStyle", 12911 "borderBlockEndWidth" 12912 ], 12913 borderBlockStart: [ 12914 "borderBlockStartColor", 12915 "borderBlockStartStyle", 12916 "borderBlockStartWidth" 12917 ], 12918 borderBlockStyle: ["borderBlockEndStyle", "borderBlockStartStyle"], 12919 borderBlockWidth: ["borderBlockEndWidth", "borderBlockStartWidth"], 12920 borderBottom: [ 12921 "borderBottomColor", 12922 "borderBottomStyle", 12923 "borderBottomWidth" 12924 ], 12925 borderColor: [ 12926 "borderBottomColor", 12927 "borderLeftColor", 12928 "borderRightColor", 12929 "borderTopColor" 12930 ], 12931 borderImage: [ 12932 "borderImageOutset", 12933 "borderImageRepeat", 12934 "borderImageSlice", 12935 "borderImageSource", 12936 "borderImageWidth" 12937 ], 12938 borderInline: "borderInlineEndColor borderInlineEndStyle borderInlineEndWidth borderInlineStartColor borderInlineStartStyle borderInlineStartWidth".split(" "), 12939 borderInlineColor: ["borderInlineEndColor", "borderInlineStartColor"], 12940 borderInlineEnd: [ 12941 "borderInlineEndColor", 12942 "borderInlineEndStyle", 12943 "borderInlineEndWidth" 12944 ], 12945 borderInlineStart: [ 12946 "borderInlineStartColor", 12947 "borderInlineStartStyle", 12948 "borderInlineStartWidth" 12949 ], 12950 borderInlineStyle: ["borderInlineEndStyle", "borderInlineStartStyle"], 12951 borderInlineWidth: ["borderInlineEndWidth", "borderInlineStartWidth"], 12952 borderLeft: [ 12953 "borderLeftColor", 12954 "borderLeftStyle", 12955 "borderLeftWidth" 12956 ], 12957 borderRadius: [ 12958 "borderBottomLeftRadius", 12959 "borderBottomRightRadius", 12960 "borderTopLeftRadius", 12961 "borderTopRightRadius" 12962 ], 12963 borderRight: [ 12964 "borderRightColor", 12965 "borderRightStyle", 12966 "borderRightWidth" 12967 ], 12968 borderStyle: [ 12969 "borderBottomStyle", 12970 "borderLeftStyle", 12971 "borderRightStyle", 12972 "borderTopStyle" 12973 ], 12974 borderTop: [ 12975 "borderTopColor", 12976 "borderTopStyle", 12977 "borderTopWidth" 12978 ], 12979 borderWidth: [ 12980 "borderBottomWidth", 12981 "borderLeftWidth", 12982 "borderRightWidth", 12983 "borderTopWidth" 12984 ], 12985 colorAdjust: ["printColorAdjust"], 12986 columnRule: [ 12987 "columnRuleColor", 12988 "columnRuleStyle", 12989 "columnRuleWidth" 12990 ], 12991 columns: ["columnCount", "columnWidth"],
12992 containIntrinsicSize: ["containIntrinsicHeight", "containIntrinsicWidth"], 12993 container: ["containerName", "containerType"], 12994 flex: [ 12995 "flexBasis", 12996 "flexGrow", 12997 "flexShrink" 12998 ], 12999 flexFlow: ["flexDirection", "flexWrap"], 13000 font: "fontFamily fontFeatureSettings fontKerning fontLanguageOverride fontSize fontSizeAdjust fontStretch fontStyle fontVariant fontVariantAlternates fontVariantCaps fontVariantEastAsian fontVariantLigatures fontVariantNumeric fontVariantPosition fontWeight lineHeight".split(" "), 13001 fontSynthesis: [ 13002 "fontSynthesisPosition", 13003 "fontSynthesisSmallCaps", 13004 "fontSynthesisStyle", 13005 "fontSynthesisWeight" 13006 ], 13007 fontVariant: "fontVariantAlternates fontVariantCaps fontVariantEastAsian fontVariantLigatures fontVariantNumeric fontVariantPosition".split(" "), 13008 gap: ["columnGap", "rowGap"], 13009 grid: "gridAutoColumns gridAutoFlow gridAutoRows gridTemplateAreas gridTemplateColumns gridTemplateRows".split(" "), 13010 gridArea: [ 13011 "gridColumnEnd", 13012 "gridColumnStart", 13013 "gridRowEnd", 13014 "gridRowStart" 13015 ], 13016 gridColumn: ["gridColumnEnd", "gridColumnStart"], 13017 gridColumnGap: ["columnGap"], 13018 gridGap: ["columnGap", "rowGap"], 13019 gridRow: ["gridRowEnd", "gridRowStart"], 13020 gridRowGap: ["rowGap"], 13021 gridTemplate: [ 13022 "gridTemplateAreas", 13023 "gridTemplateColumns", 13024 "gridTemplateRows" 13025 ], 13026 inset: [ 13027 "bottom", 13028 "left", 13029 "right", 13030 "top" 13031 ], 13032 insetBlock: ["insetBlockEnd", "insetBlockStart"], 13033 insetInline: ["insetInlineEnd", "insetInlineStart"], 13034 listStyle: [ 13035 "listStyleImage", 13036 "listStylePosition", 13037 "listStyleType" 13038 ], 13039 margin: [ 13040 "marginBottom", 13041 "marginLeft", 13042 "marginRight", 13043 "marginTop" 13044 ], 13045 marginBlock: ["marginBlockEnd", "marginBlockStart"], 13046 marginInline: ["marginInlineEnd", "marginInlineStart"], 13047 marker: [ 13048 "markerEnd", 13049 "markerMid", 13050 "markerStart" 13051 ], 13052 mask: "maskClip maskComposite maskImage maskMode maskOrigin maskPositionX maskPositionY maskRepeat maskSize".split(" "), 13053 maskPosition: ["maskPositionX", "maskPositionY"], 13054 offset: [ 13055 "offsetAnchor", 13056 "offsetDistance", 13057 "offsetPath", 13058 "offsetPosition", 13059 "offsetRotate" 13060 ], 13061 outline: [ 13062 "outlineColor", 13063 "outlineStyle", 13064 "outlineWidth" 13065 ], 13066 overflow: ["overflowX", "overflowY"], 13067 overscrollBehavior: ["overscrollBehaviorX", "overscrollBehaviorY"], 13068 padding: [ 13069 "paddingBottom", 13070 "paddingLeft", 13071 "paddingRight", 13072 "paddingTop" 13073 ], 13074 paddingBlock: ["paddingBlockEnd", "paddingBlockStart"], 13075 paddingInline: ["paddingInlineEnd", "paddingInlineStart"], 13076 pageBreakAfter: ["breakAfter"], 13077 pageBreakBefore: ["breakBefore"], 13078 pageBreakInside: ["breakInside"], 13079 placeContent: ["alignContent", "justifyContent"], 13080 placeItems: ["alignItems", "justifyItems"], 13081 placeSelf: ["alignSelf", "justifySelf"], 13082 scrollMargin: [ 13083 "scrollMarginBottom", 13084 "scrollMarginLeft", 13085 "scrollMarginRight", 13086 "scrollMarginTop" 13087 ], 13088 scrollMarginBlock: ["scrollMarginBlockEnd", "scrollMarginBlockStart"], 13089 scrollMarginInline: ["scrollMarginInlineEnd", "scrollMarginInlineStart"], 13090 scrollPadding: [ 13091 "scrollPaddingBottom", 13092 "scrollPaddingLeft", 13093 "scrollPaddingRight", 13094 "scrollPaddingTop" 13095 ], 13096 scrollPaddingBlock: ["scrollPaddingBlockEnd", "scrollPaddingBlockStart"], 13097 scrollPaddingInline: ["scrollPaddingInlineEnd", "scrollPaddingInlineStart"], 13098 textDecoration: [ 13099 "textDecorationColor", 13100 "textDecorationLine", 13101 "textDecorationStyle", 13102 "textDecorationThickness" 13103 ], 13104 textEmphasis: ["textEmphasisColor", "textEmphasisStyle"], 13105 textWrap: ["textWrapMode", "textWrapStyle"], 13106 transition: [ 13107 "transitionBehavior", 13108 "transitionDelay", 13109 "transitionDuration", 13110 "transitionProperty", 13111 "transitionTimingFunction" 13112 ], 13113 verticalAlign: [ 13114 "alignmentBaseline", 13115 "baselineShift", 13116 "baselineSource" 13117 ], 13118 whiteSpace: ["textWrapMode", "whiteSpaceCollapse"], 13119 wordWrap: ["overflowWrap"] 13120 }, uppercasePattern = /([A-Z])/g, msPattern$1 = /^ms-/, badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/, msPattern = /^-ms-/, hyphenPattern = /-(.)/g, badStyleValueWithSemicolonPattern = /;\s*$/, warnedStyleNames = {}, warnedStyleValues = {}, warnedForNaNValue = !1, warnedForInfinityValue = !1, unitlessNumbers = new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" ")), MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML", SVG_NAMESPACE = "http://www.w3.org/2000/svg", aliases = /* @__PURE__ */ new Map([ 13121 ["acceptCharset", "accept-charset"], 13122 ["htmlFor", "for"], 13123 ["httpEquiv", "http-equiv"], 13124 ["crossOrigin", "crossorigin"], 13125 ["accentHeight", "accent-height"], 13126 ["alignmentBaseline", "alignment-baseline"], 13127 ["arabicForm", "arabic-form"], 13128 ["baselineShift", "baseline-shift"], 13129 ["capHeight", "cap-height"], 13130 ["clipPath", "clip-path"], 13131 ["clipRule", "clip-rule"], 13132 ["colorInterpolation", "color-interpolation"], 13133 ["colorInterpolationFilters", "color-interpolation-filters"], 13134 ["colorProfile", "color-profile"],
13135 ["colorRendering", "color-rendering"], 13136 ["dominantBaseline", "dominant-baseline"], 13137 ["enableBackground", "enable-background"], 13138 ["fillOpacity", "fill-opacity"], 13139 ["fillRule", "fill-rule"], 13140 ["floodColor", "flood-color"], 13141 ["floodOpacity", "flood-opacity"], 13142 ["fontFamily", "font-family"], 13143 ["fontSize", "font-size"], 13144 ["fontSizeAdjust", "font-size-adjust"], 13145 ["fontStretch", "font-stretch"], 13146 ["fontStyle", "font-style"], 13147 ["fontVariant", "font-variant"], 13148 ["fontWeight", "font-weight"], 13149 ["glyphName", "glyph-name"], 13150 ["glyphOrientationHorizontal", "glyph-orientation-horizontal"], 13151 ["glyphOrientationVertical", "glyph-orientation-vertical"], 13152 ["horizAdvX", "horiz-adv-x"], 13153 ["horizOriginX", "horiz-origin-x"], 13154 ["imageRendering", "image-rendering"], 13155 ["letterSpacing", "letter-spacing"], 13156 ["lightingColor", "lighting-color"], 13157 ["markerEnd", "marker-end"], 13158 ["markerMid", "marker-mid"], 13159 ["markerStart", "marker-start"], 13160 ["maskType", "mask-type"], 13161 ["overlinePosition", "overline-position"], 13162 ["overlineThickness", "overline-thickness"], 13163 ["paintOrder", "paint-order"], 13164 ["panose-1", "panose-1"], 13165 ["pointerEvents", "pointer-events"], 13166 ["renderingIntent", "rendering-intent"], 13167 ["shapeRendering", "shape-rendering"], 13168 ["stopColor", "stop-color"], 13169 ["stopOpacity", "stop-opacity"], 13170 ["strikethroughPosition", "strikethrough-position"], 13171 ["strikethroughThickness", "strikethrough-thickness"], 13172 ["strokeDasharray", "stroke-dasharray"], 13173 ["strokeDashoffset", "stroke-dashoffset"], 13174 ["strokeLinecap", "stroke-linecap"], 13175 ["strokeLinejoin", "stroke-linejoin"], 13176 ["strokeMiterlimit", "stroke-miterlimit"], 13177 ["strokeOpacity", "stroke-opacity"], 13178 ["strokeWidth", "stroke-width"], 13179 ["textAnchor", "text-anchor"], 13180 ["textDecoration", "text-decoration"], 13181 ["textRendering", "text-rendering"], 13182 ["transformOrigin", "transform-origin"], 13183 ["underlinePosition", "underline-position"], 13184 ["underlineThickness", "underline-thickness"], 13185 ["unicodeBidi", "unicode-bidi"], 13186 ["unicodeRange", "unicode-range"], 13187 ["unitsPerEm", "units-per-em"], 13188 ["vAlphabetic", "v-alphabetic"], 13189 ["vHanging", "v-hanging"], 13190 ["vIdeographic", "v-ideographic"], 13191 ["vMathematical", "v-mathematical"], 13192 ["vectorEffect", "vector-effect"], 13193 ["vertAdvY", "vert-adv-y"], 13194 ["vertOriginX", "vert-origin-x"], 13195 ["vertOriginY", "vert-origin-y"], 13196 ["wordSpacing", "word-spacing"], 13197 ["writingMode", "writing-mode"], 13198 ["xmlnsXlink", "xmlns:xlink"], 13199 ["xHeight", "x-height"] 13200 ]), possibleStandardNames = { 13201 accept: "accept", 13202 acceptcharset: "acceptCharset", 13203 "accept-charset": "acceptCharset", 13204 accesskey: "accessKey", 13205 action: "action", 13206 allowfullscreen: "allowFullScreen", 13207 alt: "alt", 13208 as: "as", 13209 async: "async", 13210 autocapitalize: "autoCapitalize", 13211 autocomplete: "autoComplete", 13212 autocorrect: "autoCorrect", 13213 autofocus: "autoFocus", 13214 autoplay: "autoPlay", 13215 autosave: "autoSave", 13216 capture: "capture", 13217 cellpadding: "cellPadding", 13218 cellspacing: "cellSpacing", 13219 challenge: "challenge", 13220 charset: "charSet", 13221 checked: "checked", 13222 children: "children", 13223 cite: "cite", 13224 class: "className", 13225 classid: "classID", 13226 classname: "className", 13227 cols: "cols", 13228 colspan: "colSpan", 13229 content: "content", 13230 contenteditable: "contentEditable", 13231 contextmenu: "contextMenu", 13232 controls: "controls", 13233 controlslist: "controlsList", 13234 coords: "coords", 13235 credentialless: "credentialless", 13236 crossorigin: "crossOrigin", 13237 dangerouslysetinnerhtml: "dangerouslySetInnerHTML", 13238 data: "data", 13239 datetime: "dateTime", 13240 default: "default", 13241 defaultchecked: "defaultChecked", 13242 defaultvalue: "defaultValue", 13243 defer: "defer", 13244 dir: "dir", 13245 disabled: "disabled", 13246 disablepictureinpicture: "disablePictureInPicture", 13247 disableremoteplayback: "disableRemotePlayback", 13248 download: "download", 13249 draggable: "draggable", 13250 enctype: "encType", 13251 enterkeyhint: "enterKeyHint", 13252 fetchpriority: "fetchPriority", 13253 for: "htmlFor", 13254 form: "form", 13255 formmethod: "formMethod", 13256 formaction: "formAction", 13257 formenctype: "formEncType", 13258 formnovalidate: "formNoValidate", 13259 formtarget: "formTarget", 13260 frameborder: "frameBorder", 13261 headers: "headers", 13262 height: "height", 13263 hidden: "hidden", 13264 high: "high", 13265 href: "href", 13266 hreflang: "hrefLang", 13267 htmlfor: "htmlFor", 13268 httpequiv: "httpEquiv", 13269 "http-equiv": "httpEquiv", 13270 icon: "icon", 13271 id: "id", 13272 imagesizes: "imageSizes", 13273 imagesrcset: "imageSrcSet", 13274 inert: "inert",
13275 innerhtml: "innerHTML", 13276 inputmode: "inputMode", 13277 integrity: "integrity", 13278 is: "is", 13279 itemid: "itemID", 13280 itemprop: "itemProp", 13281 itemref: "itemRef", 13282 itemscope: "itemScope", 13283 itemtype: "itemType", 13284 keyparams: "keyParams", 13285 keytype: "keyType", 13286 kind: "kind", 13287 label: "label", 13288 lang: "lang", 13289 list: "list", 13290 loop: "loop", 13291 low: "low", 13292 manifest: "manifest", 13293 marginwidth: "marginWidth", 13294 marginheight: "marginHeight", 13295 max: "max", 13296 maxlength: "maxLength", 13297 media: "media", 13298 mediagroup: "mediaGroup", 13299 method: "method", 13300 min: "min", 13301 minlength: "minLength", 13302 multiple: "multiple", 13303 muted: "muted", 13304 name: "name", 13305 nomodule: "noModule", 13306 nonce: "nonce", 13307 novalidate: "noValidate", 13308 open: "open", 13309 optimum: "optimum", 13310 pattern: "pattern", 13311 placeholder: "placeholder", 13312 playsinline: "playsInline", 13313 poster: "poster", 13314 preload: "preload", 13315 profile: "profile", 13316 radiogroup: "radioGroup", 13317 readonly: "readOnly", 13318 referrerpolicy: "referrerPolicy", 13319 rel: "rel", 13320 required: "required", 13321 reversed: "reversed", 13322 role: "role", 13323 rows: "rows", 13324 rowspan: "rowSpan", 13325 sandbox: "sandbox", 13326 scope: "scope", 13327 scoped: "scoped", 13328 scrolling: "scrolling", 13329 seamless: "seamless", 13330 selected: "selected", 13331 shape: "shape", 13332 size: "size", 13333 sizes: "sizes", 13334 span: "span", 13335 spellcheck: "spellCheck", 13336 src: "src", 13337 srcdoc: "srcDoc", 13338 srclang: "srcLang", 13339 srcset: "srcSet", 13340 start: "start", 13341 step: "step", 13342 style: "style", 13343 summary: "summary", 13344 tabindex: "tabIndex", 13345 target: "target", 13346 title: "title", 13347 type: "type", 13348 usemap: "useMap", 13349 value: "value", 13350 width: "width", 13351 wmode: "wmode", 13352 wrap: "wrap", 13353 about: "about", 13354 accentheight: "accentHeight", 13355 "accent-height": "accentHeight", 13356 accumulate: "accumulate", 13357 additive: "additive", 13358 alignmentbaseline: "alignmentBaseline", 13359 "alignment-baseline": "alignmentBaseline", 13360 allowreorder: "allowReorder", 13361 alphabetic: "alphabetic", 13362 amplitude: "amplitude", 13363 arabicform: "arabicForm", 13364 "arabic-form": "arabicForm", 13365 ascent: "ascent", 13366 attributename: "attributeName", 13367 attributetype: "attributeType", 13368 autoreverse: "autoReverse", 13369 azimuth: "azimuth", 13370 basefrequency: "baseFrequency", 13371 baselineshift: "baselineShift", 13372 "baseline-shift": "baselineShift", 13373 baseprofile: "baseProfile", 13374 bbox: "bbox", 13375 begin: "begin", 13376 bias: "bias", 13377 by: "by", 13378 calcmode: "calcMode", 13379 capheight: "capHeight", 13380 "cap-height": "capHeight", 13381 clip: "clip", 13382 clippath: "clipPath", 13383 "clip-path": "clipPath", 13384 clippathunits: "clipPathUnits", 13385 cliprule: "clipRule", 13386 "clip-rule": "clipRule", 13387 color: "color", 13388 colorinterpolation: "colorInterpolation", 13389 "color-interpolation": "colorInterpolation", 13390 colorinterpolationfilters: "colorInterpolationFilters", 13391 "color-interpolation-filters": "colorInterpolationFilters", 13392 colorprofile: "colorProfile", 13393 "color-profile": "colorProfile", 13394 colorrendering: "colorRendering", 13395 "color-rendering": "colorRendering", 13396 contentscripttype: "contentScriptType", 13397 contentstyletype: "contentStyleType", 13398 cursor: "cursor", 13399 cx: "cx", 13400 cy: "cy", 13401 d: "d", 13402 datatype: "datatype", 13403 decelerate: "decelerate", 13404 descent: "descent", 13405 diffuseconstant: "diffuseConstant", 13406 direction: "direction", 13407 display: "display", 13408 divisor: "divisor", 13409 dominantbaseline: "dominantBaseline", 13410 "dominant-baseline": "dominantBaseline", 13411 dur: "dur", 13412 dx: "dx", 13413 dy: "dy", 13414 edgemode: "edgeMode", 13415 elevation: "elevation", 13416 enablebackground: "enableBackground", 13417 "enable-background": "enableBackground", 13418 end: "end", 13419 exponent: "exponent", 13420 externalresourcesrequired: "externalResourcesRequired", 13421 fill: "fill", 13422 fillopacity: "fillOpacity", 13423 "fill-opacity": "fillOpacity", 13424 fillrule: "fillRule", 13425 "fill-rule": "fillRule", 13426 filter: "filter", 13427 filterres: "filterRes", 13428 filterunits: "filterUnits", 13429 floodopacity: "floodOpacity", 13430 "flood-opacity": "floodOpacity", 13431 floodcolor: "floodColor", 13432 "flood-color": "floodColor", 13433 focusable: "focusable", 13434 fontfamily: "fontFamily", 13435 "font-family": "fontFamily", 13436 fontsize: "fontSize", 13437 "font-size": "fontSize", 13438 fontsizeadjust: "fontSizeAdjust", 13439 "font-size-adjust": "fontSizeAdjust", 13440 fontstretch: "fontStretch", 13441 "font-stretch": "fontStretch", 13442 fontstyle: "fontStyle", 13443 "font-style": "fontStyle", 13444 fontvariant: "fontVariant", 13445 "font-variant": "fontVariant", 13446 fontweight: "fontWeight", 13447 "font-weight": "fontWeight", 13448 format: "format", 13449 from: "from", 13450 fx: "fx", 13451 fy: "fy", 13452 g1: "g1", 13453 g2: "g2", 13454 glyphname: "glyphName", 13455 "glyph-name": "glyphName", 13456 glyphorientationhorizontal: "glyphOrientationHorizontal", 13457 "glyph-orientation-horizontal": "glyphOrientationHorizontal",
13458 glyphorientationvertical: "glyphOrientationVertical", 13459 "glyph-orientation-vertical": "glyphOrientationVertical", 13460 glyphref: "glyphRef", 13461 gradienttransform: "gradientTransform", 13462 gradientunits: "gradientUnits", 13463 hanging: "hanging", 13464 horizadvx: "horizAdvX", 13465 "horiz-adv-x": "horizAdvX", 13466 horizoriginx: "horizOriginX", 13467 "horiz-origin-x": "horizOriginX", 13468 ideographic: "ideographic", 13469 imagerendering: "imageRendering", 13470 "image-rendering": "imageRendering", 13471 in2: "in2", 13472 in: "in", 13473 inlist: "inlist", 13474 intercept: "intercept", 13475 k1: "k1", 13476 k2: "k2", 13477 k3: "k3", 13478 k4: "k4", 13479 k: "k", 13480 kernelmatrix: "kernelMatrix", 13481 kernelunitlength: "kernelUnitLength", 13482 kerning: "kerning", 13483 keypoints: "keyPoints", 13484 keysplines: "keySplines", 13485 keytimes: "keyTimes", 13486 lengthadjust: "lengthAdjust", 13487 letterspacing: "letterSpacing", 13488 "letter-spacing": "letterSpacing", 13489 lightingcolor: "lightingColor", 13490 "lighting-color": "lightingColor", 13491 limitingconeangle: "limitingConeAngle", 13492 local: "local", 13493 markerend: "markerEnd", 13494 "marker-end": "markerEnd", 13495 markerheight: "markerHeight", 13496 markermid: "markerMid", 13497 "marker-mid": "markerMid", 13498 markerstart: "markerStart", 13499 "marker-start": "markerStart", 13500 markerunits: "markerUnits", 13501 markerwidth: "markerWidth", 13502 mask: "mask", 13503 maskcontentunits: "maskContentUnits", 13504 masktype: "maskType", 13505 maskunits: "maskUnits", 13506 mathematical: "mathematical", 13507 mode: "mode", 13508 numoctaves: "numOctaves", 13509 offset: "offset", 13510 opacity: "opacity", 13511 operator: "operator", 13512 order: "order", 13513 orient: "orient", 13514 orientation: "orientation", 13515 origin: "origin", 13516 overflow: "overflow", 13517 overlineposition: "overlinePosition", 13518 "overline-position": "overlinePosition", 13519 overlinethickness: "overlineThickness", 13520 "overline-thickness": "overlineThickness", 13521 paintorder: "paintOrder", 13522 "paint-order": "paintOrder", 13523 panose1: "panose1", 13524 "panose-1": "panose1", 13525 pathlength: "pathLength", 13526 patterncontentunits: "patternContentUnits", 13527 patterntransform: "patternTransform", 13528 patternunits: "patternUnits", 13529 pointerevents: "pointerEvents", 13530 "pointer-events": "pointerEvents", 13531 points: "points", 13532 pointsatx: "pointsAtX", 13533 pointsaty: "pointsAtY", 13534 pointsatz: "pointsAtZ", 13535 popover: "popover", 13536 popovertarget: "popoverTarget", 13537 popovertargetaction: "popoverTargetAction", 13538 prefix: "prefix", 13539 preservealpha: "preserveAlpha", 13540 preserveaspectratio: "preserveAspectRatio", 13541 primitiveunits: "primitiveUnits", 13542 property: "property", 13543 r: "r", 13544 radius: "radius", 13545 refx: "refX", 13546 refy: "refY", 13547 renderingintent: "renderingIntent", 13548 "rendering-intent": "renderingIntent", 13549 repeatcount: "repeatCount", 13550 repeatdur: "repeatDur", 13551 requiredextensions: "requiredExtensions", 13552 requiredfeatures: "requiredFeatures", 13553 resource: "resource", 13554 restart: "restart", 13555 result: "result", 13556 results: "results", 13557 rotate: "rotate", 13558 rx: "rx", 13559 ry: "ry", 13560 scale: "scale", 13561 security: "security", 13562 seed: "seed", 13563 shaperendering: "shapeRendering", 13564 "shape-rendering": "shapeRendering", 13565 slope: "slope", 13566 spacing: "spacing", 13567 specularconstant: "specularConstant", 13568 specularexponent: "specularExponent", 13569 speed: "speed", 13570 spreadmethod: "spreadMethod", 13571 startoffset: "startOffset", 13572 stddeviation: "stdDeviation", 13573 stemh: "stemh", 13574 stemv: "stemv", 13575 stitchtiles: "stitchTiles", 13576 stopcolor: "stopColor", 13577 "stop-color": "stopColor", 13578 stopopacity: "stopOpacity", 13579 "stop-opacity": "stopOpacity", 13580 strikethroughposition: "strikethroughPosition", 13581 "strikethrough-position": "strikethroughPosition", 13582 strikethroughthickness: "strikethroughThickness", 13583 "strikethrough-thickness": "strikethroughThickness", 13584 string: "string", 13585 stroke: "stroke", 13586 strokedasharray: "strokeDasharray", 13587 "stroke-dasharray": "strokeDasharray", 13588 strokedashoffset: "strokeDashoffset", 13589 "stroke-dashoffset": "strokeDashoffset", 13590 strokelinecap: "strokeLinecap", 13591 "stroke-linecap": "strokeLinecap", 13592 strokelinejoin: "strokeLinejoin", 13593 "stroke-linejoin": "strokeLinejoin", 13594 strokemiterlimit: "strokeMiterlimit", 13595 "stroke-miterlimit": "strokeMiterlimit", 13596 strokewidth: "strokeWidth", 13597 "stroke-width": "strokeWidth", 13598 strokeopacity: "strokeOpacity", 13599 "stroke-opacity": "strokeOpacity", 13600 suppresscontenteditablewarning: "suppressContentEditableWarning", 13601 suppresshydrationwarning: "suppressHydrationWarning", 13602 surfacescale: "surfaceScale", 13603 systemlanguage: "systemLanguage", 13604 tablevalues: "tableValues", 13605 targetx: "targetX", 13606 targety: "targetY", 13607 textanchor: "textAnchor", 13608 "text-anchor": "textAnchor", 13609 textdecoration: "textDecoration", 13610 "text-decoration": "textDecoration", 13611 textlength: "textLength", 13612 textrendering: "textRendering", 13613 "text-rendering": "textRendering", 13614 to: "to", 13615 transform: "transform", 13616 transformorigin: "transformOrigin", 13617 "transform-origin": "transformOrigin", 13618 typeof: "typeof", 13619 u1: "u1", 13620 u2: "u2", 13621 underlineposition: "underlinePosition", 13622 "underline-position": "underlinePosition", 13623 underlinethickness: "underlineThickness", 13624 "underline-thickness": "underlineThickness", 13625 unicode: "unicode", 13626 unicodebidi: "unicodeBidi",
13627 "unicode-bidi": "unicodeBidi", 13628 unicoderange: "unicodeRange", 13629 "unicode-range": "unicodeRange", 13630 unitsperem: "unitsPerEm", 13631 "units-per-em": "unitsPerEm", 13632 unselectable: "unselectable", 13633 valphabetic: "vAlphabetic", 13634 "v-alphabetic": "vAlphabetic", 13635 values: "values", 13636 vectoreffect: "vectorEffect", 13637 "vector-effect": "vectorEffect", 13638 version: "version", 13639 vertadvy: "vertAdvY", 13640 "vert-adv-y": "vertAdvY", 13641 vertoriginx: "vertOriginX", 13642 "vert-origin-x": "vertOriginX", 13643 vertoriginy: "vertOriginY", 13644 "vert-origin-y": "vertOriginY", 13645 vhanging: "vHanging", 13646 "v-hanging": "vHanging", 13647 videographic: "vIdeographic", 13648 "v-ideographic": "vIdeographic", 13649 viewbox: "viewBox", 13650 viewtarget: "viewTarget", 13651 visibility: "visibility", 13652 vmathematical: "vMathematical", 13653 "v-mathematical": "vMathematical", 13654 vocab: "vocab", 13655 widths: "widths", 13656 wordspacing: "wordSpacing", 13657 "word-spacing": "wordSpacing", 13658 writingmode: "writingMode", 13659 "writing-mode": "writingMode", 13660 x1: "x1", 13661 x2: "x2", 13662 x: "x", 13663 xchannelselector: "xChannelSelector", 13664 xheight: "xHeight", 13665 "x-height": "xHeight", 13666 xlinkactuate: "xlinkActuate", 13667 "xlink:actuate": "xlinkActuate", 13668 xlinkarcrole: "xlinkArcrole", 13669 "xlink:arcrole": "xlinkArcrole", 13670 xlinkhref: "xlinkHref", 13671 "xlink:href": "xlinkHref", 13672 xlinkrole: "xlinkRole", 13673 "xlink:role": "xlinkRole", 13674 xlinkshow: "xlinkShow", 13675 "xlink:show": "xlinkShow", 13676 xlinktitle: "xlinkTitle", 13677 "xlink:title": "xlinkTitle", 13678 xlinktype: "xlinkType", 13679 "xlink:type": "xlinkType", 13680 xmlbase: "xmlBase", 13681 "xml:base": "xmlBase", 13682 xmllang: "xmlLang", 13683 "xml:lang": "xmlLang", 13684 xmlns: "xmlns", 13685 "xml:space": "xmlSpace", 13686 xmlnsxlink: "xmlnsXlink", 13687 "xmlns:xlink": "xmlnsXlink", 13688 xmlspace: "xmlSpace", 13689 y1: "y1", 13690 y2: "y2", 13691 y: "y", 13692 ychannelselector: "yChannelSelector", 13693 z: "z", 13694 zoomandpan: "zoomAndPan" 13695 }, ariaProperties = { 13696 "aria-current": 0, 13697 "aria-description": 0, 13698 "aria-details": 0, 13699 "aria-disabled": 0, 13700 "aria-hidden": 0, 13701 "aria-invalid": 0, 13702 "aria-keyshortcuts": 0, 13703 "aria-label": 0, 13704 "aria-roledescription": 0, 13705 "aria-autocomplete": 0, 13706 "aria-checked": 0, 13707 "aria-expanded": 0, 13708 "aria-haspopup": 0, 13709 "aria-level": 0, 13710 "aria-modal": 0, 13711 "aria-multiline": 0, 13712 "aria-multiselectable": 0, 13713 "aria-orientation": 0, 13714 "aria-placeholder": 0, 13715 "aria-pressed": 0, 13716 "aria-readonly": 0, 13717 "aria-required": 0, 13718 "aria-selected": 0, 13719 "aria-sort": 0, 13720 "aria-valuemax": 0, 13721 "aria-valuemin": 0, 13722 "aria-valuenow": 0, 13723 "aria-valuetext": 0, 13724 "aria-atomic": 0, 13725 "aria-busy": 0, 13726 "aria-live": 0, 13727 "aria-relevant": 0, 13728 "aria-dropeffect": 0, 13729 "aria-grabbed": 0, 13730 "aria-activedescendant": 0, 13731 "aria-colcount": 0, 13732 "aria-colindex": 0, 13733 "aria-colspan": 0, 13734 "aria-controls": 0, 13735 "aria-describedby": 0, 13736 "aria-errormessage": 0, 13737 "aria-flowto": 0, 13738 "aria-labelledby": 0, 13739 "aria-owns": 0, 13740 "aria-posinset": 0, 13741 "aria-rowcount": 0, 13742 "aria-rowindex": 0, 13743 "aria-rowspan": 0, 13744 "aria-setsize": 0, 13745 "aria-braillelabel": 0, 13746 "aria-brailleroledescription": 0, 13747 "aria-colindextext": 0, 13748 "aria-rowindextext": 0 13749 }, warnedProperties$1 = {}, rARIA$1 = RegExp("^(aria)-[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), rARIACamel$1 = RegExp("^(aria)[A-Z][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), didWarnValueNull = !1, warnedProperties = {}, EVENT_NAME_REGEX = /^on./, INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/, rARIA = RegExp("^(aria)-[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), rARIACamel = RegExp("^(aria)[A-Z][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u
vendor: 4,466 bytes, lines 13749-13864
13749037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i, currentReplayingEvent = null, restoreTarget = null, restoreQueue = null, isInsideEventHandler = !1, canUseDOM = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement), passiveBrowserEventsSupported = !1; 13750 if (canUseDOM) try { 13751 var options$jscomp$0 = {}; 13752 Object.defineProperty(options$jscomp$0, "passive", { get: function() { 13753 passiveBrowserEventsSupported = !0; 13754 } }); 13755 window.addEventListener("test", options$jscomp$0, options$jscomp$0); 13756 window.removeEventListener("test", options$jscomp$0, options$jscomp$0); 13757 } catch (e) { 13758 passiveBrowserEventsSupported = !1; 13759 } 13760 var root = null, startText = null, fallbackText = null, EventInterface = { 13761 eventPhase: 0, 13762 bubbles: 0, 13763 cancelable: 0, 13764 timeStamp: function(event) { 13765 return event.timeStamp || Date.now(); 13766 }, 13767 defaultPrevented: 0, 13768 isTrusted: 0 13769 }, SyntheticEvent = createSyntheticEvent(EventInterface), UIEventInterface = assign({}, EventInterface, { 13770 view: 0, 13771 detail: 0 13772 }), SyntheticUIEvent = createSyntheticEvent(UIEventInterface), lastMovementX, lastMovementY, lastMouseEvent, MouseEventInterface = assign({}, UIEventInterface, { 13773 screenX: 0, 13774 screenY: 0, 13775 clientX: 0, 13776 clientY: 0, 13777 pageX: 0, 13778 pageY: 0, 13779 ctrlKey: 0, 13780 shiftKey: 0, 13781 altKey: 0, 13782 metaKey: 0, 13783 getModifierState: getEventModifierState, 13784 button: 0, 13785 buttons: 0, 13786 relatedTarget: function(event) { 13787 return void 0 === event.relatedTarget ? event.fromElement === event.srcElement ? event.toElement : event.fromElement : event.relatedTarget; 13788 }, 13789 movementX: function(event) { 13790 if ("movementX" in event) return event.movementX; 13791 event !== lastMouseEvent && (lastMouseEvent && "mousemove" === event.type ? (lastMovementX = event.screenX - lastMouseEvent.screenX, lastMovementY = event.screenY - lastMouseEvent.screenY) : lastMovementY = lastMovementX = 0, lastMouseEvent = event); 13792 return lastMovementX; 13793 }, 13794 movementY: function(event) { 13795 return "movementY" in event ? event.movementY : lastMovementY; 13796 } 13797 }), SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface), SyntheticDragEvent = createSyntheticEvent(assign({}, MouseEventInterface, { dataTransfer: 0 })), SyntheticFocusEvent = createSyntheticEvent(assign({}, UIEventInterface, { relatedTarget: 0 })), SyntheticAnimationEvent = createSyntheticEvent(assign({}, EventInterface, { 13798 animationName: 0, 13799 elapsedTime: 0, 13800 pseudoElement: 0 13801 })), SyntheticClipboardEvent = createSyntheticEvent(assign({}, EventInterface, { clipboardData: function(event) { 13802 return "clipboardData" in event ? event.clipboardData : window.clipboardData; 13803 } })), SyntheticCompositionEvent = createSyntheticEvent(assign({}, EventInterface, { data: 0 })), SyntheticInputEvent = SyntheticCompositionEvent, normalizeKey = { 13804 Esc: "Escape", 13805 Spacebar: " ", 13806 Left: "ArrowLeft", 13807 Up: "ArrowUp", 13808 Right: "ArrowRight", 13809 Down: "ArrowDown", 13810 Del: "Delete", 13811 Win: "OS", 13812 Menu: "ContextMenu", 13813 Apps: "ContextMenu", 13814 Scroll: "ScrollLock", 13815 MozPrintableKey: "Unidentified" 13816 }, translateToKey = { 13817 8: "Backspace", 13818 9: "Tab", 13819 12: "Clear", 13820 13: "Enter", 13821 16: "Shift", 13822 17: "Control", 13823 18: "Alt", 13824 19: "Pause", 13825 20: "CapsLock", 13826 27: "Escape", 13827 32: " ", 13828 33: "PageUp", 13829 34: "PageDown", 13830 35: "End", 13831 36: "Home", 13832 37: "ArrowLeft", 13833 38: "ArrowUp", 13834 39: "ArrowRight", 13835 40: "ArrowDown", 13836 45: "Insert", 13837 46: "Delete", 13838 112: "F1", 13839 113: "F2", 13840 114: "F3", 13841 115: "F4", 13842 116: "F5", 13843 117: "F6", 13844 118: "F7", 13845 119: "F8", 13846 120: "F9", 13847 121: "F10", 13848 122: "F11", 13849 123: "F12", 13850 144: "NumLock", 13851 145: "ScrollLock", 13852 224: "Meta" 13853 }, modifierKeyToProp = { 13854 Alt: "altKey", 13855 Control: "ctrlKey", 13856 Meta: "metaKey", 13857 Shift: "shiftKey" 13858 }, SyntheticKeyboardEvent = createSyntheticEvent(assign({}, UIEventInterface, { 13859 key: function(nativeEvent) { 13860 if (nativeEvent.key) { 13861 var key = normalizeKey[nativeEvent.key] || nativeEvent.key; 13862 if ("Unidentified" !== key) return key; 13863 } 13864 return "keypress" === nativeEvent.type ? (nativeEvent = getEventCharCo
13864de(nativeEvent), 13 === nativeEvent ? "Enter" : String.fromCharCode(nativeEvent)) : "keydown" === nativeEvent.type || "keyup" === nativeEvent.type ? translateToKey[nativeEvent.keyCode] || "Unidentified" : ""; 13865 }, 13866 code: 0, 13867 location: 0, 13868 ctrlKey: 0, 13869 shiftKey: 0, 13870 altKey: 0, 13871 metaKey: 0, 13872 repeat: 0, 13873 locale: 0, 13874 getModifierState: getEventModifierState, 13875 charCode: function(event) { 13876 return "keypress" === event.type ? getEventCharCode(event) : 0; 13877 }, 13878 keyCode: function(event) { 13879 return "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0; 13880 }, 13881 which: function(event) { 13882 return "keypress" === event.type ? getEventCharCode(event) : "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0; 13883 } 13884 })), SyntheticPointerEvent = createSyntheticEvent(assign({}, MouseEventInterface, { 13885 pointerId: 0, 13886 width: 0, 13887 height: 0, 13888 pressure: 0, 13889 tangentialPressure: 0, 13890 tiltX: 0, 13891 tiltY: 0, 13892 twist: 0, 13893 pointerType: 0, 13894 isPrimary: 0 13895 })), SyntheticSubmitEvent = createSyntheticEvent(assign({}, EventInterface, { submitter: 0 })), SyntheticTouchEvent = createSyntheticEvent(assign({}, UIEventInterface, { 13896 touches: 0, 13897 targetTouches: 0, 13898 changedTouches: 0, 13899 altKey: 0, 13900 metaKey: 0, 13901 ctrlKey: 0, 13902 shiftKey: 0, 13903 getModifierState: getEventModifierState 13904 })), SyntheticTransitionEvent = createSyntheticEvent(assign({}, EventInterface, { 13905 propertyName: 0, 13906 elapsedTime: 0, 13907 pseudoElement: 0 13908 })), SyntheticWheelEvent = createSyntheticEvent(assign({}, MouseEventInterface, { 13909 deltaX: function(event) { 13910 return "deltaX" in event ? event.deltaX : "wheelDeltaX" in event ? -event.wheelDeltaX : 0; 13911 }, 13912 deltaY: function(event) { 13913 return "deltaY" in event ? event.deltaY : "wheelDeltaY" in event ? -event.wheelDeltaY : "wheelDelta" in event ? -event.wheelDelta : 0; 13914 }, 13915 deltaZ: 0, 13916 deltaMode: 0 13917 })), SyntheticToggleEvent = createSyntheticEvent(assign({}, EventInterface, { 13918 newState: 0, 13919 oldState: 0, 13920 source: 0 13921 })), END_KEYCODES = [ 13922 9, 13923 13, 13924 27, 13925 32 13926 ], START_KEYCODE = 229, canUseCompositionEvent = canUseDOM && "CompositionEvent" in window, documentMode = null; 13927 canUseDOM && "documentMode" in document && (documentMode = document.documentMode); 13928 var canUseTextInputEvent = canUseDOM && "TextEvent" in window && !documentMode, useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && 8 < documentMode && 11 >= documentMode), SPACEBAR_CODE = 32, SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE), hasSpaceKeypress = !1, isComposing = !1, supportedInputTypes = { 13929 color: !0, 13930 date: !0, 13931 datetime: !0, 13932 "datetime-local": !0, 13933 email: !0, 13934 month: !0, 13935 number: !0, 13936 password: !0, 13937 range: !0, 13938 search: !0, 13939 tel: !0, 13940 text: !0, 13941 time: !0, 13942 url: !0, 13943 week: !0 13944 }, activeElement$1 = null, activeElementInst$1 = null, isInputEventSupported = !1; 13945 canUseDOM && (isInputEventSupported = isEventSupported("input") && (!document.documentMode || 9 < document.documentMode)); 13946 var objectIs = "function" === typeof Object.is ? Object.is : is, skipSelectionChangeEvent = canUseDOM && "documentMode" in document && 11 >= document.documentMode, activeElement = null, activeElementInst = null, lastSelection = null, mouseDown = !1, vendorPrefixes = { 13947 animationend: makePrefixMap("Animation", "AnimationEnd"), 13948 animationiteration: makePrefixMap("Animation", "AnimationIteration"), 13949 animationstart: makePrefixMap("Animation", "AnimationStart"), 13950 transitionrun: makePrefixMap("Transition", "TransitionRun"), 13951 transitionstart: makePrefixMap("Transition", "TransitionStart"), 13952 transitioncancel: makePrefixMap("Transition", "TransitionCancel"), 13953 transitionend: makePrefixMap("Transition", "TransitionEnd") 13954 }, prefixedEventNames = {}, style = {};
vendor: 4,875 bytes, lines 13955-14002
13955 canUseDOM && (style = document.createElement("div").style, "AnimationEvent" in window || (delete vendorPrefixes.animationend.animation, delete vendorPrefixes.animationiteration.animation, delete vendorPrefixes.animationstart.animation), "TransitionEvent" in window || delete vendorPrefixes.transitionend.transition); 13956 var ANIMATION_END = getVendorPrefixedEventName("animationend"), ANIMATION_ITERATION = getVendorPrefixedEventName("animationiteration"), ANIMATION_START = getVendorPrefixedEventName("animationstart"), TRANSITION_RUN = getVendorPrefixedEventName("transitionrun"), TRANSITION_START = getVendorPrefixedEventName("transitionstart"), TRANSITION_CANCEL = getVendorPrefixedEventName("transitioncancel"), TRANSITION_END = getVendorPrefixedEventName("transitionend"), topLevelEventsToReactNames = /* @__PURE__ */ new Map(), simpleEventPluginEvents = "abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error fullscreenChange fullscreenError gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" "); 13957 simpleEventPluginEvents.push("scrollEnd"); 13958 var globalClientIdCounter$1 = 0, lastResetTime = 0; 13959 if ("object" === typeof performance && "function" === typeof performance.now) { 13960 var localPerformance = performance; 13961 var getCurrentTime = function() { 13962 return localPerformance.now(); 13963 }; 13964 } else { 13965 var localDate = Date; 13966 getCurrentTime = function() { 13967 return localDate.now(); 13968 }; 13969 } 13970 var reportGlobalError = "function" === typeof reportError ? reportError : function(error) { 13971 if ("object" === typeof window && "function" === typeof window.ErrorEvent) { 13972 var event = new window.ErrorEvent("error", { 13973 bubbles: !0, 13974 cancelable: !0, 13975 message: "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error), 13976 error 13977 }); 13978 if (!window.dispatchEvent(event)) return; 13979 } else if ("object" === typeof process && "function" === typeof process.emit) { 13980 process.emit("uncaughtException", error); 13981 return; 13982 } 13983 console.error(error); 13984 }, OMITTED_PROP_ERROR = "This object has been omitted by React in the console log to avoid sending too much data from the server. Try logging smaller or more specific objects.", EMPTY_ARRAY = 0, COMPLEX_ARRAY = 1, PRIMITIVE_ARRAY = 2, ENTRIES_ARRAY = 3, OBJECT_WIDTH_LIMIT = 100, REMOVED = "-\xA0", ADDED = "+\xA0", UNCHANGED = " \xA0", supportsUserTiming = "undefined" !== typeof console && "function" === typeof console.timeStamp && "undefined" !== typeof performance && "function" === typeof performance.measure, COMPONENTS_TRACK = "Components ⚛", LANES_TRACK_GROUP = "Scheduler ⚛", currentTrack = "Blocking", alreadyWarnedForDeepEquality = !1, reusableComponentDevToolDetails = { 13985 color: "primary", 13986 properties: null, 13987 tooltipText: "", 13988 track: COMPONENTS_TRACK 13989 }, reusableComponentOptions = { 13990 start: -0, 13991 end: -0, 13992 detail: { devtools: reusableComponentDevToolDetails } 13993 }, reusableChangedPropsEntry = ["Changed Props", ""], DEEP_EQUALITY_WARNING = "This component received deeply equal props. It might benefit from useMemo or the React Compiler in its owner.", reusableDeeplyEqualPropsEntry = ["Changed Props", DEEP_EQUALITY_WARNING], OffscreenVisible = 1, OffscreenPassiveEffectsConnected = 2, concurrentQueues = [], concurrentQueuesIndex = 0, concurrentlyUpdatedLanes = 0, emptyContextObject = {}; 13994 Object.freeze(emptyContextObject); 13995 var resolveFamily = null, failedBoundaries = null, NoMode = 0, ConcurrentMode = 1, ProfileMode = 2, StrictLegacyMode = 8, StrictEffectsMode = 16, SuspenseyImagesMode = 32; 13996 var hasBadMapPolyfill = !1; 13997 try { 13998 Object.preventExtensions({}); 13999 } catch (e$4) { 14000 hasBadMapPolyfill = !0; 14001 } 14002 var CapturedStacks = /* @__PURE__ */ new WeakMap(), forkStack = [], forkStackIndex = 0, treeForkProvider = null, treeForkCount = 0, idStack = [], idStackIndex = 0, treeContextProvider = null, treeContextId = 1, treeContextOverflow = "", hydrationParentFiber = null, nextHydratableInstance = null, isHydrating = !1, didSuspendOrErrorDEV = !1, hydrationDiffRootDEV = null, hydrationErrors = null, rootOrSingletonContext = !1, HydrationMismatchException = Error("Hydration Mismatch Exception: This is not a real error, and should not leak into userspace. If you're seeing this, it's likely a bug in React."), valueCursor = createCursor(null);
14003 var rendererCursorDEV = createCursor(null); 14004 var rendererSigil = {}; 14005 var currentlyRenderingFiber$1 = null, lastContextDependency = null, isDisallowedContextReadInDEV = !1, AbortControllerLocal = "undefined" !== typeof AbortController ? AbortController : function() { 14006 var listeners = [], signal = this.signal = { 14007 aborted: !1, 14008 addEventListener: function(type, listener) { 14009 listeners.push(listener); 14010 } 14011 }; 14012 this.abort = function() { 14013 signal.aborted = !0; 14014 listeners.forEach(function(listener) { 14015 return listener(); 14016 }); 14017 }; 14018 }, scheduleCallback$2 = Scheduler.unstable_scheduleCallback, NormalPriority = Scheduler.unstable_NormalPriority, CacheContext = { 14019 $$typeof: REACT_CONTEXT_TYPE, 14020 Consumer: null, 14021 Provider: null, 14022 _currentValue: null, 14023 _currentValue2: null, 14024 _threadCount: 0, 14025 _currentRenderer: null, 14026 _currentRenderer2: null 14027 }, entangledTransitionTypes = null, now = Scheduler.unstable_now, createTask = console.createTask ? console.createTask : function() { 14028 return null; 14029 }, SPAWNED_UPDATE = 1, PINGED_UPDATE = 2, renderStartTime = -0, c
14029ommitStartTime = -0, commitEndTime = -0, commitErrors = null, profilerStartTime = -1.1, profilerEffectDuration = -0, componentEffectDuration = -0, componentEffectStartTime = -1.1, componentEffectEndTime = -1.1, componentEffectErrors = null, componentEffectSpawnedUpdate = !1, blockingClampTime = -0, blockingUpdateTime = -1.1, blockingUpdateTask = null, blockingUpdateType = 0, blockingUpdateMethodName = null, blockingUpdateComponentName = null, blockingEventTime = -1.1, blockingEventType = null, blockingEventRepeatTime = -1.1, blockingSuspendedTime = -1.1, transitionClampTime = -0, transitionStartTime = -1.1, transitionUpdateTime = -1.1, transitionUpdateType = 0, transitionUpdateTask = null, transitionUpdateMethodName = null, transitionUpdateComponentName = null, transitionEventTime = -1.1, transitionEventType = null, transitionEventRepeatTime = -1.1, transitionSuspendedTime = -1.1, retryClampTime = -0, idleClampTime = -0, animatingLanes = 0, animatingTask = null, yieldReason = 0, yieldStartTime = -1.1, currentUpdateIsNested = !1, nestedUpdateScheduled = !1, currentEntangledListeners = null, currentEntangledPendingCount = 0, currentEntangledLane = 0, currentEntangledActionThenable = null, prevOnStartTransitionFinish = ReactSharedInternals.S; 14030 ReactSharedInternals.S = function(transition, returnValue) { 14031 globalMostRecentTransitionTime = now$1(); 14032 if ("object" === typeof returnValue && null !== returnValue && "function" === typeof returnValue.then) { 14033 if (0 > transitionStartTime && 0 > transitionUpdateTime) { 14034 transitionStartTime = now(); 14035 var newEventTime = resolveEventTimeStamp(), newEventType = resolveEventType(); 14036 if (newEventTime !== transitionEventRepeatTime || newEventType !== transitionEventType) transitionEventRepeatTime = -1.1; 14037 transitionEventTime = newEventTime; 14038 transitionEventType = newEventType; 14039 } 14040 entangleAsyncAction(transition, returnValue); 14041 } 14042 if (null !== entangledTransitionTypes) for (newEventTime = firstScheduledRoot; null !== newEventTime;) queueTransitionTypes(newEventTime, entangledTransitionTypes), newEventTime = newEventTime.next; 14043 newEventTime = transition.types; 14044 if (null !== newEventTime) { 14045 for (newEventType = firstScheduledRoot; null !== newEventType;) queueTransitionTypes(newEventType, newEventTime), newEventType = newEventType.next; 14046 if (0 !== currentEntangledLane) { 14047 newEventType = entangledTransitionTypes; 14048 null === newEventType && (newEventType = entangledTransitionTypes = []); 14049 for (var i = 0; i < newEventTime.length; i++) { 14050 var transitionType = newEventTime[i]; 14051 -1 === newEventType.indexOf(transitionType) && newEventType.push(transitionType); 14052 } 14053 } 14054 } 14055 null !== prevOnStartTransitionFinish && prevOnStartTransitionFinish(transition, returnValue); 14056 }; 14057 var resumedCache = createCursor(null), ReactStrictModeWarnings = { 14058 recordUnsafeLifecycleWarnings: function() {}, 14059 flushPendingUnsafeLifecycleWarnings: function() {}, 14060 recordLegacyContextWarning: function() {}, 14061 flushLegacyContextWarning: function() {}, 14062 discardPendingWarnings: function() {} 14063 }, pendingComponentWillMountWarnings = [], pendingUNSAFE_ComponentWillMountWarnings = [], pendingComponentWillReceivePropsWarnings = [], pendingUNSAFE_ComponentWillReceivePropsWarnings = [], pendingComponentWillUpdateWarnings = [], pendingUNSAFE_ComponentWillUpdateWarnings = [], didWarnAboutUnsafeLifecycles = /* @__PURE__ */ new Set(); 14064 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function(fiber, instance) { 14065 didWarnAboutUnsafeLifecycles.has(fiber.type) || ("function" === typeof instance.componentWillMount && !0 !== instance.componentWillMount.__suppressDeprecationWarning && pendingComponentWillMountWarnings.push(fiber), fiber.mode & StrictLegacyMode && "function" === typeof instance.UNSAFE_componentWillMount && pendingUNSAFE_ComponentWillMountWarnings.push(fiber), "function" === typeof instance.componentWillReceiveProps && !0 !== instance.componentWillReceiveProps.__suppressDeprecationWarning && pendingComponentWillReceivePropsWarnings.push(fiber), fiber.mode & StrictLegacyMode && "function" === typeof instance.UNSAFE_componentWillReceiveProps && pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber), "function" === typeof instance.componentWillUpdate && !0 !== instance.componentWillUpdate.__suppressDeprecationWarning && pendingComponentWillUpdateWarnings.push(fiber), fiber.mode & StrictLegacyMode && "function" === typeof instance.UNSAFE_componentWillUpdate && pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber)); 14066 }; 14067 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function() { 14068 var componentWillMountUniqueNames = /* @__PURE__ */ new Set(); 14069 0 < pendingComponentWillMountWarnings.length && (pendingComponentWillMountWarnings.forEac
14069h(function(fiber) { 14070 componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14071 didWarnAboutUnsafeLifecycles.add(fiber.type); 14072 }), pendingComponentWillMountWarnings = []); 14073 var UNSAFE_componentWillMountUniqueNames = /* @__PURE__ */ new Set(); 14074 0 < pendingUNSAFE_ComponentWillMountWarnings.length && (pendingUNSAFE_ComponentWillMountWarnings.forEach(function(fiber) { 14075 UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14076 didWarnAboutUnsafeLifecycles.add(fiber.type); 14077 }), pendingUNSAFE_ComponentWillMountWarnings = []); 14078 var componentWillReceivePropsUniqueNames = /* @__PURE__ */ new Set(); 14079 0 < pendingComponentWillReceivePropsWarnings.length && (pendingComponentWillReceivePropsWarnings.forEach(function(fiber) { 14080 componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14081 didWarnAboutUnsafeLifecycles.add(fiber.type); 14082 }), pendingComponentWillReceivePropsWarnings = []); 14083 var UNSAFE_componentWillReceivePropsUniqueNames = /* @__PURE__ */ new Set(); 14084 0 < pendingUNSAFE_ComponentWillReceivePropsWarnings.length && (pendingUNSAFE_ComponentWillReceivePropsWarnings.forEac
14084h(function(fiber) { 14085 UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14086 didWarnAboutUnsafeLifecycles.add(fiber.type); 14087 }), pendingUNSAFE_ComponentWillReceivePropsWarnings = []); 14088 var componentWillUpdateUniqueNames = /* @__PURE__ */ new Set(); 14089 0 < pendingComponentWillUpdateWarnings.length && (pendingComponentWillUpdateWarnings.forEach(function(fiber) { 14090 componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14091 didWarnAboutUnsafeLifecycles.add(fiber.type); 14092 }), pendingComponentWillUpdateWarnings = []); 14093 var UNSAFE_componentWillUpdateUniqueNames = /* @__PURE__ */ new Set(); 14094 0 < pendingUNSAFE_ComponentWillUpdateWarnings.length && (pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function(fiber) { 14095 UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14096 didWarnAboutUnsafeLifecycles.add(fiber.type); 14097 }), pendingUNSAFE_ComponentWillUpdateWarnings = []); 14098 if (0 < UNSAFE_componentWillMountUniqueNames.size) { 14099 var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames); 14100 console.error("Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n\nPlease update the following components: %s", sortedNames); 14101 } 14102 0 < UNSAFE_componentWillReceivePropsUniqueNames.size && (sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames), console.error("Using UNSAFE_componentWillReceiveProps in strict mode is not recommended and may indicate bugs in your code. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://react.dev/link/derived-state\n\nPlease update the following components: %s", sortedNames)); 14103 0 < UNSAFE_componentWillUpdateUniqueNames.size && (sortedNames = setToSortedString(UNSAFE_componentWillUpdateUniqueNames), console.error("Using UNSAFE_componentWillUpdate in strict mode is not recommended and may indicate bugs in your code. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n\nPlease update the following components: %s", sortedNames)); 14104 0 < componentWillMountUniqueNames.size && (sortedNames = setToSortedString(componentWillMountUniqueNames), console.warn("componentWillMount has been renamed, and is not recommended for use. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n* Rename componentWillMount to UNSAFE_componentWillMount to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", sortedNames)); 14105 0 < componentWillReceivePropsUniqueNames.size && (sortedNames = setToSortedString(componentWillReceivePropsUniqueNames), console.warn("componentWillReceiveProps has been renamed, and is not recommended for use. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://react.dev/link/derived-state\n* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", sortedNames)); 14106 0 < componentWillUpdateUniqueNames.size && (sortedNames = setToSortedString(componentWillUpdateUniqueNames), console.warn("componentWillUpdate has been renamed, and is not recommended for use. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", sortedNames)); 14107 };
14108 var pendingLegacyContextWarning = /* @__PURE__ */ new Map(), didWarnAboutLegacyContext = /* @__PURE__ */ new Set(); 14109 ReactStrictModeWarnings.recordLegacyContextWarning = function(fiber, instance) { 14110 var strictRoot = null; 14111 for (var node = fiber; null !== node;) node.mode & StrictLegacyMode && (strictRoot = node), node = node.return; 14112 null === strictRoot ? console.error("Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue.") : !didWarnAboutLegacyContext.has(fiber.type) && (node = pendingLegacyContextWarning.get(strictRoot), null != fiber.type.contextTypes || null != fiber.type.childContextTypes || null !== instance && "function" === typeof instance.getChildContext) && (void 0 === node && (node = [], pendingLegacyContextWarning.set(strictRoot, node)), node.push(fiber)); 14113 }; 14114 ReactStrictModeWarnings.flushLegacyContextWarning = function() { 14115 pendingLegacyContextWarning.forEach(function(fiberArray) { 14116 if (0 !== fiberArray.length) { 14117 var firstFiber = fiberArray[0], uniqueNames = /* @__PURE__ */ new Set(); 14118 fiberArray.forEach(function(fiber) { 14119 uniqueNames.add(getComponentNameFromFiber(fiber) || "Component"); 14120 didWarnAboutLegacyContext.add(fiber.type); 14121 }); 14122 var sortedNames = setToSortedString(uniqueNames); 14123 runWithFiberInDEV(firstFiber, function() { 14124 console.error("Legacy context API has been detected within a strict-mode tree.\n\nThe old API will be supported in all 16.x releases, but applications using it should migrate to the new version.\n\nPlease update the following components: %s\n\nLearn more about this warning here: https://react.dev/link/legacy-context", sortedNames); 14125 }); 14126 } 14127 }); 14128 }; 14129 ReactStrictModeWarnings.discardPendingWarnings = function() { 14130 pendingComponentWillMountWarnings = []; 14131 pendingUNSAFE_ComponentWillMountWarnings = []; 14132 pendingComponentWillReceivePropsWarnings = []; 14133 pendingUNSAFE_ComponentWillReceivePropsWarnings = []; 14134 pendingComponentWillUpdateWarnings = []; 14135 pendingUNSAFE_ComponentWillUpdateWarnings = []; 14136 pendingLegacyContextWarning = /* @__PURE__ */ new Map(); 14137 }; 14138 var REACT_RECOVERABLE_DIGEST = "", callComponent = { react_stack_bottom_frame: function(Component, props, secondArg) { 14139 var wasRendering = isRendering; 14140 isRendering = !0; 14141 try { 14142 return Component(props, secondArg); 14143 } finally { 14144 isRendering = wasRendering; 14145 } 14146 } }, callComponentInDEV = callComponent.react_stack_bottom_frame.bind(callComponent), callRender = { react_stack_bottom_frame: function(instance) { 14147 var wasRendering = isRendering; 14148 isRendering = !0; 14149 try { 14150 return instance.render(); 14151 } finally { 14152 isRendering = wasRendering; 14153 } 14154 } }, callRenderInDEV = callRender.react_stack_bottom_frame.bind(callRender), callComponentDidMount = { react_stack_bottom_frame: function(finishedWork, instance) { 14155 try { 14156 instance.componentDidMount(); 14157 } catch (error) { 14158 captureCommitPhaseError(finishedWork, finishedWork.return, error); 14159 } 14160 } }, callComponentDidMountInDEV = callComponentDidMount.react_stack_bottom_frame.bind(callComponentDidMount), callComponentDidUpdate = { react_stack_bottom_frame: function(finishedWork, instance, prevProps, prevState, snapshot) { 14161 try { 14162 instance.componentDidUpdate(prevProps, prevState, snapshot); 14163 } catch (error) { 14164 captureCommitPhaseError(finishedWork, finishedWork.return, error); 14165 } 14166 } }, callComponentDidUpdateInDEV = callComponentDidUpdate.react_stack_bottom_frame.bind(callComponentDidUpdate), callComponentDidCatch = { react_stack_bottom_frame: function(instance, errorInfo) { 14167 var stack = errorInfo.stack; 14168 instance.componentDidCatch(errorInfo.value, { componentStack: null !== stack ? stack : "" }); 14169 } }, callComponentDidCatchInDEV = callComponentDidCatch.react_stack_bottom_frame.bind(callComponentDidCatch), callComponentWillUnmount = { react_stack_bottom_frame: function(current, nearestMountedAncestor, instance) { 14170 try { 14171 instance.componentWillUnmount(); 14172 } catch (error) { 14173 captureCommitPhaseError(current, nearestMountedAncestor, error); 14174 } 14175 } }, callComponentWillUnmountInDEV = callComponentWillUnmount.react_stack_bottom_frame.bind(callComponentWillUnmount), callCreate = { react_stack_bottom_frame: function(effect) { 14176 var create = effect.create; 14177 effect = effect.inst; 14178 create = create(); 14179 return effect.destroy = create; 14180 } }, callCreateInDEV = callCreate.react_stack_bottom_frame.bind(callCreate), callDestroy = { react_stack_bottom_frame: function(current, nearestMountedAncestor, destroy) { 14181 try { 14182 destroy(); 14183 } catch (error) { 14184 captureCommitPhaseError(current, nearestMountedAncestor, error); 14185 } 14186 } }, callDestroyInDEV = callDestroy.react_stack_bottom_frame.bind(callDestroy), callLazyInit = { react_stack_bottom_frame: function(lazy) { 14187 var init = lazy._init; 14188 return init(lazy._payload); 14189 } }, callLazyInitInDEV = callLazyInit.react_stack_bottom_frame.bind(callLazyInit), SuspenseException = Error("Suspense Exception: This is not a real error! It's an implementation detail of `use` to interrupt the current render. You must either rethrow it immediately, or move the `use` call outside of the `try/catch` block. Capturing without rethrowing will lead to unexpected behavior.\n\nTo handle async errors, wrap your component in an error boundary, or call the promise's `.catch` method and pass the result to `use`."), SuspenseyCommitException = Error("Suspense Exception: This is not a real error, and should not leak into userspace. If you're seeing this, it's likely a bug in React."), SuspenseActionException = Error("Suspense Exception: This is not a real error! It's an implementation detail of `useActionState` to interrupt the current render. You must either rethrow it immediately, or move the `useActionState` call outside of the `try/catch` block. Capturing without rethrowing will lead to unexpected behavior.\n\nTo handle async errors, wrap your component in an error boundary."), noopSuspenseyCommitThenable = { then: function() { 14190 console.error("Internal React error: A listener was unexpectedly attached to a \"noop\" thenable. This is a bug in React. Please file an issue."); 14191 } }, lastSuspendedFiber = null, lastSuspendedStack = null, didIssueUseWarning = !1, suspendedThenable = null, needsToResetSuspendedThenableDEV = !1, thenableState$1 = null, thenableIndexCounter$1 = 0, currentDebugInfo = null, didWarnAboutMaps; 14192 var didWarnAboutGenerators = didWarnAboutMaps = !1; 14193 var ownerHasKeyUseWarning = {}; 14194 var ownerHasFunctionTypeWarning = {}; 14195 var ownerHasSymbolTypeWarning = {}; 14196 warnForMissingKey = function(returnFiber, workInProgress, child) { 14197 if (null !== child && "object" === typeof child && child._store && (!child._store.validated && null == child.key || 2 === child._store.validated)) { 14198 if ("object" !== typeof child._store) throw Error("React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue."); 14199 child._store.validated = 1; 14200 var componentName = getComponentNameFromFiber(returnFiber), componentKey = componentName || "null"; 14201 if (!ownerHasKeyUseWarning[componentKey]) { 14202 ownerHasKeyUseWarning[componentKey] = !0; 14203 child = child._owner; 14204 returnFiber = returnFiber._debugOwner; 14205 var currentComponentErrorInfo = ""; 14206 returnFiber && "number" === typeof returnFiber.tag && (componentKey = getComponentNameFromFiber(returnFiber)) && (currentComponentErrorInfo = "\n\nCheck the render method of `" + componentKey + "`."); 14207 currentComponentErrorInfo || componentName && (currentComponentErrorInfo = "\n\nCheck the top-level render call using <" + componentName + ">."); 14208 var childOwnerAppendix = ""; 14209 null != child && returnFiber !== child && (componentName = null, "number" === typeof child.tag ? componentName = getComponentNameFromFiber(child) : "string" === typeof child.name && (componentName = child.name), componentName && (childOwnerAppendix = " It was passed a child from " + componentName + ".")); 14210 runWithFiberInDEV(workInProgress, function() {
vendor: 34,000 bytes, lines 14211-15222
14211 console.error("Each child in a list should have a unique \"key\" prop.%s%s See https://react.dev/link/warning-keys for more information.", currentComponentErrorInfo, childOwnerAppendix); 14212 }); 14213 } 14214 } 14215 }; 14216 var reconcileChildFibers = createChildReconciler(!0), mountChildFibers = createChildReconciler(!1), UpdateState = 0, ReplaceState = 1, ForceUpdate = 2, CaptureUpdate = 3, hasForceUpdate = !1; 14217 var didWarnUpdateInsideUpdate = !1; 14218 var currentlyProcessingQueue = null; 14219 var didReadFromEntangledAsyncAction = !1, currentTreeHiddenStackCursor = createCursor(null), prevEntangledRenderLanesCursor = createCursor(0), suspenseHandlerStackCursor = createCursor(null), shellBoundary = null, SubtreeSuspenseContextMask = 1, ForceSuspenseFallback = 2, suspenseStackCursor = createCursor(0), NoFlags = 0, HasEffect = 1, Insertion = 2, Layout = 4, Passive = 8, didWarnUncachedGetSnapshot; 14220 var didWarnAboutMismatchedHooksForComponent = /* @__PURE__ */ new Set(); 14221 var didWarnAboutUseWrappedInTryCatch = /* @__PURE__ */ new Set(); 14222 var didWarnAboutAsyncClientComponent = /* @__PURE__ */ new Set(); 14223 var didWarnAboutUseFormState = /* @__PURE__ */ new Set(); 14224 var renderLanes = 0, currentlyRenderingFiber = null, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = !1, didScheduleRenderPhaseUpdateDuringThisPass = !1, shouldDoubleInvokeUserFnsInHooksDEV = !1, localIdCounter = 0, thenableIndexCounter = 0, thenableState = null, globalClientIdCounter = 0, RE_RENDER_LIMIT = 25, currentHookNameInDev = null, hookTypesDev = null, hookTypesUpdateIndexDev = -1, ignorePreviousDependencies = !1, ContextOnlyDispatcher = { 14225 readContext, 14226 use, 14227 useCallback: throwInvalidHookError, 14228 useContext: throwInvalidHookError, 14229 useEffect: throwInvalidHookError, 14230 useImperativeHandle: throwInvalidHookError, 14231 useLayoutEffect: throwInvalidHookError, 14232 useInsertionEffect: throwInvalidHookError, 14233 useMemo: throwInvalidHookError, 14234 useReducer: throwInvalidHookError, 14235 useRef: throwInvalidHookError, 14236 useState: throwInvalidHookError, 14237 useDebugValue: throwInvalidHookError, 14238 useDeferredValue: throwInvalidHookError, 14239 useTransition: throwInvalidHookError, 14240 useSyncExternalStore: throwInvalidHookError, 14241 useId: throwInvalidHookError, 14242 useHostTransitionStatus: throwInvalidHookError, 14243 useFormState: throwInvalidHookError, 14244 useActionState: throwInvalidHookError, 14245 useOptimistic: throwInvalidHookError, 14246 useMemoCache: throwInvalidHookError, 14247 useCacheRefresh: throwInvalidHookError, 14248 useEffectEvent: throwInvalidHookError 14249 }, HooksDispatcherOnMountInDEV = null, HooksDispatcherOnMountWithHookTypesInDEV = null, HooksDispatcherOnUpdateInDEV = null, HooksDispatcherOnRerenderInDEV = null, InvalidNestedHooksDispatcherOnMountInDEV = null, InvalidNestedHooksDispatcherOnUpdateInDEV = null, InvalidNestedHooksDispatcherOnRerenderInDEV = null; 14250 HooksDispatcherOnMountInDEV = { 14251 readContext: function(context) { 14252 return readContext(context); 14253 }, 14254 use, 14255 useCallback: function(callback, deps) { 14256 currentHookNameInDev = "useCallback"; 14257 mountHookTypesDev(); 14258 checkDepsAreArrayDev(deps); 14259 return mountCallback(callback, deps); 14260 }, 14261 useContext: function(context) { 14262 currentHookNameInDev = "useContext"; 14263 mountHookTypesDev(); 14264 return readContext(context); 14265 }, 14266 useEffect: function(create, deps) { 14267 currentHookNameInDev = "useEffect"; 14268 mountHookTypesDev(); 14269 checkDepsAreArrayDev(deps); 14270 return mountEffect(create, deps); 14271 }, 14272 useImperativeHandle: function(ref, create, deps) { 14273 currentHookNameInDev = "useImperativeHandle"; 14274 mountHookTypesDev(); 14275 checkDepsAreArrayDev(deps); 14276 return mountImperativeHandle(ref, create, deps); 14277 }, 14278 useInsertionEffect: function(create, deps) { 14279 currentHookNameInDev = "useInsertionEffect"; 14280 mountHookTypesDev(); 14281 checkDepsAreArrayDev(deps); 14282 mountEffectImpl(4, Insertion, create, deps); 14283 }, 14284 useLayoutEffect: function(create, deps) { 14285 currentHookNameInDev = "useLayoutEffect"; 14286 mountHookTypesDev(); 14287 checkDepsAreArrayDev(deps); 14288 return mountLayoutEffect(create, deps); 14289 }, 14290 useMemo: function(create, deps) { 14291 currentHookNameInDev = "useMemo"; 14292 mountHookTypesDev(); 14293 checkDepsAreArrayDev(deps); 14294 var prevDispatcher = ReactSharedInternals.H; 14295 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14296 try { 14297 return mountMemo(create, deps); 14298 } finally { 14299 ReactSharedInternals.H = prevDispatcher; 14300 } 14301 }, 14302 useReducer: function(reducer, initialArg, init) { 14303 currentHookNameInDev = "useReducer"; 14304 mountHookTypesDev(); 14305 var prevDispatcher = ReactSharedInternals.H; 14306 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14307 try { 14308 return mountReducer(reducer, initialArg, init); 14309 } finally { 14310 ReactSharedInternals.H = prevDispatcher; 14311 } 14312 }, 14313 useRef: function(initialValue) { 14314 currentHookNameInDev = "useRef"; 14315 mountHookTypesDev(); 14316 return mountRef(initialValue); 14317 }, 14318 useState: function(initialState) { 14319 currentHookNameInDev = "useState"; 14320 mountHookTypesDev(); 14321 var prevDispatcher = ReactSharedInternals.H; 14322 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14323 try { 14324 return mountState(initialState); 14325 } finally { 14326 ReactSharedInternals.H = prevDispatcher; 14327 } 14328 }, 14329 useDebugValue: function() { 14330 currentHookNameInDev = "useDebugValue"; 14331 mountHookTypesDev(); 14332 }, 14333 useDeferredValue: function(value, initialValue) { 14334 currentHookNameInDev = "useDeferredValue"; 14335 mountHookTypesDev(); 14336 return mountDeferredValue(value, initialValue); 14337 }, 14338 useTransition: function() { 14339 currentHookNameInDev = "useTransition"; 14340 mountHookTypesDev(); 14341 return mountTransition(); 14342 }, 14343 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 14344 currentHookNameInDev = "useSyncExternalStore"; 14345 mountHookTypesDev(); 14346 return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 14347 }, 14348 useId: function() { 14349 currentHookNameInDev = "useId"; 14350 mountHookTypesDev(); 14351 return mountId(); 14352 }, 14353 useFormState: function(action, initialState) { 14354 currentHookNameInDev = "useFormState"; 14355 mountHookTypesDev(); 14356 warnOnUseFormStateInDev(); 14357 return mountActionState(action, initialState); 14358 }, 14359 useActionState: function(action, initialState) { 14360 currentHookNameInDev = "useActionState"; 14361 mountHookTypesDev(); 14362 return mountActionState(action, initialState); 14363 }, 14364 useOptimistic: function(passthrough) { 14365 currentHookNameInDev = "useOptimistic"; 14366 mountHookTypesDev(); 14367 return mountOptimistic(passthrough); 14368 }, 14369 useHostTransitionStatus, 14370 useMemoCache, 14371 useCacheRefresh: function() { 14372 currentHookNameInDev = "useCacheRefresh"; 14373 mountHookTypesDev(); 14374 return mountRefresh(); 14375 }, 14376 useEffectEvent: function(callback) { 14377 currentHookNameInDev = "useEffectEvent"; 14378 mountHookTypesDev(); 14379 return mountEvent(callback); 14380 } 14381 }; 14382 HooksDispatcherOnMountWithHookTypesInDEV = { 14383 readContext: function(context) { 14384 return readContext(context); 14385 }, 14386 use, 14387 useCallback: function(callback, deps) { 14388 currentHookNameInDev = "useCallback"; 14389 updateHookTypesDev(); 14390 return mountCallback(callback, deps); 14391 }, 14392 useContext: function(context) { 14393 currentHookNameInDev = "useContext"; 14394 updateHookTypesDev(); 14395 return readContext(context); 14396 }, 14397 useEffect: function(create, deps) { 14398 currentHookNameInDev = "useEffect"; 14399 updateHookTypesDev(); 14400 return mountEffect(create, deps); 14401 }, 14402 useImperativeHandle: function(ref, create, deps) { 14403 currentHookNameInDev = "useImperativeHandle"; 14404 updateHookTypesDev(); 14405 return mountImperativeHandle(ref, create, deps); 14406 }, 14407 useInsertionEffect: function(create, deps) { 14408 currentHookNameInDev = "useInsertionEffect"; 14409 updateHookTypesDev(); 14410 mountEffectImpl(4, Insertion, create, deps); 14411 }, 14412 useLayoutEffect: function(create, deps) { 14413 currentHookNameInDev = "useLayoutEffect"; 14414 updateHookTypesDev(); 14415 return mountLayoutEffect(create, deps); 14416 }, 14417 useMemo: function(create, deps) { 14418 currentHookNameInDev = "useMemo"; 14419 updateHookTypesDev(); 14420 var prevDispatcher = ReactSharedInternals.H; 14421 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14422 try { 14423 return mountMemo(create, deps); 14424 } finally { 14425 ReactSharedInternals.H = prevDispatcher; 14426 } 14427 }, 14428 useReducer: function(reducer, initialArg, init) { 14429 currentHookNameInDev = "useReducer"; 14430 updateHookTypesDev(); 14431 var prevDispatcher = ReactSharedInternals.H; 14432 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14433 try { 14434 return mountReducer(reducer, initialArg, init); 14435 } finally { 14436 ReactSharedInternals.H = prevDispatcher; 14437 } 14438 }, 14439 useRef: function(initialValue) { 14440 currentHookNameInDev = "useRef"; 14441 updateHookTypesDev(); 14442 return mountRef(initialValue); 14443 }, 14444 useState: function(initialState) { 14445 currentHookNameInDev = "useState"; 14446 updateHookTypesDev(); 14447 var prevDispatcher = ReactSharedInternals.H; 14448 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14449 try { 14450 return mountState(initialState); 14451 } finally { 14452 ReactSharedInternals.H = prevDispatcher; 14453 } 14454 }, 14455 useDebugValue: function() { 14456 currentHookNameInDev = "useDebugValue"; 14457 updateHookTypesDev(); 14458 }, 14459 useDeferredValue: function(value, initialValue) { 14460 currentHookNameInDev = "useDeferredValue"; 14461 updateHookTypesDev(); 14462 return mountDeferredValue(value, initialValue); 14463 }, 14464 useTransition: function() { 14465 currentHookNameInDev = "useTransition"; 14466 updateHookTypesDev(); 14467 return mountTransition(); 14468 }, 14469 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 14470 currentHookNameInDev = "useSyncExternalStore"; 14471 updateHookTypesDev(); 14472 return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 14473 }, 14474 useId: function() { 14475 currentHookNameInDev = "useId"; 14476 updateHookTypesDev(); 14477 return mountId(); 14478 }, 14479 useActionState: function(action, initialState) { 14480 currentHookNameInDev = "useActionState"; 14481 updateHookTypesDev(); 14482 return mountActionState(action, initialState); 14483 }, 14484 useFormState: function(action, initialState) { 14485 currentHookNameInDev = "useFormState"; 14486 updateHookTypesDev(); 14487 warnOnUseFormStateInDev(); 14488 return mountActionState(action, initialState); 14489 }, 14490 useOptimistic: function(passthrough) { 14491 currentHookNameInDev = "useOptimistic"; 14492 updateHookTypesDev(); 14493 return mountOptimistic(passthrough); 14494 }, 14495 useHostTransitionStatus, 14496 useMemoCache, 14497 useCacheRefresh: function() { 14498 currentHookNameInDev = "useCacheRefresh"; 14499 updateHookTypesDev(); 14500 return mountRefresh(); 14501 }, 14502 useEffectEvent: function(callback) { 14503 currentHookNameInDev = "useEffectEvent"; 14504 updateHookTypesDev(); 14505 return mountEvent(callback); 14506 } 14507 }; 14508 HooksDispatcherOnUpdateInDEV = { 14509 readContext: function(context) { 14510 return readContext(context); 14511 }, 14512 use, 14513 useCallback: function(callback, deps) { 14514 currentHookNameInDev = "useCallback"; 14515 updateHookTypesDev(); 14516 return updateCallback(callback, deps); 14517 }, 14518 useContext: function(context) { 14519 currentHookNameInDev = "useContext"; 14520 updateHookTypesDev(); 14521 return readContext(context); 14522 }, 14523 useEffect: function(create, deps) { 14524 currentHookNameInDev = "useEffect"; 14525 updateHookTypesDev(); 14526 updateEffectImpl(2048, Passive, create, deps); 14527 }, 14528 useImperativeHandle: function(ref, create, deps) { 14529 currentHookNameInDev = "useImperativeHandle"; 14530 updateHookTypesDev(); 14531 return updateImperativeHandle(ref, create, deps); 14532 }, 14533 useInsertionEffect: function(create, deps) { 14534 currentHookNameInDev = "useInsertionEffect"; 14535 updateHookTypesDev(); 14536 return updateEffectImpl(4, Insertion, create, deps); 14537 }, 14538 useLayoutEffect: function(create, deps) { 14539 currentHookNameInDev = "useLayoutEffect"; 14540 updateHookTypesDev(); 14541 return updateEffectImpl(4, Layout, create, deps); 14542 }, 14543 useMemo: function(create, deps) { 14544 currentHookNameInDev = "useMemo"; 14545 updateHookTypesDev(); 14546 var prevDispatcher = ReactSharedInternals.H; 14547 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 14548 try { 14549 return updateMemo(create, deps); 14550 } finally { 14551 ReactSharedInternals.H = prevDispatcher; 14552 } 14553 }, 14554 useReducer: function(reducer, initialArg, init) { 14555 currentHookNameInDev = "useReducer"; 14556 updateHookTypesDev(); 14557 var prevDispatcher = ReactSharedInternals.H; 14558 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 14559 try { 14560 return updateReducer(reducer, initialArg, init); 14561 } finally { 14562 ReactSharedInternals.H = prevDispatcher; 14563 } 14564 }, 14565 useRef: function() { 14566 currentHookNameInDev = "useRef"; 14567 updateHookTypesDev(); 14568 return updateWorkInProgressHook().memoizedState; 14569 }, 14570 useState: function() { 14571 currentHookNameInDev = "useState"; 14572 updateHookTypesDev(); 14573 var prevDispatcher = ReactSharedInternals.H; 14574 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 14575 try { 14576 return updateReducer(basicStateReducer); 14577 } finally { 14578 ReactSharedInternals.H = prevDispatcher; 14579 } 14580 }, 14581 useDebugValue: function() { 14582 currentHookNameInDev = "useDebugValue"; 14583 updateHookTypesDev(); 14584 }, 14585 useDeferredValue: function(value, initialValue) { 14586 currentHookNameInDev = "useDeferredValue"; 14587 updateHookTypesDev(); 14588 return updateDeferredValue(value, initialValue); 14589 }, 14590 useTransition: function() { 14591 currentHookNameInDev = "useTransition"; 14592 updateHookTypesDev(); 14593 return updateTransition(); 14594 }, 14595 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 14596 currentHookNameInDev = "useSyncExternalStore"; 14597 updateHookTypesDev(); 14598 return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 14599 }, 14600 useId: function() { 14601 currentHookNameInDev = "useId"; 14602 updateHookTypesDev(); 14603 return updateWorkInProgressHook().memoizedState; 14604 }, 14605 useFormState: function(action) { 14606 currentHookNameInDev = "useFormState"; 14607 updateHookTypesDev(); 14608 warnOnUseFormStateInDev(); 14609 return updateActionState(action); 14610 }, 14611 useActionState: function(action) { 14612 currentHookNameInDev = "useActionState"; 14613 updateHookTypesDev(); 14614 return updateActionState(action); 14615 }, 14616 useOptimistic: function(passthrough, reducer) { 14617 currentHookNameInDev = "useOptimistic"; 14618 updateHookTypesDev(); 14619 return updateOptimistic(passthrough, reducer); 14620 }, 14621 useHostTransitionStatus, 14622 useMemoCache, 14623 useCacheRefresh: function() { 14624 currentHookNameInDev = "useCacheRefresh"; 14625 updateHookTypesDev(); 14626 return updateWorkInProgressHook().memoizedState; 14627 }, 14628 useEffectEvent: function(callback) { 14629 currentHookNameInDev = "useEffectEvent"; 14630 updateHookTypesDev(); 14631 return updateEvent(callback); 14632 } 14633 }; 14634 HooksDispatcherOnRerenderInDEV = { 14635 readContext: function(context) { 14636 return readContext(context); 14637 }, 14638 use, 14639 useCallback: function(callback, deps) { 14640 currentHookNameInDev = "useCallback"; 14641 updateHookTypesDev(); 14642 return updateCallback(callback, deps); 14643 }, 14644 useContext: function(context) { 14645 currentHookNameInDev = "useContext"; 14646 updateHookTypesDev(); 14647 return readContext(context); 14648 }, 14649 useEffect: function(create, deps) { 14650 currentHookNameInDev = "useEffect"; 14651 updateHookTypesDev(); 14652 updateEffectImpl(2048, Passive, create, deps); 14653 }, 14654 useImperativeHandle: function(ref, create, deps) { 14655 currentHookNameInDev = "useImperativeHandle"; 14656 updateHookTypesDev(); 14657 return updateImperativeHandle(ref, create, deps); 14658 }, 14659 useInsertionEffect: function(create, deps) { 14660 currentHookNameInDev = "useInsertionEffect"; 14661 updateHookTypesDev(); 14662 return updateEffectImpl(4, Insertion, create, deps); 14663 }, 14664 useLayoutEffect: function(create, deps) { 14665 currentHookNameInDev = "useLayoutEffect"; 14666 updateHookTypesDev(); 14667 return updateEffectImpl(4, Layout, create, deps); 14668 }, 14669 useMemo: function(create, deps) { 14670 currentHookNameInDev = "useMemo"; 14671 updateHookTypesDev(); 14672 var prevDispatcher = ReactSharedInternals.H; 14673 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnRerenderInDEV; 14674 try { 14675 return updateMemo(create, deps); 14676 } finally { 14677 ReactSharedInternals.H = prevDispatcher; 14678 } 14679 }, 14680 useReducer: function(reducer, initialArg, init) { 14681 currentHookNameInDev = "useReducer"; 14682 updateHookTypesDev(); 14683 var prevDispatcher = ReactSharedInternals.H; 14684 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnRerenderInDEV; 14685 try { 14686 return rerenderReducer(reducer, initialArg, init); 14687 } finally { 14688 ReactSharedInternals.H = prevDispatcher; 14689 } 14690 }, 14691 useRef: function() { 14692 currentHookNameInDev = "useRef"; 14693 updateHookTypesDev(); 14694 return updateWorkInProgressHook().memoizedState; 14695 }, 14696 useState: function() { 14697 currentHookNameInDev = "useState"; 14698 updateHookTypesDev(); 14699 var prevDispatcher = ReactSharedInternals.H; 14700 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnRerenderInDEV; 14701 try { 14702 return rerenderReducer(basicStateReducer); 14703 } finally { 14704 ReactSharedInternals.H = prevDispatcher; 14705 } 14706 }, 14707 useDebugValue: function() { 14708 currentHookNameInDev = "useDebugValue"; 14709 updateHookTypesDev(); 14710 }, 14711 useDeferredValue: function(value, initialValue) { 14712 currentHookNameInDev = "useDeferredValue"; 14713 updateHookTypesDev(); 14714 return rerenderDeferredValue(value, initialValue); 14715 }, 14716 useTransition: function() { 14717 currentHookNameInDev = "useTransition"; 14718 updateHookTypesDev(); 14719 return rerenderTransition(); 14720 }, 14721 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 14722 currentHookNameInDev = "useSyncExternalStore"; 14723 updateHookTypesDev(); 14724 return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 14725 }, 14726 useId: function() { 14727 currentHookNameInDev = "useId"; 14728 updateHookTypesDev(); 14729 return updateWorkInProgressHook().memoizedState; 14730 }, 14731 useFormState: function(action) { 14732 currentHookNameInDev = "useFormState"; 14733 updateHookTypesDev(); 14734 warnOnUseFormStateInDev(); 14735 return rerenderActionState(action); 14736 }, 14737 useActionState: function(action) { 14738 currentHookNameInDev = "useActionState"; 14739 updateHookTypesDev(); 14740 return rerenderActionState(action); 14741 }, 14742 useOptimistic: function(passthrough, reducer) { 14743 currentHookNameInDev = "useOptimistic"; 14744 updateHookTypesDev(); 14745 return rerenderOptimistic(passthrough, reducer); 14746 }, 14747 useHostTransitionStatus, 14748 useMemoCache, 14749 useCacheRefresh: function() { 14750 currentHookNameInDev = "useCacheRefresh"; 14751 updateHookTypesDev(); 14752 return updateWorkInProgressHook().memoizedState; 14753 }, 14754 useEffectEvent: function(callback) { 14755 currentHookNameInDev = "useEffectEvent"; 14756 updateHookTypesDev(); 14757 return updateEvent(callback); 14758 } 14759 }; 14760 InvalidNestedHooksDispatcherOnMountInDEV = { 14761 readContext: function(context) { 14762 warnInvalidContextAccess(); 14763 return readContext(context); 14764 }, 14765 use: function(usable) { 14766 warnInvalidHookAccess(); 14767 return use(usable); 14768 }, 14769 useCallback: function(callback, deps) { 14770 currentHookNameInDev = "useCallback"; 14771 warnInvalidHookAccess(); 14772 mountHookTypesDev(); 14773 return mountCallback(callback, deps); 14774 }, 14775 useContext: function(context) { 14776 currentHookNameInDev = "useContext"; 14777 warnInvalidHookAccess(); 14778 mountHookTypesDev(); 14779 return readContext(context); 14780 }, 14781 useEffect: function(create, deps) { 14782 currentHookNameInDev = "useEffect"; 14783 warnInvalidHookAccess(); 14784 mountHookTypesDev(); 14785 return mountEffect(create, deps); 14786 }, 14787 useImperativeHandle: function(ref, create, deps) { 14788 currentHookNameInDev = "useImperativeHandle"; 14789 warnInvalidHookAccess(); 14790 mountHookTypesDev(); 14791 return mountImperativeHandle(ref, create, deps); 14792 }, 14793 useInsertionEffect: function(create, deps) { 14794 currentHookNameInDev = "useInsertionEffect"; 14795 warnInvalidHookAccess(); 14796 mountHookTypesDev(); 14797 mountEffectImpl(4, Insertion, create, deps); 14798 }, 14799 useLayoutEffect: function(create, deps) { 14800 currentHookNameInDev = "useLayoutEffect"; 14801 warnInvalidHookAccess(); 14802 mountHookTypesDev(); 14803 return mountLayoutEffect(create, deps); 14804 }, 14805 useMemo: function(create, deps) { 14806 currentHookNameInDev = "useMemo"; 14807 warnInvalidHookAccess(); 14808 mountHookTypesDev(); 14809 var prevDispatcher = ReactSharedInternals.H; 14810 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14811 try { 14812 return mountMemo(create, deps); 14813 } finally { 14814 ReactSharedInternals.H = prevDispatcher; 14815 } 14816 }, 14817 useReducer: function(reducer, initialArg, init) { 14818 currentHookNameInDev = "useReducer"; 14819 warnInvalidHookAccess(); 14820 mountHookTypesDev(); 14821 var prevDispatcher = ReactSharedInternals.H; 14822 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14823 try { 14824 return mountReducer(reducer, initialArg, init); 14825 } finally { 14826 ReactSharedInternals.H = prevDispatcher; 14827 } 14828 }, 14829 useRef: function(initialValue) { 14830 currentHookNameInDev = "useRef"; 14831 warnInvalidHookAccess(); 14832 mountHookTypesDev(); 14833 return mountRef(initialValue); 14834 }, 14835 useState: function(initialState) { 14836 currentHookNameInDev = "useState"; 14837 warnInvalidHookAccess(); 14838 mountHookTypesDev(); 14839 var prevDispatcher = ReactSharedInternals.H; 14840 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV; 14841 try { 14842 return mountState(initialState); 14843 } finally { 14844 ReactSharedInternals.H = prevDispatcher; 14845 } 14846 }, 14847 useDebugValue: function() { 14848 currentHookNameInDev = "useDebugValue"; 14849 warnInvalidHookAccess(); 14850 mountHookTypesDev(); 14851 }, 14852 useDeferredValue: function(value, initialValue) { 14853 currentHookNameInDev = "useDeferredValue"; 14854 warnInvalidHookAccess(); 14855 mountHookTypesDev(); 14856 return mountDeferredValue(value, initialValue); 14857 }, 14858 useTransition: function() { 14859 currentHookNameInDev = "useTransition"; 14860 warnInvalidHookAccess(); 14861 mountHookTypesDev(); 14862 return mountTransition(); 14863 }, 14864 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 14865 currentHookNameInDev = "useSyncExternalStore"; 14866 warnInvalidHookAccess(); 14867 mountHookTypesDev(); 14868 return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 14869 }, 14870 useId: function() { 14871 currentHookNameInDev = "useId"; 14872 warnInvalidHookAccess(); 14873 mountHookTypesDev(); 14874 return mountId(); 14875 }, 14876 useFormState: function(action, initialState) { 14877 currentHookNameInDev = "useFormState"; 14878 warnInvalidHookAccess(); 14879 mountHookTypesDev(); 14880 return mountActionState(action, initialState); 14881 }, 14882 useActionState: function(action, initialState) { 14883 currentHookNameInDev = "useActionState"; 14884 warnInvalidHookAccess(); 14885 mountHookTypesDev(); 14886 return mountActionState(action, initialState); 14887 }, 14888 useOptimistic: function(passthrough) { 14889 currentHookNameInDev = "useOptimistic"; 14890 warnInvalidHookAccess(); 14891 mountHookTypesDev(); 14892 return mountOptimistic(passthrough); 14893 }, 14894 useMemoCache: function(size) { 14895 warnInvalidHookAccess(); 14896 return useMemoCache(size); 14897 }, 14898 useHostTransitionStatus, 14899 useCacheRefresh: function() { 14900 currentHookNameInDev = "useCacheRefresh"; 14901 mountHookTypesDev(); 14902 return mountRefresh(); 14903 }, 14904 useEffectEvent: function(callback) { 14905 currentHookNameInDev = "useEffectEvent"; 14906 warnInvalidHookAccess(); 14907 mountHookTypesDev(); 14908 return mountEvent(callback); 14909 } 14910 }; 14911 InvalidNestedHooksDispatcherOnUpdateInDEV = { 14912 readContext: function(context) { 14913 warnInvalidContextAccess(); 14914 return readContext(context); 14915 }, 14916 use: function(usable) { 14917 warnInvalidHookAccess(); 14918 return use(usable); 14919 }, 14920 useCallback: function(callback, deps) { 14921 currentHookNameInDev = "useCallback"; 14922 warnInvalidHookAccess(); 14923 updateHookTypesDev(); 14924 return updateCallback(callback, deps); 14925 }, 14926 useContext: function(context) { 14927 currentHookNameInDev = "useContext"; 14928 warnInvalidHookAccess(); 14929 updateHookTypesDev(); 14930 return readContext(context); 14931 }, 14932 useEffect: function(create, deps) { 14933 currentHookNameInDev = "useEffect"; 14934 warnInvalidHookAccess(); 14935 updateHookTypesDev(); 14936 updateEffectImpl(2048, Passive, create, deps); 14937 }, 14938 useImperativeHandle: function(ref, create, deps) { 14939 currentHookNameInDev = "useImperativeHandle"; 14940 warnInvalidHookAccess(); 14941 updateHookTypesDev(); 14942 return updateImperativeHandle(ref, create, deps); 14943 }, 14944 useInsertionEffect: function(create, deps) { 14945 currentHookNameInDev = "useInsertionEffect"; 14946 warnInvalidHookAccess(); 14947 updateHookTypesDev(); 14948 return updateEffectImpl(4, Insertion, create, deps); 14949 }, 14950 useLayoutEffect: function(create, deps) { 14951 currentHookNameInDev = "useLayoutEffect"; 14952 warnInvalidHookAccess(); 14953 updateHookTypesDev(); 14954 return updateEffectImpl(4, Layout, create, deps); 14955 }, 14956 useMemo: function(create, deps) { 14957 currentHookNameInDev = "useMemo"; 14958 warnInvalidHookAccess(); 14959 updateHookTypesDev(); 14960 var prevDispatcher = ReactSharedInternals.H; 14961 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 14962 try { 14963 return updateMemo(create, deps); 14964 } finally { 14965 ReactSharedInternals.H = prevDispatcher; 14966 } 14967 }, 14968 useReducer: function(reducer, initialArg, init) { 14969 currentHookNameInDev = "useReducer"; 14970 warnInvalidHookAccess(); 14971 updateHookTypesDev(); 14972 var prevDispatcher = ReactSharedInternals.H; 14973 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 14974 try { 14975 return updateReducer(reducer, initialArg, init); 14976 } finally { 14977 ReactSharedInternals.H = prevDispatcher; 14978 } 14979 }, 14980 useRef: function() { 14981 currentHookNameInDev = "useRef"; 14982 warnInvalidHookAccess(); 14983 updateHookTypesDev(); 14984 return updateWorkInProgressHook().memoizedState; 14985 }, 14986 useState: function() { 14987 currentHookNameInDev = "useState"; 14988 warnInvalidHookAccess(); 14989 updateHookTypesDev(); 14990 var prevDispatcher = ReactSharedInternals.H; 14991 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 14992 try { 14993 return updateReducer(basicStateReducer); 14994 } finally { 14995 ReactSharedInternals.H = prevDispatcher; 14996 } 14997 }, 14998 useDebugValue: function() { 14999 currentHookNameInDev = "useDebugValue"; 15000 warnInvalidHookAccess(); 15001 updateHookTypesDev(); 15002 }, 15003 useDeferredValue: function(value, initialValue) { 15004 currentHookNameInDev = "useDeferredValue"; 15005 warnInvalidHookAccess(); 15006 updateHookTypesDev(); 15007 return updateDeferredValue(value, initialValue); 15008 }, 15009 useTransition: function() { 15010 currentHookNameInDev = "useTransition"; 15011 warnInvalidHookAccess(); 15012 updateHookTypesDev(); 15013 return updateTransition(); 15014 }, 15015 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 15016 currentHookNameInDev = "useSyncExternalStore"; 15017 warnInvalidHookAccess(); 15018 updateHookTypesDev(); 15019 return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 15020 }, 15021 useId: function() { 15022 currentHookNameInDev = "useId"; 15023 warnInvalidHookAccess(); 15024 updateHookTypesDev(); 15025 return updateWorkInProgressHook().memoizedState; 15026 }, 15027 useFormState: function(action) { 15028 currentHookNameInDev = "useFormState"; 15029 warnInvalidHookAccess(); 15030 updateHookTypesDev(); 15031 return updateActionState(action); 15032 }, 15033 useActionState: function(action) { 15034 currentHookNameInDev = "useActionState"; 15035 warnInvalidHookAccess(); 15036 updateHookTypesDev(); 15037 return updateActionState(action); 15038 }, 15039 useOptimistic: function(passthrough, reducer) { 15040 currentHookNameInDev = "useOptimistic"; 15041 warnInvalidHookAccess(); 15042 updateHookTypesDev(); 15043 return updateOptimistic(passthrough, reducer); 15044 }, 15045 useMemoCache: function(size) { 15046 warnInvalidHookAccess(); 15047 return useMemoCache(size); 15048 }, 15049 useHostTransitionStatus, 15050 useCacheRefresh: function() { 15051 currentHookNameInDev = "useCacheRefresh"; 15052 updateHookTypesDev(); 15053 return updateWorkInProgressHook().memoizedState; 15054 }, 15055 useEffectEvent: function(callback) { 15056 currentHookNameInDev = "useEffectEvent"; 15057 warnInvalidHookAccess(); 15058 updateHookTypesDev(); 15059 return updateEvent(callback); 15060 } 15061 }; 15062 InvalidNestedHooksDispatcherOnRerenderInDEV = { 15063 readContext: function(context) { 15064 warnInvalidContextAccess(); 15065 return readContext(context); 15066 }, 15067 use: function(usable) { 15068 warnInvalidHookAccess(); 15069 return use(usable); 15070 }, 15071 useCallback: function(callback, deps) { 15072 currentHookNameInDev = "useCallback"; 15073 warnInvalidHookAccess(); 15074 updateHookTypesDev(); 15075 return updateCallback(callback, deps); 15076 }, 15077 useContext: function(context) { 15078 currentHookNameInDev = "useContext"; 15079 warnInvalidHookAccess(); 15080 updateHookTypesDev(); 15081 return readContext(context); 15082 }, 15083 useEffect: function(create, deps) { 15084 currentHookNameInDev = "useEffect"; 15085 warnInvalidHookAccess(); 15086 updateHookTypesDev(); 15087 updateEffectImpl(2048, Passive, create, deps); 15088 }, 15089 useImperativeHandle: function(ref, create, deps) { 15090 currentHookNameInDev = "useImperativeHandle"; 15091 warnInvalidHookAccess(); 15092 updateHookTypesDev(); 15093 return updateImperativeHandle(ref, create, deps); 15094 }, 15095 useInsertionEffect: function(create, deps) { 15096 currentHookNameInDev = "useInsertionEffect"; 15097 warnInvalidHookAccess(); 15098 updateHookTypesDev(); 15099 return updateEffectImpl(4, Insertion, create, deps); 15100 }, 15101 useLayoutEffect: function(create, deps) { 15102 currentHookNameInDev = "useLayoutEffect"; 15103 warnInvalidHookAccess(); 15104 updateHookTypesDev(); 15105 return updateEffectImpl(4, Layout, create, deps); 15106 }, 15107 useMemo: function(create, deps) { 15108 currentHookNameInDev = "useMemo"; 15109 warnInvalidHookAccess(); 15110 updateHookTypesDev(); 15111 var prevDispatcher = ReactSharedInternals.H; 15112 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 15113 try { 15114 return updateMemo(create, deps); 15115 } finally { 15116 ReactSharedInternals.H = prevDispatcher; 15117 } 15118 }, 15119 useReducer: function(reducer, initialArg, init) { 15120 currentHookNameInDev = "useReducer"; 15121 warnInvalidHookAccess(); 15122 updateHookTypesDev(); 15123 var prevDispatcher = ReactSharedInternals.H; 15124 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 15125 try { 15126 return rerenderReducer(reducer, initialArg, init); 15127 } finally { 15128 ReactSharedInternals.H = prevDispatcher; 15129 } 15130 }, 15131 useRef: function() { 15132 currentHookNameInDev = "useRef"; 15133 warnInvalidHookAccess(); 15134 updateHookTypesDev(); 15135 return updateWorkInProgressHook().memoizedState; 15136 }, 15137 useState: function() { 15138 currentHookNameInDev = "useState"; 15139 warnInvalidHookAccess(); 15140 updateHookTypesDev(); 15141 var prevDispatcher = ReactSharedInternals.H; 15142 ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV; 15143 try { 15144 return rerenderReducer(basicStateReducer); 15145 } finally { 15146 ReactSharedInternals.H = prevDispatcher; 15147 } 15148 }, 15149 useDebugValue: function() { 15150 currentHookNameInDev = "useDebugValue"; 15151 warnInvalidHookAccess(); 15152 updateHookTypesDev(); 15153 }, 15154 useDeferredValue: function(value, initialValue) { 15155 currentHookNameInDev = "useDeferredValue"; 15156 warnInvalidHookAccess(); 15157 updateHookTypesDev(); 15158 return rerenderDeferredValue(value, initialValue); 15159 }, 15160 useTransition: function() { 15161 currentHookNameInDev = "useTransition"; 15162 warnInvalidHookAccess(); 15163 updateHookTypesDev(); 15164 return rerenderTransition(); 15165 }, 15166 useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { 15167 currentHookNameInDev = "useSyncExternalStore"; 15168 warnInvalidHookAccess(); 15169 updateHookTypesDev(); 15170 return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); 15171 }, 15172 useId: function() { 15173 currentHookNameInDev = "useId"; 15174 warnInvalidHookAccess(); 15175 updateHookTypesDev(); 15176 return updateWorkInProgressHook().memoizedState; 15177 }, 15178 useFormState: function(action) { 15179 currentHookNameInDev = "useFormState"; 15180 warnInvalidHookAccess(); 15181 updateHookTypesDev(); 15182 return rerenderActionState(action); 15183 }, 15184 useActionState: function(action) { 15185 currentHookNameInDev = "useActionState"; 15186 warnInvalidHookAccess(); 15187 updateHookTypesDev(); 15188 return rerenderActionState(action); 15189 }, 15190 useOptimistic: function(passthrough, reducer) { 15191 currentHookNameInDev = "useOptimistic"; 15192 warnInvalidHookAccess(); 15193 updateHookTypesDev(); 15194 return rerenderOptimistic(passthrough, reducer); 15195 }, 15196 useMemoCache: function(size) { 15197 warnInvalidHookAccess(); 15198 return useMemoCache(size); 15199 }, 15200 useHostTransitionStatus, 15201 useCacheRefresh: function() { 15202 currentHookNameInDev = "useCacheRefresh"; 15203 updateHookTypesDev(); 15204 return updateWorkInProgressHook().memoizedState; 15205 }, 15206 useEffectEvent: function(callback) { 15207 currentHookNameInDev = "useEffectEvent"; 15208 warnInvalidHookAccess(); 15209 updateHookTypesDev(); 15210 return updateEvent(callback); 15211 } 15212 }; 15213 var fakeInternalInstance = {}; 15214 var didWarnAboutStateAssignmentForComponent = /* @__PURE__ */ new Set(); 15215 var didWarnAboutUninitializedState = /* @__PURE__ */ new Set(); 15216 var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = /* @__PURE__ */ new Set(); 15217 var didWarnAboutLegacyLifecyclesAndDerivedState = /* @__PURE__ */ new Set(); 15218 var didWarnAboutDirectlyAssigningPropsToState = /* @__PURE__ */ new Set(); 15219 var didWarnAboutUndefinedDerivedState = /* @__PURE__ */ new Set(); 15220 var didWarnAboutContextTypes$1 = /* @__PURE__ */ new Set(); 15221 var didWarnAboutChildContextTypes = /* @__PURE__ */ new Set(); 15222 var didWarnAboutInvalidateContextType = /* @__PURE__ */ new Set();
15223 var didWarnOnInvalidCallback = /* @__PURE__ */ new Set(); 15224 Object.freeze(fakeInternalInstance); 15225 var classComponentUpdater = { 15226 enqueueSetState: function(inst, payload, callback) { 15227 inst = inst._reactInternals; 15228 var lane = requestUpdateLane(inst), update = createUpdate(lane); 15229 update.payload = payload; 15230 void 0 !== callback && null !== callback && (warnOnInvalidCallback(callback), update.callback = callback); 15231 payload = enqueueUpdate(inst, update, lane); 15232 null !== payload && (startUpdateTimerByLane(lane, "this.setState()", inst), scheduleUpdateOnFiber(payload, inst, lane), entangleTransitions(payload, inst, lane)); 15233 }, 15234 enqueueReplaceState: function(inst, payload, callback) { 15235 inst = inst._reactInternals; 15236 var lane = requestUpdateLane(inst), update = createUpdate(lane); 15237 update.tag = ReplaceState; 15238 update.payload = payload; 15239 void 0 !== callback && null !== callback && (warnOnInvalidCallback(callback), update.callback = callback); 15240 payload = enqueueUpdate(inst, update, lane); 15241 null !== payload && (startUpdateTimerByLane(lane, "this.replaceState()", inst), scheduleUpdateOnFiber(payload, inst, lane), entangleTransitions(payload, inst, lane)); 15242 }, 15243 enqueueForceUpdate: function(inst, callback) { 15244 inst = inst._reactInternals; 15245 var lane = requestUpdateLane(inst), update = createUpdate(lane); 15246 update.tag = ForceUpdate; 15247 void 0 !== callback && null !== callback && (warnOnInvalidCallback(callback), update.callback = callback); 15248 callback = enqueueUpdate(inst, update, lane); 15249 null !== callback && (startUpdateTimerByLane(lane, "this.forceUpdate()", inst), scheduleUpdateOnFiber(callback, inst, lane), entangleTransitions(callback, inst, lane)); 15250 } 15251 }, componentName = null, errorBoundaryName = null, SelectiveHydrationException = Error("This is not a real error. It's an implementation detail of React's selective hydration feature. If this leaks into userspace, it's a bug in React. Please file an issue."), didReceiveUpdate = !1; 15252 var didWarnAboutBadClass = {}; 15253 var didWarnAboutContextTypeOnFunctionComponent = {}; 15254 var didWarnAboutContextTypes = {}; 15255 var didWarnAboutGetDerivedStateOnFunctionComponent = {}; 15256 var didWarnAboutReassigningProps = !1; 15257 var didWarnAboutRevealOrder = {}; 15258 var didWarnAboutTailOptions = {}; 15259 var didWarnAboutClassNameOnViewTransition = {}; 15260 var SUSPENDED_MARKER = { 15261 dehydrated: null, 15262 treeContext: null, 15263 retryLane: 0, 15264 hydrationErrors: null 15265 }, hasWarnedAboutUsingNoValuePropOnContextProvider = !1, didWarnAboutUndefinedSnapshotBeforeUpdate = null; 15266 didWarnAboutUndefinedSnapshotBeforeUpdate = /* @__PURE__ */ new Set(); 15267 var shouldStartViewTransition = !1, appearingViewTransitions = null, viewTransitionCancelableChildren = null, viewTransitionHostInstanceIdx = 0, mountedNamedViewTransitions = /* @__PURE__ */ new Map(), didWarnAboutName = {}, NoLayoutEffectTraversalFlags = 0, IncludeWorkInProgressEffects = 1, IncludeHostSingletons = 2, offscreenSubtreeIsHidden = !1, offscreenSubtreeWasHidden = !1, offscreenDirectParentIsHidden = !1, needsFormReset = !1, PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, nextEffect = null, inProgressLanes = null, inProgressRoot = null, viewTransitionContextChanged = !1, inUpdateViewTransition = !1, rootViewTransitionAffected = !1, rootViewTransitionNameCanceled = !1, hostParent = null, hostParentIsContainer = !1, currentHoistableRoot = null, inHydratedSubtree = !1, suspenseyCommitFlag = 8192, DefaultAsyncDispatcher = { 15268 getCacheForType: function(resourceType) { 15269 var cache = readContext(CacheContext), cacheForType = cache.data.get(resourceType); 15270 void 0 === cacheForType && (cacheForType = resourceType(), cache.data.set(resourceType, cacheForType)); 15271 return cacheForType; 15272 }, 15273 cacheSignal: function() { 15274 return readContext(CacheContext).controller.signal; 15275 }, 15276 getOwner: function() { 15277 return current; 15278 } 15279 }; 15280 if ("function" === typeof Symbol && Symbol.for) { 15281 var symbolFor = Symbol.for; 15282 symbolFor("selector.component"); 15283 symbolFor("selector.has_pseudo_class"); 15284 symbolFor("selector.role"); 15285 symbolFor("selector.test_id"); 15286 symbolFor("selector.text"); 15287 } 15288 var commitHooks = [], PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map, NoContext = 0, RenderContext = 2, CommitContext = 4, RootInProgress = 0, RootFatal
vendor: 3,338 bytes, lines 15288-15298
15288Errored = 1, RootErrored = 2, RootSuspended = 3, RootSuspendedWithDelay = 4, RootSuspendedAtTheShell = 6, RootCompleted = 5, executionContext = NoContext, workInProgressRoot = null, workInProgress = null, workInProgressRootRenderLanes = 0, NotSuspended = 0, SuspendedOnError = 1, SuspendedOnData = 2, SuspendedOnImmediate = 3, SuspendedOnInstance = 4, SuspendedOnInstanceAndReadyToContinue = 5, SuspendedOnDeprecatedThrowPromise = 6, SuspendedAndReadyToContinue = 7, SuspendedOnHydration = 8, SuspendedOnAction = 9, workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, workInProgressRootDidSkipSuspendedSiblings = !1, workInProgressRootIsPrerendering = !1, workInProgressRootDidAttachPingListener = !1, entangledRenderLanes = 0, workInProgressRootExitStatus = RootInProgress, workInProgressRootSkippedLanes = 0, workInProgressRootInterleavedUpdatedLanes = 0, workInProgressRootPingedLanes = 0, workInProgressDeferredLane = 0, workInProgressSuspendedRetryLanes = 0, workInProgressRootConcurrentErrors = null, workInProgressRootRecoverableErrors = null, workInProgressRootDidIncludeRecursiveRenderUpdate = !1, globalMostRecentFallbackTime = 0, globalMostRecentTransitionTime = 0, FALLBACK_THROTTLE_MS = 300, workInProgressRootRenderTargetTime = Infinity, RENDER_TIMEOUT_MS = 500, workInProgressTransitions = null, workInProgressUpdateTask = null, legacyErrorBoundariesThatAlreadyFailed = null, IMMEDIATE_COMMIT = 0, ABORTED_VIEW_TRANSITION_COMMIT = 1, DELAYED_PASSIVE_COMMIT = 2, ANIMATION_STARTED_COMMIT = 3, NO_PENDING_EFFECTS = 0, PENDING_MUTATION_PHASE = 1, PENDING_LAYOUT_PHASE = 2, PENDING_AFTER_MUTATION_PHASE = 3, PENDING_SPAWNED_WORK = 4, PENDING_PASSIVE_PHASE = 5, pendingEffectsStatus = 0, pendingEffectsRoot = null, pendingFinishedWork = null, pendingEffectsLanes = 0, pendingEffectsRemainingLanes = 0, pendingEffectsRenderEndTime = -0, pendingPassiveTransitions = null, pendingRecoverableErrors = null, pendingViewTransition = null, pendingViewTransitionEvents = null, pendingTransitionTypes = null, pendingSuspendedCommitReason = null, pendingDelayedCommitReason = IMMEDIATE_COMMIT, pendingSuspendedViewTransitionReason = null, NESTED_UPDATE_LIMIT = 50, nestedUpdateCount = 0, rootWithNestedUpdates = null, isFlushingPassiveEffects = !1, didScheduleUpdateDuringPassiveEffects = !1, NESTED_PASSIVE_UPDATE_LIMIT = 50, nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null, isRunningInsertionEffect = !1, didWarnAboutInterruptedViewTransitions = !1, didWarnStateUpdateForNotYetMountedComponent = null, didWarnAboutUpdateInRender = !1; 15289 var didWarnAboutUpdateInRenderForAnotherComponent = /* @__PURE__ */ new Set(); 15290 var fakeActCallbackNode$1 = {}, firstScheduledRoot = null, lastScheduledRoot = null, didScheduleMicrotask = !1, didScheduleMicrotask_act = !1, mightHavePendingSyncWork = !1, isFlushingWork = !1, currentEventTransitionLane = 0, fakeActCallbackNode = {}; 15291 (function() { 15292 for (var i = 0; i < simpleEventPluginEvents.length; i++) { 15293 var eventName = simpleEventPluginEvents[i], domEventName = eventName.toLowerCase(); 15294 eventName = eventName[0].toUpperCase() + eventName.slice(1); 15295 registerSimpleEvent(domEventName, "on" + eventName); 15296 } 15297 registerSimpleEvent(ANIMATION_END, "onAnimationEnd"); 15298 registerSimpleEvent(ANIMATION_ITERATION, "onAnimationIteration");
15299 registerSimpleEvent(ANIMATION_START, "onAnimationStart"); 15300 registerSimpleEvent("dblclick", "onDoubleClick"); 15301 registerSimpleEvent("focusin", "onFocus"); 15302 registerSimpleEvent("focusout", "onBlur"); 15303 registerSimpleEvent(TRANSITION_RUN, "onTransitionRun"); 15304 registerSimpleEvent(TRANSITION_START, "onTransitionStart"); 15305 registerSimpleEvent(TRANSITION_CANCEL, "onTransitionCancel"); 15306 registerSimpleEvent(TRANSITION_END, "onTransitionEnd"); 15307 })(); 15308 registerDirectEvent("onMouseEnter", ["mouseout", "mouseover"]); 15309 registerDirectEvent("onMouseLeave", ["mouseout", "mouseover"]); 15310 registerDirectEvent("onPointerEnter", ["pointerout", "pointerover"]); 15311 registerDirectEvent("onPointerLeave", ["pointerout", "pointerover"]); 15312 registerTwoPhaseEvent("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" ")); 15313 registerTwoPhaseEvent("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")); 15314 registerTwoPhaseEvent("onBeforeInput", [ 15315 "compositionend", 15316 "keypress", 15317 "textInput", 15318 "paste" 15319 ]); 15320 registerTwoPhaseEvent("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" ")); 15321 registerTwoPhaseEvent("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" ")); 15322 registerTwoPhaseEvent("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" ")); 15323 var mediaEventTypes = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), nonDelegatedEvents = new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(mediaEventTypes)), listeningMarker = "_reactListening" + Math.random().toString(36).slice(2), didWarnControlledToUncontrolled = !1, didWarnUncontrolledToControlled = !1, didWarnFormActionType = !1, didWarnFormActionName = !1, didWarnFormActionTarget = !1, didWarnFormActionMethod = !1, didWarnPopoverTargetObject = !1; 15324 var didWarnForNewBooleanPropsWithEmptyValue = {}; 15325 var NORMALIZE_NEWLINES_REGEX = /\r\n?/g, NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g, xlinkNamespace = "http://www.w3.org/1999/xlink", xmlNamespace = "http://www.w3.org/XML/1998/namespace", emptyProps = {}, EXPECTED_FORM_ACTION_URL = "javascript:throw new Error('React form unexpectedly submitted.')", SUPPRESS_HYDRATION_WARNING = "suppressHydrationWarning", ACTIVITY_START_DATA = "&", ACTIVITY_END_DATA = "/&", SUSPENSE_START_DATA = "$", SUSPENSE_END_DATA = "/$", SUSPENSE_PENDING_START_DATA = "$?", SUSPENSE_QUEUED_START_DATA = "$~", SUSPENSE_FALLBACK_START_DATA = "$!", PREAMBLE_CONTRIBUTION_HTML = "html", PREAMBLE_CONTRIBUTION_BODY = "body", PREAMBLE_CONTRIBUTION_HEAD = "head", FORM_STATE_IS_MATCHING = "F!", FORM_STATE_IS_NOT_MATCHING = "F", DOCUMENT_READY_STATE_LOADING = "loading", STYLE = "style", HostContextNamespaceNone = 0, HostContextNamespaceSvg = 1, HostContextNamespaceMath = 2, eventsEnabled = null, selectionInformation = null, didWarnScriptTags = !1, warnedUnknownTags = { 15326 dialog: !0, 15327 webview: !0 15328 }, currentPopstateTransitionEvent = null, schedulerEvent = void 0, scheduleTimeout = "function" === typeof setTimeout ? setTimeout : void 0, cancelTimeout = "function" === typeof clearTimeout ? clearTimeout : void 0, noTimeout = -1, localPromise = "function" === typeof Promise ? Promise : void 0, localRequestAnimationFrame = "function" === typeof requestAnimationFrame ? requestAnimationFrame : scheduleTimeout, scheduleMicrotask = "function" === typeof queueMicrotask ? queueMicrotask : "undefined" !== typeof localPromise ? function(callback) { 15329 return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick); 15330 } : scheduleTimeout, SUSPENSEY_FONT_AND_IMAGE_TIMEOUT = 500; 15331 ViewTransitionPseudoElement.prototype.animate = function(keyframes, options) { 15332 options = "number" === typeof options ? { duration: options } : assign({}, options); 15333 options.pseudoElement = this._selector; 15334 return this._scope.animate(keyframes, options); 15335 }; 15336 ViewTransitionPseudoElement.prototype.getAnimations = function() { 15337 for (var scope = this._scope, selector = this._selector, animations = scope.getAnimations({ subtree: !0 }), result = [], i = 0; i < animations.length; i++) { 15338 var effect = animations[i].effect; 15339 null !== effect && effect.target === scope && effect.pseudoElement === selector && result.push(animations[i]); 15340 } 15341 return result; 15342 }; 15343 ViewTransitionPseudoElement.prototype.getComputedStyle = function() { 15344 return getComputedStyle(this._scope, this._selector); 15345 }; 15346 FragmentInstance.prototype.addEventListener = function(type, listener, optionsOrUseCapture) { 15347 var signal = null, cleanup = null; 15348 if (null != optionsOrUseCapture && "boolean" !== typeof optionsOrUseCapture && (signal = optionsOrUseCapture.signal || null, null !== signal && signal.aborted)) return; 15349 null === this._eventListeners && (this._eventListeners = []); 15350 var listeners = this._eventListeners; 15351 if (-1 === indexOfEventListener(listeners, type, listener, optionsOrUseCapture)) { 15352 var fragmentInstance = this, attachedListener = listener; 15353 null != optionsOrUseCapture && "boolean" !== typeof optionsOrUseCapture && !0 === optionsOrUseCapture.once && (attachedListener = function(event) { 15354 fragmentInstance.removeEventListener(type, listener, optionsOrUseCapture); 15355 "function" === typeof listener ? listener.call(this, event) : listener.handleEvent(event); 15356 }); 15357 null !== signal && (cleanup = fragmentInstance.removeEventListener.bind(fragmentInstance, type, listener, optionsOrUseCapture), signal.addEventListener("abort", cleanup, { once: !0 }), cleanup = signal.removeEventListener.bind(signal, "abort", cleanup)); 15358 signal = getAttachOptions(optionsOrUseCapture); 15359 listeners.push({ 15360 type, 15361 listener, 15362 optionsOrUseCapture, 15363 attachedListener, 15364 cleanup 15365 }); 15366 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, addEventListenerToChild, type, attachedListener, signal); 15367 } 15368 this._eventListeners = listeners; 15369 }; 15370 FragmentInstance.prototype.removeEventListener = function(type, listener, optionsOrUseCapture) { 15371 var listeners = this._eventListeners; 15372 if (null !== listeners && (listener = indexOfEventListener(listeners, type, listener, optionsOrUseCapture), -1 !== listener)) { 15373 var _listeners$index = listeners[listener]; 15374 optionsOrUseCapture = _listeners$index.attachedListener; 15375 var cleanup = _listeners$index.cleanup; 15376 _listeners$index = getAttachOptions(_listeners$index.optionsOrUseCapture); 15377 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, removeEventListenerFromChild, type, optionsOrUseCapture, _listeners$index); 15378 listeners.splice(listener, 1); 15379 null !== cleanup && cleanup(); 15380 } 15381 }; 15382 FragmentInstance.prototype.dispatchEvent = function(event) { 15383 var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber); 15384 if (null === parentHostFiber) return !0; 15385 parentHostFiber = getInstanceFromHostFiber(parentHostFiber); 15386 var eventListeners = this._eventListeners; 15387 if (null !== eventListeners && 0 < eventListeners.length || !event.bubbles) { 15388 var temp = 9 === parentHostFiber.nodeType ? parentHostFiber.createComment("") : document.createTextNode(""); 15389 if (eventListeners) for (var i = 0; i < eventListeners.length; i++) { 15390 var _eventListeners$i = eventListeners[i]; 15391 temp.addEventListener(_eventListeners$i.type, _eventListeners$i.attachedListener, getAttachOptions(_eventListeners$i.optionsOrUseCapture)); 15392 } 15393 parentHostFiber.appendChild(temp); 15394 event = temp.dispatchEvent(event); 15395 if (eventListeners) for (i = 0; i < eventListeners.length; i++) _eventListeners$i = eventListeners[i], temp.removeEventListener(_eventListeners$i.type, _eventListeners$i.attachedListener, getAttachOptions(_eventListeners$i.optionsOrUseCapture)); 15396 parentHostFiber.removeChild(temp); 15397 return event; 15398 } 15399 return parentHostFiber.dispatchEvent(event); 15400 };
15401 FragmentInstance.prototype.focus = function(focusOptions) { 15402 traverseVisibleInstancesAndTextInstances(this._fragmentFiber.child, !0, setFocusOnFiberIfFocusable, focusOptions, void 0, void 0); 15403 }; 15404 FragmentInstance.prototype.focusLast = function(focusOptions) { 15405 var children = []; 15406 traverseVisibleInstancesAndTextInstances(this._fragmentFiber.child, !0, collectChildren, children, void 0, void 0); 15407 for (var i = children.length - 1; 0 <= i && !setFocusOnFiberIfFocusable(children[i], focusOptions); i--); 15408 }; 15409 FragmentInstance.prototype.blur = function() { 15410 var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber); 15411 null !== parentHostFiber && (parentHostFiber = getInstanceFromHostFiber(parentHostFiber), parentHostFiber = getOwnerDocumentFromRootContainer(parentHostFiber).activeElement, null !== parentHostFiber && traverseFragmentInstancesAndTextInstances(this._fragmentFiber, blurActiveElementWithinFragment, parentHostFiber)); 15412 }; 15413 FragmentInstance.prototype.observeUsing = function(observer) { 15414 var hasText = !1, hasElement = !1; 15415 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, function(child) { 15416 if (6 === child.tag) hasText = !0; 15417 else return hasElement = !0; 15418 return !1; 15419 }); 15420 hasText && !hasElement && console.error("observeUsing() was called on a FragmentInstance with only text children. Observers do not work on text nodes."); 15421 null === this._observers && (this._observers = /* @__PURE__ */ new Set()); 15422 this._observers.add(observer); 15423 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, observeChild, observer); 15424 }; 15425 FragmentInstance.prototype.unobserveUsing = function(observer) { 15426 var observers = this._observers; 15427 if (null !== observers && observers.has(observer)) { 15428 observers.delete(observer); 15429 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, unobserveChild, observer); 15430 for (var i = observers = 0; i < pendingIntersectionUnobserves.length; i++) { 15431 var pending = pendingIntersectionUnobserves[i]; 15432 pending.fragmentInstance === this && pending.observer === observer ? observer.unobserve(pending.instance) : pendingIntersectionUnobserves[observers++] = pending; 15433 } 15434 pendingIntersectionUnobserves.length = observers; 15435 } else console.error("You are calling unobserveUsing() with an observer that is not being observed with this fragment instance. First attach the observer with observeUsing()"); 15436 }; 15437 var pendingIntersectionUnobserves = [], intersectionUnobserveScheduled = !1; 15438 FragmentInstance.prototype.getClientRects = function() { 15439 var rects = []; 15440 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, collectClientRects, rects); 15441 return rects; 15442 }; 15443 FragmentInstance.prototype.getRootNode = function(getRootNodeOptions) { 15444 var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber); 15445 return null === parentHostFiber ? this : getInstanceFromHostFiber(parentHostFiber).getRootNode(getRootNodeOptions); 15446 }; 15447 FragmentInstance.prototype.compareDocumentPosition = function(otherNode) { 15448 var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber); 15449 if (null === parentHostFiber) return Node.DOCUMENT_POSITION_DISCONNECTED; 15450 var children = []; 15451 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, collectChildren, children); 15452 var parentHostInstance = getInstanceFromHostFiber(parentHostFiber); 15453 if (0 === children.length) { 15454 parentHostFiber = parentHostInstance; 15455 if (fiberIsPortaledIntoHost(this._fragmentFiber)) { 15456 a: { 15457 for (children = this._fragmentFiber.return; null !== children;) { 15458 if (4 === children.tag) { 15459 children = children.stateNode.containerInfo; 15460 break a; 15461 } 15462 if (3 === children.tag || 5 === children.tag || 27 === children.tag) break; 15463 children = children.return; 15464 } 15465 children = null; 15466 } 15467 null != children && (parentHostFiber = children); 15468 } 15469 children = this._fragmentFiber; 15470 var result = parentHostInstance = parentHostFiber.compareDocumentPosition(otherNode); 15471 parentHostFiber === otherNode ? result = Node.DOCUMENT_POSITION_CONTAINS : parentHostInstance & Node.DOCUMENT_POSITION_CONTAINED_BY && (children = getFragmentInstanceOrTextInstanceSiblings(children)[1], null === children ? result = Node.DOCUMENT_POSITION_PRECEDING : (otherNode = getInstanceFromHostFiber(children).compareDocumentPosition(otherNode), result = 0 === otherNode || otherNode & Node.DOCUMENT_POSITION_FOLLOWING ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING)); 15472 return result |= Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; 15473 } 15474 parentHostFiber = getInstanceFromHostFiber(children[0]); 15475 result = getInstanceFromHostFiber(children[children.length - 1]); 15476 var parentHostInstanceFromDOM = fiberIsPortaledIntoHost(this._fragmentFiber) ? parentHostFiber.parentElement : parentHostInstance; 15477 if (null == parentHostInstanceFromDOM) return Node.DOCUMENT_POSITION_DISCONNECTED; 15478 parentHostInstance = parentHostInstanceFromDOM.compareDocumentPosition(parentHostFiber) & Node.DOCUMENT_POSITION_CONTAINED_BY; 15479 parentHostInstanceFromDOM = parentHostInstanceFromDOM.compareDocumentPosition(result) & Node.DOCUMENT_POSITION_CONTAINED_BY; 15480 var firstResult = parentHostFiber.compareDocumentPosition(otherNode), lastResult = result.compareDocumentPosition(otherNode), otherNodeIsWithinFirstOrLastChild = firstResult & Node.DOCUMENT_POSITION_CONTAINED_BY || lastResult & Node.DOCUMENT_POSITION_CONTAINED_BY; 15481 lastResult = parentHostInstance && parentHostInstanceFromDOM && firstResult & Node.DOCUMENT_POSITION_FOLLOWING && lastResult & Node.DOCUMENT_POSITION_PRECEDING; 15482 parentHostFiber = parentHostInstance && parentHostFiber === otherNode || parentHostInstanceFromDOM && result === otherNode || otherNodeIsWithinFirstOrLastChild || lastResult ? Node.DOCUMENT_POSITION_CONTAINED_BY : !parentHostInstance && parentHostFiber === otherNode || !parentHostInstanceFromDOM && result === otherNode ? Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : firstResult; 15483 return parentHostFiber & Node.DOCUMENT_POSITION_DISCONNECTED || parentHostFiber & Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC || validateDocumentPositionWithFiberTree(parentHostFiber, this._fragmentFiber, children[0], children[children.length - 1], otherNode) ? parentHostFiber : Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; 15484 }; 15485 FragmentInstance.prototype.scrollIntoView = function(alignToTo
vendor: 9,192 bytes, lines 15485-15673
15485p) { 15486 if ("object" === typeof alignToTop) throw Error("FragmentInstance.scrollIntoView() does not support scrollIntoViewOptions. Use the alignToTop boolean instead."); 15487 var children = []; 15488 traverseFragmentInstancesAndTextInstances(this._fragmentFiber, collectChildren, children); 15489 var resolvedAlignToTop = !1 !== alignToTop; 15490 if (0 === children.length) { 15491 var hostSiblings = getFragmentInstanceOrTextInstanceSiblings(this._fragmentFiber); 15492 hostSiblings = resolvedAlignToTop ? hostSiblings[1] || hostSiblings[0] || getFragmentParentInstanceOrContainerFiber(this._fragmentFiber) : hostSiblings[0] || hostSiblings[1]; 15493 if (null === hostSiblings) return; 15494 if (6 === hostSiblings.tag) { 15495 alignToTop = getInstanceFromHostFiber(hostSiblings); 15496 scrollTextNodeIntoView(alignToTop, resolvedAlignToTop); 15497 return; 15498 } 15499 hostSiblings = getInstanceFromHostFiber(hostSiblings); 15500 if (9 !== hostSiblings.nodeType) { 15501 if (11 === hostSiblings.nodeType) { 15502 resolvedAlignToTop = "host" in hostSiblings ? hostSiblings.host : null; 15503 null !== resolvedAlignToTop ? resolvedAlignToTop.scrollIntoView(alignToTop) : console.warn("You are attempting to scroll a FragmentInstance that is only mounted inside a detached DocumentFragment. No scroll was performed."); 15504 return; 15505 } 15506 hostSiblings.scrollIntoView(alignToTop); 15507 } 15508 } 15509 for (hostSiblings = resolvedAlignToTop ? children.length - 1 : 0; hostSiblings !== (resolvedAlignToTop ? -1 : children.length);) { 15510 var child = children[hostSiblings]; 15511 6 === child.tag ? (child = getInstanceFromHostFiber(child), scrollTextNodeIntoView(child, resolvedAlignToTop)) : getInstanceFromHostFiber(child).scrollIntoView(alignToTop); 15512 hostSiblings += resolvedAlignToTop ? -1 : 1; 15513 } 15514 }; 15515 var previousHydratableOnEnteringScopedSingleton = null, NotLoaded = 0, Loaded = 1, Errored = 2, Settled = 3, Inserted = 4, preloadPropsMap = /* @__PURE__ */ new Map(), preconnectsSet = /* @__PURE__ */ new Set(), previousDispatcher = ReactDOMSharedInternals.d; 15516 ReactDOMSharedInternals.d = { 15517 f: function() { 15518 var previousWasRendering = previousDispatcher.f(), wasRendering = flushSyncWork$1(); 15519 return previousWasRendering || wasRendering; 15520 }, 15521 r: function(form) { 15522 var formInst = getInstanceFromNode(form); 15523 null !== formInst && 5 === formInst.tag && "form" === formInst.type ? requestFormReset$1(formInst) : previousDispatcher.r(form); 15524 }, 15525 D: function(href) { 15526 previousDispatcher.D(href); 15527 preconnectAs("dns-prefetch", href, null); 15528 }, 15529 C: function(href, crossOrigin) { 15530 previousDispatcher.C(href, crossOrigin); 15531 preconnectAs("preconnect", href, crossOrigin); 15532 }, 15533 L: function(href, as, options) { 15534 previousDispatcher.L(href, as, options); 15535 var ownerDocument = globalDocument; 15536 if (ownerDocument && href && as) { 15537 var preloadSelector = "link[rel=\"preload\"][as=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(as) + "\"]"; 15538 "image" === as ? options && options.imageSrcSet ? (preloadSelector += "[imagesrcset=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(options.imageSrcSet) + "\"]", "string" === typeof options.imageSizes && (preloadSelector += "[imagesizes=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(options.imageSizes) + "\"]")) : preloadSelector += "[href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"]" : preloadSelector += "[href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"]"; 15539 var key = preloadSelector; 15540 switch (as) { 15541 case "style": 15542 key = getStyleKey(href); 15543 break; 15544 case "script": key = getScriptKey(href); 15545 } 15546 if (!(preloadPropsMap.has(key) || (href = assign({ 15547 rel: "preload", 15548 href: "image" === as && options && options.imageSrcSet ? void 0 : href, 15549 as 15550 }, options), preloadPropsMap.set(key, href), null !== ownerDocument.querySelector(preloadSelector) || "style" === as && ownerDocument.querySelector(getStylesheetSelectorFromKey(key)) || "script" === as && ownerDocument.querySelector(getScriptSelectorFromKey(key))))) { 15551 var instance = ownerDocument.createElement("link"); 15552 setInitialProperties(instance, "link", href); 15553 "style" === as && (instance[internalLoadPendingKey] = !0, instance.onload = instance.onerror = function() { 15554 clearPendingLoadOnNode(instance); 15555 }); 15556 markNodeAsHoistable(instance); 15557 ownerDocument.head.appendChild(instance); 15558 } 15559 } 15560 }, 15561 m: function(href, options) { 15562 previousDispatcher.m(href, options); 15563 var ownerDocument = globalDocument; 15564 if (ownerDocument && href) { 15565 var as = options && "string" === typeof options.as ? options.as : "script", preloadSelector = "link[rel=\"modulepreload\"][as=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(as) + "\"][href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"]", key = preloadSelector; 15566 switch (as) { 15567 case "audioworklet": 15568 case "paintworklet": 15569 case "serviceworker": 15570 case "sharedworker": 15571 case "worker": 15572 case "script": key = getScriptKey(href); 15573 } 15574 if (!preloadPropsMap.has(key) && (href = assign({ 15575 rel: "modulepreload", 15576 href 15577 }, options), preloadPropsMap.set(key, href), null === ownerDocument.querySelector(preloadSelector))) { 15578 switch (as) { 15579 case "audioworklet": 15580 case "paintworklet": 15581 case "serviceworker": 15582 case "sharedworker": 15583 case "worker": 15584 case "script": if (ownerDocument.querySelector(getScriptSelectorFromKey(key))) return; 15585 } 15586 as = ownerDocument.createElement("link"); 15587 setInitialProperties(as, "link", href); 15588 markNodeAsHoistable(as); 15589 ownerDocument.head.appendChild(as); 15590 } 15591 } 15592 }, 15593 X: function(src, options) { 15594 previousDispatcher.X(src, options); 15595 var ownerDocument = globalDocument; 15596 if (ownerDocument && src) { 15597 var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts, key = getScriptKey(src), resource = scripts.get(key); 15598 resource || (resource = ownerDocument.querySelector(getScriptSelectorFromKey(key)), resource || (src = assign({ 15599 src, 15600 async: !0 15601 }, options), (options = preloadPropsMap.get(key)) && adoptPreloadPropsForScript(src, options), resource = ownerDocument.createElement("script"), markNodeAsHoistable(resource), setInitialProperties(resource, "link", src), ownerDocument.head.appendChild(resource)), resource = { 15602 type: "script", 15603 instance: resource, 15604 count: 1, 15605 state: null 15606 }, scripts.set(key, resource)); 15607 } 15608 }, 15609 S: function(href, precedence, options) { 15610 previousDispatcher.S(href, precedence, options); 15611 var ownerDocument = globalDocument; 15612 if (ownerDocument && href) { 15613 var styles = getResourcesFromRoot(ownerDocument).hoistableStyles, key = getStyleKey(href); 15614 precedence = precedence || "default"; 15615 var resource = styles.get(key); 15616 if (!resource) { 15617 var state = { 15618 loading: NotLoaded, 15619 preload: null 15620 }; 15621 if (resource = ownerDocument.querySelector(getStylesheetSelectorFromKey(key))) state.loading = Loaded | Inserted; 15622 else { 15623 href = assign({ 15624 rel: "stylesheet", 15625 href, 15626 "data-precedence": precedence 15627 }, options); 15628 (options = preloadPropsMap.get(key)) && adoptPreloadPropsForStylesheet(href, options); 15629 var link = resource = ownerDocument.createElement("link"); 15630 markNodeAsHoistable(link); 15631 setInitialProperties(link, "link", href); 15632 link._p = new Promise(function(resolve, reject) { 15633 link.onload = resolve; 15634 link.onerror = reject; 15635 }); 15636 link.addEventListener("load", function() { 15637 state.loading |= Loaded; 15638 }); 15639 link.addEventListener("error", function() { 15640 state.loading |= Errored; 15641 }); 15642 state.loading |= Inserted; 15643 insertStylesheet(resource, precedence, ownerDocument); 15644 } 15645 resource = { 15646 type: "stylesheet", 15647 instance: resource, 15648 count: 1, 15649 state 15650 }; 15651 styles.set(key, resource); 15652 } 15653 } 15654 }, 15655 M: function(src, options) { 15656 previousDispatcher.M(src, options); 15657 var ownerDocument = globalDocument; 15658 if (ownerDocument && src) { 15659 var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts, key = getScriptKey(src), resource = scripts.get(key); 15660 resource || (resource = ownerDocument.querySelector(getScriptSelectorFromKey(key)), resource || (src = assign({ 15661 src, 15662 async: !0, 15663 type: "module" 15664 }, options), (options = preloadPropsMap.get(key)) && adoptPreloadPropsForScript(src, options), resource = ownerDocument.createElement("script"), markNodeAsHoistable(resource), setInitialProperties(resource, "link", src), ownerDocument.head.appendChild(resource)), resource = { 15665 type: "script", 15666 instance: resource, 15667 count: 1, 15668 state: null 15669 }, scripts.set(key, resource)); 15670 } 15671 } 15672 }; 15673 var globalDocument = "undefined" === typeof document ? null : document, tagCaches = null, SUSPENSEY_STYLESHEET_TIMEOUT = 6e4, SUSPENSEY_IMAGE_TIMEOUT = 800, SUSPENSEY_IMAGE_TIME_ESTIMATE = 500, estimatedBytesWithinLim
vendor: 12,750 bytes, lines 15673-15830
15673it = 0, LAST_PRECEDENCE = null, precedencesByRoot = null, NotPendingTransition = NotPending, HostTransitionContext = { 15674 $$typeof: REACT_CONTEXT_TYPE, 15675 Provider: null, 15676 Consumer: null, 15677 _currentValue: NotPendingTransition, 15678 _currentValue2: NotPendingTransition, 15679 _threadCount: 0 15680 }, badgeFormat = "%c%s%c", badgeStyle = "background: #e6e6e6;background: light-dark(rgba(0,0,0,0.1), rgba(255,255,255,0.25));color: #000000;color: light-dark(#000000, #ffffff);border-radius: 2px", resetStyle = "", pad = " ", bind = Function.prototype.bind; 15681 var didWarnAboutNestedUpdates = !1; 15682 var overrideHookState = null, overrideHookStateDeletePath = null, overrideHookStateRenamePath = null, overrideProps = null, overridePropsDeletePath = null, overridePropsRenamePath = null, scheduleUpdate = null, scheduleRetry = null, setErrorHandler = null, setSuspenseHandler = null; 15683 overrideHookState = function(fiber, id, path, value) { 15684 id = findHook(fiber, id); 15685 null !== id && (path = copyWithSetImpl(id.memoizedState, path, 0, value), id.memoizedState = path, id.baseState = path, fiber.memoizedProps = assign({}, fiber.memoizedProps), path = enqueueConcurrentRenderForLane(fiber, 2), null !== path && scheduleUpdateOnFiber(path, fiber, 2)); 15686 }; 15687 overrideHookStateDeletePath = function(fiber, id, path) { 15688 id = findHook(fiber, id); 15689 null !== id && (path = copyWithDeleteImpl(id.memoizedState, path, 0), id.memoizedState = path, id.baseState = path, fiber.memoizedProps = assign({}, fiber.memoizedProps), path = enqueueConcurrentRenderForLane(fiber, 2), null !== path && scheduleUpdateOnFiber(path, fiber, 2)); 15690 }; 15691 overrideHookStateRenamePath = function(fiber, id, oldPath, newPath) { 15692 id = findHook(fiber, id); 15693 null !== id && (oldPath = copyWithRename(id.memoizedState, oldPath, newPath), id.memoizedState = oldPath, id.baseState = oldPath, fiber.memoizedProps = assign({}, fiber.memoizedProps), oldPath = enqueueConcurrentRenderForLane(fiber, 2), null !== oldPath && scheduleUpdateOnFiber(oldPath, fiber, 2)); 15694 }; 15695 overrideProps = function(fiber, path, value) { 15696 fiber.pendingProps = copyWithSetImpl(fiber.memoizedProps, path, 0, value); 15697 fiber.alternate && (fiber.alternate.pendingProps = fiber.pendingProps); 15698 path = enqueueConcurrentRenderForLane(fiber, 2); 15699 null !== path && scheduleUpdateOnFiber(path, fiber, 2); 15700 }; 15701 overridePropsDeletePath = function(fiber, path) { 15702 fiber.pendingProps = copyWithDeleteImpl(fiber.memoizedProps, path, 0); 15703 fiber.alternate && (fiber.alternate.pendingProps = fiber.pendingProps); 15704 path = enqueueConcurrentRenderForLane(fiber, 2); 15705 null !== path && scheduleUpdateOnFiber(path, fiber, 2); 15706 }; 15707 overridePropsRenamePath = function(fiber, oldPath, newPath) { 15708 fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath); 15709 fiber.alternate && (fiber.alternate.pendingProps = fiber.pendingProps); 15710 oldPath = enqueueConcurrentRenderForLane(fiber, 2); 15711 null !== oldPath && scheduleUpdateOnFiber(oldPath, fiber, 2); 15712 }; 15713 scheduleUpdate = function(fiber) { 15714 var root = enqueueConcurrentRenderForLane(fiber, 2); 15715 null !== root && scheduleUpdateOnFiber(root, fiber, 2); 15716 }; 15717 scheduleRetry = function(fiber) { 15718 var lane = claimNextRetryLane(), root = enqueueConcurrentRenderForLane(fiber, lane); 15719 null !== root && scheduleUpdateOnFiber(root, fiber, lane); 15720 }; 15721 setErrorHandler = function(newShouldErrorImpl) { 15722 shouldErrorImpl = newShouldErrorImpl; 15723 }; 15724 setSuspenseHandler = function(newShouldSuspendImpl) { 15725 shouldSuspendImpl = newShouldSuspendImpl; 15726 }; 15727 var _enabled = !0, return_targetInst = null, hasScheduledReplayAttempt = !1, queuedFocus = null, queuedDrag = null, queuedMouse = null, queuedPointers = /* @__PURE__ */ new Map(), queuedPointerCaptures = /* @__PURE__ */ new Map(), queuedExplicitHydrationTargets = [], discreteReplayableEvents = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" "), lastScheduledReplayQueue = null; 15728 ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function(children) { 15729 var root = this._internalRoot; 15730 if (null === root) throw Error("Cannot update an unmounted root."); 15731 var args = arguments; 15732 "function" === typeof args[1] ? console.error("does not support the second callback argument. To execute a side effect after rendering, declare it in a component body with useEffect().") : isValidContainer(args[1]) ? console.error("You passed a container to the second argument of root.render(...). You don't need to pass it again since you already passed it to create the root.") : "undefined" !== typeof args[1] && console.error("You passed a second argument to root.render(...) but it only accepts one argument."); 15733 args = children; 15734 var current = root.current; 15735 updateContainerImpl(current, requestUpdateLane(current), args, root, null, null); 15736 }; 15737 ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function() { 15738 var args = arguments; 15739 "function" === typeof args[0] && console.error("does not support a callback argument. To execute a side effect after rendering, declare it in a component body with useEffect()."); 15740 args = this._internalRoot; 15741 if (null !== args) { 15742 this._internalRoot = null; 15743 var container = args.containerInfo; 15744 (executionContext & (RenderContext | CommitContext)) !== NoContext && console.error("Attempted to synchronously unmount a root while React was already rendering. React cannot finish unmounting the root until the current render has completed, which may lead to a race condition."); 15745 updateContainerImpl(args.current, 2, null, args, null, null); 15746 flushSyncWork$1(); 15747 container[internalContainerInstanceKey] = null; 15748 } 15749 }; 15750 ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function(target) { 15751 if (target) { 15752 var updatePriority = resolveUpdatePriority(); 15753 target = { 15754 blockedOn: null, 15755 target, 15756 priority: updatePriority 15757 }; 15758 for (var i = 0; i < queuedExplicitHydrationTargets.length && 0 !== updatePriority && updatePriority < queuedExplicitHydrationTargets[i].priority; i++); 15759 queuedExplicitHydrationTargets.splice(i, 0, target); 15760 0 === i && attemptExplicitHydrationTarget(target); 15761 } 15762 }; 15763 (function() { 15764 var isomorphicReactPackageVersion = React.version; 15765 if ("19.3.0" !== isomorphicReactPackageVersion) throw Error("Incompatible React versions: The \"react\" and \"react-dom\" packages must have the exact same version. Instead got:\n - react: " + (isomorphicReactPackageVersion + "\n - react-dom: 19.3.0\nLearn more: https://react.dev/warnings/version-mismatch")); 15766 })(); 15767 "function" === typeof Map && null != Map.prototype && "function" === typeof Map.prototype.forEach && "function" === typeof Set && null != Set.prototype && "function" === typeof Set.prototype.clear && "function" === typeof Set.prototype.forEach || console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://react.dev/link/react-polyfills"); 15768 ReactDOMSharedInternals.findDOMNode = function(componentOrElement) { 15769 var fiber = componentOrElement._reactInternals; 15770 if (void 0 === fiber) { 15771 if ("function" === typeof componentOrElement.render) throw Error("Unable to find node on an unmounted component."); 15772 componentOrElement = Object.keys(componentOrElement).join(","); 15773 throw Error("Argument appears to not be a ReactComponent. Keys: " + componentOrElement); 15774 } 15775 componentOrElement = findCurrentFiberUsingSlowPath(fiber); 15776 componentOrElement = null !== componentOrElement ? findCurrentHostFiberImpl(componentOrElement) : null; 15777 componentOrElement = null === componentOrElement ? null : componentOrElement.stateNode; 15778 return componentOrElement; 15779 }; 15780 if (!(function() { 15781 var internals = { 15782 bundleType: 1, 15783 version: "19.3.0", 15784 rendererPackageName: "react-dom", 15785 currentDispatcherRef: ReactSharedInternals, 15786 reconcilerVersion: "19.3.0" 15787 }; 15788 internals.overrideHookState = overrideHookState; 15789 internals.overrideHookStateDeletePath = overrideHookStateDeletePath; 15790 internals.overrideHookStateRenamePath = overrideHookStateRenamePath; 15791 internals.overrideProps = overrideProps; 15792 internals.overridePropsDeletePath = overridePropsDeletePath; 15793 internals.overridePropsRenamePath = overridePropsRenamePath; 15794 internals.scheduleUpdate = scheduleUpdate; 15795 internals.scheduleRetry = scheduleRetry; 15796 internals.setErrorHandler = setErrorHandler; 15797 internals.setSuspenseHandler = setSuspenseHandler; 15798 internals.scheduleRefresh = scheduleRefresh; 15799 internals.scheduleRoot = scheduleRoot; 15800 internals.setRefreshHandler = setRefreshHandler; 15801 internals.getCurrentFiber = getCurrentFiberForDevTools; 15802 return injectInternals(internals); 15803 })() && canUseDOM && window.top === window.self && (-1 < navigator.userAgent.indexOf("Chrome") && -1 === navigator.userAgent.indexOf("Edge") || -1 < navigator.userAgent.indexOf("Firefox"))) { 15804 var protocol = window.location.protocol; 15805 /^(https?|file):$/.test(protocol) && console.info("%cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools" + ("file:" === protocol ? "\nYou might need to use a local HTTP server (instead of file://): https://react.dev/link/react-devtools-faq" : ""), "font-weight:bold"); 15806 } 15807 exports.createRoot = function(container, options) { 15808 if (!isValidContainer(container)) throw Error("Target container is not a DOM element."); 15809 warnIfReactDOMContainerInDEV(container); 15810 var isStrictMode = !1, identifierPrefix = "", onUncaughtError = defaultOnUncaughtError, onCaughtError = defaultOnCaughtError, onRecoverableError = defaultOnRecoverableError; 15811 null !== options && void 0 !== options && (options.hydrate ? console.warn("hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.") : "object" === typeof options && null !== options && options.$$typeof === REACT_ELEMENT_TYPE && console.error("You passed a JSX element to createRoot. You probably meant to call root.render instead. Example usage:\n\n let root = createRoot(domContainer);\n root.render(<App />);"), !0 === options.unstable_strictMode && (isStrictMode = !0), void 0 !== options.identifierPrefix && (identifierPrefix = options.identifierPrefix), void 0 !== options.onUncaughtError && (onUncaughtError = options.onUncaughtError), void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError), void 0 !== options.onRecoverableError && (onRecoverableError = options.onRecoverableError)); 15812 options = createFiberRoot(container, 1, !1, null, null, isStrictMode, identifierPrefix, null, onUncaughtError, onCaughtError, onRecoverableError, defaultOnDefaultTransitionIndicator); 15813 container[internalContainerInstanceKey] = options.current; 15814 listenToAllSupportedEvents(container); 15815 return new ReactDOMRoot(options); 15816 }; 15817 exports.hydrateRoot = function(container, initialChildren, options) { 15818 if (!isValidContainer(container)) throw Error("Target container is not a DOM element."); 15819 warnIfReactDOMContainerInDEV(container); 15820 void 0 === initialChildren && console.error("Must provide initial children as second argument to hydrateRoot. Example usage: hydrateRoot(domContainer, <App />)"); 15821 var isStrictMode = !1, identifierPrefix = "", onUncaughtError = defaultOnUncaughtError, onCaughtError = defaultOnCaughtError, onRecoverableError = defaultOnRecoverableError, formState = null; 15822 null !== options && void 0 !== options && (!0 === options.unstable_strictMode && (isStrictMode = !0), void 0 !== options.identifierPrefix && (identifierPrefix = options.identifierPrefix), void 0 !== options.onUncaughtError && (onUncaughtError = options.onUncaughtError), void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError), void 0 !== options.onRecoverableError && (onRecoverableError = options.onRecoverableError), void 0 !== options.formState && (formState = options.formState)); 15823 initialChildren = createFiberRoot(container, 1, !0, initialChildren, null != options ? options : null, isStrictMode, identifierPrefix, formState, onUncaughtError, onCaughtError, onRecoverableError, defaultOnDefaultTransitionIndicator); 15824 initialChildren.context = getContextForSubtree(null); 15825 options = initialChildren.current; 15826 isStrictMode = requestUpdateLane(options); 15827 isStrictMode = getBumpedLaneForHydrationByLane(isStrictMode); 15828 identifierPrefix = createUpdate(isStrictMode); 15829 identifierPrefix.callback = null; 15830 enqueueUpdate(options, identifierPrefix, isStrictMode);
15831 startUpdateTimerByLane(isStrictMode, "hydrateRoot()", null); 15832 options = isStrictMode; 15833 initialChildren.current.lanes = options; 15834 markRootUpdated$1(initialChildren, options); 15835 ensureRootIsScheduled(initialChildren); 15836 container[internalContainerInstanceKey] = initialChildren.current; 15837 listenToAllSupportedEvents(container); 15838 return new ReactDOMHydrationRoot(initialChildren); 15839 }; 15840 exports.version = "19.3.0"; 15841 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 15842 })(); 15843})); 15844//#endregion 15845//#region node_modules/react-dom/client.js 15846var require_client = /* @__PURE__ */ __commonJSMin(((exports, module) => { 15847 module.exports = require_react_dom_client_development(); 15848})); 15849//#endregion 15850export { require_client as t }; 15851 15852//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LUI2VDVDODlDLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwiLi4vLi4vc2NoZWR1bGVyL2luZGV4LmpzIiwiLi4vLi4vcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20tY2xpZW50LmRldmVsb3BtZW50LmpzIiwiLi4vLi4vcmVhY3QtZG9tL2NsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9k
15852dWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCkge1xuICAgICAgbmVlZHNQYWludCA9ICExO1xuICAgICAgaWYgKGlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB2YXIgaGFzTW9yZVdvcmsgPSAhMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9ICExO1xuICAgICAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCAmJlxuICAgICAgICAgICAgICAoKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSAhMSksXG4gICAgICAgICAgICAgIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpLFxuICAgICAgICAgICAgICAodGFza1RpbWVvdXRJRCA9IC0xKSk7XG4gICAgICAgICAgICBpc1BlcmZvcm1pbmdXb3JrID0gITA7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFRhc2sgJiZcbiAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkWWllbGRUb0hvc3QoKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNNb3JlV29yayA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSAmJiBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRUYXNrKSBoYXNNb3JlV29yayA9ICEwO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZmlyc3RUaW1lciAmJlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBoYXNNb3JlV29yayA9ICExO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgKGN1cnJlbnRUYXNrID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsKSxcbiAgICAgICAgICAgICAgICAoaXNQZXJmb3JtaW5nV29yayA9ICExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhc01vcmVXb3JrID0gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBoYXNNb3JlV29ya1xuICAgICAgICAgICAgPyBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpXG4gICAgICAgICAgICA6IChpc01lc3NhZ2VMb29wUnVubmluZyA9ICExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgICAgIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICAgICAgaGVhcC5wdXNoKG5vZGUpO1xuICAgICAgYTogZm9yICg7IDAgPCBpbmRleDsgKSB7XG4gICAgICAgIHZhciBwYXJlbnRJbmRleCA9IChpbmRleCAtIDEpID4+PiAxLFxuICAgICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuICAgICAgICBpZiAoMCA8IGNvbXBhcmUocGFyZW50LCBub2RlKSlcbiAgICAgICAgICAoaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlKSxcbiAgICAgICAgICAgIChoZWFwW2luZGV4XSA9IHBhcmVudCksXG4gICAgICAgICAgICAoaW5kZXggPSBwYXJlbnRJbmRleCk7XG4gICAgICAgIGVsc2UgYnJlYWsgYTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gICAgICByZXR1cm4gMCA9PT0gaGVhcC5sZW5ndGggPyBudWxsIDogaGVhcFswXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgICAgIGlmICgwID09PSBoZWFwLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICB2Y
15852XIgZmlyc3QgPSBoZWFwWzBdLFxuICAgICAgICBsYXN0ID0gaGVhcC5wb3AoKTtcbiAgICAgIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgICAgICBoZWFwWzBdID0gbGFzdDtcbiAgICAgICAgYTogZm9yIChcbiAgICAgICAgICB2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBoZWFwLmxlbmd0aCwgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcbiAgICAgICAgICBpbmRleCA8IGhhbGZMZW5ndGg7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGxlZnRJbmRleCA9IDIgKiAoaW5kZXggKyAxKSAtIDEsXG4gICAgICAgICAgICBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdLFxuICAgICAgICAgICAgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDEsXG4gICAgICAgICAgICByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07XG4gICAgICAgICAgaWYgKDAgPiBjb21wYXJlKGxlZnQsIGxhc3QpKVxuICAgICAgICAgICAgcmlnaHRJbmRleCA8IGxlbmd0aCAmJiAwID4gY29tcGFyZShyaWdodCwgbGVmdClcbiAgICAgICAgICAgICAgPyAoKGhlYXBbaW5kZXhdID0gcmlnaHQpLFxuICAgICAgICAgICAgICAgIChoZWFwW3JpZ2h0SW5kZXhdID0gbGFzdCksXG4gICAgICAgICAgICAgICAgKGluZGV4ID0gcmlnaHRJbmRleCkpXG4gICAgICAgICAgICAgIDogKChoZWFwW2luZGV4XSA9IGxlZnQpLFxuICAgICAgICAgICAgICAgIChoZWFwW2xlZnRJbmRleF0gPSBsYXN0KSxcbiAgICAgICAgICAgICAgICAoaW5kZXggPSBsZWZ0SW5kZXgpKTtcbiAgICAgICAgICBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIDAgPiBjb21wYXJlKHJpZ2h0LCBsYXN0KSlcbiAgICAgICAgICAgIChoZWFwW2luZGV4XSA9IHJpZ2h0KSxcbiAgICAgICAgICAgICAgKGhlYXBbcmlnaHRJbmRleF0gPSBsYXN0KSxcbiAgICAgICAgICAgICAgKGluZGV4ID0gcmlnaHRJbmRleCk7XG4gICAgICAgICAgZWxzZSBicmVhayBhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgICAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICAgICAgcmV0dXJuIDAgIT09IGRpZmYgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgICAgIGZvciAodmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTsgbnVsbCAhPT0gdGltZXI7ICkge1xuICAgICAgICBpZiAobnVsbCA9PT0gdGltZXIuY2FsbGJhY2spIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgICAgZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKVxuICAgICAgICAgIHBvcCh0aW1lclF1ZXVlKSxcbiAgICAgICAgICAgICh0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZSksXG4gICAgICAgICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSAhMTtcbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZClcbiAgICAgICAgaWYgKG51bGwgIT09IHBlZWsodGFza1F1ZXVlKSlcbiAgICAgICAgICAoaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyB8fFxuICAgICAgICAgICAgICAoKGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITApLCBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICAgICAgICAgIG51bGwgIT09IGZpcnN0VGltZXIgJiZcbiAgICAgICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChcbiAgICAgICAgICAgICAgaGFuZGxlVGltZW91dCxcbiAgICAgICAgICAgICAgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRZaWVsZFRvSG9zdCgpIHtcbiAgICAgIHJldHVybiBuZWVkc1BhaW50XG4gICAgICAgID8gITBcbiAgICAgICAgOiBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lIDwgZnJhbWVJbnRlcnZhbFxuICAgICAgICAgID8gITFcbiAgICAgICAgICA6ICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXF1ZXN0SG9zdFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gICAgICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gICAgICB9LCBtcyk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSB2b2lkIDA7XG4gICAgaWYgKFxuICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHBlcmZvcm1hbmNlICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwZXJmb3JtYW5jZS5ub3dcbiAgICApIHtcbiAgICAgIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG4gICAgICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2Y
15852XIgbG9jYWxEYXRlID0gRGF0ZSxcbiAgICAgICAgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG4gICAgICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHRhc2tRdWV1ZSA9IFtdLFxuICAgICAgdGltZXJRdWV1ZSA9IFtdLFxuICAgICAgdGFza0lkQ291bnRlciA9IDEsXG4gICAgICBjdXJyZW50VGFzayA9IG51bGwsXG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IDMsXG4gICAgICBpc1BlcmZvcm1pbmdXb3JrID0gITEsXG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9ICExLFxuICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9ICExLFxuICAgICAgbmVlZHNQYWludCA9ICExLFxuICAgICAgbG9jYWxTZXRUaW1lb3V0ID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygc2V0VGltZW91dCA/IHNldFRpbWVvdXQgOiBudWxsLFxuICAgICAgbG9jYWxDbGVhclRpbWVvdXQgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjbGVhclRpbWVvdXQgPyBjbGVhclRpbWVvdXQgOiBudWxsLFxuICAgICAgbG9jYWxTZXRJbW1lZGlhdGUgPVxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2Ygc2V0SW1tZWRpYXRlID8gc2V0SW1tZWRpYXRlIDogbnVsbCxcbiAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITEsXG4gICAgICB0YXNrVGltZW91dElEID0gLTEsXG4gICAgICBmcmFtZUludGVydmFsID0gNSxcbiAgICAgIHN0YXJ0VGltZSA9IC0xO1xuICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsb2NhbFNldEltbWVkaWF0ZSlcbiAgICAgIHZhciBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTtcbiAgICAgIH07XG4gICAgZWxzZSBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICB2Y
15852XIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpLFxuICAgICAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICB9O1xuICAgIH0gZWxzZVxuICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICAgICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IDU7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IDE7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IDQ7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IDM7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSBudWxsO1xuICAgIGV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xuICAgIGV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgdGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZnVuY3Rpb24gKGZwcykge1xuICAgICAgMCA+IGZwcyB8fCAxMjUgPCBmcHNcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWRcIlxuICAgICAgICAgIClcbiAgICAgICAgOiAoZnJhbWVJbnRlcnZhbCA9IDAgPCBmcHMgPyBNYXRoLmZsb29yKDFlMyAvIGZwcykgOiA1KTtcbiAgICB9O1xuICAgIGV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX25leHQgPSBmdW5jdGlvbiAoZXZlbnRIYW5kbGVyKSB7XG4gICAgICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgdmFyIHByaW9yaXR5TGV2ZWwgPSAzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgICAgfVxuICAgIH07XG4gICAgZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBuZWVkc1BhaW50ID0gITA7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgICAgIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBwcmlvcml0eUxldmVsID0gMztcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgICAgfVxuICAgIH07XG4gICAgZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gZnVuY3Rpb24gKFxuICAgICAgcHJpb3JpdHlMZXZlbCxcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgb3B0aW9uc1xuICAgICkge1xuICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBvcHRpb25zICYmIG51bGwgIT09IG9wdGlvbnNcbiAgICAgICAgPyAoKG9wdGlvbnMgPSBvcHRpb25zLmRlbGF5KSxcbiAgICAgICAgICAob3B0aW9ucyA9XG4gICAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2Ygb3B0aW9ucyAmJiAwIDwgb3B0aW9uc1xuICAgICAgICAgICAgICA/IGN1cnJlbnRUaW1lICsgb3B0aW9uc1xuICAgICAgICAgICAgICA6IGN1cnJlbnRUaW1lKSlcbiAgICAgICAgOiAob3B0aW9ucyA9IGN1cnJlbnRUaW1lKTtcbiAgICAgIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdmFyIHRpbWVvdXQgPSAtMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRpbWVvdXQgPSAyNTA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICB0aW1lb3V0ID0gMTA3Mzc0MTgyMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHRpbWVvdXQgPSAx
15852ZTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGltZW91dCA9IDVlMztcbiAgICAgIH1cbiAgICAgIHRpbWVvdXQgPSBvcHRpb25zICsgdGltZW91dDtcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSB7XG4gICAgICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICAgICAgc3RhcnRUaW1lOiBvcHRpb25zLFxuICAgICAgICBleHBpcmF0aW9uVGltZTogdGltZW91dCxcbiAgICAgICAgc29ydEluZGV4OiAtMVxuICAgICAgfTtcbiAgICAgIG9wdGlvbnMgPiBjdXJyZW50VGltZVxuICAgICAgICA/ICgocHJpb3JpdHlMZXZlbC5zb3J0SW5kZXggPSBvcHRpb25zKSxcbiAgICAgICAgICBwdXNoKHRpbWVyUXVldWUsIHByaW9yaXR5TGV2ZWwpLFxuICAgICAgICAgIG51bGwgPT09IHBlZWsodGFza1F1ZXVlKSAmJlxuICAgICAgICAgICAgcHJpb3JpdHlMZXZlbCA9PT0gcGVlayh0aW1lclF1ZXVlKSAmJlxuICAgICAgICAgICAgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWRcbiAgICAgICAgICAgICAgPyAobG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCksICh0YXNrVGltZW91dElEID0gLTEpKVxuICAgICAgICAgICAgICA6IChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gITApLFxuICAgICAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIG9wdGlvbnMgLSBjdXJyZW50VGltZSkpKVxuICAgICAgICA6ICgocHJpb3JpdHlMZXZlbC5zb3J0SW5kZXggPSB0aW1lb3V0KSxcbiAgICAgICAgICBwdXNoKHRhc2tRdWV1ZSwgcHJpb3JpdHlMZXZlbCksXG4gICAgICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgfHxcbiAgICAgICAgICAgIGlzUGVyZm9ybWluZ1dvcmsgfHxcbiAgICAgICAgICAgICgoaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyB8fFxuICAgICAgICAgICAgICAoKGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITApLFxuICAgICAgICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpKSkpO1xuICAgICAgcmV0dXJuIHByaW9yaXR5TGV2ZWw7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG4gICAgZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
15852XIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKEVycm9yKCkpO1xuICB9KSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLWNsaWVudC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGZpbmRIb29rKGZpYmVyLCBpZCkge1xuICAgICAgZm9yIChmaWJlciA9IGZpYmVyLm1lbW9pemVkU3RhdGU7IG51bGwgIT09IGZpYmVyICYmIDAgPCBpZDsgKVxuICAgICAgICAoZmliZXIgPSBmaWJlci5uZXh0KSwgaWQtLTtcbiAgICAgIHJldHVybiBmaWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHJldHVybiB2YWx1ZTtcbiAgICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XSxcbiAgICAgICAgdXBkYXRlZCA9IGlzQXJyYXlJbXBsKG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcbiAgICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVdpdGhSZW5hbWUob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKVxuICAgICAgICBjb25zb2xlLndhcm4oXCJjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspXG4gICAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgXCJjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXlcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XSxcbiAgICAgICAgdXBkYXRlZCA9IGlzQXJyYXlJbXBsKG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcbiAgICAgIGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGhcbiAgICAgICAgPyAoKHVwZGF0ZWRbbmV3UGF0aFtpbmRleF1dID0gdXBkYXRlZFtvbGRLZXldKSxcbiAgICAgICAgICBpc0FycmF5SW1wbCh1cGRhdGVkKVxuICAgICAgICAgICAgPyB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpXG4gICAgICAgICAgICA6IGRlbGV0ZSB1cGRhdGVkW29sZEtleV0pXG4gICAgICAgIDogKHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbChcbiAgICAgICAgICAgIG9ialtvbGRLZXldLFxuICAgICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgICBpbmRleCArIDFcbiAgICAgICAgICApKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdLFxuICAgICAgICB1cGRhdGVkID0gaXNBcnJheUltcGwob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuICAgICAgaWYgKGluZGV4ICsgMSA9PT0gcGF0aC5sZW5ndGgpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgaXNBcnJheUltcGwodXBkYXRlZCkgPyB1cGRhdGVkLnNwbGljZShrZXksIDEpIDogZGVsZXRlIHVwZGF0ZWRba2V5XSxcbiAgICAgICAgICB1cGRhdGVkXG4gICAgICAgICk7XG4gICAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2hvdWxkU3VzcGVuZEltcGwoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNob3VsZEVycm9ySW1wbCgpIHtcbiAgICAgIHJldHVybi
15852BudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIkRvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvcnVsZXMtb2YtaG9va3NcIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiBJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbm9vcCgpIHt9XG4gICAgZnVuY3Rpb24gd2FybkZvck1pc3NpbmdLZXkoKSB7fVxuICAgIGZ1bmN0aW9uIHNldFRvU29ydGVkU3RyaW5nKHNldCkge1xuICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbihcIiwgXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVGaWJlcih0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gICAgICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVSb290KHJvb3QsIGVsZW1lbnQpIHtcbiAgICAgIHJvb3QuY29udGV4dCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0ICYmXG4gICAgICAgICh1cGRhdGVDb250YWluZXJJbXBsKHJvb3QuY3VycmVudCwgMiwgZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCksXG4gICAgICAgIGZsdXNoU3luY1dvcmskMSgpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVSZWZyZXNoKHJvb3QsIHVwZGF0ZSkge1xuICAgICAgaWYgKG51bGwgIT09IHJlc29sdmVGYW1pbHkpIHtcbiAgICAgICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcztcbiAgICAgICAgdXBkYXRlID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICAgICAgZmx1c2hQZW5kaW5nRWZmZWN0cygpO1xuICAgICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KFxuICAgICAgICAgIHJvb3QuY3VycmVudCxcbiAgICAgICAgICB1cGRhdGUsXG4gICAgICAgICAgc3RhbGVGYW1pbGllc1xuICAgICAgICApO1xuICAgICAgICBmbHVzaFN5bmNXb3JrJDEoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0UmVmcmVzaEhhbmRsZXIoaGFuZGxlcikge1xuICAgICAgcmVzb2x2ZUZhbWlseSA9IGhhbmRsZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgICFub2RlIHx8XG4gICAgICAgICgxICE9PSBub2RlLm5vZGVUeXBlICYmIDkgIT09IG5vZGUubm9kZVR5cGUgJiYgMTEgIT09IG5vZGUubm9kZVR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gICAgICBmb3IgKHZhciBub2RlID0gZmliZXIsIG5leHROb2RlID0gbm9kZTsgbmV4dE5vZGUgJiYgIW5leHROb2RlLmFsdGVybmF0ZTsgKVxuICAgICAgICAobm9kZSA9IG5leHROb2RlKSxcbiAgICAgICAgICAwICE9PSAobm9kZS5mbGFncyAmIDQwOTgpICYmIChmaWJlciA9IG5vZGUucmV0dXJuKSxcbiAgICAgICAgICAobmV4dE5vZGUgPSBub2RlLnJldHVybik7XG4gICAgICBmb3IgKDsgbm9kZS5yZXR1cm47ICkgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgcmV0dXJuIDMgPT09IG5vZGUudGFnID8gZmliZXIgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gICAgICBpZiAoMTMgPT09IGZpYmVyLnRhZykge1xuICAgICAgICB2Y
15852XIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIG51bGwgPT09IHN1c3BlbnNlU3RhdGUgJiZcbiAgICAgICAgICAoKGZpYmVyID0gZmliZXIuYWx0ZXJuYXRlKSxcbiAgICAgICAgICBudWxsICE9PSBmaWJlciAmJiAoc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGUpKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHN1c3BlbnNlU3RhdGUpIHJldHVybiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QWN0aXZpdHlJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICAgICAgaWYgKDMxID09PSBmaWJlci50YWcpIHtcbiAgICAgICAgdmFyIGFjdGl2aXR5U3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICBudWxsID09PSBhY3Rpdml0eVN0YXRlICYmXG4gICAgICAgICAgKChmaWJlciA9IGZpYmVyLmFsdGVybmF0ZSksXG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIgJiYgKGFjdGl2aXR5U3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlKSk7XG4gICAgICAgIGlmIChudWxsICE9PSBhY3Rpdml0eVN0YXRlKSByZXR1cm4gYWN0aXZpdHlTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICAgICAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcilcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgICAgIGFsdGVybmF0ZSA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuICAgICAgICBpZiAobnVsbCA9PT0gYWx0ZXJuYXRlKVxuICAgICAgICAgIHRocm93IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlwiKTtcbiAgICAgICAgcmV0dXJuIGFsdGVybmF0ZSAhPT0gZmliZXIgPyBudWxsIDogZmliZXI7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBhID0gZmliZXIsIGIgPSBhbHRlcm5hdGU7IDsgKSB7XG4gICAgICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG4gICAgICAgIGlmIChudWxsID09PSBwYXJlbnRBKSBicmVhaztcbiAgICAgICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBLmFsdGVybmF0ZTtcbiAgICAgICAgaWYgKG51bGwgPT09IHBhcmVudEIpIHtcbiAgICAgICAgICBiID0gcGFyZW50QS5yZXR1cm47XG4gICAgICAgICAgaWYgKG51bGwgIT09IGIpIHtcbiAgICAgICAgICAgIGEgPSBiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICAgICAgZm9yIChwYXJlbnRCID0gcGFyZW50QS5jaGlsZDsgcGFyZW50QjsgKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50QiA9PT0gYSkgcmV0dXJuIGFzc2VydElzTW91bnRlZChwYXJlbnRBKSwgZmliZXI7XG4gICAgICAgICAgICBpZiAocGFyZW50QiA9PT0gYikgcmV0dXJuIGFzc2VydElzTW91bnRlZChwYXJlbnRBKSwgYWx0ZXJuYXRlO1xuICAgICAgICAgICAgcGFyZW50QiA9IHBhcmVudEIuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIChhID0gcGFyZW50QSksIChiID0gcGFyZW50Qik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGRpZEZpbmRDaGlsZCA9ICExLCBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkOyBfY2hpbGQ7ICkge1xuICAgICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSAhMDtcbiAgICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgICAgZGlkRmluZENoaWxkID0gITA7XG4gICAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICAgIGZvciAoX2NoaWxkID0gcGFyZW50Qi5jaGlsZDsgX2NoaWxkOyApIHtcbiAgICAgICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9ICEwO1xuICAgICAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSAhMDtcbiAgICAgICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGlkRmluZENoaWxkKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybi
15852Bwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoMyAhPT0gYS50YWcpXG4gICAgICAgIHRocm93IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlwiKTtcbiAgICAgIHJldHVybiBhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhID8gZmliZXIgOiBhbHRlcm5hdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gICAgICB2YXIgdGFnID0gbm9kZS50YWc7XG4gICAgICBpZiAoNSA9PT0gdGFnIHx8IDI2ID09PSB0YWcgfHwgMjcgPT09IHRhZyB8fCA2ID09PSB0YWcpIHJldHVybiBub2RlO1xuICAgICAgZm9yIChub2RlID0gbm9kZS5jaGlsZDsgbnVsbCAhPT0gbm9kZTsgKSB7XG4gICAgICAgIHRhZyA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHRhZykgcmV0dXJuIHRhZztcbiAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgIGZyYWdtZW50RmliZXIsXG4gICAgICBmbixcbiAgICAgIGEsXG4gICAgICBiLFxuICAgICAgY1xuICAgICkge1xuICAgICAgdHJhdmVyc2VWaXNpYmxlSW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgZnJhZ21lbnRGaWJlci5jaGlsZCxcbiAgICAgICAgITEsXG4gICAgICAgIGZuLFxuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgICBjXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZVZpc2libGVJbnN0YW5jZXNBbmRUZXh0SW5zdGFuY2VzKFxuICAgICAgY2hpbGQsXG4gICAgICBzZWFyY2hXaXRoaW5Ib3N0cyxcbiAgICAgIGZuLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBjXG4gICAgKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPT0gY2hpbGQ7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKCg1ID09PSBjaGlsZC50YWcgfHwgMjcgPT09IGNoaWxkLnRhZyB8fCA2ID09PSBjaGlsZC50YWcpICYmXG4gICAgICAgICAgICBmbihjaGlsZCwgYSwgYiwgYykpIHx8XG4gICAgICAgICAgKCgyMiAhPT0gY2hpbGQudGFnIHx8IG51bGwgPT09IGNoaWxkLm1lbW9pemVkU3RhdGUpICYmXG4gICAgICAgICAgICAoc2VhcmNoV2l0aGluSG9zdHMgfHwgKDUgIT09IGNoaWxkLnRhZyAmJiAyNyAhPT0gY2hpbGQudGFnKSkgJiZcbiAgICAgICAgICAgIHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICAgIGNoaWxkLmNoaWxkLFxuICAgICAgICAgICAgICBzZWFyY2hXaXRoaW5Ib3N0cyxcbiAgICAgICAgICAgICAgZm4sXG4gICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgIGIsXG4gICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICkpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoZmliZXIpIHtcbiAgICAgIGZvciAoZmliZXIgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IGZpYmVyOyApIHtcbiAgICAgICAgaWYgKDMgPT09IGZpYmVyLnRhZyB8fCA1ID09PSBmaWJlci50YWcgfHwgMjcgPT09IGZpYmVyLnRhZylcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpYmVySXNQb3J0YWxlZEludG9Ib3N0KGZpYmVyKSB7XG4gICAgICB2Y
15852XIgZm91bmRQb3J0YWxQYXJlbnQgPSAhMTtcbiAgICAgIGZvciAoZmliZXIgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IGZpYmVyOyApIHtcbiAgICAgICAgNCA9PT0gZmliZXIudGFnICYmIChmb3VuZFBvcnRhbFBhcmVudCA9ICEwKTtcbiAgICAgICAgaWYgKDMgPT09IGZpYmVyLnRhZyB8fCA1ID09PSBmaWJlci50YWcgfHwgMjcgPT09IGZpYmVyLnRhZykgYnJlYWs7XG4gICAgICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvdW5kUG9ydGFsUGFyZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhmaWJlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IFtudWxsLCBudWxsXSxcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyID0gZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoZmliZXIpO1xuICAgICAgaWYgKG51bGwgPT09IHBhcmVudEhvc3RGaWJlcikgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGZpbmRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBmaWJlcixcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyLmNoaWxkLFxuICAgICAgICB7IGZvdW5kU2VsZjogITEgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhcbiAgICAgIHJlc3VsdCxcbiAgICAgIHNlbGYsXG4gICAgICBjaGlsZCxcbiAgICAgIHN0YXRlXG4gICAgKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPT0gY2hpbGQ7ICkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IHNlbGYpIHN0YXRlLmZvdW5kU2VsZiA9ICEwO1xuICAgICAgICBlbHNlIGlmICg1ID09PSBjaGlsZC50YWcgfHwgMjcgPT09IGNoaWxkLnRhZyB8fCA2ID09PSBjaGlsZC50YWcpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZm91bmRTZWxmKSByZXR1cm4gKHJlc3VsdFsxXSA9IGNoaWxkKSwgITA7XG4gICAgICAgICAgcmVzdWx0WzBdID0gY2hpbGQ7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKDIyICE9PSBjaGlsZC50YWcgfHwgbnVsbCA9PT0gY2hpbGQubWVtb2l6ZWRTdGF0ZSkgJiZcbiAgICAgICAgICBmaW5kRnJhZ21lbnRJbnN0YW5jZU9yVGV4dEluc3RhbmNlU2libGluZ3MoXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBzZWxmLFxuICAgICAgICAgICAgY2hpbGQuY2hpbGQsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoZmliZXIpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJldHVybiBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNGaWJlclByZWNlZGluZ0NoZWNrKGNoaWxkLCB0YXJnZXQsIGJvdW5kYXJ5KSB7XG4gICAgICByZXR1cm4gY2hpbGQgPT09IGJvdW5kYXJ5XG4gICAgICAgID8gITBcbiAgICAgICAgOiBjaGlsZCA9PT0gdGFyZ2V0XG4gICAgICAgICAgPyAoKHNlYXJjaFRhcmdldCA9IGNoaWxkKSwgITApXG4gICAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNGaWJlckZvbGxvd2luZ0NoZWNrKGNoaWxkLCB0YXJnZXQsIGJvdW5kYXJ5KSB7XG4gICAgICByZXR1cm4gY2hpbGQgPT09IGJvdW5kYXJ5XG4gICAgICAgID8gKChzZWFyY2hCb3VuZGFyeSA9IGNoaWxkKSwgITEpXG4gICAgICAgIDogY2hpbGQgPT09IHRhcmdldFxuICAgICAgICAgID8gKG51bGwgIT09IHNlYXJjaEJvdW5kYXJ5ICYmIChzZWFyY2hUYXJnZXQgPSBjaGlsZCksICEwKVxuICAgICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFBhcmVudEZvckZyYWdtZW50QW5jZXN0b3JzKGluc3QpIHtcbiAgICAgIGlmIChudWxsID09PSBpbnN0KSByZXR1cm4gbnVsbDtcbiAgICAgIGRvIGluc3QgPSBudWxsID09PSBpbnN0ID8gbnVsbCA6IGluc3QucmV0dXJuO1xuICAgICAgd2hpbGUgKGluc3QgJiYgNSAhPT0gaW5zdC50YWcgJiYgMjcgIT09IGluc3QudGFnICYmIDMgIT09IGluc3QudGFnKTtcbiAgICAgIHJldHVybiBpbnN0ID8gaW5zdCA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0QiwgZ2V0UGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBkZXB0aEEgPSAwLCB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKVxuICAgICAgICBkZXB0aEErKztcbiAgICAgIHRlbXBBID0gMDtcbiAgICAgIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHRlbXBBKys7XG4gICAgICBmb3IgKDsgMCA8IGRlcHRoQSAtIHRlbXBBOyApIChpbnN0QSA9IGdldFBhcmVudChpbnN0
15852QSkpLCBkZXB0aEEtLTtcbiAgICAgIGZvciAoOyAwIDwgdGVtcEEgLSBkZXB0aEE7ICkgKGluc3RCID0gZ2V0UGFyZW50KGluc3RCKSksIHRlbXBBLS07XG4gICAgICBmb3IgKDsgZGVwdGhBLS07ICkge1xuICAgICAgICBpZiAoaW5zdEEgPT09IGluc3RCIHx8IChudWxsICE9PSBpbnN0QiAmJiBpbnN0QSA9PT0gaW5zdEIuYWx0ZXJuYXRlKSlcbiAgICAgICAgICByZXR1cm4gaW5zdEE7XG4gICAgICAgIGluc3RBID0gZ2V0UGFyZW50KGluc3RBKTtcbiAgICAgICAgaW5zdEIgPSBnZXRQYXJlbnQoaW5zdEIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgICAgaWYgKG51bGwgPT09IG1heWJlSXRlcmFibGUgfHwgXCJvYmplY3RcIiAhPT0gdHlwZW9mIG1heWJlSXRlcmFibGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgbWF5YmVJdGVyYWJsZSA9XG4gICAgICAgIChNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdKSB8fFxuICAgICAgICBtYXliZUl0ZXJhYmxlW1wiQEBpdGVyYXRvclwiXTtcbiAgICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBtYXliZUl0ZXJhYmxlID8gbWF5YmVJdGVyYWJsZSA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICByZXR1cm4gdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQcm9maWxlclwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3RyaWN0TW9kZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfQUNUSVZJVFlfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJBY3Rpdml0eVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1ZJRVdfVFJBTlNJVElPTl9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlZpZXdUcmFuc2l0aW9uXCI7XG4gICAgICB9XG4gICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUpXG4gICAgICAgIHN3aXRjaCAoXG4gICAgICAgICAgKFwibnVtYmVyXCIgPT09IHR5cGVvZiB0eXBlLnRhZyAmJlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgIHR5cGUuJCR0eXBlb2YpXG4gICAgICAgICkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gXCJQb3J0YWxcIjtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgIHZhciBpbm5lclR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgICAgICAoKHR5cGUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgXCJcIiksXG4gICAgICAgICAgICAgICh0eXBlID0gXCJcIiAhPT0gdHlwZSA/IFwiRm9yd2FyZFJlZihcIiArIHR5cGUgKyBcIilcIiA6IFwiRm9yd2FyZFJlZlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChpbm5lclR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGwpLFxuICAgICAgICAgICAgICBudWxsICE9PSBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA/IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgIDogZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJNZW1vXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICBpbm5lclR5cGUgPSB0eXBlLl9wYXlsb2FkO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuX2luaXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUoaW5uZXJUeXBlKSk7XG4gICAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21Pd25lcihvd25lcikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT09IHR5cGVvZiBvd25lci50YWdcbiAgICAgICAgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKVxuICAgICAgICA6IFwic3RyaW5nXCIgPT09IHR5cGVvZiBvd25lci5uYW1lXG4gICAgICAgICAgPyBvd25lci5uYW1lXG4gICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJldHVybiBcIkFjdGl2aXR5XCI7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmV0dXJuIFwiQ2FjaGVcIjtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIHJldHVybiBcIkRlaHlkcmF0ZWRGcmFnbWVudFwiO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZmliZXIgPSB0eXBlLnJlbmRlciksXG4gICAgICAgICAgICAoZmliZXIgPSBmaWJlci5kaXNwbGF5TmFtZSB8fCBmaWJlci5uYW1lIHx8IFwiXCIpLFxuICAgICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSB8fFxuICAgICAgICAgICAgICAoXCJcIiAhPT0gZmliZXIgPyBcIkZvcndhcmRSZWYoXCIgKyBmaWJlciArIFwiKVwiIDogXCJGb3J3YXJkUmVmXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBcIlBvcnRhbFwiO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIFwiUm9vdFwiO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIFwiVGV4dFwiO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA/IFwiU3RyaWN0TW9kZVwiIDogXCJNb2RlXCI7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgaWYgKG51bGwgIT09IGZpYmVyLnJldHVybilcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgcmV0dXJuIFwiUHJvZmlsZXJcIjtcbiAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICByZXR1cm4gXCJTY29wZVwiO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJldHVybiBcIlN1c3BlbnNlXCI7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgcmV0dXJuIFwiVHJhY2luZ01hcmtlclwiO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIHJldHVybiBcIlZpZXdUcmFuc2l0aW9uXCI7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlKSByZXR1cm4gdHlwZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICB0eXBlID0gZmliZXIuX2RlYnVnSW5mbztcbiAgICAgICAgICBpZiAobnVsbCAhPSB0eXBlKVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHR5cGUubGVuZ3RoIC0gMTsgMCA8PSBpOyBpLS0pXG4gICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZVtpXS5uYW1lKSByZXR1cm4gdHlwZVtpXS5uYW1lO1xuICAgICAgICAgIGlmIChudWxsICE9PSBmaWJlci5yZXR1cm4pXG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlci5yZXR1cm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZh
15852dWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiB7IGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZSB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICAgICAgMCA+IGluZGV4JGpzY29tcCQwXG4gICAgICAgID8gY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgcG9wLlwiKVxuICAgICAgICA6IChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleCRqc2NvbXAkMF0gJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC5cIiksXG4gICAgICAgICAgKGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleCRqc2NvbXAkMF0pLFxuICAgICAgICAgICh2YWx1ZVN0YWNrW2luZGV4JGpzY29tcCQwXSA9IG51bGwpLFxuICAgICAgICAgIChmaWJlclN0YWNrW2luZGV4JGpzY29tcCQwXSA9IG51bGwpLFxuICAgICAgICAgIGluZGV4JGpzY29tcCQwLS0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gICAgICBpbmRleCRqc2NvbXAkMCsrO1xuICAgICAgdmFsdWVTdGFja1tpbmRleCRqc2NvbXAkMF0gPSBjdXJzb3IuY3VycmVudDtcbiAgICAgIGZpYmVyU3RhY2tbaW5kZXgkanNjb21wJDBdID0gZmliZXI7XG4gICAgICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICAgICAgbnVsbCA9PT0gYyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaEhvc3RDb250YWluZXIoZmliZXIsIG5leHRSb290SW5zdGFuY2UpIHtcbiAgICAgIHB1c2gocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIG5leHRSb290SW5zdGFuY2UsIGZpYmVyKTtcbiAgICAgIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gICAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbnVsbCwgZmliZXIpO1xuICAgICAgdmFyIG5leHRSb290Q29udGV4dCA9IG5leHRSb290SW5zdGFuY2Uubm9kZVR5cGU7XG4gICAgICBzd2l0Y2ggKG5leHRSb290Q29udGV4dCkge1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgbmV4dFJvb3RDb250ZXh0ID0gOSA9PT0gbmV4dFJvb3RDb250ZXh0ID8gXCIjZG9jdW1lbnRcIiA6IFwiI2ZyYWdtZW50XCI7XG4gICAgICAgICAgbmV4dFJvb3RJbnN0YW5jZSA9IChuZXh0Um9vdEluc3RhbmNlID1cbiAgICAgICAgICAgIG5leHRSb290SW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgPyAobmV4dFJvb3RJbnN0YW5jZSA9IG5leHRSb290SW5zdGFuY2UubmFtZXNwYWNlVVJJKVxuICAgICAgICAgICAgICA/IGdldE93bkhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpXG4gICAgICAgICAgICAgIDogSG9zdENvbnRleHROYW1lc3BhY2VOb25lXG4gICAgICAgICAgICA6IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoKG5leHRSb290Q29udGV4dCA9IG5leHRSb290SW5zdGFuY2UudGFnTmFtZSksXG4gICAgICAgICAgICAobmV4dFJvb3RJbnN0YW5jZSA9IG5leHRSb290SW5zdGFuY2UubmFtZXNwYWNlVVJJKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICAobmV4dFJvb3RJbnN0YW5jZSA9IGdldE93bkhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpKSxcbiAgICAgICAgICAgICAgKG5leHRSb290SW5zdGFuY2UgPSBnZXRDaGlsZEhvc3RDb250ZXh0UHJvZChcbiAgICAgICAgICAgICAgICBuZXh0Um9vdEluc3RhbmNlLFxuICAgICAgICAgICAgICAgIG5leHRSb290Q29udGV4dFxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKG5leHRSb290Q29udGV4dCkge1xuICAgICAgICAgICAgICBjYXNlIFwic3ZnXCI6XG4gICAgICAgICAgICAgICAgbmV4dFJvb3RJbnN0YW5jZSA9IEhvc3RDb250ZXh0TmFtZXNwYWNlU3ZnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgICAgICAgICAgIG5leHRSb290SW5zdGFuY2UgPSBIb3N0Q29udGV4dE5hbWVzcGFjZU1hdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbmV4dFJvb3RJbnN0YW5jZSA9IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHRSb290Q29udGV4dCA9IG5leHRSb290Q29udGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgbmV4dFJvb3RDb250ZXh0ID0gdXBkYXRlZEFuY2VzdG9ySW5mb0RldihudWxsLCBuZXh0Um9vdENvbnRleHQpO1xuICAgICAgbmV4dFJvb3RDb250ZXh0ID0ge1xuICAgICAgICBjb250ZXh0OiBuZXh0Um9vdEluc3RhbmNlLFxuICAgICAgICBhbmNlc3RvckluZm86IG5leHRSb290Q29udGV4dFxuICAgICAgfTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICAgICAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gICAgICB2Y
15852XIgc3RhdGVIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIG51bGwgIT09IHN0YXRlSG9vayAmJlxuICAgICAgICAoKEhvc3RUcmFuc2l0aW9uQ29udGV4dC5fY3VycmVudFZhbHVlID0gc3RhdGVIb29rLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICBwdXNoKGhvc3RUcmFuc2l0aW9uUHJvdmlkZXJDdXJzb3IsIGZpYmVyLCBmaWJlcikpO1xuICAgICAgc3RhdGVIb29rID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHRQcm9kKHN0YXRlSG9vay5jb250ZXh0LCB0eXBlKTtcbiAgICAgIHR5cGUgPSB1cGRhdGVkQW5jZXN0b3JJbmZvRGV2KHN0YXRlSG9vay5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgbmV4dENvbnRleHQgPSB7IGNvbnRleHQ6IG5leHRDb250ZXh0LCBhbmNlc3RvckluZm86IHR5cGUgfTtcbiAgICAgIHN0YXRlSG9vayAhPT0gbmV4dENvbnRleHQgJiZcbiAgICAgICAgKHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlciksXG4gICAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBuZXh0Q29udGV4dCwgZmliZXIpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgICAgIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgPT09IGZpYmVyICYmXG4gICAgICAgIChwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlciksIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpKTtcbiAgICAgIGhvc3RUcmFuc2l0aW9uUHJvdmlkZXJDdXJzb3IuY3VycmVudCA9PT0gZmliZXIgJiZcbiAgICAgICAgKHBvcChob3N0VHJhbnNpdGlvblByb3ZpZGVyQ3Vyc29yLCBmaWJlciksXG4gICAgICAgIChIb3N0VHJhbnNpdGlvbkNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IE5vdFBlbmRpbmdUcmFuc2l0aW9uKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2Y
15852XIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0T3duZXJTdGFjayhlcnJvcikge1xuICAgICAgdmFyIHByZXZQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB2b2lkIDA7XG4gICAgICBlcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2UHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBlcnJvci5zdGFydHNXaXRoKFwiRXJyb3I6IHJlYWN0LXN0YWNrLXRvcC1mcmFtZVxcblwiKSAmJlxuICAgICAgICAoZXJyb3IgPSBlcnJvci5zbGljZSgyOSkpO1xuICAgICAgcHJldlByZXBhcmVTdGFja1RyYWNlID0gZXJyb3IuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgIC0xICE9PSBwcmV2UHJlcGFyZVN0YWNrVHJhY2UgJiZcbiAgICAgICAgKGVycm9yID0gZXJyb3Iuc2xpY2UocHJldlByZXBhcmVTdGFja1RyYWNlICsgMSkpO1xuICAgICAgcHJldlByZXBhcmVTdGFja1RyYWNlID0gZXJyb3IuaW5kZXhPZihcInJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZVwiKTtcbiAgICAgIC0xICE9PSBwcmV2UHJlcGFyZVN0YWNrVHJhY2UgJiZcbiAgICAgICAgKHByZXZQcmVwYXJlU3RhY2tUcmFjZSA9IGVycm9yLmxhc3RJbmRleE9mKFxuICAgICAgICAgIFwiXFxuXCIsXG4gICAgICAgICAgcHJldlByZXBhcmVTdGFja1RyYWNlXG4gICAgICAgICkpO1xuICAgICAgaWYgKC0xICE9PSBwcmV2UHJlcGFyZVN0YWNrVHJhY2UpXG4gICAgICAgIGVycm9yID0gZXJyb3Iuc2xpY2UoMCwgcHJldlByZXBhcmVTdGFja1RyYWNlKTtcbiAgICAgIGVsc2UgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgICBwcmVmaXggPSAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8IFwiXCI7XG4gICAgICAgICAgc3VmZml4ID1cbiAgICAgICAgICAgIC0xIDwgeC5zdGFjay5pbmRleE9mKFwiXFxuICAgIGF0XCIpXG4gICAgICAgICAgICAgID8gXCIgKDxhbm9ueW1vdXM+KVwiXG4gICAgICAgICAgICAgIDogLTEgPCB4LnN0YWNrLmluZGV4T2YoXCJAXCIpXG4gICAgICAgICAgICAgICAgPyBcIkB1bmtub3duOjA6MFwiXG4gICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gXCJcXG5cIiArIHByZWZpeCArIG5hbWUgKyBzdWZmaXg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAgICAgaWYgKCFmbiB8fCByZWVudHJ5KSByZXR1cm4gXCJcIjtcbiAgICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcbiAgICAgIGlmICh2b2lkIDAgIT09IGZyYW1lKSByZXR1cm4gZnJhbWU7XG4gICAgICByZWVudHJ5ID0gITA7XG4gICAgICBmcmFtZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB2b2lkIDA7XG4gICAgICB2Y
15852XIgcHJldmlvdXNEaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gbnVsbDtcbiAgICAgIGRpc2FibGVMb2dzKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgUnVuSW5Sb290RnJhbWUgPSB7XG4gICAgICAgICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgUmVmbGVjdCAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
15852XIgY29udHJvbCA9IHg7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgkMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sID0geCQwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgRmFrZSA9ICExO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgZm4ucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIFwicHJvcHNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4ucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBGYWtlID0gITA7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBmbigpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgRmFrZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICh2b2lkIDAgIT09IHByZXZQcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4ucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvcHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWxldGUgZm4ucHJvdG90eXBlLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sID0geCQxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBGYWtlLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgICBGYWtlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgICAgICAgICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiBcInN0cmluZ1wiID09PSB0eXBlb2Ygc2FtcGxlLnN0YWNrKVxuICAgICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QuZGlzcGxheU5hbWUgPVxuICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICAgIHZhciBuYW1lUHJvcERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCxcbiAgICAgICAgICBcIm5hbWVcIlxuICAgICAgICApO1xuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgICB7IHZhbHVlOiBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiIH1cbiAgICAgICAgICApO1xuICAgICAgICB2Y
15852XIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBuYW1lUHJvcERlc2NyaXB0b3IgPSAwO1xuICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yIDwgc2FtcGxlTGluZXMubGVuZ3RoICYmXG4gICAgICAgICAgICAhc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIClcbiAgICAgICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvcisrO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBjb250cm9sTGluZXMubGVuZ3RoICYmXG4gICAgICAgICAgICAhY29udHJvbExpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIrKztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPT09IHNhbXBsZUxpbmVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyID09PSBjb250cm9sTGluZXMubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICAgICAgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXTtcblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLTtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgO1xuICAgICAgICAgICAgMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiYgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXI7XG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3ItLSwgX1J1bkluUm9vdEZyYW1lJERldGVyLS1cbiAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHNhbXBsZUxpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0gIT09XG4gICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKDEgIT09IG5hbWVQcm9wRGVzY3JpcHRvciB8fCAxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIpIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobmFtZVByb3BEZXNjcmlwdG9yLS0sXG4gICAgICAgICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlci0tLFxuICAgICAgICAgICAgICAgICAgICAwID4gX1J1bkluUm9vdEZyYW1lJERldGVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gbmFtZVByb3BEZXNjcmlwdG9yICYmIDAgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKHJlZW50cnkgPSAhMSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2aW91c0Rpc3BhdGNoZXIpLFxuICAgICAgICAgIHJlZW5hYmxlTG9ncygpLFxuICAgICAgICAgIChFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZyYW1lKTtcbiAgICAgIH1cbiAgICAgIHNhbXBsZUxpbmVzID0gKHNhbXBsZUxpbmVzID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogXCJcIilcbiAgICAgICAgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShzYW1wbGVMaW5lcylcbiAgICAgICAgOiBcIlwiO
158521xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZm4gJiYgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHNhbXBsZUxpbmVzKTtcbiAgICAgIHJldHVybiBzYW1wbGVMaW5lcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlciwgY2hpbGRGaWJlcikge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJMYXp5XCIpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJldHVybiBmaWJlci5jaGlsZCAhPT0gY2hpbGRGaWJlciAmJiBudWxsICE9PSBjaGlsZEZpYmVyXG4gICAgICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2UgRmFsbGJhY2tcIilcbiAgICAgICAgICAgIDogZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZUxpc3RcIik7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmaWJlci50eXBlLCAhMSk7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIsICExKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUsICEwKTtcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJBY3Rpdml0eVwiKTtcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJWaWV3VHJhbnNpdGlvblwiKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2Y
15852XIgaW5mbyA9IFwiXCIsXG4gICAgICAgICAgcHJldmlvdXMgPSBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKHdvcmtJblByb2dyZXNzLCBwcmV2aW91cyk7XG4gICAgICAgICAgdmFyIGRlYnVnSW5mbyA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z0luZm87XG4gICAgICAgICAgaWYgKGRlYnVnSW5mbylcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWJ1Z0luZm8ubGVuZ3RoIC0gMTsgMCA8PSBpOyBpLS0pIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gZGVidWdJbmZvW2ldO1xuICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgSlNDb21waWxlcl90ZW1wX2NvbnN0ID0gaW5mbztcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVudiA9IGVudHJ5LmVudixcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBlbnRyeS5kZWJ1Z0xvY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkU3RhY2sgPSBmb3JtYXRPd25lclN0YWNrKGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICBpZHggPSBjaGlsZFN0YWNrLmxhc3RJbmRleE9mKFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lID1cbiAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBpZHggPyBjaGlsZFN0YWNrIDogY2hpbGRTdGFjay5zbGljZShpZHggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9PSBsYXN0TGluZS5pbmRleE9mKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IFwiXFxuXCIgKyBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcbiAgICAgICAgICAgICAgICAgICAgbmFtZSArIChlbnYgPyBcIiBbXCIgKyBlbnYgKyBcIl1cIiA6IFwiXCIpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmZvID0gSlNDb21waWxlcl90ZW1wX2NvbnN0ICsgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICAgICAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogXCIgKyB4Lm1lc3NhZ2UgKyBcIlxcblwiICsgeC5zdGFjaztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lV2l0aG91dExpbmVOdW1iZXIoZm4pIHtcbiAgICAgIHJldHVybiAoZm4gPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZuKVxuICAgICAgICA6IFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHJldHVybiBudWxsICE9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21Pd25lcihvd25lcikgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gXCJcIjtcbiAgICAgICAgNiA9PT0gd29ya0luUHJvZ3Jlc3MudGFnICYmICh3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybik7XG4gICAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGluZm8gKz0gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUod29ya0luUHJvZ3Jlc3MudHlwZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgaW5mbyArPSBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIlN1c3BlbnNlXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIGluZm8gKz0gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZUxpc3RcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgaW5mbyArPSBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIkFjdGl2aXR5XCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgIGluZm8gKz0gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJWaWV3VHJhbnNpdGlvblwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8XG4gICAgICAgICAgICAgIFwiXCIgIT09IGluZm8gfHxcbiAgICAgICAgICAgICAgKGluZm8gKz0gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lV2l0aG91dExpbmVOdW1iZXIoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZVxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciB8fFxuICAgICAgICAgICAgICBcIlwiICE9PSBpbmZvIHx8XG4gICAgICAgICAgICAgIChpbmZvICs9IGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZVdpdGhvdXRMaW5lTnVtYmVyKFxuICAgICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLnR5cGUucmVuZGVyXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyB3b3JrSW5Qcm9ncmVzczsgKVxuICAgICAgICAgIGlmIChcIm51bWJlclwiID09PSB0eXBlb2Ygd29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgICAgICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gZmliZXIuX2RlYnVnT3duZXI7XG4gICAgICAgICAgICB2YXIgZGVidWdTdGFjayA9IGZpYmVyLl9kZWJ1Z1N0YWNrO1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzICYmIGRlYnVnU3RhY2spIHtcbiAgICAgICAgICAgICAgdmFyIGZvcm1hdHRlZFN0YWNrID0gZm9ybWF0T3duZXJTdGFjayhkZWJ1Z1N0YWNrKTtcbiAgICAgICAgICAgICAgXCJcIiAhPT0gZm9ybWF0dGVkU3RhY2sgJiYgKGluZm8gKz0gXCJcXG5cIiArIGZvcm1hdHRlZFN0YWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG51bGwgIT0gd29ya0luUHJvZ3Jlc3MuZGVidWdTdGFjaykge1xuICAgICAgICAgICAgdmFyIG93bmVyU3RhY2sgPSB3b3JrSW5Qcm9ncmVzcy5kZWJ1Z1N0YWNrO1xuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3Mub3duZXIpICYmXG4gICAgICAgICAgICAgIG93bmVyU3RhY2sgJiZcbiAgICAgICAgICAgICAgKGluZm8gKz0gXCJcXG5cIiArIGZvcm1hdE93bmVyU3RhY2sob3duZXJTdGFjaykpO1xuICAgICAgICAgIH0gZWxzZSBicmVhaztcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IGluZm87XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9XG4gICAgICAgICAgXCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIiArIHgubWVzc2FnZSArIFwiXFxuXCIgKyB4LnN0YWNrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGNhbGxiYWNrLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICB2Y
15852XIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IGZpYmVyICYmIGZpYmVyLl9kZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGZpYmVyLl9kZWJ1Z1Rhc2sucnVuKFxuICAgICAgICAgICAgICBjYWxsYmFjay5iaW5kKG51bGwsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjYWxsYmFjayhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcInJ1bldpdGhGaWJlckluREVWIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gcHJvZHVjdGlvbi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPVxuICAgICAgICBudWxsID09PSBmaWJlciA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgICAgaXNSZW5kZXJpbmcgPSAhMTtcbiAgICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBTeW1ib2wgJiZcbiAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcgJiZcbiAgICAgICAgICB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddKSB8fFxuICAgICAgICB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8XG4gICAgICAgIFwiT2JqZWN0XCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSwgITE7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJcIiArIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlRoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLiBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgdXNpbmcgaXQgaGVyZS5cIixcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICB0eXBlTmFtZSh2YWx1ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4gVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIHVzaW5nIGl0IGhlcmUuXCIsXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgIHR5cGVOYW1lKHZhbHVlKVxuICAgICAgICAgICksXG4gICAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKVxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKSBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4gVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIHVzaW5nIGl0IGhlcmUuXCIsXG4gICAgICAgICAgICB0eXBlTmFtZSh2YWx1ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHJldHVybiAhMTtcbiAgICAgIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgICAgaWYgKGhvb2suaXNEaXNhYmxlZCkgcmV0dXJuICEwO1xuICAgICAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiBodHRwczovL3JlYWN0LmRldi9saW5rL3JlYWN0LWRldnRvb2xzXCJcbiAgICAgICAgICApLFxuICAgICAgICAgICEwXG4gICAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICAocmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscykpLCAoaW5qZWN0ZWRIb29rID0gaG9vayk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW8uXCIsIGVycik7XG4gICAgICB9XG4gICAgICByZXR1cm4gaG9vay5jaGVja0RDRSA/ICEwIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbG9nJDEgJiZcbiAgICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIGlmIChpbmplY3RlZEhvb2sgJiYgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUpXG4gICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgfHxcbiAgICAgICAgICAgICgoaGFzTG9nZ2VkRXJyb3IgPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW9cIixcbiAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgICAgIHggPj4+PSAwO1xuICAgICAgcmV0dXJuIDAgPT09IHggPyAzMiA6ICgzMSAtICgobG9nKHgpIC8gTE4yKSB8IDApKSB8IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gICAgICB2YXIgcGVuZGluZ1N5bmNMYW5lcyA9IGxhbmVzICYgNDI7XG4gICAgICBpZiAoMCAhPT0gcGVuZGluZ1N5bmNMYW5lcykgcmV0dXJuIHBlbmRpbmdTeW5jTGFuZXM7XG4gICAgICBzd2l0Y2ggKGxhbmVzICYgLWxhbmVzKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXR1cm4gMTY7XG4gICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICBjYXNlIDY0OlxuICAgICAgICAgIHJldHVybiA2NDtcbiAgICAgICAgY2FzZSAxMjg6XG4gICAgICAgICAgcmV0dXJuIDEyODtcbiAgICAgICAgY2FzZSAyNTY6XG4gICAgICAgIGNhc2UgNTEyOlxuICAgICAgICBjYXNlIDEwMjQ6XG4gICAgICAgIGNhc2UgMjA0ODpcbiAgICAgICAgY2FzZSA0MDk2OlxuICAgICAgICBjYXNlIDgxOTI6XG4gICAgICAgIGNhc2UgMTYzODQ6XG4gICAgICAgIGNhc2UgMzI3Njg6XG4gICAgICAgIGNhc2UgNjU1MzY6XG4gICAgICAgIGNhc2UgMTMxMDcyOlxuICAgICAgICAgIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbiAgICAgICAgY2FzZSAyNjIxNDQ6XG4gICAgICAgIGNhc2UgNTI0Mjg4OlxuICAgICAgICBjYXNlIDEwNDg1NzY6XG4gICAgICAgIGNhc2UgMjA5NzE1MjpcbiAgICAgICAgICByZXR1cm4gbGFuZXMgJiAzOTMyMTYwO1xuICAgICAgICBjYXNlIDQxOTQzMDQ6XG4gICAgICAgIGNhc2UgODM4ODYwODpcbiAgICAgICAgY2FzZSAxNjc3NzIxNjpcbiAgICAgICAgY2FzZSAzMzU1NDQzMjpcbiAgICAgICAgICByZXR1cm4gbGFuZXMgJiA2MjkxNDU2MDtcbiAgICAgICAgY2FzZSA2NzEwODg2NDpcbiAgICAgICAgICByZXR1cm4gNjcxMDg4NjQ7XG4gICAgICAgIGNhc2UgMTM0MjE3NzI4OlxuICAgICAgICAgIHJldHVybiAxMzQyMTc3Mjg7XG4gICAgICAgIGNhc2UgMjY4NDM1NDU2OlxuICAgICAgICAgIHJldHVybiAyNjg0MzU0NTY7XG4gICAgICAgIGNhc2UgNTM2ODcwOTEyOlxuICAgICAgICAgIHJldHVybiA1MzY4NzA5MTI7XG4gICAgICAgIGNhc2UgMTA3Mzc0MTgyNDpcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzLCByb290SGFzUGVuZGluZ0NvbW1pdCkge1xuICAgICAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICAgICAgaWYgKDAgPT09IHBlbmRpbmdMYW5lcykgcmV0dXJuIDA7XG4gICAgICB2Y
15852XIgbmV4dExhbmVzID0gMCxcbiAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzLFxuICAgICAgICBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gICAgICByb290ID0gcm9vdC53YXJtTGFuZXM7XG4gICAgICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIDEzNDIxNzcyNztcbiAgICAgIDAgIT09IG5vbklkbGVQZW5kaW5nTGFuZXNcbiAgICAgICAgPyAoKHBlbmRpbmdMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXMpLFxuICAgICAgICAgIDAgIT09IHBlbmRpbmdMYW5lc1xuICAgICAgICAgICAgPyAobmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGVuZGluZ0xhbmVzKSlcbiAgICAgICAgICAgIDogKChwaW5nZWRMYW5lcyAmPSBub25JZGxlUGVuZGluZ0xhbmVzKSxcbiAgICAgICAgICAgICAgMCAhPT0gcGluZ2VkTGFuZXNcbiAgICAgICAgICAgICAgICA/IChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcykpXG4gICAgICAgICAgICAgICAgOiByb290SGFzUGVuZGluZ0NvbW1pdCB8fFxuICAgICAgICAgICAgICAgICAgKChyb290SGFzUGVuZGluZ0NvbW1pdCA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+cm9vdCksXG4gICAgICAgICAgICAgICAgICAwICE9PSByb290SGFzUGVuZGluZ0NvbW1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAobmV4dExhbmVzID1cbiAgICAgICAgICAgICAgICAgICAgICBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290SGFzUGVuZGluZ0NvbW1pdCkpKSkpXG4gICAgICAgIDogKChub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzKSxcbiAgICAgICAgICAwICE9PSBub25JZGxlUGVuZGluZ0xhbmVzXG4gICAgICAgICAgICA/IChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGVuZGluZ0xhbmVzKSlcbiAgICAgICAgICAgIDogMCAhPT0gcGluZ2VkTGFuZXNcbiAgICAgICAgICAgICAgPyAobmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpKVxuICAgICAgICAgICAgICA6IHJvb3RIYXNQZW5kaW5nQ29tbWl0IHx8XG4gICAgICAgICAgICAgICAgKChyb290SGFzUGVuZGluZ0NvbW1pdCA9IHBlbmRpbmdMYW5lcyAmIH5yb290KSxcbiAgICAgICAgICAgICAgICAwICE9PSByb290SGFzUGVuZGluZ0NvbW1pdCAmJlxuICAgICAgICAgICAgICAgICAgKG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3RIYXNQZW5kaW5nQ29tbWl0KSkpKTtcbiAgICAgIHJldHVybiAwID09PSBuZXh0TGFuZXNcbiAgICAgICAgPyAwXG4gICAgICAgIDogMCAhPT0gd2lwTGFuZXMgJiZcbiAgICAgICAgICAgIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiZcbiAgICAgICAgICAgIDAgPT09ICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSAmJlxuICAgICAgICAgICAgKChzdXNwZW5kZWRMYW5lcyA9IG5leHRMYW5lcyAmIC1uZXh0TGFuZXMpLFxuICAgICAgICAgICAgKHJvb3RIYXNQZW5kaW5nQ29tbWl0ID0gd2lwTGFuZXMgJiAtd2lwTGFuZXMpLFxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPj0gcm9vdEhhc1BlbmRpbmdDb21taXQgfHxcbiAgICAgICAgICAgICAgKDMyID09PSBzdXNwZW5kZWRMYW5lcyAmJiAwICE9PSAocm9vdEhhc1BlbmRpbmdDb21taXQgJiA0MTk0MDQ4KSkpXG4gICAgICAgICAgPyB3aXBMYW5lc1xuICAgICAgICAgIDogbmV4dExhbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmUm9vdElzUHJlcmVuZGVyaW5nKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAwID09PVxuICAgICAgICAocm9vdC5wZW5kaW5nTGFuZXMgJlxuICAgICAgICAgIH4ocm9vdC5zdXNwZW5kZWRMYW5lcyAmIH5yb290LnBpbmdlZExhbmVzKSAmXG4gICAgICAgICAgcmVuZGVyTGFuZXMpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRFbnRhbmdsZWRMYW5lcyhyb290LCByZW5kZXJMYW5lcykge1xuICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgOCkgJiYgKHJlbmRlckxhbmVzIHw9IHJlbmRlckxhbmVzICYgMzIpO1xuICAgICAgdmFyIGFsbEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcbiAgICAgIGlmICgwICE9PSBhbGxFbnRhbmdsZWRMYW5lcylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICByb290ID0gcm9vdC5lbnRhbmdsZW1lbnRzLCBhbGxFbnRhbmdsZWRMYW5lcyAmPSByZW5kZXJMYW5lcztcbiAgICAgICAgICAwIDwgYWxsRW50YW5nbGVkTGFuZXM7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gMzEgLSBjbHozMihhbGxFbnRhbmdsZWRMYW5lcyksXG4gICAgICAgICAgICBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgICAgICByZW5kZXJMYW5lcyB8PSByb290W2luZGV4XTtcbiAgICAgICAgICBhbGxFbnRhbmdsZWRMYW5lcyAmPSB+bGFuZTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIHJlbmRlckxhbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgICAgIHN3aXRjaCAobGFuZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIDg6XG4gICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICBjYXNlIDMyOlxuICAgICAgICBjYXNlIDEyODpcbiAgICAgICAgY2FzZSAyNTY6XG4gICAgICAgIGNhc2UgNTEyOlxuICAgICAgICBjYXNlIDEwMjQ6XG4gICAgICAgIGNhc2UgMjA0ODpcbiAgICAgICAgY2FzZSA0MDk2OlxuICAgICAgICBjYXNlIDgxOTI6XG4gICAgICAgIGNhc2UgMTYzODQ6XG4gICAgICAgIGNhc2UgMzI3Njg6XG4gICAgICAgIGNhc2UgNjU1MzY6XG4gICAgICAgIGNhc2UgMTMxMDcyOlxuICAgICAgICBjYXNlIDI2MjE0NDpcbiAgICAgICAgY2FzZSA1MjQyODg6XG4gICAgICAgIGNhc2UgMTA0ODU3NjpcbiAgICAgICAgY2FzZSAyMDk3MTUyOlxuICAgICAgICAgI
15852HJldHVybiBjdXJyZW50VGltZSArIDVlMztcbiAgICAgICAgY2FzZSA0MTk0MzA0OlxuICAgICAgICBjYXNlIDgzODg2MDg6XG4gICAgICAgIGNhc2UgMTY3NzcyMTY6XG4gICAgICAgIGNhc2UgMzM1NTQ0MzI6XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBjYXNlIDY3MTA4ODY0OlxuICAgICAgICBjYXNlIDEzNDIxNzcyODpcbiAgICAgICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgICAgIGNhc2UgNTM2ODcwOTEyOlxuICAgICAgICBjYXNlIDEwNzM3NDE4MjQ6XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlNob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgLTFcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gICAgICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gICAgICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuICAgICAgMCA9PT0gKG5leHRSZXRyeUxhbmUgJiA2MjkxNDU2MCkgJiYgKG5leHRSZXRyeUxhbmUgPSA0MTk0MzA0KTtcbiAgICAgIHJldHVybiBsYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgICAgIGZvciAodmFyIGxhbmVNYXAgPSBbXSwgaSA9IDA7IDMxID4gaTsgaSsrKSBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gICAgICByZXR1cm4gbGFuZU1hcDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkJDEocm9vdCwgdXBkYXRlTGFuZSkge1xuICAgICAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTtcbiAgICAgIDI2ODQzNTQ1NiAhPT0gdXBkYXRlTGFuZSAmJlxuICAgICAgICAoKHJvb3Quc3VzcGVuZGVkTGFuZXMgPSAwKSxcbiAgICAgICAgKHJvb3QucGluZ2VkTGFuZXMgPSAwKSxcbiAgICAgICAgKHJvb3Qud2FybUxhbmVzID0gMCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKFxuICAgICAgcm9vdCxcbiAgICAgIGZpbmlzaGVkTGFuZXMsXG4gICAgICByZW1haW5pbmdMYW5lcyxcbiAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgc3VzcGVuZGVkUmV0cnlMYW5lc1xuICAgICkge1xuICAgICAgdmFyIHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAgIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7XG4gICAgICByb290LnN1c3BlbmRlZExhbmVzID0gMDtcbiAgICAgIHJvb3QucGluZ2VkTGFuZXMgPSAwO1xuICAgICAgcm9vdC53YXJtTGFuZXMgPSAwO1xuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gICAgICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICAgICAgcm9vdC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgICAgIHJvb3Quc2hlbGxTdXNwZW5kQ291bnRlciA9IDA7XG4gICAgICB2Y
15852XIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cyxcbiAgICAgICAgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXMsXG4gICAgICAgIGhpZGRlblVwZGF0ZXMgPSByb290LmhpZGRlblVwZGF0ZXM7XG4gICAgICBmb3IgKFxuICAgICAgICByZW1haW5pbmdMYW5lcyA9IHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gICAgICAgIDAgPCByZW1haW5pbmdMYW5lcztcblxuICAgICAgKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDMxIC0gY2x6MzIocmVtYWluaW5nTGFuZXMpLFxuICAgICAgICAgIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IDA7XG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSAtMTtcbiAgICAgICAgdmFyIGhpZGRlblVwZGF0ZXNGb3JMYW5lID0gaGlkZGVuVXBkYXRlc1tpbmRleF07XG4gICAgICAgIGlmIChudWxsICE9PSBoaWRkZW5VcGRhdGVzRm9yTGFuZSlcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgaGlkZGVuVXBkYXRlc1tpbmRleF0gPSBudWxsLCBpbmRleCA9IDA7XG4gICAgICAgICAgICBpbmRleCA8IGhpZGRlblVwZGF0ZXNGb3JMYW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBoaWRkZW5VcGRhdGVzRm9yTGFuZVtpbmRleF07XG4gICAgICAgICAgICBudWxsICE9PSB1cGRhdGUgJiYgKHVwZGF0ZS5sYW5lICY9IC01MzY4NzA5MTMpO1xuICAgICAgICAgIH1cbiAgICAgICAgcmVtYWluaW5nTGFuZXMgJj0gfmxhbmU7XG4gICAgICB9XG4gICAgICAwICE9PSBzcGF3bmVkTGFuZSAmJiBtYXJrU3Bhd25lZERlZmVycmVkTGFuZShyb290LCBzcGF3bmVkTGFuZSwgMCk7XG4gICAgICAwICE9PSBzdXNwZW5kZWRSZXRyeUxhbmVzICYmXG4gICAgICAgIDAgPT09IHVwZGF0ZWRMYW5lcyAmJlxuICAgICAgICAwICE9PSByb290LnRhZyAmJlxuICAgICAgICAocm9vdC5zdXNwZW5kZWRMYW5lcyB8PVxuICAgICAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMgJiB+KHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgJiB+ZmluaXNoZWRMYW5lcykpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrU3Bhd25lZERlZmVycmVkTGFuZShyb290LCBzcGF3bmVkTGFuZSwgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIHJvb3QucGVuZGluZ0xhbmVzIHw9IHNwYXduZWRMYW5lO1xuICAgICAgcm9vdC5zdXNwZW5kZWRMYW5lcyAmPSB+c3Bhd25lZExhbmU7XG4gICAgICB2Y
15852XIgc3Bhd25lZExhbmVJbmRleCA9IDMxIC0gY2x6MzIoc3Bhd25lZExhbmUpO1xuICAgICAgcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBzcGF3bmVkTGFuZTtcbiAgICAgIHJvb3QuZW50YW5nbGVtZW50c1tzcGF3bmVkTGFuZUluZGV4XSA9XG4gICAgICAgIHJvb3QuZW50YW5nbGVtZW50c1tzcGF3bmVkTGFuZUluZGV4XSB8XG4gICAgICAgIDEwNzM3NDE4MjQgfFxuICAgICAgICAoZW50YW5nbGVkTGFuZXMgJiAyNjE5MzApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IChyb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzKTtcbiAgICAgIGZvciAocm9vdCA9IHJvb3QuZW50YW5nbGVtZW50czsgcm9vdEVudGFuZ2xlZExhbmVzOyApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gMzEgLSBjbHozMihyb290RW50YW5nbGVkTGFuZXMpLFxuICAgICAgICAgIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgICAobGFuZSAmIGVudGFuZ2xlZExhbmVzKSB8IChyb290W2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSAmJlxuICAgICAgICAgIChyb290W2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcyk7XG4gICAgICAgIHJvb3RFbnRhbmdsZWRMYW5lcyAmPSB+bGFuZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICAgICAgdmFyIHJlbmRlckxhbmUgPSByZW5kZXJMYW5lcyAmIC1yZW5kZXJMYW5lcztcbiAgICAgIHJlbmRlckxhbmUgPVxuICAgICAgICAwICE9PSAocmVuZGVyTGFuZSAmIDQyKVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbkJ5TGFuZShyZW5kZXJMYW5lKTtcbiAgICAgIHJldHVybiAwICE9PSAocmVuZGVyTGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKVxuICAgICAgICA/IDBcbiAgICAgICAgOiByZW5kZXJMYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uQnlMYW5lKGxhbmUpIHtcbiAgICAgIHN3aXRjaCAobGFuZSkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbGFuZSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBsYW5lID0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBsYW5lID0gMTY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjU2OlxuICAgICAgICBjYXNlIDUxMjpcbiAgICAgICAgY2FzZSAxMDI0OlxuICAgICAgICBjYXNlIDIwNDg6XG4gICAgICAgIGNhc2UgNDA5NjpcbiAgICAgICAgY2FzZSA4MTkyOlxuICAgICAgICBjYXNlIDE2Mzg0OlxuICAgICAgICBjYXNlIDMyNzY4OlxuICAgICAgICBjYXNlIDY1NTM2OlxuICAgICAgICBjYXNlIDEzMTA3MjpcbiAgICAgICAgY2FzZSAyNjIxNDQ6XG4gICAgICAgIGNhc2UgNTI0Mjg4OlxuICAgICAgICBjYXNlIDEwNDg1NzY6XG4gICAgICAgIGNhc2UgMjA5NzE1MjpcbiAgICAgICAgY2FzZSA0MTk0MzA0OlxuICAgICAgICBjYXNlIDgzODg2MDg6XG4gICAgICAgIGNhc2UgMTY3NzcyMTY6XG4gICAgICAgIGNhc2UgMzM1NTQ0MzI6XG4gICAgICAgICAgbGFuZSA9IDEyODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgICAgICAgbGFuZSA9IDEzNDIxNzcyODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBsYW5lID0gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpXG4gICAgICAgIGZvciAocm9vdCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDsgMCA8IGxhbmVzOyApIHtcbiAgICAgICAgICB2Y
15852XIgaW5kZXggPSAzMSAtIGNsejMyKGxhbmVzKSxcbiAgICAgICAgICAgIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgICAgIHJvb3RbaW5kZXhdLmFkZChmaWJlcik7XG4gICAgICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAsXG4gICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgICAgIDAgPCBsYW5lcztcblxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSAzMSAtIGNsejMyKGxhbmVzKTtcbiAgICAgICAgICByb290ID0gMSA8PCBpbmRleDtcbiAgICAgICAgICBpbmRleCA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgICAgICAgIDAgPCBpbmRleC5zaXplICYmXG4gICAgICAgICAgICAoaW5kZXguZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgICAgICAgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB8fFxuICAgICAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgaW5kZXguY2xlYXIoKSk7XG4gICAgICAgICAgbGFuZXMgJj0gfnJvb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgICAgIGxhbmVzICY9IC1sYW5lcztcbiAgICAgIHJldHVybiAwICE9PSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgJiYgRGlzY3JldGVFdmVudFByaW9yaXR5IDwgbGFuZXNcbiAgICAgICAgPyAwICE9PSBDb250aW51b3VzRXZlbnRQcmlvcml0eSAmJiBDb250aW51b3VzRXZlbnRQcmlvcml0eSA8IGxhbmVzXG4gICAgICAgICAgPyAwICE9PSAobGFuZXMgJiAxMzQyMTc3MjcpXG4gICAgICAgICAgICA/IERlZmF1bHRFdmVudFByaW9yaXR5XG4gICAgICAgICAgICA6IElkbGVFdmVudFByaW9yaXR5XG4gICAgICAgICAgOiBDb250aW51b3VzRXZlbnRQcmlvcml0eVxuICAgICAgICA6IERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVwZGF0ZVByaW9yaXR5KCkge1xuICAgICAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgIGlmICgwICE9PSB1cGRhdGVQcmlvcml0eSkgcmV0dXJuIHVwZGF0ZVByaW9yaXR5O1xuICAgICAgdXBkYXRlUHJpb3JpdHkgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICByZXR1cm4gdm9pZCAwID09PSB1cGRhdGVQcmlvcml0eVxuICAgICAgICA/IERlZmF1bHRFdmVudFByaW9yaXR5XG4gICAgICAgIDogZ2V0RXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eS50eXBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJpb3JpdHkpLCBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gICAgICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgICAgIGRlbGV0ZSBub2RlW2ludGVybmFsUHJvcHNLZXldO1xuICAgICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICAgICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gICAgICB2Y
15852XIgdGFyZ2V0SW5zdDtcbiAgICAgIGlmICgodGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pKSByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICAgIGZvciAodmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7IHBhcmVudE5vZGU7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRhcmdldEluc3QgPVxuICAgICAgICAgICAgcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fFxuICAgICAgICAgICAgcGFyZW50Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcGFyZW50Tm9kZSA9IHRhcmdldEluc3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGwgIT09IHRhcmdldEluc3QuY2hpbGQgfHxcbiAgICAgICAgICAgIChudWxsICE9PSBwYXJlbnROb2RlICYmIG51bGwgIT09IHBhcmVudE5vZGUuY2hpbGQpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGdldFBhcmVudEh5ZHJhdGlvbkJvdW5kYXJ5KHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICBudWxsICE9PSB0YXJnZXROb2RlO1xuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKChwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBnZXRQYXJlbnRIeWRyYXRpb25Cb3VuZGFyeSh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG5vZGUgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0pXG4gICAgICApIHtcbiAgICAgICAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgNSA9PT0gdGFnIHx8XG4gICAgICAgICAgNiA9PT0gdGFnIHx8XG4gICAgICAgICAgMTMgPT09IHRhZyB8fFxuICAgICAgICAgIDMxID09PSB0YWcgfHxcbiAgICAgICAgICAyNiA9PT0gdGFnIHx8XG4gICAgICAgICAgMjcgPT09IHRhZyB8fFxuICAgICAgICAgIDMgPT09IHRhZ1xuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gICAgICB2Y
15852XIgdGFnID0gaW5zdC50YWc7XG4gICAgICBpZiAoNSA9PT0gdGFnIHx8IDI2ID09PSB0YWcgfHwgMjcgPT09IHRhZyB8fCA2ID09PSB0YWcpXG4gICAgICAgIHJldHVybiBpbnN0LnN0YXRlTm9kZTtcbiAgICAgIHRocm93IEVycm9yKFwiZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC5cIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFJlc291cmNlc0Zyb21Sb290KHJvb3QpIHtcbiAgICAgIHZhciByZXNvdXJjZXMgPSByb290W2ludGVybmFsUm9vdE5vZGVSZXNvdXJjZXNLZXldO1xuICAgICAgcmVzb3VyY2VzIHx8XG4gICAgICAgIChyZXNvdXJjZXMgPSByb290W2ludGVybmFsUm9vdE5vZGVSZXNvdXJjZXNLZXldID1cbiAgICAgICAgICB7IGhvaXN0YWJsZVN0eWxlczogbmV3IE1hcCgpLCBob2lzdGFibGVTY3JpcHRzOiBuZXcgTWFwKCkgfSk7XG4gICAgICByZXR1cm4gcmVzb3VyY2VzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrTm9kZUFzSG9pc3RhYmxlKG5vZGUpIHtcbiAgICAgIG5vZGVbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdID0gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFyUGVuZGluZ0xvYWRPbk5vZGUobm9kZSkge1xuICAgICAgbm9kZVtpbnRlcm5hbExvYWRQZW5kaW5nS2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICAgICAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgXCJDYXB0dXJlXCIsIGRlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwgYCVzYC5cIixcbiAgICAgICAgICByZWdpc3RyYXRpb25OYW1lXG4gICAgICAgICk7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuICAgICAgXCJvbkRvdWJsZUNsaWNrXCIgPT09IHJlZ2lzdHJhdGlvbk5hbWUgJiZcbiAgICAgICAgKHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgICAgZm9yIChcbiAgICAgICAgcmVnaXN0cmF0aW9uTmFtZSA9IDA7XG4gICAgICAgIHJlZ2lzdHJhdGlvbk5hbWUgPCBkZXBlbmRlbmNpZXMubGVuZ3RoO1xuICAgICAgICByZWdpc3RyYXRpb25OYW1lKytcbiAgICAgIClcbiAgICAgICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gICAgICBoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8XG4gICAgICAgIHByb3BzLm9uQ2hhbmdlIHx8XG4gICAgICAgIHByb3BzLm9uSW5wdXQgfHxcbiAgICAgICAgcHJvcHMucmVhZE9ubHkgfHxcbiAgICAgICAgcHJvcHMuZGlzYWJsZWQgfHxcbiAgICAgICAgbnVsbCA9PSBwcm9wcy52YWx1ZSB8fFxuICAgICAgICAoXCJzZWxlY3RcIiA9PT0gdGFnTmFtZVxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsIHNldCBgb25DaGFuZ2VgLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIllvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuXCJcbiAgICAgICAgICAgICkpO1xuICAgICAgcHJvcHMub25DaGFuZ2UgfHxcbiAgICAgICAgcHJvcHMucmVhZE9ubHkgfHxcbiAgICAgICAgcHJvcHMuZGlzYWJsZWQgfHxcbiAgICAgICAgbnVsbCA9PSBwcm9wcy5jaGVja2VkIHx8XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSlcbiAgICAgICAgcmV0dXJuICh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaG
15852VbYXR0cmlidXRlTmFtZV0gPSAhMCk7XG4gICAgICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gITA7XG4gICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYFwiLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaE11dGF0aW9uQ29udGV4dCgpIHtcbiAgICAgIHZhciBwcmV2ID0gdmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQ7XG4gICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFZhbHVlRm9yQXR0cmlidXRlT25DdXN0b21Db21wb25lbnQobm9kZSwgbmFtZSwgZXhwZWN0ZWQpIHtcbiAgICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBleHBlY3RlZCkge1xuICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgaWYgKCExID09PSBleHBlY3RlZCkgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBleHBlY3RlZCA/IHZvaWQgMCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9XG4gICAgICAgICAgXCJub25jZVwiID09PSBuYW1lLnRvTG93ZXJDYXNlKCkgPyBub2RlLm5vbmNlIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcIlwiID09PSBub2RlICYmICEwID09PSBleHBlY3RlZCkgcmV0dXJuICEwO1xuICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5vZGUgPT09IFwiXCIgKyBleHBlY3RlZCA/IGV4cGVjdGVkIDogbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKVxuICAgICAgICBpZiAobnVsbCA9PT0gdmFsdWUpIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgICB2Y
15852XIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgICAgICBpZiAoXCJkYXRhLVwiICE9PSBwcmVmaXggJiYgXCJhcmlhLVwiICE9PSBwcmVmaXgpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFZhbHVlRm9yS25vd25BdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmIChudWxsID09PSB2YWx1ZSkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUobm9kZSwgbmFtZXNwYWNlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKG51bGwgPT09IHZhbHVlKSBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgcmV0dXJuIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSksIHZhbHVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gICAgICB2Y
15852XIgdHlwZSA9IGVsZW0udHlwZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlbGVtID0gZWxlbS5ub2RlTmFtZSkgJiZcbiAgICAgICAgXCJpbnB1dFwiID09PSBlbGVtLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgKFwiY2hlY2tib3hcIiA9PT0gdHlwZSB8fCBcInJhZGlvXCIgPT09IHR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUsIHZhbHVlRmllbGQsIGN1cnJlbnRWYWx1ZSkge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICBub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxcbiAgICAgICAgdmFsdWVGaWVsZFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgJiZcbiAgICAgICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGRlc2NyaXB0b3IgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGVzY3JpcHRvci5nZXQgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGVzY3JpcHRvci5zZXRcbiAgICAgICkge1xuICAgICAgICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgICAgICAgY3VycmVudFZhbHVlID0gXCJcIiArIHZhbHVlO1xuICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci
158525lbnVtZXJhYmxlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IFwiXCIgKyB2YWx1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICAgICAgaWYgKCFub2RlLl92YWx1ZVRyYWNrZXIpIHtcbiAgICAgICAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/IFwiY2hlY2tlZFwiIDogXCJ2YWx1ZVwiO1xuICAgICAgICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdmFsdWVGaWVsZCxcbiAgICAgICAgICBcIlwiICsgbm9kZVt2YWx1ZUZpZWxkXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybiAhMTtcbiAgICAgIHZhciB0cmFja2VyID0gbm9kZS5fdmFsdWVUcmFja2VyO1xuICAgICAgaWYgKCF0cmFja2VyKSByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICAgICAgdmFyIHZhbHVlID0gXCJcIjtcbiAgICAgIG5vZGUgJiZcbiAgICAgICAgKHZhbHVlID0gaXNDaGVja2FibGUobm9kZSlcbiAgICAgICAgICA/IG5vZGUuY2hlY2tlZFxuICAgICAgICAgICAgPyBcInRydWVcIlxuICAgICAgICAgICAgOiBcImZhbHNlXCJcbiAgICAgICAgICA6IG5vZGUudmFsdWUpO1xuICAgICAgbm9kZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIG5vZGUgIT09IGxhc3RWYWx1ZSA/ICh0cmFja2VyLnNldFZhbHVlKG5vZGUpLCAhMCkgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3Rlcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoXG4gICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXNSZWdleCxcbiAgICAgICAgZnVuY3Rpb24gKGNoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXFxcXFwiICsgY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgKyBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gICAgICB2b2lkIDAgPT09IHByb3BzLmNoZWNrZWQgfHxcbiAgICAgICAgdm9pZCAwID09PSBwcm9wcy5kZWZhdWx0Q2hlY2tlZCB8fFxuICAgICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkIHx8XG4gICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuIElucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIChzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCBib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCBlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzXCIsXG4gICAgICAgICAgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCBcIkEgY29tcG9uZW50XCIsXG4gICAgICAgICAgcHJvcHMudHlwZVxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9ICEwKSk7XG4gICAgICB2b2lkIDAgPT09IHByb3BzLnZhbHVlIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gcHJvcHMuZGVmYXVsdFZhbHVlIHx8XG4gICAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxIHx8XG4gICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0LmRldi9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50c1wiLFxuICAgICAgICAgIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgXCJBIGNvbXBvbmVudFwiLFxuICAgICAgICAgIHByb3BzLnR5cGVcbiAgICAgICAgKSxcbiAgICAgICAgKGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSW5wdXQoXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBsYXN0RGVmYXVsdFZhbHVlLFxuICAgICAgY2hlY2tlZCxcbiAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgdHlwZSxcbiAgICAgIG5hbWVcbiAgICApIHtcbiAgICAgIGVsZW1lbnQubmFtZSA9IFwiXCI7XG4gICAgICBudWxsICE9IHR5cGUgJiZcbiAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgICBcImJvb2xlYW5cIiAhPT0gdHlwZW9mIHR5cGVcbiAgICAgICAgPyAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih0eXBlLCBcInR5cGVcIiksIChlbGVtZW50LnR5cGUgPSB0eXBlKSlcbiAgICAgICAgOiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICBpZiAobnVsbCAhPSB2YWx1ZSlcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT09IHR5cGUpIHtcbiAgICAgICAgICBpZiAoKDAgPT09IHZhbHVlICYmIFwiXCIgPT09IGVsZW1lbnQudmFsdWUpIHx8IGVsZW1lbnQudmFsdWUgIT0gdmFsdWUpXG4gICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBlbGVtZW50LnZhbHVlICE9PSBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkgJiZcbiAgICAgICAgICAgIChlbGVtZW50LnZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgKFwic3VibWl0XCIgIT09IHR5cGUgJiYgXCJyZXNldFwiICE9PSB0eXBlKSB8fFxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICBudWxsICE9IHZhbHVlXG4gICAgICAgID8gXCJudW1iZXJcIiA9PT0gdHlwZSAmJiBlbGVtZW50LnZhbHVlID09IHZhbHVlXG4gICAgICAgICAgPyBzZXREZWZhdWx0VmFsdWUoZWxlbWVudCwgZ2V0VG9TdHJpbmdWYWx1ZShlbGVtZW50LnZhbHVlKSlcbiAgICAgICAgICA6IHNldERlZmF1bHRWYWx1ZShlbGVtZW50LCBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSlcbiAgICAgICAgOiBudWxsICE9IGRlZmF1bHRWYWx1ZVxuICAgICAgICAgID8gc2V0RGVmYXVsdFZhbHVlKGVsZW1lbnQsIGdldFRvU3RyaW5nVmFsdWUoZGVmYXVsdFZhbHVlKSlcbiAgICAgICAgICA6IG51bGwgIT0gbGFzdERlZmF1bHRWYWx1ZSAmJiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgbnVsbCA9PSBjaGVja2VkICYmXG4gICAgICAgIG51bGwgIT0gZGVmYXVsdENoZWNrZWQgJiZcbiAgICAgICAgKGVsZW1lbnQuZGVmYXVsdENoZWNrZWQgPSAhIWRlZmF1bHRDaGVja2VkKTtcbiAgICAgIG51bGwgIT0gY2hlY2tlZCAmJlxuICAgICAgICAoZWxlbWVudC5jaGVja2VkID1cbiAgICAgICAgICBjaGVja2VkICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY2hlY2tlZCAmJlxuICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBjaGVja2VkKTtcbiAgICAgIG51bGwgIT0gbmFtZSAmJlxuICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIG5hbWUgJiZcbiAgICAgIFwiYm9vbGVhblwiICE9PSB0eXBlb2YgbmFtZVxuICAgICAgICA/IChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsIFwibmFtZVwiKSxcbiAgICAgICAgICAoZWxlbWVudC5uYW1lID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUobmFtZSkpKVxuICAgICAgICA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdElucHV0KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgY2hlY2tlZCxcbiAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgdHlwZSxcbiAgICAgIG5hbWUsXG4gICAgICBpc0h5ZHJhdGluZ1xuICAgICkge1xuICAgICAgbnVsbCAhPSB0eXBlICYmXG4gICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgIChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHR5cGUsIFwidHlwZVwiKSwgKGVsZW1lbnQudHlwZSA9IHR5cGUpKTtcbiAgICAgIGlmIChudWxsICE9IHZhbHVlIHx8IG51bGwgIT0gZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKFxuICAgICAgICAgICAgKFwic3VibWl0XCIgIT09IHR5cGUgJiYgXCJyZXNldFwiICE9PSB0eXBlKSB8fFxuICAgICAgICAgICAgKHZvaWQgMCAhPT0gdmFsdWUgJiYgbnVsbCAhPT0gdmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICB0cmFjayhlbGVtZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgI
15852H1cbiAgICAgICAgZGVmYXVsdFZhbHVlID1cbiAgICAgICAgICBudWxsICE9IGRlZmF1bHRWYWx1ZSA/IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKGRlZmF1bHRWYWx1ZSkgOiBcIlwiO1xuICAgICAgICB2YWx1ZSA9IG51bGwgIT0gdmFsdWUgPyBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGlzSHlkcmF0aW5nIHx8IHZhbHVlID09PSBlbGVtZW50LnZhbHVlIHx8IChlbGVtZW50LnZhbHVlID0gdmFsdWUpO1xuICAgICAgICBlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgY2hlY2tlZCA9IG51bGwgIT0gY2hlY2tlZCA/IGNoZWNrZWQgOiBkZWZhdWx0Q2hlY2tlZDtcbiAgICAgIGNoZWNrZWQgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjaGVja2VkICYmXG4gICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBjaGVja2VkICYmXG4gICAgICAgICEhY2hlY2tlZDtcbiAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGlzSHlkcmF0aW5nID8gZWxlbWVudC5jaGVja2VkIDogISFjaGVja2VkO1xuICAgICAgZWxlbWVudC5kZWZhdWx0Q2hlY2tlZCA9ICEhY2hlY2tlZDtcbiAgICAgIG51bGwgIT0gbmFtZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBuYW1lICYmXG4gICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBuYW1lICYmXG4gICAgICAgIFwiYm9vbGVhblwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICAgICAgICAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCBcIm5hbWVcIiksIChlbGVtZW50Lm5hbWUgPSBuYW1lKSk7XG4gICAgICB0cmFjayhlbGVtZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gXCJcIiArIHZhbHVlICYmIChub2RlLmRlZmF1bHRWYWx1ZSA9IFwiXCIgKyB2YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9uUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgICAgIG51bGwgPT0gcHJvcHMudmFsdWUgJiZcbiAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiAmJiBudWxsICE9PSBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgID8gUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgIG51bGwgPT0gY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkIHx8XG4gICAgICAgICAgICAgICAgKChkaWRXYXJuSW52YWxpZENoaWxkID0gITApLFxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkNhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uIFBhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LlwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCA9PSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCB8fFxuICAgICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgfHxcbiAgICAgICAgICAgICgoZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlBhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyB3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuXCJcbiAgICAgICAgICAgICkpKTtcbiAgICAgIG51bGwgPT0gcHJvcHMuc2VsZWN0ZWQgfHxcbiAgICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gfHxcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiBzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uXCJcbiAgICAgICAgKSxcbiAgICAgICAgKGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICAgICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG4gICAgICByZXR1cm4gb3duZXJOYW1lXG4gICAgICAgID8gXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBvd25lck5hbWUgKyBcImAuXCJcbiAgICAgICAgOiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgbm9kZSA9IG5vZGUub3B0aW9ucztcbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICBtdWx0aXBsZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICBtdWx0aXBsZVtcIiRcIiArIHByb3BWYWx1ZVtpXV0gPSAhMDtcbiAgICAgICAgZm9yIChwcm9wVmFsdWUgPSAwOyBwcm9wVmFsdWUgPCBub2RlLmxlbmd0aDsgcHJvcFZhbHVlKyspXG4gICAgICAgICAgKGkgPSBtdWx0aXBsZS5oYXNPd25Qcm9wZXJ0eShcIiRcIiArIG5vZGVbcHJvcFZhbHVlXS52YWx1ZSkpLFxuICAgICAgICAgICAgbm9kZVtwcm9wVmFsdWVdLnNlbGVjdGVkICE9PSBpICYmIChub2RlW3Byb3BWYWx1ZV0uc2VsZWN0ZWQgPSBpKSxcbiAgICAgICAgICAgIGkgJiYgc2V0RGVmYXVsdFNlbGVjdGVkICYmIChub2RlW3Byb3BWYWx1ZV0uZGVmYXVsdFNlbGVjdGVkID0gITApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcFZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKTtcbiAgICAgICAgbXVsdGlwbGUgPSBudWxsO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChub2RlW2ldLnZhbHVlID09PSBwcm9wVmFsdWUpIHtcbiAgICAgICAgICAgIG5vZGVbaV0uc2VsZWN0ZWQgPSAhMDtcbiAgICAgICAgICAgI
15852HNldERlZmF1bHRTZWxlY3RlZCAmJiAobm9kZVtpXS5kZWZhdWx0U2VsZWN0ZWQgPSAhMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IG11bHRpcGxlIHx8IG5vZGVbaV0uZGlzYWJsZWQgfHwgKG11bHRpcGxlID0gbm9kZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbnVsbCAhPT0gbXVsdGlwbGUgJiYgKG11bHRpcGxlLnNlbGVjdGVkID0gITApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVNlbGVjdFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gICAgICBmb3IgKGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBlbGVtZW50KyspIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbZWxlbWVudF07XG4gICAgICAgIGlmIChudWxsICE9IHByb3BzW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5SW1wbChwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICAgIHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXlcbiAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiBgbXVsdGlwbGVgIGlzIHRydWUuJXNcIixcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6ICFwcm9wcy5tdWx0aXBsZSAmJlxuICAgICAgICAgICAgICBwcm9wTmFtZUlzQXJyYXkgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciB2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzXCIsXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm9pZCAwID09PSBwcm9wcy52YWx1ZSB8fFxuICAgICAgICB2b2lkIDAgPT09IHByb3BzLmRlZmF1bHRWYWx1ZSB8fFxuICAgICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgfHxcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0IGVsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHNcIlxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVUZXh0YXJlYVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gICAgICB2b2lkIDAgPT09IHByb3BzLnZhbHVlIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gcHJvcHMuZGVmYXVsdFZhbHVlIHx8XG4gICAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsIHx8XG4gICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHNcIixcbiAgICAgICAgICBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8IFwiQSBjb21wb25lbnRcIlxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FyblZhbERlZmF1bHRWYWwgPSAhMCkpO1xuICAgICAgbnVsbCAhPSBwcm9wcy5jaGlsZHJlbiAmJlxuICAgICAgICBudWxsID09IHByb3BzLnZhbHVlICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nIGNoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVGV4dGFyZWEoZWxlbWVudCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICgodmFsdWUgPSBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkpLFxuICAgICAgICB2YWx1ZSAhPT0gZWxlbWVudC52YWx1ZSAmJiAoZWxlbWVudC52YWx1ZSA9IHZhbHVlKSxcbiAgICAgICAgbnVsbCA9PSBkZWZhdWx0VmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT09IHZhbHVlICYmIChlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5kZWZhdWx0VmFsdWUgPVxuICAgICAgICBudWxsICE9IGRlZmF1bHRWYWx1ZSA/IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKGRlZmF1bHRWYWx1ZSkgOiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0VGV4dGFyZWEoZWxlbWVudCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSwgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChudWxsID09IHZhbHVlKSB7XG4gICAgICAgIGlmIChudWxsICE9IGNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKG51bGwgIT0gZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc0FycmF
158525SW1wbChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGlmICgxIDwgY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC5cIik7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBudWxsID09IGRlZmF1bHRWYWx1ZSAmJiAoZGVmYXVsdFZhbHVlID0gXCJcIik7XG4gICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XG4gICAgICBlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGNoaWxkcmVuID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgIGNoaWxkcmVuID09PSBkZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgXCJcIiAhPT0gY2hpbGRyZW4gJiZcbiAgICAgICAgbnVsbCAhPT0gY2hpbGRyZW4gJiZcbiAgICAgICAgKGVsZW1lbnQudmFsdWUgPSBjaGlsZHJlbik7XG4gICAgICB0cmFjayhlbGVtZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZE5vdGFibGVOb2RlKG5vZGUsIGluZGVudCkge1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gbm9kZS5zZXJ2ZXJQcm9wcyAmJlxuICAgICAgICAwID09PSBub2RlLnNlcnZlclRhaWwubGVuZ3RoICYmXG4gICAgICAgIDEgPT09IG5vZGUuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIDMgPCBub2RlLmRpc3RhbmNlRnJvbUxlYWYgJiZcbiAgICAgICAgbm9kZS5kaXN0YW5jZUZyb21MZWFmID4gMTUgLSBpbmRlbnRcbiAgICAgICAgPyBmaW5kTm90YWJsZU5vZGUobm9kZS5jaGlsZHJlblswXSwgaW5kZW50KVxuICAgICAgICA6IG5vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluZGVudGF0aW9uKGluZGVudCkge1xuICAgICAgcmV0dXJuIFwiICBcIiArIFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkZWQoaW5kZW50KSB7XG4gICAgICByZXR1cm4gXCIrIFwiICsgXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVkKGluZGVudCkge1xuICAgICAgcmV0dXJuIFwiLSBcIiArIFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGaWJlclR5cGUoZmliZXIpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gZmliZXIudHlwZTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXR1cm4gXCJMYXp5XCI7XG4gICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgcmV0dXJuIFwiQWN0aXZpdHlcIjtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZVwiO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHJldHVybiBcIlN1c3BlbnNlTGlzdFwiO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgcmV0dXJuIChmaWJlciA9IGZpYmVyLnR5cGUpLCBmaWJlci5kaXNwbGF5TmFtZSB8fCBmaWJlci5uYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChmaWJlciA9IGZpYmVyLnR5cGUucmVuZGVyKSwgZmliZXIuZGlzcGxheU5hbWUgfHwgZmliZXIubmFtZSB8fCBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiAoZmliZXIgPSBmaWJlci50eXBlKSwgZmliZXIuZGlzcGxheU5hbWUgfHwgZmliZXIubmFtZSB8fCBudWxsO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVRleHROb2RlKGNvbnRlbnQsIG1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIG5lZWRzRXNjYXBpbmcudGVzdChjb250ZW50KVxuICAgICAgICA/ICgoY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKSxcbiAgICAgICAgICBjb250ZW50Lmxlbmd0aCA+IG1heExlbmd0aCAtIDJcbiAgICAgICAgICAgID8gOCA+IG1heExlbmd0aFxuICAgICAgICAgICAgICA/ICd7XCIuLi5cIn0nXG4gICAgICAgICAgICAgIDogXCJ7XCIgKyBjb250ZW50LnNsaWNlKDAsIG1heExlbmd0aCAtIDcpICsgJy4uLlwifSdcbiAgICAgICAgICAgIDogXCJ7XCIgKyBjb250ZW50ICsgXCJ9XCIpXG4gICAgICAgIDogY29udGVudC5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgICA/IDUgPiBtYXhMZW5ndGhcbiAgICAgICAgICAgID8gJ3tcIi4uLlwifSdcbiAgICAgICAgICAgIDogY29udGVudC5zbGljZSgwLCBtYXhMZW5ndGggLSAzKSArIFwiLi4uXCJcbiAgICAgICAgICA6IGNvbnRlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlVGV4dERpZmYoY2xpZW50VGV4dCwgc2VydmVyUHJvcHMsIGluZGVudCkge1xuICAgICAgdmFyIG1heExlbmd0aCA9IDEyMCAtIDIgKiBpbmRlbnQ7XG4gICAgICBpZiAobnVsbCA9PT0gc2VydmVyUHJvcHMpXG4gICAgICAgIHJldHVybiBhZGRlZChpbmRlbnQpICsgZGVzY3JpYmVUZXh0Tm9kZShjbGllbnRUZXh0LCBtYXhMZW5ndGgpICsgXCJcXG5cIjtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2Ygc2VydmVyUHJvcHMpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2Y
15852XIgZmlyc3REaWZmID0gMDtcbiAgICAgICAgICBmaXJzdERpZmYgPCBzZXJ2ZXJQcm9wcy5sZW5ndGggJiZcbiAgICAgICAgICBmaXJzdERpZmYgPCBjbGllbnRUZXh0Lmxlbmd0aCAmJlxuICAgICAgICAgIHNlcnZlclByb3BzLmNoYXJDb2RlQXQoZmlyc3REaWZmKSA9PT1cbiAgICAgICAgICAgIGNsaWVudFRleHQuY2hhckNvZGVBdChmaXJzdERpZmYpO1xuICAgICAgICAgIGZpcnN0RGlmZisrXG4gICAgICAgICk7XG4gICAgICAgIGZpcnN0RGlmZiA+IG1heExlbmd0aCAtIDggJiZcbiAgICAgICAgICAxMCA8IGZpcnN0RGlmZiAmJlxuICAgICAgICAgICgoY2xpZW50VGV4dCA9IFwiLi4uXCIgKyBjbGllbnRUZXh0LnNsaWNlKGZpcnN0RGlmZiAtIDgpKSxcbiAgICAgICAgICAoc2VydmVyUHJvcHMgPSBcIi4uLlwiICsgc2VydmVyUHJvcHMuc2xpY2UoZmlyc3REaWZmIC0gOCkpKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBhZGRlZChpbmRlbnQpICtcbiAgICAgICAgICBkZXNjcmliZVRleHROb2RlKGNsaWVudFRleHQsIG1heExlbmd0aCkgK1xuICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgIHJlbW92ZWQoaW5kZW50KSArXG4gICAgICAgICAgZGVzY3JpYmVUZXh0Tm9kZShzZXJ2ZXJQcm9wcywgbWF4TGVuZ3RoKSArXG4gICAgICAgICAgXCJcXG5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgaW5kZW50YXRpb24oaW5kZW50KSArIGRlc2NyaWJlVGV4dE5vZGUoY2xpZW50VGV4dCwgbWF4TGVuZ3RoKSArIFwiXFxuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9iamVjdE5hbWUob2JqZWN0KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgICAgICAuY2FsbChvYmplY3QpXG4gICAgICAgIC5yZXBsYWNlKC9eXFxbb2JqZWN0ICguKilcXF0kLywgZnVuY3Rpb24gKG
158520sIHAwKSB7XG4gICAgICAgICAgcmV0dXJuIHAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVWYWx1ZSh2YWx1ZSwgbWF4TGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKSksXG4gICAgICAgICAgICB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgICAgICAgPyA1ID4gbWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgPyAnXCIuLi5cIidcbiAgICAgICAgICAgICAgICA6IHZhbHVlLnNsaWNlKDAsIG1heExlbmd0aCAtIDQpICsgJy4uLlwiJ1xuICAgICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIGlmIChudWxsID09PSB2YWx1ZSkgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICAgIGlmIChpc0FycmF5SW1wbCh2YWx1ZSkpIHJldHVybiBcIlsuLi5dXCI7XG4gICAgICAgICAgaWYgKHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gKG1heExlbmd0aCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh2YWx1ZS50eXBlKSlcbiAgICAgICAgICAgICAgPyBcIjxcIiArIG1heExlbmd0aCArIFwiPlwiXG4gICAgICAgICAgICAgIDogXCI8Li4uPlwiO1xuICAgICAgICAgIHZhciBuYW1lID0gb2JqZWN0TmFtZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKFwiT2JqZWN0XCIgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbWF4TGVuZ3RoIC09IDI7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB2YWx1ZSlcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciBqc29uUHJvcE5hbWUgPSBKU09OLnN0cmluZ2lmeShwcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAganNvblByb3BOYW1lICE9PSAnXCInICsgcHJvcE5hbWUgKyAnXCInICYmXG4gICAgICAgICAgICAgICAgICAocHJvcE5hbWUgPSBqc29uUHJvcE5hbWUpO1xuICAgICAgICAgICAgICAgIG1heExlbmd0aCAtPSBwcm9wTmFtZS5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIGpzb25Qcm9wTmFtZSA9IGRlc2NyaWJlVmFsdWUoXG4gICAgICAgICAgICAgICAgICB2YWx1ZVtwcm9wTmFtZV0sXG4gICAgICAgICAgICAgICAgICAxNSA+IG1heExlbmd0aCA/IG1heExlbmd0aCA6IDE1XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggLT0ganNvblByb3BOYW1lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoMCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgbmFtZSArPSBcIlwiID09PSBuYW1lID8gXCIuLi5cIiA6IFwiLCAuLi5cIjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuYW1lICs9XG4gICAgICAgICAgICAgICAgICAoXCJcIiA9PT0gbmFtZSA/IFwiXCIgOiBcIixcIikgKyBwcm9wTmFtZSArIFwiOlwiICsganNvblByb3BOYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJ7XCIgKyBuYW1lICsgXCJ9XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICByZXR1cm4gKG1heExlbmd0aCA9IHZhbHVlLmRpc3BsYXlOYW1lIHx8IHZhbHVlLm5hbWUpXG4gICAgICAgICAgICA/IFwiZnVuY3Rpb24gXCIgKyBtYXhMZW5ndGhcbiAgICAgICAgICAgIDogXCJmdW5jdGlvblwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVByb3BWYWx1ZSh2YWx1ZSwgbWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHZhbHVlIHx8IG5lZWRzRXNjYXBpbmcudGVzdCh2YWx1ZSlcbiAgICAgICAgPyBcIntcIiArIGRlc2NyaWJlVmFsdWUodmFsdWUsIG1heExlbmd0aCAtIDIpICsgXCJ9XCJcbiAgICAgICAgOiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGggLSAyXG4gICAgICAgICAgPyA1ID4gbWF4TGVuZ3RoXG4gICAgICAgICAgICA/ICdcIi4uLlwiJ1xuICAgICAgICAgICAgOiAnXCInICsgdmFsdWUuc2xpY2UoMCwgbWF4TGVuZ3RoIC0gNSkgKyAnLi4uXCInXG4gICAgICAgICAgOiAnXCInICsgdmFsdWUgKyAnXCInO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUV4cGFuZGVkRWxlbWVudCh0eXBlLCBwcm9wcywgcm93UHJlZml4KSB7XG4gICAgICB2Y
15852XIgcmVtYWluaW5nUm93TGVuZ3RoID0gMTIwIC0gcm93UHJlZml4Lmxlbmd0aCAtIHR5cGUubGVuZ3RoLFxuICAgICAgICBwcm9wZXJ0aWVzID0gW10sXG4gICAgICAgIHByb3BOYW1lO1xuICAgICAgZm9yIChwcm9wTmFtZSBpbiBwcm9wcylcbiAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAmJiBcImNoaWxkcmVuXCIgIT09IHByb3BOYW1lKSB7XG4gICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGRlc2NyaWJlUHJvcFZhbHVlKFxuICAgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdLFxuICAgICAgICAgICAgMTIwIC0gcm93UHJlZml4Lmxlbmd0aCAtIHByb3BOYW1lLmxlbmd0aCAtIDFcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlbWFpbmluZ1Jvd0xlbmd0aCAtPSBwcm9wTmFtZS5sZW5ndGggKyBwcm9wVmFsdWUubGVuZ3RoICsgMjtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcE5hbWUgKyBcIj1cIiArIHByb3BWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiAwID09PSBwcm9wZXJ0aWVzLmxlbmd0aFxuICAgICAgICA/IHJvd1ByZWZpeCArIFwiPFwiICsgdHlwZSArIFwiPlxcblwiXG4gICAgICAgIDogMCA8IHJlbWFpbmluZ1Jvd0xlbmd0aFxuICAgICAgICAgID8gcm93UHJlZml4ICsgXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBwcm9wZXJ0aWVzLmpvaW4oXCIgXCIpICsgXCI+XFxuXCJcbiAgICAgICAgICA6IHJvd1ByZWZpeCArXG4gICAgICAgICAgICBcIjxcIiArXG4gICAgICAgICAgICB0eXBlICtcbiAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgcm93UHJlZml4ICtcbiAgICAgICAgICAgIFwiICBcIiArXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmpvaW4oXCJcXG5cIiArIHJvd1ByZWZpeCArIFwiICBcIikgK1xuICAgICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICByb3dQcmVmaXggK1xuICAgICAgICAgICAgXCI+XFxuXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlUHJvcGVydGllc0RpZmYoY2xpZW50T2JqZWN0LCBzZXJ2ZXJPYmplY3QsIGluZGVudCkge1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSBcIlwiLFxuICAgICAgICByZW1haW5pbmdTZXJ2ZXJQcm9wZXJ0aWVzID0gYXNzaWduKHt9LCBzZXJ2ZXJPYmplY3QpLFxuICAgICAgICBwcm9wTmFtZTtcbiAgICAgIGZvciAocHJvcE5hbWUgaW4gY2xpZW50T2JqZWN0KVxuICAgICAgICBpZiAoY2xpZW50T2JqZWN0Lmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAgIGRlbGV0ZSByZW1haW5pbmdTZXJ2ZXJQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgICB2Y
15852XIgbWF4TGVuZ3RoID0gMTIwIC0gMiAqIGluZGVudCAtIHByb3BOYW1lLmxlbmd0aCAtIDIsXG4gICAgICAgICAgICBjbGllbnRQcm9wVmFsdWUgPSBkZXNjcmliZVZhbHVlKGNsaWVudE9iamVjdFtwcm9wTmFtZV0sIG1heExlbmd0aCk7XG4gICAgICAgICAgc2VydmVyT2JqZWN0Lmhhc093blByb3BlcnR5KHByb3BOYW1lKVxuICAgICAgICAgICAgPyAoKG1heExlbmd0aCA9IGRlc2NyaWJlVmFsdWUoc2VydmVyT2JqZWN0W3Byb3BOYW1lXSwgbWF4TGVuZ3RoKSksXG4gICAgICAgICAgICAgIChwcm9wZXJ0aWVzICs9XG4gICAgICAgICAgICAgICAgYWRkZWQoaW5kZW50KSArIHByb3BOYW1lICsgXCI6IFwiICsgY2xpZW50UHJvcFZhbHVlICsgXCJcXG5cIiksXG4gICAgICAgICAgICAgIChwcm9wZXJ0aWVzICs9XG4gICAgICAgICAgICAgICAgcmVtb3ZlZChpbmRlbnQpICsgcHJvcE5hbWUgKyBcIjogXCIgKyBtYXhMZW5ndGggKyBcIlxcblwiKSlcbiAgICAgICAgICAgIDogKHByb3BlcnRpZXMgKz1cbiAgICAgICAgICAgICAgICBhZGRlZChpbmRlbnQpICsgcHJvcE5hbWUgKyBcIjogXCIgKyBjbGllbnRQcm9wVmFsdWUgKyBcIlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIHJlbWFpbmluZ1NlcnZlclByb3BlcnRpZXMpXG4gICAgICAgIHJlbWFpbmluZ1NlcnZlclByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSAmJlxuICAgICAgICAgICgoY2xpZW50T2JqZWN0ID0gZGVzY3JpYmVWYWx1ZShcbiAgICAgICAgICAgIHJlbWFpbmluZ1NlcnZlclByb3BlcnRpZXNbX3Byb3BOYW1lXSxcbiAgICAgICAgICAgIDEyMCAtIDIgKiBpbmRlbnQgLSBfcHJvcE5hbWUubGVuZ3RoIC0gMlxuICAgICAgICAgICkpLFxuICAgICAgICAgIChwcm9wZXJ0aWVzICs9XG4gICAgICAgICAgICByZW1vdmVkKGluZGVudCkgKyBfcHJvcE5hbWUgKyBcIjogXCIgKyBjbGllbnRPYmplY3QgKyBcIlxcblwiKSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFbGVtZW50RGlmZih0eXBlLCBjbGllbnRQcm9wcywgc2VydmVyUHJvcHMsIGluZGVudCkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiLFxuICAgICAgICBzZXJ2ZXJQcm9wTmFtZXMgPSBuZXcgTWFwKCk7XG4gICAgICBmb3IgKHByb3BOYW1lJGpzY29tcCQwIGluIHNlcnZlclByb3BzKVxuICAgICAgICBzZXJ2ZXJQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSRqc2NvbXAkMCkgJiZcbiAgICAgICAgICBzZXJ2ZXJQcm9wTmFtZXMuc2V0KFxuICAgICAgICAgICAgcHJvcE5hbWUkanNjb21wJDAudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHByb3BOYW1lJGpzY29tcCQwXG4gICAgICAgICAgKTtcbiAgICAgIGlmICgxID09PSBzZXJ2ZXJQcm9wTmFtZXMuc2l6ZSAmJiBzZXJ2ZXJQcm9wTmFtZXMuaGFzKFwiY2hpbGRyZW5cIikpXG4gICAgICAgIGNvbnRlbnQgKz0gZGVzY3JpYmVFeHBhbmRlZEVsZW1lbnQoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBjbGllbnRQcm9wcyxcbiAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQpXG4gICAgICAgICk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgX3Byb3BOYW1lMiBpbiBjbGllbnRQcm9wcylcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjbGllbnRQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUyKSAmJlxuICAgICAgICAgICAgXCJjaGlsZHJlblwiICE9PSBfcHJvcE5hbWUyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2Y
15852XIgbWF4TGVuZ3RoJGpzY29tcCQwID1cbiAgICAgICAgICAgICAgICAxMjAgLSAyICogKGluZGVudCArIDEpIC0gX3Byb3BOYW1lMi5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICBzZXJ2ZXJQcm9wTmFtZSA9IHNlcnZlclByb3BOYW1lcy5nZXQoX3Byb3BOYW1lMi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHNlcnZlclByb3BOYW1lKSB7XG4gICAgICAgICAgICAgIHNlcnZlclByb3BOYW1lcy5kZWxldGUoX3Byb3BOYW1lMi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgdmFyIHByb3BOYW1lJGpzY29tcCQwID0gY2xpZW50UHJvcHNbX3Byb3BOYW1lMl07XG4gICAgICAgICAgICAgIHNlcnZlclByb3BOYW1lID0gc2VydmVyUHJvcHNbc2VydmVyUHJvcE5hbWVdO1xuICAgICAgICAgICAgICB2YXIgY2xpZW50UHJvcFZhbHVlID0gZGVzY3JpYmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUkanNjb21wJDAsXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoJGpzY29tcCQwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG1heExlbmd0aCRqc2NvbXAkMCA9IGRlc2NyaWJlUHJvcFZhbHVlKFxuICAgICAgICAgICAgICAgIHNlcnZlclByb3BOYW1lLFxuICAgICAgICAgICAgICAgIG1heExlbmd0aCRqc2NvbXAkMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcHJvcE5hbWUkanNjb21wJDAgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcHJvcE5hbWUkanNjb21wJDAgJiZcbiAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHNlcnZlclByb3BOYW1lICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IHNlcnZlclByb3BOYW1lICYmXG4gICAgICAgICAgICAgIFwiT2JqZWN0XCIgPT09IG9iamVjdE5hbWUocHJvcE5hbWUkanNjb21wJDApICYmXG4gICAgICAgICAgICAgIFwiT2JqZWN0XCIgPT09IG9iamVjdE5hbWUoc2VydmVyUHJvcE5hbWUpICYmXG4gICAgICAgICAgICAgICgyIDwgT2JqZWN0LmtleXMocHJvcE5hbWUkanNjb21wJDApLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIDIgPCBPYmplY3Qua2V5cyhzZXJ2ZXJQcm9wTmFtZSkubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgLTEgPCBjbGllbnRQcm9wVmFsdWUuaW5kZXhPZihcIi4uLlwiKSB8fFxuICAgICAgICAgICAgICAgIC0xIDwgbWF4TGVuZ3RoJGpzY29tcCQwLmluZGV4T2YoXCIuLi5cIikpXG4gICAgICAgICAgICAgICAgPyAoY29udGVudCArPVxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgICAgICBcIj17e1xcblwiICtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQcm9wZXJ0aWVzRGlmZihcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSRqc2NvbXAkMCxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAyXG4gICAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwifX1cXG5cIilcbiAgICAgICAgICAgICAgICA6ICgoY29udGVudCArPVxuICAgICAgICAgICAgICAgICAgICBhZGRlZChpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFByb3BWYWx1ZSArXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgKGNvbnRlbnQgKz1cbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZChpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCRqc2NvbXAkMCArXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuXCIpKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBjb250ZW50ICs9XG4gICAgICAgICAgICAgICAgaW5kZW50YXRpb24oaW5kZW50ICsgMSkgK1xuICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgIFwiPVwiICtcbiAgICAgICAgICAgICAgICBkZXNjcmliZVByb3BWYWx1ZShjbGllbnRQcm9wc1tfcHJvcE5hbWUyXSwgbWF4TGVuZ3RoJGpzY29tcCQwKSArXG4gICAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIHNlcnZlclByb3BOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgIGlmIChcImNoaWxkcmVuXCIgIT09IHByb3BOYW1lKSB7XG4gICAgICAgICAgICB2Y
15852XIgbWF4TGVuZ3RoID0gMTIwIC0gMiAqIChpbmRlbnQgKyAxKSAtIHByb3BOYW1lLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBjb250ZW50ICs9XG4gICAgICAgICAgICAgIHJlbW92ZWQoaW5kZW50ICsgMSkgK1xuICAgICAgICAgICAgICBwcm9wTmFtZSArXG4gICAgICAgICAgICAgIFwiPVwiICtcbiAgICAgICAgICAgICAgZGVzY3JpYmVQcm9wVmFsdWUoc2VydmVyUHJvcHNbcHJvcE5hbWVdLCBtYXhMZW5ndGgpICtcbiAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZW50ID1cbiAgICAgICAgICBcIlwiID09PSBjb250ZW50XG4gICAgICAgICAgICA/IGluZGVudGF0aW9uKGluZGVudCkgKyBcIjxcIiArIHR5cGUgKyBcIj5cXG5cIlxuICAgICAgICAgICAgOiBpbmRlbnRhdGlvbihpbmRlbnQpICtcbiAgICAgICAgICAgICAgXCI8XCIgK1xuICAgICAgICAgICAgICB0eXBlICtcbiAgICAgICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICAgIGNvbnRlbnQgK1xuICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQpICtcbiAgICAgICAgICAgICAgXCI+XFxuXCI7XG4gICAgICB9XG4gICAgICB0eXBlID0gc2VydmVyUHJvcHMuY2hpbGRyZW47XG4gICAgICBjbGllbnRQcm9wcyA9IGNsaWVudFByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgdHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNlcnZlclByb3BOYW1lcyA9IFwiXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgY2xpZW50UHJvcHMgfHxcbiAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgY2xpZW50UHJvcHMgfHxcbiAgICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgY2xpZW50UHJvcHNcbiAgICAgICAgKVxuICAgICAgICAgIHNlcnZlclByb3BOYW1lcyA9IFwiXCIgKyBjbGllbnRQcm9wcztcbiAgICAgICAgY29udGVudCArPSBkZXNjcmliZVRleHREaWZmKHNlcnZlclByb3BOYW1lcywgXCJcIiArIHR5cGUsIGluZGVudCArIDEpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNsaWVudFByb3BzIHx8XG4gICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBjbGllbnRQcm9wcyB8fFxuICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgY2xpZW50UHJvcHNcbiAgICAgIClcbiAgICAgICAgY29udGVudCA9XG4gICAgICAgICAgbnVsbCA9PSB0eXBlXG4gICAgICAgICAgICA/IGNvbnRlbnQgKyBkZXNjcmliZVRleHREaWZmKFwiXCIgKyBjbGllbnRQcm9wcywgbnVsbCwgaW5kZW50ICsgMSlcbiAgICAgICAgICAgIDogY29udGVudCArIGRlc2NyaWJlVGV4dERpZmYoXCJcIiArIGNsaWVudFByb3BzLCB2b2lkIDAsIGluZGVudCArIDEpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlU2libGluZ0ZpYmVyKGZpYmVyLCBpbmRlbnQpIHtcbiAgICAgIHZhciB0eXBlID0gZGVzY3JpYmVGaWJlclR5cGUoZmliZXIpO1xuICAgICAgaWYgKG51bGwgPT09IHR5cGUpIHtcbiAgICAgICAgdHlwZSA9IFwiXCI7XG4gICAgICAgIGZvciAoZmliZXIgPSBmaWJlci5jaGlsZDsgZmliZXI7IClcbiAgICAgICAgICAodHlwZSArPSBkZXNjcmliZVNpYmxpbmdGaWJlcihmaWJlciwgaW5kZW50KSksXG4gICAgICAgICAgICAoZmliZXIgPSBmaWJlci5zaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZW50YXRpb24oaW5kZW50KSArIFwiPFwiICsgdHlwZSArIFwiPlxcblwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZU5vZGUobm9kZSwgaW5kZW50KSB7XG4gICAgICB2Y
15852XIgc2tpcFRvTm9kZSA9IGZpbmROb3RhYmxlTm9kZShub2RlLCBpbmRlbnQpO1xuICAgICAgaWYgKFxuICAgICAgICBza2lwVG9Ob2RlICE9PSBub2RlICYmXG4gICAgICAgICgxICE9PSBub2RlLmNoaWxkcmVuLmxlbmd0aCB8fCBub2RlLmNoaWxkcmVuWzBdICE9PSBza2lwVG9Ob2RlKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGluZGVudGF0aW9uKGluZGVudCkgKyBcIi4uLlxcblwiICsgZGVzY3JpYmVOb2RlKHNraXBUb05vZGUsIGluZGVudCArIDEpXG4gICAgICAgICk7XG4gICAgICBza2lwVG9Ob2RlID0gXCJcIjtcbiAgICAgIHZhciBkZWJ1Z0luZm8gPSBub2RlLmZpYmVyLl9kZWJ1Z0luZm87XG4gICAgICBpZiAoZGVidWdJbmZvKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlYnVnSW5mby5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBzZXJ2ZXJDb21wb25lbnROYW1lID0gZGVidWdJbmZvW2ldLm5hbWU7XG4gICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHNlcnZlckNvbXBvbmVudE5hbWUgJiZcbiAgICAgICAgICAgICgoc2tpcFRvTm9kZSArPVxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQpICsgXCI8XCIgKyBzZXJ2ZXJDb21wb25lbnROYW1lICsgXCI+XFxuXCIpLFxuICAgICAgICAgICAgaW5kZW50KyspO1xuICAgICAgICB9XG4gICAgICBkZWJ1Z0luZm8gPSBcIlwiO1xuICAgICAgaSA9IG5vZGUuZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgaWYgKDYgPT09IG5vZGUuZmliZXIudGFnKVxuICAgICAgICAoZGVidWdJbmZvID0gZGVzY3JpYmVUZXh0RGlmZihpLCBub2RlLnNlcnZlclByb3BzLCBpbmRlbnQpKSwgaW5kZW50Kys7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgKChzZXJ2ZXJDb21wb25lbnROYW1lID0gZGVzY3JpYmVGaWJlclR5cGUobm9kZS5maWJlcikpLFxuICAgICAgICBudWxsICE9PSBzZXJ2ZXJDb21wb25lbnROYW1lKVxuICAgICAgKVxuICAgICAgICBpZiAodm9pZCAwID09PSBub2RlLnNlcnZlclByb3BzKSB7XG4gICAgICAgICAgZGVidWdJbmZvID0gaW5kZW50O1xuICAgICAgICAgIHZhciBtYXhMZW5ndGggPSAxMjAgLSAyICogZGVidWdJbmZvIC0gc2VydmVyQ29tcG9uZW50TmFtZS5sZW5ndGggLSAyLFxuICAgICAgICAgICAgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgZm9yIChwcm9wTmFtZSBpbiBpKVxuICAgICAgICAgICAgaWYgKGkuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpICYmIFwiY2hpbGRyZW5cIiAhPT0gcHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGRlc2NyaWJlUHJvcFZhbHVlKGlbcHJvcE5hbWVdLCAxNSk7XG4gICAgICAgICAgICAgIG1heExlbmd0aCAtPSBwcm9wTmFtZS5sZW5ndGggKyBwcm9wVmFsdWUubGVuZ3RoICsgMjtcbiAgICAgICAgICAgICAgaWYgKDAgPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9IFwiIC4uLlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRlbnQgKz0gXCIgXCIgKyBwcm9wTmFtZSArIFwiPVwiICsgcHJvcFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlYnVnSW5mbyA9XG4gICAgICAgICAgICBpbmRlbnRhdGlvbihkZWJ1Z0luZm8pICtcbiAgICAgICAgICAgIFwiPFwiICtcbiAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUgK1xuICAgICAgICAgICAgY29udGVudCArXG4gICAgICAgICAgICBcIj5cXG5cIjtcbiAgICAgICAgICBpbmRlbnQrKztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgbnVsbCA9PT0gbm9kZS5zZXJ2ZXJQcm9wc1xuICAgICAgICAgICAgPyAoKGRlYnVnSW5mbyA9IGRlc2NyaWJlRXhwYW5kZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBhZGRlZChpbmRlbnQpXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBpbmRlbnQrKylcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5vZGUuc2VydmVyUHJvcHNcbiAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJTaG91bGQgbm90IGhhdmUgbWF0Y2hlZCBhIG5vbiBIb3N0VGV4dCBmaWJlciB0byBhIFRleHQgbm9kZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiAoKGRlYnVnSW5mbyA9IGRlc2NyaWJlRWxlbWVudERpZmYoXG4gICAgICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lLFxuICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgIG5vZGUuc2VydmVyUHJvcHMsXG4gICAgICAgICAgICAgICAgICBpbmRlbnRcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBpbmRlbnQrKyk7XG4gICAgICB2Y
15852XIgcHJvcE5hbWUgPSBcIlwiO1xuICAgICAgaSA9IG5vZGUuZmliZXIuY2hpbGQ7XG4gICAgICBmb3IgKFxuICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lID0gMDtcbiAgICAgICAgaSAmJiBzZXJ2ZXJDb21wb25lbnROYW1lIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgIClcbiAgICAgICAgKG1heExlbmd0aCA9IG5vZGUuY2hpbGRyZW5bc2VydmVyQ29tcG9uZW50TmFtZV0pLFxuICAgICAgICAgIG1heExlbmd0aC5maWJlciA9PT0gaVxuICAgICAgICAgICAgPyAoKHByb3BOYW1lICs9IGRlc2NyaWJlTm9kZShtYXhMZW5ndGgsIGluZGVudCkpLFxuICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lKyspXG4gICAgICAgICAgICA6IChwcm9wTmFtZSArPSBkZXNjcmliZVNpYmxpbmdGaWJlcihpLCBpbmRlbnQpKSxcbiAgICAgICAgICAoaSA9IGkuc2libGluZyk7XG4gICAgICBpICYmXG4gICAgICAgIDAgPCBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICAocHJvcE5hbWUgKz0gaW5kZW50YXRpb24oaW5kZW50KSArIFwiLi4uXFxuXCIpO1xuICAgICAgaSA9IG5vZGUuc2VydmVyVGFpbDtcbiAgICAgIG51bGwgPT09IG5vZGUuc2VydmVyUHJvcHMgJiYgaW5kZW50LS07XG4gICAgICBmb3IgKG5vZGUgPSAwOyBub2RlIDwgaS5sZW5ndGg7IG5vZGUrKylcbiAgICAgICAgKHNlcnZlckNvbXBvbmVudE5hbWUgPSBpW25vZGVdKSxcbiAgICAgICAgICAocHJvcE5hbWUgPVxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHNlcnZlckNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICAgPyBwcm9wTmFtZSArXG4gICAgICAgICAgICAgICAgKHJlbW92ZWQoaW5kZW50KSArXG4gICAgICAgICAgICAgICAgICBkZXNjcmliZVRleHROb2RlKHNlcnZlckNvbXBvbmVudE5hbWUsIDEyMCAtIDIgKiBpbmRlbnQpICtcbiAgICAgICAgICAgICAgICAgIFwiXFxuXCIpXG4gICAgICAgICAgICAgIDogcHJvcE5hbWUgK1xuICAgICAgICAgICAgICAgIGRlc2NyaWJlRXhwYW5kZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZS50eXBlLFxuICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZS5wcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJlbW92ZWQoaW5kZW50KVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgcmV0dXJuIHNraXBUb05vZGUgKyBkZWJ1Z0luZm8gKyBwcm9wTmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVEaWZmKHJvb3ROb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gXCJcXG5cXG5cIiArIGRlc2NyaWJlTm9kZShyb290Tm9kZSwgMCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUFuY2VzdG9ycyhhbmNlc3RvciwgY2hpbGQsIHByb3BzKSB7XG4gICAgICBmb3IgKHZhciBmaWJlciA9IGNoaWxkLCBub2RlID0gbnVsbCwgZGlzdGFuY2VGcm9tTGVhZiA9IDA7IGZpYmVyOyApXG4gICAgICAgIGZpYmVyID09PSBhbmNlc3RvciAmJiAoZGlzdGFuY2VGcm9tTGVhZiA9IDApLFxuICAgICAgICAgIChub2RlID0ge1xuICAgICAgICAgICAgZmliZXI6IGZpYmVyLFxuICAgICAgICAgICAgY2hpbGRyZW46IG51bGwgIT09IG5vZGUgPyBbbm9kZV0gOiBbXSxcbiAgICAgICAgICAgIHNlcnZlclByb3BzOlxuICAgICAgICAgICAgICBmaWJlciA9PT0gY2hpbGQgPyBwcm9wcyA6IGZpYmVyID09PSBhbmNlc3RvciA/IG51bGwgOiB2b2lkIDAsXG4gICAgICAgICAgICBzZXJ2ZXJUYWlsOiBbXSxcbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUxlYWY6IGRpc3RhbmNlRnJvbUxlYWZcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXN0YW5jZUZyb21MZWFmKyssXG4gICAgICAgICAgKGZpYmVyID0gZmliZXIucmV0dXJuKTtcbiAgICAgIHJldHVybiBudWxsICE9PSBub2RlID8gZGVzY3JpYmVEaWZmKG5vZGUpLnJlcGxhY2VBbGwoL15bKy1dL2dtLCBcIj5cIikgOiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVkQW5jZXN0b3JJbmZvRGV2KG9sZEluZm8sIHRhZykge1xuICAgICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mb0RldiksXG4gICAgICAgIGluZm8gPSB7IHRhZzogdGFnIH07XG4gICAgICAtMSAhPT0gaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICYmXG4gICAgICAgICgoYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbCksXG4gICAgICAgIChhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGwpLFxuICAgICAgICAoYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbCkpO1xuICAgICAgLTEgIT09IGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgJiZcbiAgICAgICAgKGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGwpO1xuICAgICAgLTEgIT09IHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAmJlxuICAgICAgICBcImFkZHJlc3NcIiAhPT0gdGFnICYmXG4gICAgICAgIFwiZGl2XCIgIT09IHRhZyAmJlxuICAgICAgICBcInBcIiAhPT0gdGFnICYmXG4gICAgICAgICgoYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsKSxcbiAgICAgICAgKGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGwpKTtcbiAgICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcbiAgICAgIFwiZm9ybVwiID09PSB0YWcgJiYgKGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbyk7XG4gICAgICBcImFcIiA9PT0gdGFnICYmIChhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvKTtcbiAgICAgIFwiYnV0dG9uXCIgPT09IHRhZyAmJiAoYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvKTtcbiAgICAgIFwibm9iclwiID09PSB0YWcgJiYgKGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm8pO1xuICAgICAgXCJwXCIgPT09IHRhZyAmJiAoYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbyk7XG4gICAgICBcImxpXCIgPT09IHRhZyAmJiAoYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvKTtcbiAgICAgIGlmIChcImRkXCIgPT09IHRhZyB8fCBcImR0XCIgPT09IHRhZylcbiAgICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICAgIFwiI2RvY3VtZW50XCIgPT09IHRhZyB8fCBcImh0bWxcIiA9PT0gdGFnXG4gICAgICAgID8gKGFuY2VzdG9ySW5mby5jb250YWluZXJUYWdJblNjb3BlID0gbnVsbClcbiAgICAgICAgOiBhbmNlc3RvckluZm8uY29udGFpbmVyVGFnSW5TY29wZSB8fFxuICAgICAgICAgIChhbmNlc3RvckluZm8uY29udGFpbmVyVGFnSW5TY29wZSA9IGluZm8pO1xuICAgICAgbnVsbCAhPT0gb2xkSW5mbyB8fFxuICAgICAgKFwiI2RvY3VtZW50XCIgIT09IHRhZyAmJiBcImh0bWxcIiAhPT0gdGFnICYmIFwiYm9keVwiICE9PSB0YWcpXG4gICAgICAgID8gITAgPT09IGFuY2VzdG9ySW5mby5pbXBsaWNpdFJvb3RTY29wZSAmJlxuICAgICAgICAgIChhbmNlc3RvckluZm8uaW1wbGljaXRSb290U2NvcGUgPSAhMSlcbiAgICAgICAgOiAoYW5jZXN0b3JJbmZvLmltcGxpY2l0Um9vdFNjb3BlID0gITApO1xuICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNUYWdWYWxpZFdpdGhQYXJlbnQodGFnLCBwYXJlbnRUYWcsIGltcGxpY2l0Um9vdFNjb3BlKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgXCJ0aFwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwidGRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInN0eWxlXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzY3JpcHRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInRlbXBsYXRlXCIgPT09IHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJ0Ym9keVwiOlxuICAgICAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgICAgY2FzZSBcInRmb290XCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIFwidHJcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInN0eWxlXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzY3JpcHRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInRlbXBsYXRlXCIgPT09IHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJjb2xncm91cFwiOlxuICAgICAgICAgI
15852HJldHVybiBcImNvbFwiID09PSB0YWcgfHwgXCJ0ZW1wbGF0ZVwiID09PSB0YWc7XG4gICAgICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBcImNhcHRpb25cIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcImNvbGdyb3VwXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0Ym9keVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwidGZvb3RcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInRoZWFkXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzdHlsZVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwic2NyaXB0XCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0ZW1wbGF0ZVwiID09PSB0YWdcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiaGVhZFwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBcImJhc2VcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcImJhc2Vmb250XCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJiZ3NvdW5kXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJsaW5rXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJtZXRhXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0aXRsZVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwibm9zY3JpcHRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcIm5vZnJhbWVzXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzdHlsZVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwic2NyaXB0XCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0ZW1wbGF0ZVwiID09PSB0YWdcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICAgIGlmIChpbXBsaWNpdFJvb3RTY29wZSkgYnJlYWs7XG4gICAgICAgICAgcmV0dXJuIFwiaGVhZFwiID09PSB0YWcgfHwgXCJib2R5XCIgPT09IHRhZyB8fCBcImZyYW1lc2V0XCIgPT09IHRhZztcbiAgICAgICAgY2FzZSBcImZyYW1lc2V0XCI6XG4gICAgICAgICAgcmV0dXJuIFwiZnJhbWVcIiA9PT0gdGFnO1xuICAgICAgICBjYXNlIFwiI2RvY3VtZW50XCI6XG4gICAgICAgICAgaWYgKCFpbXBsaWNpdFJvb3RTY29wZSkgcmV0dXJuIFwiaHRtbFwiID09PSB0YWc7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIFwiaDFcIjpcbiAgICAgICAgY2FzZSBcImgyXCI6XG4gICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICBjYXNlIFwiaDRcIjpcbiAgICAgICAgY2FzZSBcImg1XCI6XG4gICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBcImgxXCIgIT09IHBhcmVudFRhZyAmJlxuICAgICAgICAgICAgXCJoMlwiICE9PSBwYXJlbnRUYWcgJiZcbiAgICAgICAgICAgIFwiaDNcIiAhPT0gcGFyZW50VGFnICYmXG4gICAgICAgICAgICBcImg0XCIgIT09IHBhcmVudFRhZyAmJlxuICAgICAgICAgICAgXCJoNVwiICE9PSBwYXJlbnRUYWcgJiZcbiAgICAgICAgICAgIFwiaDZcIiAhPT0gcGFyZW50VGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcInJwXCI6XG4gICAgICAgIGNhc2UgXCJydFwiOlxuICAgICAgICAgIHJldHVybiAtMSA9PT0gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpO1xuICAgICAgICBjYXNlIFwiY2FwdGlvblwiOlxuICAgICAgICBjYXNlIFwiY29sXCI6XG4gICAgICAgIGNhc2UgXCJjb2xncm91cFwiOlxuICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICByZXR1cm4gXCJzZWxlY3RcIiAhPT0gcGFyZW50VGFnO1xuICAgICAgICBjYXNlIFwiZnJhbWVzZXRcIjpcbiAgICAgICAgY2FzZSBcImZyYW1lXCI6XG4gICAgICAgIGNhc2UgXCJ0Ym9keVwiOlxuICAgICAgICBjYXNlIFwidGRcIjpcbiAgICAgICAgY2FzZSBcInRmb290XCI6XG4gICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgICAgY2FzZSBcInRyXCI6XG4gICAgICAgICAgcmV0dXJuIG51bGwgPT0gcGFyZW50VGFnO1xuICAgICAgICBjYXNlIFwiaGVhZFwiOlxuICAgICAgICAgIHJldHVybiBpbXBsaWNpdFJvb3RTY29wZSB8fCBudWxsID09PSBwYXJlbnRUYWc7XG4gICAgICAgIGNhc2UgXCJodG1sXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChpbXBsaWNpdFJvb3RTY29wZSAmJiBcIiNkb2N1bWVudFwiID09PSBwYXJlbnRUYWcpIHx8XG4gICAgICAgICAgICBudWxsID09PSBwYXJlbnRUYWdcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaW1wbGljaXRSb290U2NvcGUgJiZcbiAgICAgICAgICAgICAgKFwiI2RvY3VtZW50XCIgPT09IHBhcmVudFRhZyB8fCBcImh0bWxcIiA9PT0gcGFyZW50VGFnKSkgfHxcbiAgICAgICAgICAgIG51bGwgPT09IHBhcmVudFRhZ1xuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgIGNhc2UgXCJhc2lkZVwiOlxuICAgICAgICBjYXNlIFwiYmxvY2txdW90ZVwiOlxuICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgIGNhc2UgXCJkZXRhaWxzXCI6XG4gICAgICAgIGNhc2UgXCJkaWFsb2dcIjpcbiAgICAgICAgY2FzZSBcImRpclwiOlxuICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgIGNhc2UgXCJkbFwiOlxuICAgICAgICBjYXNlIFwiZmllbGRzZXRcIjpcbiAgICAgICAgY2FzZSBcImZpZ2NhcHRpb25cIjpcbiAgICAgICAgY2FzZSBcImZpZ3VyZVwiOlxuICAgICAgICBjYXNlIFwiZm9vdGVyXCI6XG4gICAgICAgIGNhc2UgXCJoZWFkZXJcIjpcbiAgICAgICAgY2FzZSBcImhncm91cFwiOlxuICAgICAgICBjYXNlIFwibWFpblwiOlxuICAgICAgICBjYXNlIFwibWVudVwiOlxuICAgICAgICBjYXNlIFwibmF2XCI6XG4gICAgICAgIGNhc2UgXCJvbFwiOlxuICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICBjYXNlIFwidWxcIjpcbiAgICAgICAgY2FzZSBcInByZVwiOlxuICAgICAgICBjYXNlIFwibGlzdGluZ1wiOlxuICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgY2FzZSBcImhyXCI6XG4gICAgICAgIGNhc2UgXCJ4bXBcIjpcbiAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgIGNhc2UgXCJoMlwiOlxuICAgICAgICBjYXNlIFwiaDNcIjpcbiAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgIGNhc2UgXCJoNVwiOlxuICAgICAgICBjYXNlIFwiaDZcIjpcbiAgICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuICAgICAgICBjYXNlIFwiZm9ybVwiOlxuICAgICAgICAgI
15852HJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG4gICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgIGNhc2UgXCJkdFwiOlxuICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG4gICAgICAgIGNhc2UgXCJidXR0b25cIjpcbiAgICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcbiAgICAgICAgY2FzZSBcIm5vYnJcIjpcbiAgICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRBbmNlc3RvcihwYXJlbnQsIHRhZ05hbWUpIHtcbiAgICAgIGZvciAoOyBwYXJlbnQ7ICkge1xuICAgICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSB0YWdOYW1lKSByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVET01OZXN0aW5nKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mb0RldjtcbiAgICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgICBhbmNlc3RvckluZm8gPSAocGFyZW50SW5mbyA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KFxuICAgICAgICBjaGlsZFRhZyxcbiAgICAgICAgcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZyxcbiAgICAgICAgYW5jZXN0b3JJbmZvLmltcGxpY2l0Um9vdFNjb3BlXG4gICAgICApXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHBhcmVudEluZm8pXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgICBhbmNlc3RvckluZm8gPSBwYXJlbnRJbmZvIHx8IGFuY2VzdG9ySW5mbztcbiAgICAgIGlmICghYW5jZXN0b3JJbmZvKSByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgYW5jZXN0b3JUYWcgPSBhbmNlc3RvckluZm8udGFnO1xuICAgICAgYW5jZXN0b3JJbmZvID0gU3RyaW5nKCEhcGFyZW50SW5mbykgKyBcInxcIiArIGNoaWxkVGFnICsgXCJ8XCIgKyBhbmNlc3RvclRhZztcbiAgICAgIGlmIChkaWRXYXJuW2FuY2VzdG9ySW5mb10pIHJldHVybiAhMTtcbiAgICAgIGRpZFdhcm5bYW5jZXN0b3JJbmZvXSA9ICEwO1xuICAgICAgdmFyIGFuY2VzdG9yID0gKGFuY2VzdG9ySW5mbyA9IGN1cnJlbnQpXG4gICAgICAgICAgPyBmaW5kQW5jZXN0b3IoYW5jZXN0b3JJbmZvLnJldHVybiwgYW5jZXN0b3JUYWcpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgICBhbmNlc3RvckRlc2NyaXB0aW9uID1cbiAgICAgICAgICBudWxsICE9PSBhbmNlc3RvckluZm8gJiYgbnVsbCAhPT0gYW5jZXN0b3JcbiAgICAgICAgICAgID8gZGVzY3JpYmVBbmNlc3RvcnMoYW5jZXN0b3IsIGFuY2VzdG9ySW5mbywgbnVsbClcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSBcIjxcIiArIGNoaWxkVGFnICsgXCI+XCI7XG4gICAgICBwYXJlbnRJbmZvXG4gICAgICAgID8gKChwYXJlbnRJbmZvID0gXCJcIiksXG4gICAgICAgICAgXCJ0YWJsZVwiID09PSBhbmNlc3RvclRhZyAmJlxuICAgICAgICAgICAgXCJ0clwiID09PSBjaGlsZFRhZyAmJlxuICAgICAgICAgICAgKHBhcmVudEluZm8gKz1cbiAgICAgICAgICAgICAgXCIgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5IHRoZSBicm93c2VyLlwiKSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbiBIVE1MLCAlcyBjYW5ub3QgYmUgYSBjaGlsZCBvZiA8JXM+LiVzXFxuVGhpcyB3aWxsIGNhdXNlIGEgaHlkcmF0aW9uIGVycm9yLiVzXCIsXG4gICAgICAgICAgICB0YWdEaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIGFuY2VzdG9yVGFnLFxuICAgICAgICAgICAgcGFyZW50SW5mbyxcbiAgICAgICAgICAgIGFuY2VzdG9yRGVzY3JpcHRpb25cbiAgICAgICAgICApKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkluIEhUTUwsICVzIGNhbm5vdCBiZSBhIGRlc2NlbmRhbnQgb2YgPCVzPi5cXG5UaGlzIHdpbGwgY2F1c2UgYSBoeWRyYXRpb24gZXJyb3IuJXNcIixcbiAgICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1lLFxuICAgICAgICAgICAgYW5jZXN0b3JUYWcsXG4gICAgICAgICAgICBhbmNlc3RvckRlc2NyaXB0aW9uXG4gICAgICAgICAgKTtcbiAgICAgIGFuY2VzdG9ySW5mbyAmJlxuICAgICAgICAoKGNoaWxkVGFnID0gYW5jZXN0b3JJbmZvLnJldHVybiksXG4gICAgICAgIG51bGwgPT09IGFuY2VzdG9yIHx8XG4gICAgICAgICAgbnVsbCA9PT0gY2hpbGRUYWcgfHxcbiAgICAgICAgICAoYW5jZXN0b3IgPT09IGNoaWxkVGFnICYmXG4gICAgICAgICAgICBjaGlsZFRhZy5fZGVidWdPd25lciA9PT0gYW5jZXN0b3JJbmZvLl9kZWJ1Z093bmVyKSB8fFxuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKGFuY2VzdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIjwlcz4gY2Fubm90IGNvbnRhaW4gYSBuZXN0ZWQgJXMuXFxuU2VlIHRoaXMgbG9nIGZvciB0aGUgYW5jZXN0b3Igc3RhY2sgdHJhY2UuXCIsXG4gICAgICAgICAgICAgIGFuY2VzdG9yVGFnLFxuICAgICAgICAgICAgICB0YWdEaXNwbGF5TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSk7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlVGV4dE5lc3RpbmcoY2hpbGRUZXh0LCBwYXJlbnRUYWcsIGltcGxpY2l0Um9vdFNjb3BlKSB7XG4gICAgICBpZiAoaW1wbGljaXRSb290U2NvcGUgfHwgaXNUYWdWYWxpZFdpdGhQYXJlbnQoXCIjdGV4dFwiLCBwYXJlbnRUYWcsICExKSlcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgaW1wbGljaXRSb290U2NvcGUgPSBcIiN0ZXh0fFwiICsgcGFyZW50VGFnO1xuICAgICAgaWYgKGRpZFdhcm5baW1wbGljaXRSb290U2NvcGVdKSByZXR1cm4gITE7XG4gICAgICBkaWRXYXJuW2ltcGxpY2l0Um9vdFNjb3BlXSA9ICEwO1xuICAgICAgdmFyIGFuY2VzdG9yID0gKGltcGxpY2l0Um9vdFNjb3BlID0gY3VycmVudClcbiAgICAgICAgPyBmaW5kQW5jZXN0b3IoaW1wbGljaXRSb290U2NvcGUsIHBhcmVudFRhZylcbiAgICAgICAgOiBudWxsO1xuICAgICAgaW1wbGljaXRSb290U2NvcGUgPVxuICAgICAgICBudWxsICE9PSBpbXBsaWNpdFJvb3RTY29wZSAmJiBudWxsICE9PSBhbmNlc3RvclxuICAgICAgICAgID8gZGVzY3JpYmVBbmNlc3RvcnMoXG4gICAgICAgICAgICAgIGFuY2VzdG9yLFxuICAgICAgICAgICAgICBpbXBsaWNpdFJvb3RTY29wZSxcbiAgICAgICAgICAgICAgNiAhPT0gaW1wbGljaXRSb290U2NvcGUudGFnID8geyBjaGlsZHJlbjogbnVsbCB9IDogbnVsbFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogXCJcIjtcbiAgICAgIC9cXFMvLnRlc3QoY2hpbGRUZXh0KVxuICAgICAgICA/IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkluIEhUTUwsIHRleHQgbm9kZXMgY2Fubm90IGJlIGEgY2hpbGQgb2YgPCVzPi5cXG5UaGlzIHdpbGwgY2F1c2UgYSBoeWRyYXRpb24gZXJyb3IuJXNcIixcbiAgICAgICAgICAgIHBhcmVudFRhZyxcbiAgICAgICAgICAgIGltcGxpY2l0Um9vdFNjb3BlXG4gICAgICAgICAgKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkluIEhUTUwsIHdoaXRlc3BhY2UgdGV4dCBub2RlcyBjYW5ub3QgYmUgYSBjaGlsZCBvZiA8JXM+LiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIGVhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLlxcblRoaXMgd2lsbCBjYXVzZSBhIGh5ZHJhdGlvbiBlcnJvci4lc1wiLFxuICAgICAgICAgICAgcGFyZW50VGFnLFxuICAgICAgICAgICAgaW1wbGljaXRSb290U2NvcGVcbiAgICAgICAgICApO1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRUZX
15852h0Q29udGVudChub2RlLCB0ZXh0KSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpcnN0Q2hpbGQgJiZcbiAgICAgICAgICBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJlxuICAgICAgICAgIDMgPT09IGZpcnN0Q2hpbGQubm9kZVR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbWVsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGUoc3R5bGUsIHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKTtcbiAgICAgIGlzQ3VzdG9tUHJvcGVydHkgfHxcbiAgICAgICAgKC0xIDwgc3R5bGVOYW1lLmluZGV4T2YoXCItXCIpXG4gICAgICAgICAgPyAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmXG4gICAgICAgICAgICAgIHdhcm5lZFN0eWxlTmFtZXNbc3R5bGVOYW1lXSkgfHxcbiAgICAgICAgICAgICgod2FybmVkU3R5bGVOYW1lc1tzdHlsZU5hbWVdID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzP1wiLFxuICAgICAgICAgICAgICBzdHlsZU5hbWUsXG4gICAgICAgICAgICAgIGNhbWVsaXplKHN0eWxlTmFtZS5yZXBsYWNlKG1zUGF0dGVybiwgXCJtcy1cIikpXG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3Qoc3R5bGVOYW1lKVxuICAgICAgICAgICAgPyAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmXG4gICAgICAgICAgICAgICAgd2FybmVkU3R5bGVOYW1lc1tzdHlsZU5hbWVdKSB8fFxuICAgICAgICAgICAgICAoKHdhcm5lZFN0eWxlTmFtZXNbc3R5bGVOYW1lXSA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzP1wiLFxuICAgICAgICAgICAgICAgIHN0eWxlTmFtZSxcbiAgICAgICAgICAgICAgICBzdHlsZU5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHlsZU5hbWUuc2xpY2UoMSlcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogIWJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAgICAgICAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB8fFxuICAgICAgICAgICAgICAoKHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG5cXCd0IGNvbnRhaW4gYSBzZW1pY29sb24uIFRyeSBcIiVzOiAlc1wiIGluc3RlYWQuJyxcbiAgICAgICAgICAgICAgICBzdHlsZU5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sIFwiXCIpXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgICAoaXNOYU4odmFsdWUpXG4gICAgICAgICAgICA/IHdhcm5lZEZvck5hTlZhbHVlIHx8XG4gICAgICAgICAgICAgICgod2FybmVkRm9yTmFOVmFsdWUgPSAhMCksXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuXCIsXG4gICAgICAgICAgICAgICAgc3R5bGVOYW1lXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICA6IGlzRmluaXRlKHZhbHVlKSB8fFxuICAgICAgICAgICAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlIHx8XG4gICAgICAgICAgICAgICgod2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcImBJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LlwiLFxuICAgICAgICAgICAgICAgIHN0eWxlTmFtZVxuICAgICAgICAgICAgICApKSkpO1xuICAgICAgbnVsbCA9PSB2YWx1ZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHZhbHVlIHx8IFwiXCIgPT09IHZhbHVlXG4gICAgICAgID8gaXNDdXN0b21Qcm9wZXJ0eVxuICAgICAgICAgID8gc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBcIlwiKVxuICAgICAgICAgIDogXCJmbG9hdFwiID09PSBzdHlsZU5hbWVcbiAgICAgICAgICAgID8gKHN0eWxlLmNzc0Zsb2F0ID0gXCJcIilcbiAgICAgICAgICAgIDogKHN0eWxlW3N0eWxlTmFtZV0gPSBcIlwiKVxuICAgICAgICA6IGlzQ3VzdG9tUHJvcGVydHlcbiAgICAgICAgICA/IHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgdmFsdWUpXG4gICAgICAgICAgOiBcIm51bWJlclwiICE9PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgICAgMCA9PT0gdmFsdWUgfHxcbiAgICAgICAgICAgICAgdW5pdGxlc3NOdW1iZXJzLmhhcyhzdHlsZU5hbWUpXG4gICAgICAgICAgICA/IFwiZmxvYXRcIiA9PT0gc3R5bGVOYW1lXG4gICAgICAgICAgICAgID8gKHN0eWxlLmNzc0Zsb2F0ID0gdmFsdWUpXG4gICAgICAgICAgICAgIDogKGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgc3R5bGVOYW1lKSxcbiAgICAgICAgICAgICAgICAoc3R5bGVbc3R5bGVOYW1lXSA9IChcIlwiICsgdmFsdWUpLnRyaW0oKSkpXG4gICAgICAgICAgICA6IChzdHlsZVtzdHlsZU5hbWVdID0gdmFsdWUgKyBcInB4XCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMsIHByZXZTdHlsZXMpIHtcbiAgICAgIGlmIChudWxsICE9IHN0eWxlcyAmJiBcIm9iamVjdFwiICE9PSB0eXBlb2Ygc3R5bGVzKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlRoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIHVzaW5nIEpTWC5cIlxuICAgICAgICApO1xuICAgICAgc3R5bGVzICYmIE9iamVjdC5mcmVlemUoc3R5bGVzKTtcbiAgICAgIG5vZGUgPSBub2RlLnN0eWxlO1xuICAgICAgaWYgKG51bGwgIT0gcHJldlN0eWxlcykge1xuICAgICAgICBpZiAoc3R5bGVzKSB7XG4gICAgICAgICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIGlmIChwcmV2U3R5bGVzKVxuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHByZXZTdHlsZXMpXG4gICAgICAgICAgICAgIGlmIChwcmV2U3R5bGVzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICB2Y
15852XIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldLCBpID0gMDtcbiAgICAgICAgICAgICAgICAgIGkgPCBsb25naGFuZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgZXhwYW5kZWRVcGRhdGVzW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgICAgICAgZm9yICh2YXIgX2tleSBpbiBzdHlsZXMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShfa2V5KSAmJlxuICAgICAgICAgICAgICAoIXByZXZTdHlsZXMgfHwgcHJldlN0eWxlc1tfa2V5XSAhPT0gc3R5bGVzW19rZXldKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIGtleSA9IHNob3J0aGFuZFRvTG9uZ2hhbmRbX2tleV0gfHwgW19rZXldLCBsb25naGFuZHMgPSAwO1xuICAgICAgICAgICAgICAgIGxvbmdoYW5kcyA8IGtleS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbG9uZ2hhbmRzKytcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGV4cGFuZGVkVXBkYXRlc1trZXlbbG9uZ2hhbmRzXV0gPSBfa2V5O1xuICAgICAgICAgIF9rZXkgPSB7fTtcbiAgICAgICAgICBmb3IgKHZhciBrZXkkanNjb21wJDAgaW4gc3R5bGVzKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAga2V5ID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXkkanNjb21wJDBdIHx8IFtrZXkkanNjb21wJDBdLFxuICAgICAgICAgICAgICAgIGxvbmdoYW5kcyA9IDA7XG4gICAgICAgICAgICAgIGxvbmdoYW5kcyA8IGtleS5sZW5ndGg7XG4gICAgICAgICAgICAgIGxvbmdoYW5kcysrXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIF9rZXlba2V5W2xvbmdoYW5kc11dID0ga2V5JGpzY29tcCQwO1xuICAgICAgICAgIGtleSRqc2NvbXAkMCA9IHt9O1xuICAgICAgICAgIGZvciAodmFyIF9rZXkyIGluIGV4cGFuZGVkVXBkYXRlcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChrZXkgPSBleHBhbmRlZFVwZGF0ZXNbX2tleTJdKSxcbiAgICAgICAgICAgICAgKGxvbmdoYW5kcyA9IF9rZXlbX2tleTJdKSAmJlxuICAgICAgICAgICAgICAgIGtleSAhPT0gbG9uZ2hhbmRzICYmXG4gICAgICAgICAgICAgICAgKChpID0ga2V5ICsgXCIsXCIgKyBsb25naGFuZHMpLCAha2V5JGpzY29tcCQwW2ldKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBrZXkkanNjb21wJDBbaV0gPSAhMDtcbiAgICAgICAgICAgICAgaSA9IGNvbnNvbGU7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICBpLmVycm9yLmNhbGwoXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBcIiVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhIGNvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIGZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggc2VwYXJhdGUgdmFsdWVzLlwiLFxuICAgICAgICAgICAgICAgIG51bGwgPT0gdmFsdWUgfHwgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZSB8fCBcIlwiID09PSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgPyBcIlJlbW92aW5nXCJcbiAgICAgICAgICAgICAgICAgIDogXCJVcGRhdGluZ1wiLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBsb25naGFuZHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gcHJldlN0eWxlcylcbiAgICAgICAgICAhcHJldlN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpIHx8XG4gICAgICAgICAgICAobnVsbCAhPSBzdHlsZXMgJiYgc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHx8XG4gICAgICAgICAgICAoMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKVxuICAgICAgICAgICAgICA/IG5vZGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBcIlwiKVxuICAgICAgICAgICAgICA6IFwiZmxvYXRcIiA9PT0gc3R5bGVOYW1lXG4gICAgICAgICAgICAgICAgPyAobm9kZS5jc3NGbG9hdCA9IFwiXCIpXG4gICAgICAgICAgICAgICAgOiAobm9kZVtzdHlsZU5hbWVdID0gXCJcIiksXG4gICAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCkpO1xuICAgICAgICBmb3IgKHZhciBfc3R5bGVOYW1lIGluIHN0eWxlcylcbiAgICAgICAgICAoX2tleTIgPSBzdHlsZXNbX3N0eWxlTmFtZV0pLFxuICAgICAgICAgICAgc3R5bGVzLmhhc093blByb3BlcnR5KF9zdHlsZU5hbWUpICYmXG4gICAgICAgICAgICAgIHByZXZTdHlsZXNbX3N0eWxlTmFtZV0gIT09IF9rZXkyICYmXG4gICAgICAgICAgICAgIChzZXRWYWx1ZUZvclN0eWxlKG5vZGUsIF9zdHlsZU5hbWUsIF9rZXkyKSxcbiAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBmb3IgKGV4cGFuZGVkVXBkYXRlcyBpbiBzdHlsZXMpXG4gICAgICAgICAgc3R5bGVzLmhhc093blByb3BlcnR5KGV4cGFuZGVkVXBkYXRlcykgJiZcbiAgICAgICAgICAgIHNldFZhbHVlRm9yU3R5bGUobm9kZSwgZXhwYW5kZWRVcGRhdGVzLCBzdHlsZXNbZXhwYW5kZWRVcGRhdGVzXSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzQ3VzdG9tRWxlbWVudCh0YWdOYW1lKSB7XG4gICAgICBpZiAoLTEgPT09IHRhZ05hbWUuaW5kZXhPZihcIi1cIikpIHJldHVybiAhMTtcbiAgICAgIHN3aXRjaCAodGFnTmFtZSkge1xuICAgICAgICBjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpcbiAgICAgICAgY2FzZSBcImNvbG9yLXByb2ZpbGVcIjpcbiAgICAgICAgY2FzZSBcImZvbnQtZmFjZVwiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLXNyY1wiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLXVyaVwiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLWZvcm1hdFwiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpcbiAgICAgICAgY2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVBbGlhcyhuYW1lKSB7XG4gICAgICByZXR1cm4gYWxpYXNlcy5nZXQobmFtZSkgfHwgbmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSQxKHRhZ05hbWUsIG5hbW
15852UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXVxuICAgICAgKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICBpZiAockFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgICAgdGFnTmFtZSA9IFwiYXJpYS1cIiArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGFnTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHRhZ05hbWUpID8gdGFnTmFtZSA6IG51bGw7XG4gICAgICAgIGlmIChudWxsID09IHRhZ05hbWUpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuXCIsXG4gICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAod2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gITApXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IHRhZ05hbWUpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD9cIixcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSAhMClcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSkge1xuICAgICAgICB0YWdOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0YWdOYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodGFnTmFtZSkgPyB0YWdOYW1lIDogbnVsbDtcbiAgICAgICAgaWYgKG51bGwgPT0gdGFnTmFtZSkgcmV0dXJuICh3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSAhMCksICExO1xuICAgICAgICBuYW1lICE9PSB0YWdOYW1lICYmXG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlVua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/XCIsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgICAgICksXG4gICAgICAgICAgKHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9ICEwKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzKSB7XG4gICAgICB2Y
15852XIgaW52YWxpZFByb3BzID0gW10sXG4gICAgICAgIGtleTtcbiAgICAgIGZvciAoa2V5IGluIHByb3BzKVxuICAgICAgICB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5KSB8fCBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgcHJvcHMgPSBpbnZhbGlkUHJvcHNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHJldHVybiBcImBcIiArIHByb3AgKyBcImBcIjtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIDEgPT09IGludmFsaWRQcm9wcy5sZW5ndGhcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL2ludmFsaWQtYXJpYS1wcm9wc1wiLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgICAgKVxuICAgICAgICA6IDEgPCBpbnZhbGlkUHJvcHMubGVuZ3RoICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiBGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvaW52YWxpZC1hcmlhLXByb3BzXCIsXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUsIHZhbHVlLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXCJvbmZvY3VzaW5cIiA9PT0gbG93ZXJDYXNlZE5hbWUgfHwgXCJvbmZvY3Vzb3V0XCIgPT09IGxvd2VyQ2FzZWROYW1lKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlJlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiBBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0IGFyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC5cIlxuICAgICAgICAgICksXG4gICAgICAgICAgKHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSAhMClcbiAgICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgKChcImZvcm1cIiA9PT0gdGFnTmFtZSAmJiBcImFjdGlvblwiID09PSBuYW1lKSB8fFxuICAgICAgICAgIChcImlucHV0XCIgPT09IHRhZ05hbWUgJiYgXCJmb3JtQWN0aW9uXCIgPT09IG5hbWUpIHx8XG4gICAgICAgICAgKFwiYnV0dG9uXCIgPT09IHRhZ05hbWUgJiYgXCJmb3JtQWN0aW9uXCIgPT09IG5hbWUpKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICBpZiAobnVsbCAhPSBldmVudFJlZ2lzdHJ5KSB7XG4gICAgICAgIHRhZ05hbWUgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG4gICAgICAgIGlmIChldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBldmVudFJlZ2lzdHJ5ID0gdGFnTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgICA/IHRhZ05hbWVbbG93ZXJDYXNlZE5hbWVdXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPSBldmVudFJlZ2lzdHJ5KVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD9cIixcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLlwiLFxuICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSAhMClcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIFJlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLlwiLFxuICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICApLFxuICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICk7XG4gICAgICBpZiAockFSSUEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsLnRlc3QobmFtZSkpIHJldHVybiAhMDtcbiAgICAgIGlmIChcImlubmVyaHRtbFwiID09PSBsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAod2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwKVxuICAgICAgICApO1xuICAgICAgaWYgKFwiYXJpYVwiID09PSBsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgYGFyaWFgIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBpbiBSZWFjdC4gUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAod2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwKVxuICAgICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBcImlzXCIgPT09IGxvd2VyQ2FzZWROYW1lICYmXG4gICAgICAgIG51bGwgIT09IHZhbHVlICYmXG4gICAgICAgIHZvaWQgMCAhPT0gdmFsdWUgJiZcbiAgICAgICAgXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHZhbHVlXG4gICAgICApXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiUmVjZWl2ZWQgYSBgJXNgIGZvciBhIHN0cmluZyBhdHRyaWJ1dGUgYGlzYC4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuXCIsXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVcbiAgICAgICAgICApLFxuICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICk7XG4gICAgICBpZiAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHZhbHVlICYmIGlzTmFOKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuXCIsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgKSxcbiAgICAgICAgICAod2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwKVxuICAgICAgICApO1xuICAgICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgobG93ZXJDYXNlZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdKSxcbiAgICAgICAgICBsb3dlckNhc2VkTmFtZSAhPT0gbmFtZSlcbiAgICAgICAgKVxuICAgICAgICAgI
15852HJldHVybiAoXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgP1wiLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBsb3dlckNhc2VkTmFtZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91IGludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSBhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuIElmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuXCIsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbG93ZXJDYXNlZE5hbWVcbiAgICAgICAgICApLFxuICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICk7XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgY2FzZSBcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiOlxuICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICAgICAgY2FzZSBcInJlZlwiOlxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgY2FzZSBcImlubmVyVGV4dFwiOlxuICAgICAgICBjYXNlIFwidGV4dENvbnRlbnRcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcImF1dG9Gb2N1c1wiOlxuICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm11dGVkXCI6XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb250ZW50RWRpdGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzcGVsbENoZWNrXCI6XG4gICAgICAgICAgICBjYXNlIFwiZHJhZ2dhYmxlXCI6XG4gICAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJhdXRvUmV2ZXJzZVwiOlxuICAgICAgICAgICAgY2FzZSBcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb2N1c2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwcmVzZXJ2ZUFscGhhXCI6XG4gICAgICAgICAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgICAgICAgICBjYXNlIFwiYXN5bmNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJhdXRvUGxheVwiOlxuICAgICAgICAgICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgICAgICAgICBjYXNlIFwiY3JlZGVudGlhbGxlc3NcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICAgICAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgICAgICAgICAgY2FzZSBcImRpc2FibGVQaWN0dXJlSW5QaWN0dXJlXCI6XG4gICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgICAgICAgICBjYXNlIFwiZm9ybU5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoaWRkZW5cIjpcbiAgICAgICAgICAgIGNhc2UgXCJsb29wXCI6XG4gICAgICAgICAgICBjYXNlIFwibm9Nb2R1bGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub1ZhbGlkYXRlXCI6XG4gICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgY2FzZSBcInBsYXlzSW5saW5lXCI6XG4gICAgICAgICAgICBjYXNlIFwicmVhZE9ubHlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICAgICAgY2FzZSBcInJldmVyc2VkXCI6XG4gICAgICAgICAgICBjYXNlIFwic2NvcGVkXCI6XG4gICAgICAgICAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtU2NvcGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjYXB0dXJlXCI6XG4gICAgICAgICAgICBjYXNlIFwiZG93bmxvYWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJpbmVydFwiOlxuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICAgICAgaWYgKFwiZGF0YS1cIiA9PT0gbG93ZXJDYXNlZE5hbWUgfHwgXCJhcmlhLVwiID09PSBsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG5JZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgI
15852HZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG5JZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sIHBhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICByZXR1cm4gKHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSAhMCksICExO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgaWYgKFwiZmFsc2VcIiA9PT0gdmFsdWUgfHwgXCJ0cnVlXCIgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNlbGVjdGVkXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwibXV0ZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImFsbG93RnVsbFNjcmVlblwiOlxuICAgICAgICAgICAgICBjYXNlIFwiYXN5bmNcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImF1dG9QbGF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJjb250cm9sc1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiY3JlZGVudGlhbGxlc3NcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRlZmVyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRpc2FibGVSZW1vdGVQbGF5YmFja1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiZm9ybU5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICBjYXNlIFwibG9vcFwiOlxuICAgICAgICAgICAgICBjYXNlIFwibm9Nb2R1bGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm9wZW5cIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBsYXlzSW5saW5lXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJyZWFkT25seVwiOlxuICAgICAgICAgICAgICBjYXNlIFwicmVxdWlyZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInJldmVyc2VkXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJzY29wZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNlYW1sZXNzXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJpdGVtU2NvcGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImluZXJ0XCI6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAlcyBEaWQgeW91IG1lYW4gJXM9eyVzfT9cIixcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIFwiZmFsc2VcIiA9PT0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IFwiVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuXCJcbiAgICAgICAgICAgICAgICA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgICB2Y
15852XIgdW5rbm93blByb3BzID0gW10sXG4gICAgICAgIGtleTtcbiAgICAgIGZvciAoa2V5IGluIHByb3BzKVxuICAgICAgICB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSkgfHxcbiAgICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgcHJvcHMgPSB1bmtub3duUHJvcHNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHJldHVybiBcImBcIiArIHByb3AgKyBcImBcIjtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIDEgPT09IHVua25vd25Qcm9wcy5sZW5ndGhcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsIG9yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciBcIixcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgdHlwZVxuICAgICAgICAgIClcbiAgICAgICAgOiAxIDwgdW5rbm93blByb3BzLmxlbmd0aCAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgdmFsdWVzIGZvciBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVsZW1lbnQsIG9yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiBGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yIFwiLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gICAgICByZXR1cm4gaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdChcIlwiICsgdXJsKVxuICAgICAgICA/IFwiamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IGhhcyBibG9ja2VkIGEgamF2YXNjcmlwdDogVVJMIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4nKVwiXG4gICAgICAgIDogdXJsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub29wJDEoKSB7fVxuICAgIGZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gICAgICBuYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdztcbiAgICAgIG5hdGl2ZUV2ZW50LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50ICYmXG4gICAgICAgIChuYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtcbiAgICAgIHJldHVybiAzID09PSBuYXRpdmVFdmVudC5ub2RlVHlwZSA/IG5hdGl2ZUV2ZW50LnBhcmVudE5vZGUgOiBuYXRpdmVFdmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gICAgICB2Y
15852XIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlICYmICh0YXJnZXQgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSkpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGFyZ2V0W2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICAgIGE6IHN3aXRjaCAoXG4gICAgICAgICAgKCh0YXJnZXQgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSksIGludGVybmFsSW5zdGFuY2UudHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICB1cGRhdGVJbnB1dChcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBwcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgIHByb3BzLmNoZWNrZWQsXG4gICAgICAgICAgICAgIHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgICBwcm9wcy50eXBlLFxuICAgICAgICAgICAgICBwcm9wcy5uYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA9IHByb3BzLm5hbWU7XG4gICAgICAgICAgICBpZiAoXCJyYWRpb1wiID09PSBwcm9wcy50eXBlICYmIG51bGwgIT0gaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgICAgICAgICBmb3IgKHByb3BzID0gdGFyZ2V0OyBwcm9wcy5wYXJlbnROb2RlOyApIHByb3BzID0gcHJvcHMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihpbnRlcm5hbEluc3RhbmNlLCBcIm5hbWVcIik7XG4gICAgICAgICAgICAgIHByb3BzID0gcHJvcHMucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnaW5wdXRbbmFtZT1cIicgK1xuICAgICAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICAgICAgXCJcIiArIGludGVybmFsSW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgJ1wiXVt0eXBlPVwicmFkaW9cIl0nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA8IHByb3BzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlKytcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyTm9kZSA9IHByb3BzW2ludGVybmFsSW5zdGFuY2VdO1xuICAgICAgICAgICAgICAgIGlmIChvdGhlck5vZGUgIT09IHRhcmdldCAmJiBvdGhlck5vZGUuZm9ybSA9PT0gdGFyZ2V0LmZvcm0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBvdGhlclByb3BzID0gb3RoZXJOb2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICBpZiAoIW90aGVyUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUlucHV0KFxuICAgICAgICAgICAgICAgICAgICBvdGhlck5vZGUsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUHJvcHMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvdGhlclByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3RoZXJQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICBvdGhlclByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICBvdGhlclByb3BzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUHJvcHMubmFtZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlID0gMDtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlIDwgcHJvcHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGludGVybmFsSW5zdGFuY2UrK1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKG90aGVyTm9kZSA9IHByb3BzW2ludGVybmFsSW5zdGFuY2VdKSxcbiAgICAgICAgICAgICAgICAgIG90aGVyTm9kZS5mb3JtID09PSB0YXJnZXQuZm9ybSAmJlxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgICAgIHVwZGF0ZVRleHRhcmVhKHRhcmdldCwgcHJvcHMudmFsdWUsIHByb3BzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgIChpbnRlcm5hbEluc3RhbmNlID0gcHJvcHMudmFsdWUpLFxuICAgICAgICAgICAgICBudWxsICE9IGludGVybmFsSW5zdGFuY2UgJiZcbiAgICAgICAgICAgICAgICB1cGRhdGVPcHRpb25zKHRhcmdldCwgISFwcm9wcy5tdWx0aXBsZSwgaW50ZXJuYWxJbnN0YW5jZSwgITEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEsIGIpIHtcbiAgICAgIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikgcmV0dXJuIGZuKGEsIGIpO1xuICAgICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSAhMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBmbihhKTtcbiAgICAgICAgcmV0dXJuIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gITEpLFxuICAgICAgICAgIG51bGwgIT09IHJlc3RvcmVUYXJnZXQgfHwgbnVsbCAhPT0gcmVzdG9yZVF1ZXVlKVxuICAgICAgICApXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGZsdXNoU3luY1dvcmskMSgpLFxuICAgICAgICAgICAgcmVzdG9yZVRhcmdldCAmJlxuICAgICAgICAgICAgICAoKGEgPSByZXN0b3JlVGFyZ2V0KSxcbiAgICAgICAgICAgICAgKGZuID0gcmVzdG9yZVF1ZXVlKSxcbiAgICAgICAgICAgICAgKHJlc3RvcmVRdWV1ZSA9IHJlc3RvcmVUYXJnZXQgPSBudWxsKSxcbiAgICAgICAgICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQoYSksXG4gICAgICAgICAgICAgIGZuKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgZm4ubGVuZ3RoOyBhKyspIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KGZuW2FdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgICAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuICAgICAgaWYgKG51bGwgPT09IHN0YXRlTm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICB2Y
15852XIgcHJvcHMgPSBzdGF0ZU5vZGVbaW50ZXJuYWxQcm9wc0tleV0gfHwgbnVsbDtcbiAgICAgIGlmIChudWxsID09PSBwcm9wcykgcmV0dXJuIG51bGw7XG4gICAgICBzdGF0ZU5vZGUgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAgIGE6IHN3aXRjaCAocmVnaXN0cmF0aW9uTmFtZSkge1xuICAgICAgICBjYXNlIFwib25DbGlja1wiOlxuICAgICAgICBjYXNlIFwib25DbGlja0NhcHR1cmVcIjpcbiAgICAgICAgY2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpcbiAgICAgICAgY2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJvbk1vdXNlRG93blwiOlxuICAgICAgICBjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJvbk1vdXNlTW92ZVwiOlxuICAgICAgICBjYXNlIFwib25Nb3VzZU1vdmVDYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJvbk1vdXNlVXBcIjpcbiAgICAgICAgY2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpcbiAgICAgICAgY2FzZSBcIm9uTW91c2VFbnRlclwiOlxuICAgICAgICAgIChwcm9wcyA9ICFwcm9wcy5kaXNhYmxlZCkgfHxcbiAgICAgICAgICAgICgoaW5zdCA9IGluc3QudHlwZSksXG4gICAgICAgICAgICAocHJvcHMgPSAhKFxuICAgICAgICAgICAgICBcImJ1dHRvblwiID09PSBpbnN0IHx8XG4gICAgICAgICAgICAgIFwiaW5wdXRcIiA9PT0gaW5zdCB8fFxuICAgICAgICAgICAgICBcInNlbGVjdFwiID09PSBpbnN0IHx8XG4gICAgICAgICAgICAgIFwidGV4dGFyZWFcIiA9PT0gaW5zdFxuICAgICAgICAgICAgKSkpO1xuICAgICAgICAgIGluc3QgPSAhcHJvcHM7XG4gICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0ID0gITE7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoc3RhdGVOb2RlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHN0YXRlTm9kZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCBgXCIgK1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZSArXG4gICAgICAgICAgICBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgK1xuICAgICAgICAgICAgdHlwZW9mIHN0YXRlTm9kZSArXG4gICAgICAgICAgICBcImAgdHlwZS5cIlxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHN0YXRlTm9kZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgICAgIGlmIChmYWxsYmFja1RleHQpIHJldHVybiBmYWxsYmFja1RleHQ7XG4gICAgICB2Y
15852XIgc3RhcnQsXG4gICAgICAgIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQsXG4gICAgICAgIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGgsXG4gICAgICAgIGVuZCxcbiAgICAgICAgZW5kVmFsdWUgPSBcInZhbHVlXCIgaW4gcm9vdCA/IHJvb3QudmFsdWUgOiByb290LnRleHRDb250ZW50LFxuICAgICAgICBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG4gICAgICBmb3IgKFxuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIHN0YXJ0IDwgc3RhcnRMZW5ndGggJiYgc3RhcnRWYWx1ZVtzdGFydF0gPT09IGVuZFZhbHVlW3N0YXJ0XTtcbiAgICAgICAgc3RhcnQrK1xuICAgICAgKTtcbiAgICAgIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChcbiAgICAgICAgZW5kID0gMTtcbiAgICAgICAgZW5kIDw9IG1pbkVuZCAmJlxuICAgICAgICBzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSA9PT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXTtcbiAgICAgICAgZW5kKytcbiAgICAgICk7XG4gICAgICByZXR1cm4gKGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCAxIDwgZW5kID8gMSAtIGVuZCA6IHZvaWQgMCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gICAgICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG4gICAgICBcImNoYXJDb2RlXCIgaW4gbmF0aXZlRXZlbnRcbiAgICAgICAgPyAoKG5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQuY2hhckNvZGUpLFxuICAgICAgICAgIDAgPT09IG5hdGl2ZUV2ZW50ICYmIDEzID09PSBrZXlDb2RlICYmIChuYXRpdmVFdmVudCA9IDEzKSlcbiAgICAgICAgOiAobmF0aXZlRXZlbnQgPSBrZXlDb2RlKTtcbiAgICAgIDEwID09PSBuYXRpdmVFdmVudCAmJiAobmF0aXZlRXZlbnQgPSAxMyk7XG4gICAgICByZXR1cm4gMzIgPD0gbmF0aXZlRXZlbnQgfHwgMTMgPT09IG5hdGl2ZUV2ZW50ID8gbmF0aXZlRXZlbnQgOiAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgICAgIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChcbiAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICByZWFjdEV2ZW50VHlwZSxcbiAgICAgICAgdGFyZ2V0SW5zdCxcbiAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgICAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKVxuICAgICAgICAgIEludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgJiZcbiAgICAgICAgICAgICgocmVhY3ROYW1lID0gSW50ZXJmYWNlW3Byb3BOYW1lXSksXG4gICAgICAgICAgICAodGhpc1twcm9wTmFtZV0gPSByZWFjdE5hbWVcbiAgICAgICAgICAgICAgPyByZWFjdE5hbWUobmF0aXZlRXZlbnQpXG4gICAgICAgICAgICAgIDogbmF0aXZlRXZlbnRbcHJvcE5hbWVdKSk7XG4gICAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKFxuICAgICAgICAgIG51bGwgIT0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZFxuICAgICAgICAgICAgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkXG4gICAgICAgICAgICA6ICExID09PSBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZVxuICAgICAgICApXG4gICAgICAgICAgPyBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICAgICAgICAgIDogZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gITA7XG4gICAgICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICAgICAgICBldmVudCAmJlxuICAgICAgICAgICAgKGV2ZW50LnByZXZlbnREZWZhdWx0XG4gICAgICAgICAgICAgID8gZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICA6IFwidW5rbm93blwiICE9PSB0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAoZXZlbnQucmV0dXJuVmFsdWUgPSAhMSksXG4gICAgICAgICAgICAodGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSkpO1xuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2Y
15852XIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgICAgICAgIGV2ZW50ICYmXG4gICAgICAgICAgICAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgICAgID8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgOiBcInVua25vd25cIiAhPT0gdHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAmJlxuICAgICAgICAgICAgICAgIChldmVudC5jYW5jZWxCdWJibGUgPSAhMCksXG4gICAgICAgICAgICAodGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gICAgICB2YXIgbmF0aXZlRXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGVcbiAgICAgICAgPyBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZylcbiAgICAgICAgOiAoa2V5QXJnID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXSlcbiAgICAgICAgICA/ICEhbmF0aXZlRXZlbnRba2V5QXJnXVxuICAgICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSgpIHtcbiAgICAgIHJldHVybiBtb2RpZmllclN0YXRlR2V0dGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImtleXVwXCI6XG4gICAgICAgICAgcmV0dXJuIC0xICE9PSBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKTtcbiAgICAgICAgY2FzZSBcImtleWRvd25cIjpcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcbiAgICAgICAgY2FzZSBcImtleXByZXNzXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZWRvd25cIjpcbiAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICAgICAgbmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gICAgICByZXR1cm4gXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5hdGl2ZUV2ZW50ICYmIFwiZGF0YVwiIGluIG5hdGl2ZUV2ZW50XG4gICAgICAgID8gbmF0aXZlRXZlbnQuZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgICAgICBjYXNlIFwia2V5cHJlc3NcIjpcbiAgICAgICAgICBpZiAobmF0aXZlRXZlbnQud2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHJldHVybiBudWxsO1xuICAgICAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSAhMDtcbiAgICAgICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcbiAgICAgICAgY2FzZSBcInRleHRJbnB1dFwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZG9tRXZlbnROYW1lID0gbmF0aXZlRXZlbnQuZGF0YSksXG4gICAgICAgICAgICBkb21FdmVudE5hbWUgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzc1xuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiBkb21FdmVudE5hbWVcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKVxuICAgICAgICByZXR1cm4gXCJjb21wb3NpdGlvbmVuZFwiID09PSBkb21FdmVudE5hbWUgfHxcbiAgICAgICAgICAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiZcbiAgICAgICAgICAgIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSlcbiAgICAgICAgICA/ICgoZG9tRXZlbnROYW1lID0gZ2V0RGF0YSgpKSxcbiAgICAgICAgICAgIChmYWxsYmFja1RleHQgPSBzdGFydFRleHQgPSByb290ID0gbnVsbCksXG4gICAgICAgICAgICAoaXNDb21wb3NpbmcgPSAhMSksXG4gICAgICAgICAgICBkb21FdmVudE5hbWUpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcInBhc3RlXCI6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgXCJrZXlwcmVzc1wiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuYWx0S2V5IHx8XG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50Lm1ldGFLZXlcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgIChuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIDEgPCBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aClcbiAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgICAgICBpZiAobmF0aXZlRXZlbnQud2hpY2gpXG4gICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOlxuICAgICAgICAgI
15852HJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiBcImtvXCIgIT09IG5hdGl2ZUV2ZW50LmxvY2FsZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IG5hdGl2ZUV2ZW50LmRhdGE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gICAgICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFwiaW5wdXRcIiA9PT0gbm9kZU5hbWVcbiAgICAgICAgPyAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXVxuICAgICAgICA6IFwidGV4dGFyZWFcIiA9PT0gbm9kZU5hbWVcbiAgICAgICAgICA/ICEwXG4gICAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgICAgIGlmICghY2FuVXNlRE9NKSByZXR1cm4gITE7XG4gICAgICBldmVudE5hbWVTdWZmaXggPSBcIm9uXCIgKyBldmVudE5hbWVTdWZmaXg7XG4gICAgICB2YXIgaXNTdXBwb3J0ZWQgPSBldmVudE5hbWVTdWZmaXggaW4gZG9jdW1lbnQ7XG4gICAgICBpc1N1cHBvcnRlZCB8fFxuICAgICAgICAoKGlzU3VwcG9ydGVkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSksXG4gICAgICAgIGlzU3VwcG9ydGVkLnNldEF0dHJpYnV0ZShldmVudE5hbWVTdWZmaXgsIFwicmV0dXJuO1wiKSxcbiAgICAgICAgKGlzU3VwcG9ydGVkID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaXNTdXBwb3J0ZWRbZXZlbnROYW1lU3VmZml4XSkpO1xuICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoXG4gICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgaW5zdCxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgdGFyZ2V0XG4gICAgKSB7XG4gICAgICByZXN0b3JlVGFyZ2V0XG4gICAgICAgID8gcmVzdG9yZVF1ZXVlXG4gICAgICAgICAgPyByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpXG4gICAgICAgICAgOiAocmVzdG9yZVF1ZXVlID0gW3RhcmdldF0pXG4gICAgICAgIDogKHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQpO1xuICAgICAgaW5zdCA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCBcIm9uQ2hhbmdlXCIpO1xuICAgICAgMCA8IGluc3QubGVuZ3RoICYmXG4gICAgICAgICgobmF0aXZlRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoXG4gICAgICAgICAgXCJvbkNoYW5nZVwiLFxuICAgICAgICAgIFwiY2hhbmdlXCIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgKSksXG4gICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7IGV2ZW50OiBuYXRpdmVFdmVudCwgbGlzdGVuZXJzOiBpbnN0IH0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUp
15852IHtcbiAgICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICAgICAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuICAgICAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICAgICAgaWYgKFwiY2hhbmdlXCIgPT09IGRvbUV2ZW50TmFtZSkgcmV0dXJuIHRhcmdldEluc3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICAgICAgYWN0aXZlRWxlbWVudCQxICYmXG4gICAgICAgIChhY3RpdmVFbGVtZW50JDEuZGV0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKSxcbiAgICAgICAgKGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBhY3RpdmVFbGVtZW50JDEgPSBudWxsKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwidmFsdWVcIiA9PT0gbmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICYmXG4gICAgICAgIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCQxKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gICAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChcbiAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEsXG4gICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpXG4gICAgICAgICk7XG4gICAgICAgIGJhdGNoZWRVcGRhdGVzJDEocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGFyZ2V0SW5zdFxuICAgICkge1xuICAgICAgXCJmb2N1c2luXCIgPT09IGRvbUV2ZW50TmFtZVxuICAgICAgICA/IChzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpLFxuICAgICAgICAgIChhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXQpLFxuICAgICAgICAgIChhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdCksXG4gICAgICAgICAgYWN0aXZlRWxlbWVudCQxLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSkpXG4gICAgICAgIDogXCJmb2N1c291dFwiID09PSBkb21FdmVudE5hbWUgJiYgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJzZWxlY3Rpb25jaGFuZ2VcIiA9PT0gZG9tRXZlbnROYW1lIHx8XG4gICAgICAgIFwia2V5dXBcIiA9PT0gZG9tRXZlbnROYW1lIHx8XG4gICAgICAgIFwia2V5ZG93blwiID09PSBkb21FdmVudE5hbWVcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCQxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gICAgICBpZiAoXCJjbGlja1wiID09PSBkb21FdmVudE5hbWUpIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gICAgICBpZiAoXCJpbnB1dFwiID09PSBkb21FdmVudE5hbWUgfHwgXCJjaGFuZ2VcIiA9PT0gZG9tRXZlbnROYW1lKVxuICAgICAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgICByZXR1cm4gKHggPT09IHkgJiYgKDAgIT09IHggfHwgMSAvIHggPT09IDEgLyB5KSkgfHwgKHggIT09IHggJiYgeSAhPT0geSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gICAgICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHJldHVybiAhMDtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIG9iakEgfHxcbiAgICAgICAgbnVsbCA9PT0gb2JqQSB8fFxuICAgICAgICBcIm9iamVjdFwiICE9PSB0eXBlb2Ygb2JqQiB8fFxuICAgICAgICBudWxsID09PSBvYmpCXG4gICAgICApXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpLFxuICAgICAgICBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICAgICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICBmb3IgKGtleXNCID0gMDsga2V5c0IgPCBrZXlzQS5sZW5ndGg7IGtleXNCKyspIHtcbiAgICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtrZXlzQl07XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fFxuICAgICAgICAgICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICAgICAgZG9jID0gZG9jIHx8IChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZG9jdW1lbnQgPyBkb2N1bWVudCA6IHZvaWQgMCk7XG4gICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIGRvYykgcmV0dXJuIG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gICAgICB9IGNhdGNoIChlJDIpIHtcbiAgICAgICAgcmV0dXJuIGRvYy5ib2R5O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gICAgICBmb3IgKDsgbm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQ7ICkgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgIHJldHVybi
15852Bub2RlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICAgICAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgICAgIHJvb3QgPSAwO1xuICAgICAgZm9yICh2YXIgbm9kZUVuZDsgbm9kZTsgKSB7XG4gICAgICAgIGlmICgzID09PSBub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgbm9kZUVuZCA9IHJvb3QgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICBpZiAocm9vdCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCAtIHJvb3QgfTtcbiAgICAgICAgICByb290ID0gbm9kZUVuZDtcbiAgICAgICAgfVxuICAgICAgICBhOiB7XG4gICAgICAgICAgZm9yICg7IG5vZGU7ICkge1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBnZXRMZWFmTm9kZShub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gICAgICByZXR1cm4gb3V0ZXJOb2RlICYmIGlubmVyTm9kZVxuICAgICAgICA/IG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlXG4gICAgICAgICAgPyAhMFxuICAgICAgICAgIDogb3V0ZXJOb2RlICYmIDMgPT09IG91dGVyTm9kZS5ub2RlVHlwZVxuICAgICAgICAgICAgPyAhMVxuICAgICAgICAgICAgOiBpbm5lck5vZGUgJiYgMyA9PT0gaW5uZXJOb2RlLm5vZGVUeXBlXG4gICAgICAgICAgICAgID8gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgIDogXCJjb250YWluc1wiIGluIG91dGVyTm9kZVxuICAgICAgICAgICAgICAgID8gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSlcbiAgICAgICAgICAgICAgICA6IG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuICAgICAgICAgICAgICAgICAgPyAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KVxuICAgICAgICAgICAgICAgICAgOiAhMVxuICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcChjb250YWluZXJJbmZvKSB7XG4gICAgICBjb250YWluZXJJbmZvID1cbiAgICAgICAgbnVsbCAhPSBjb250YWluZXJJbmZvICYmXG4gICAgICAgIG51bGwgIT0gY29udGFpbmVySW5mby5vd25lckRvY3VtZW50ICYmXG4gICAgICAgIG51bGwgIT0gY29udGFpbmVySW5mby5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3XG4gICAgICAgICAgPyBjb250YWluZXJJbmZvLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXdcbiAgICAgICAgICA6IHdpbmRvdztcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChjb250YWluZXJJbmZvLmRvY3VtZW50KTtcbiAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIGNvbnRhaW5lckluZm8uSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVsZW1lbnQuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KSBjb250YWluZXJJbmZvID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChjb250YWluZXJJbmZvLmRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICAgICAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG5vZGVOYW1lICYmXG4gICAgICAgICgoXCJpbnB1dFwiID09PSBub2RlTmFtZSAmJlxuICAgICAgICAgIChcInRleHRcIiA9PT0gZWxlbS50eXBlIHx8XG4gICAgICAgICAgICBcInNlYXJjaFwiID09PSBlbGVtLnR5cGUgfHxcbiAgICAgICAgICAgIFwidGVsXCIgPT09IGVsZW0udHlwZSB8fFxuICAgICAgICAgICAgXCJ1cmxcIiA9PT0gZWxlbS50eXBlIHx8XG4gICAgICAgICAgICBcInBhc3N3b3JkXCIgPT09IGVsZW0udHlwZSkpIHx8XG4gICAgICAgICAgXCJ0ZXh0YXJlYVwiID09PSBub2RlTmFtZSB8fFxuICAgICAgICAgIFwidHJ1ZVwiID09PSBlbGVtLmNvbnRlbnRFZGl0YWJsZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KFxuICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICApIHtcbiAgICAgIHZhciBkb2MgPVxuICAgICAgICBuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgPyBuYXRpdmVFdmVudFRhcmdldC5kb2N1bWVudFxuICAgICAgICAgIDogOSA9PT0gbmF0aXZlRXZlbnRUYXJnZXQubm9kZVR5cGVcbiAgICAgICAgICAgID8gbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgIDogbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbiAgICAgIG1vdXNlRG93biB8fFxuICAgICAgICBudWxsID09IGFjdGl2ZUVsZW1lbnQgfHxcbiAgICAgICAgYWN0aXZlRWxlbWVudCAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHx8XG4gICAgICAgICgoZG9jID0gYWN0aXZlRWxlbWVudCksXG4gICAgICAgIFwic2VsZWN0aW9uU3RhcnRcIiBpbiBkb2MgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGRvYylcbiAgICAgICAgICA/IChkb2MgPSB7IHN0YXJ0Oi
15852Bkb2Muc2VsZWN0aW9uU3RhcnQsIGVuZDogZG9jLnNlbGVjdGlvbkVuZCB9KVxuICAgICAgICAgIDogKChkb2MgPSAoXG4gICAgICAgICAgICAgIChkb2Mub3duZXJEb2N1bWVudCAmJiBkb2Mub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgfHxcbiAgICAgICAgICAgICAgd2luZG93XG4gICAgICAgICAgICApLmdldFNlbGVjdGlvbigpKSxcbiAgICAgICAgICAgIChkb2MgPSB7XG4gICAgICAgICAgICAgIGFuY2hvck5vZGU6IGRvYy5hbmNob3JOb2RlLFxuICAgICAgICAgICAgICBhbmNob3JPZmZzZXQ6IGRvYy5hbmNob3JPZmZzZXQsXG4gICAgICAgICAgICAgIGZvY3VzTm9kZTogZG9jLmZvY3VzTm9kZSxcbiAgICAgICAgICAgICAgZm9jdXNPZmZzZXQ6IGRvYy5mb2N1c09mZnNldFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAobGFzdFNlbGVjdGlvbiAmJiBzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgZG9jKSkgfHxcbiAgICAgICAgICAoKGxhc3RTZWxlY3Rpb24gPSBkb2MpLFxuICAgICAgICAgIChkb2MgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QsIFwib25TZWxlY3RcIikpLFxuICAgICAgICAgIDAgPCBkb2MubGVuZ3RoICYmXG4gICAgICAgICAgICAoKG5hdGl2ZUV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KFxuICAgICAgICAgICAgICBcIm9uU2VsZWN0XCIsXG4gICAgICAgICAgICAgIFwic2VsZWN0XCIsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goeyBldmVudDogbmF0aXZlRXZlbnQsIGxpc3RlbmVyczogZG9jIH0pLFxuICAgICAgICAgICAgKG5hdGl2ZUV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQpKSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gICAgICB2Y
15852XIgcHJlZml4ZXMgPSB7fTtcbiAgICAgIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcHJlZml4ZXNbXCJXZWJraXRcIiArIHN0eWxlUHJvcF0gPSBcIndlYmtpdFwiICsgZXZlbnROYW1lO1xuICAgICAgcHJlZml4ZXNbXCJNb3pcIiArIHN0eWxlUHJvcF0gPSBcIm1velwiICsgZXZlbnROYW1lO1xuICAgICAgcmV0dXJuIHByZWZpeGVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgICAgIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSByZXR1cm4gZXZlbnROYW1lO1xuICAgICAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0sXG4gICAgICAgIHN0eWxlUHJvcDtcbiAgICAgIGZvciAoc3R5bGVQcm9wIGluIHByZWZpeE1hcClcbiAgICAgICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSlcbiAgICAgICAgICByZXR1cm4gKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF0pO1xuICAgICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICAgICAgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuc2V0KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKTtcbiAgICAgIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKHByb3BzLCBpbnN0YW5jZSkge1xuICAgICAgaWYgKG51bGwgIT0gcHJvcHMubmFtZSAmJiBcImF1dG9cIiAhPT0gcHJvcHMubmFtZSkgcmV0dXJuIHByb3BzLm5hbWU7XG4gICAgICBpZiAobnVsbCAhPT0gaW5zdGFuY2UuYXV0b05hbWUpIHJldHVybiBpbnN0YW5jZS5hdXRvTmFtZTtcbiAgICAgIHByb3BzID0gcGVuZGluZ0VmZmVjdHNSb290LmlkZW50aWZpZXJQcmVmaXg7XG4gICAgICB2Y
15852XIgZ2xvYmFsQ2xpZW50SWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIkMSsrO1xuICAgICAgcHJvcHMgPSBcIl9cIiArIHByb3BzICsgXCJ0X1wiICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgXCJfXCI7XG4gICAgICByZXR1cm4gKGluc3RhbmNlLmF1dG9OYW1lID0gcHJvcHMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDbGFzc05hbWVCeVR5cGUoY2xhc3NCeVR5cGUpIHtcbiAgICAgIGlmIChudWxsID09IGNsYXNzQnlUeXBlIHx8IFwic3RyaW5nXCIgPT09IHR5cGVvZiBjbGFzc0J5VHlwZSlcbiAgICAgICAgcmV0dXJuIGNsYXNzQnlUeXBlO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IG51bGwsXG4gICAgICAgIGFjdGl2ZVR5cGVzID0gcGVuZGluZ1RyYW5zaXRpb25UeXBlcztcbiAgICAgIGlmIChudWxsICE9PSBhY3RpdmVUeXBlcylcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBtYXRjaCA9IGNsYXNzQnlUeXBlW2FjdGl2ZVR5cGVzW2ldXTtcbiAgICAgICAgICBpZiAobnVsbCAhPSBtYXRjaCkge1xuICAgICAgICAgICAgaWYgKFwibm9uZVwiID09PSBtYXRjaCkgcmV0dXJuIFwibm9uZVwiO1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gbnVsbCA9PSBjbGFzc05hbWUgPyBtYXRjaCA6IGNsYXNzTmFtZSArIChcIiBcIiArIG1hdGNoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBudWxsID09IGNsYXNzTmFtZSA/IGNsYXNzQnlUeXBlLmRlZmF1bHQgOiBjbGFzc05hbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKGRlZmF1bHRDbGFzcywgZXZlbnRDbGFzcykge1xuICAgICAgZGVmYXVsdENsYXNzID0gZ2V0Q2xhc3NOYW1lQnlUeXBlKGRlZmF1bHRDbGFzcyk7XG4gICAgICBldmVudENsYXNzID0gZ2V0Q2xhc3NOYW1lQnlUeXBlKGV2ZW50Q2xhc3MpO1xuICAgICAgcmV0dXJuIG51bGwgPT0gZXZlbnRDbGFzc1xuICAgICAgICA/IFwiYXV0b1wiID09PSBkZWZhdWx0Q2xhc3NcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IGRlZmF1bHRDbGFzc1xuICAgICAgICA6IFwiYXV0b1wiID09PSBldmVudENsYXNzXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiBldmVudENsYXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBcnJheUtpbmQoYXJyYXkpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBraW5kID0gRU1QVFlfQVJSQVksIGkgPSAwO1xuICAgICAgICBpIDwgYXJyYXkubGVuZ3RoICYmIGkgPCBPQkpFQ1RfV0lEVEhfTElNSVQ7XG4gICAgICAgIGkrK1xuICAgICAgKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldO1xuICAgICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHZhbHVlICYmIG51bGwgIT09IHZhbHVlKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzQXJyYXlJbXBsKHZhbHVlKSAmJlxuICAgICAgICAgICAgMiA9PT0gdmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgdmFsdWVbMF1cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChraW5kICE9PSBFTVBUWV9BUlJBWSAmJiBraW5kICE9PSBFTlRSSUVTX0FSUkFZKVxuICAgICAgICAgICAgICByZXR1cm4gQ09NUExFWF9BUlJBWTtcbiAgICAgICAgICAgIGtpbmQgPSBFTlRSSUVTX0FSUkFZO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gQ09NUExFWF9BUlJBWTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgdmFsdWUgJiYgNTAgPCB2YWx1ZS
158525sZW5ndGgpIHx8XG4gICAgICAgICAgICAoa2luZCAhPT0gRU1QVFlfQVJSQVkgJiYga2luZCAhPT0gUFJJTUlUSVZFX0FSUkFZKSB8fFxuICAgICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIENPTVBMRVhfQVJSQVk7XG4gICAgICAgICAga2luZCA9IFBSSU1JVElWRV9BUlJBWTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtpbmQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE9iamVjdFRvUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMsIGluZGVudCwgcHJlZml4KSB7XG4gICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyhvYmplY3QpKSB7XG4gICAgICAgIHZhciBhZGRlZFByb3BlcnRpZXMgPSAwLFxuICAgICAgICAgIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqZWN0KVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICAgICAgICBcIl9cIiAhPT0ga2V5WzBdICYmXG4gICAgICAgICAgICAoYWRkZWRQcm9wZXJ0aWVzKyssXG4gICAgICAgICAgICBhZGRWYWx1ZVRvUHJvcGVydGllcyhrZXksIG9iamVjdFtrZXldLCBwcm9wZXJ0aWVzLCBpbmRlbnQsIHByZWZpeCksXG4gICAgICAgICAgICBhZGRlZFByb3BlcnRpZXMgPj0gT0JKRUNUX1dJRFRIX0xJTUlUKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgcHJlZml4ICtcbiAgICAgICAgICAgICAgICBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgK1xuICAgICAgICAgICAgICAgIFwiT25seSBcIiArXG4gICAgICAgICAgICAgICAgT0JKRUNUX1dJRFRIX0xJTUlUICtcbiAgICAgICAgICAgICAgICBcIiBwcm9wZXJ0aWVzIGFyZSBzaG93bi4gUmVhY3Qgd2lsbCBub3QgbG9nIG1vcmUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC5cIixcbiAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRSZWFjdEVsZW1lbnRUeXBlb2YodmFsdWUpIHtcbiAgICAgIHJldHVybiBcIiQkdHlwZW9mXCIgaW4gdmFsdWUgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgXCIkJHR5cGVvZlwiKVxuICAgICAgICA/IHZhbHVlLiQkdHlwZW9mXG4gICAgICAgIDogdm9pZCAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRWYWx1ZVRvUHJvcGVydGllcyhcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGluZGVudCxcbiAgICAgIHByZWZpeFxuICAgICkge1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIGlmIChudWxsID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBcIm51bGxcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVhZFJlYWN0RWxlbWVudFR5cGVvZih2YWx1ZSkgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgICAgICB2Y
15852XIgdHlwZU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodmFsdWUudHlwZSkgfHwgXCJcXHUyMDI2XCIsXG4gICAgICAgICAgICAgICAga2V5ID0gdmFsdWUua2V5O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnByb3BzO1xuICAgICAgICAgICAgICB2YXIgcHJvcHNLZXlzID0gT2JqZWN0LmtleXModmFsdWUpLFxuICAgICAgICAgICAgICAgIHByb3BzTGVuZ3RoID0gcHJvcHNLZXlzLmxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKG51bGwgPT0ga2V5ICYmIDAgPT09IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIjxcIiArIHR5cGVOYW1lICsgXCIgLz5cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgMyA+IGluZGVudCB8fFxuICAgICAgICAgICAgICAgICgxID09PSBwcm9wc0xlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgXCJjaGlsZHJlblwiID09PSBwcm9wc0tleXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgIG51bGwgPT0ga2V5KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiPFwiICsgdHlwZU5hbWUgKyBcIiBcXHUyMDI2IC8+XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgICBwcmVmaXggKyBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgXCI8XCIgKyB0eXBlTmFtZVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgbnVsbCAhPT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICBcImtleVwiLFxuICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgIGluZGVudCArIDEsXG4gICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSAhMTtcbiAgICAgICAgICAgICAga2V5ID0gMDtcbiAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcEtleSBpbiB2YWx1ZSlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoa2V5KyssXG4gICAgICAgICAgICAgICAgICBcImNoaWxkcmVuXCIgPT09IHByb3BLZXlcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsICE9IHZhbHVlLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCFpc0FycmF5SW1wbCh2YWx1ZS5jaGlsZHJlbikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIDAgPCB2YWx1ZS5jaGlsZHJlbi5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnR5TmFtZSA9ICEwKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHByb3BLZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgXCJfXCIgIT09IHByb3BLZXlbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZVRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtwcm9wS2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGtleSA+PSBPQkpFQ1RfV0lEVEhfTElNSVQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPyBcIj5cXHUyMDI2PC9cIiArIHR5cGVOYW1lICsgXCI+XCIgOiBcIi8+XCJcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGVOYW1lID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc2xpY2UoOCwgdHlwZU5hbWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgPyB0eXBlTmFtZSArIFwiKFwiICsgdmFsdWUgKyBcIilcIlxuICAgICAgICAgICAgICAgICAgOiB0eXBlTmFtZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBcnJheVwiID09PSB0eXBlTmFtZSlcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgocHJvcEtleSA9IHZhbHVlLmxlbmd0aCA+IE9CSkVDVF9XSURUSF9MSU1JVCksXG4gICAgICAgICAgICAgICAgKGtleSA9IGdldEFycmF5S2luZCh2YWx1ZSkpLFxuICAgICAgICAgICAgICAgIGtleSA9PT0gUFJJTUlUSVZFX0FSUkFZIHx8IGtleSA9PT0gRU1QVFlfQVJSQVkpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUuc2xpY2UoMCwgT0JKRUNUX1dJRFRIX0xJTUlUKS5jb25jYXQoXCJcXHUyMDI2XCIpXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gRU5UUklFU19BUlJBWSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICAgICAgICBwcmVmaXggKyBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgI
15852HByb3BlcnR5TmFtZSA9IDA7XG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPCB2YWx1ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA8IE9CSkVDVF9XSURUSF9MSU1JVDtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSsrXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKHR5cGVOYW1lID0gdmFsdWVbcHJvcGVydHlOYW1lXSksXG4gICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlVG9Qcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lWzBdLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lWzFdLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9wS2V5ICYmXG4gICAgICAgICAgICAgICAgICBhZGRWYWx1ZVRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgT0JKRUNUX1dJRFRIX0xJTUlULnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIFwiXFx1MjAyNlwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJQcm9taXNlXCIgPT09IHR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgIGlmIChcImZ1bGZpbGxlZFwiID09PSB2YWx1ZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoKHR5cGVOYW1lID0gcHJvcGVydGllcy5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5sZW5ndGggPiB0eXBlTmFtZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzW3R5cGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbMV0gPVxuICAgICAgICAgICAgICAgICAgICBcIlByb21pc2U8XCIgKyAocHJvcGVydGllc1sxXSB8fCBcIk9iamVjdFwiKSArIFwiPlwiO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBcInJlamVjdGVkXCIgPT09IHZhbHVlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICgodHlwZU5hbWUgPSBwcm9wZXJ0aWVzLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5yZWFzb24sXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgaW5kZW50LFxuICAgICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxlbmd0aCA+IHR5cGVOYW1lKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllc1t0eXBlTmFtZV07XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1sxXSA9IFwiUmVqZWN0ZWQgUHJvbWlzZTxcIiArIHByb3BlcnRpZXNbMV0gKyBcIj5cIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgICBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgXCJQcm9taXNlXCJcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiT2JqZWN0XCIgPT09IHR5cGVOYW1lICYmXG4gICAgICAgICAgICAgIChwcm9wS2V5ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcHJvcEtleS5jb25zdHJ1Y3RvciAmJlxuICAgICAgICAgICAgICAodHlwZU5hbWUgPSBwcm9wS2V5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgcHJlZml4ICsgXCJcXHUwMGEwXFx1MDBhMFwiLnJlcGVhdChpbmRlbnQpICsgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICBcIk9iamVjdFwiID09PSB0eXBlTmFtZSA/ICgzID4gaW5kZW50ID8gXCJcIiA6IFwiXFx1MjAyNlwiKSA6IHR5cGVOYW1lXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIDMgPiBpbmRlbnQgJiZcbiAgICAgICAgICAgICAgYWRkT2JqZWN0VG9Qcm9wZXJ0aWVzKHZhbHVlLCBwcm9wZXJ0aWVzLCBpbmRlbnQgKyAxLCBwcmVmaXgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgIHZhbHVlID1cbiAgICAgICAgICAgIFwiXCIgPT09IHZhbHVlIHx8IFwic3RyaW5nXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgICA/IFwiKCkgPT4ge31cIlxuICAgICAgICAgICAgICA6IHZhbHVlICsgXCIoKSB7fVwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgdmFsdWUgPT09IE9NSVRURURfUFJPUF9FUlJPUlxuICAgICAgICAgICAgICA/IFwiXFx1MjAyNlwiXG4gICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAxMDI0IDw9IHZhbHVlLmxlbmd0aCA/IHZhbHVlLnNsaWNlKDAsIDEwMjMpICsgXCJcXHUyMDI2XCIgOiB2YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICB2YWx1ZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgI
15852HZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgIHByZWZpeCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIHByb3BlcnR5TmFtZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRPYmplY3REaWZmVG9Qcm9wZXJ0aWVzKHByZXYsIG5leHQsIHByb3BlcnRpZXMsIGluZGVudCkge1xuICAgICAgdmFyIGlzRGVlcGx5RXF1YWwgPSAhMCxcbiAgICAgICAgcHJldlByb3BlcnRpZXNDaGVja2VkID0gMDtcbiAgICAgIGZvciAoa2V5IGluIHByZXYpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCA+IE9CSkVDVF9XSURUSF9MSU1JVCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICBcIlByZXZpb3VzIG9iamVjdCBoYXMgbW9yZSB0aGFuIFwiICtcbiAgICAgICAgICAgICAgT0JKRUNUX1dJRFRIX0xJTUlUICtcbiAgICAgICAgICAgICAgXCIgcHJvcGVydGllcy4gUmVhY3Qgd2lsbCBub3QgYXR0ZW1wdCB0byBkaWZmIG9iamVjdHMgd2l0aCB0b28gbWFueSBwcm9wZXJ0aWVzLlwiLFxuICAgICAgICAgICAgXCJcIlxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSAhMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBrZXkgaW4gbmV4dCB8fFxuICAgICAgICAgIChwcm9wZXJ0aWVzLnB1c2goW1xuICAgICAgICAgICAgUkVNT1ZFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIGtleSxcbiAgICAgICAgICAgIFwiXFx1MjAyNlwiXG4gICAgICAgICAgXSksXG4gICAgICAgICAgKGlzRGVlcGx5RXF1YWwgPSAhMSkpO1xuICAgICAgICBwcmV2UHJvcGVydGllc0NoZWNrZWQrKztcbiAgICAgIH1cbiAgICAgIHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCA9IDA7XG4gICAgICBmb3IgKHZhciBfa2V5IGluIG5leHQpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCA+IE9CSkVDVF9XSURUSF9MSU1JVCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICBcIk5leHQgb2JqZWN0IGhhcyBtb3JlIHRoYW4gXCIgK1xuICAgICAgICAgICAgICBPQkpFQ1RfV0lEVEhfTElNSVQgK1xuICAgICAgICAgICAgICBcIiBwcm9wZXJ0aWVzLiBSZWFjdCB3aWxsIG5vdCBhdHRlbXB0IHRvIGRpZmYgb2JqZWN0cyB3aXRoIHRvbyBtYW55IHByb3BlcnRpZXMuXCIsXG4gICAgICAgICAgICBcIlwiXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgaXNEZWVwbHlFcXVhbCA9ICExO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfa2V5IGluIHByZXYpIHtcbiAgICAgICAgICB2Y
15852XIga2V5ID0gcHJldltfa2V5XTtcbiAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gbmV4dFtfa2V5XTtcbiAgICAgICAgICBpZiAoa2V5ICE9PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICgwID09PSBpbmRlbnQgJiYgXCJjaGlsZHJlblwiID09PSBfa2V5KSB7XG4gICAgICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBfa2V5O1xuICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgICAgICAgICAgW1JFTU9WRUQgKyBpc0RlZXBseUVxdWFsLCBcIlxcdTIwMjZcIl0sXG4gICAgICAgICAgICAgICAgW0FEREVEICsgaXNEZWVwbHlFcXVhbCwgXCJcXHUyMDI2XCJdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSAhMTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISgzIDw9IGluZGVudCkpXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Yga2V5ICYmXG4gICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5leHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT09IGtleSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT09IG5leHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIHJlYWRSZWFjdEVsZW1lbnRUeXBlb2Yoa2V5KSA9PT1cbiAgICAgICAgICAgICAgICAgIHJlYWRSZWFjdEVsZW1lbnRUeXBlb2YobmV4dFZhbHVlKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKHJlYWRSZWFjdEVsZW1lbnRUeXBlb2YobmV4dFZhbHVlKSA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGtleS50eXBlID09PSBuZXh0VmFsdWUudHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICBrZXkua2V5ID09PSBuZXh0VmFsdWUua2V5XG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG5leHRWYWx1ZS50eXBlKSB8fCBcIlxcdTIwMjZcIjtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWVwbHlFcXVhbCA9IFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXk7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IFwiPFwiICsga2V5ICsgXCIgXFx1MjAyNiAvPlwiO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgW1JFTU9WRUQgKyBpc0RlZXBseUVxdWFsLCBrZXldLFxuICAgICAgICAgICAgICAgICAgICAgIFtBRERFRCArIGlzRGVlcGx5RXF1YWwsIGtleV1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWVwbHlFcXVhbCA9ICExO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIHByZXZLaW5kID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleSksXG4gICAgICAgICAgICAgICAgICAgIG5leHRLaW5kID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5leHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHByZXZLaW5kID09PSBuZXh0S2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAoXCJbb2JqZWN0IE9iamVjdF1cIiA9PT0gbmV4dEtpbmQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBcIltvYmplY3QgQXJyYXldXCIgPT09IG5leHRLaW5kKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZLaW5kID0gW1xuICAgICAgICAgICAgICAgICAgICAgIFVOQ0hBTkdFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXksXG4gICAgICAgICAgICAgICAgICAgICAgXCJbb2JqZWN0IEFycmF5XVwiID09PSBuZXh0S2luZCA/IFwiQXJyYXlcIiA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHByZXZLaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEtpbmQgPSBwcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYWRkT2JqZWN0RGlmZlRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgMVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgPyBuZXh0S2luZCA9PT0gcHJvcGVydGllcy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2S2luZFsxXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVmZXJlbnRpYWxseSB1bmVxdWFsIGJ1dCBkZWVwbHkgZXF1YWwgb2JqZWN0cy4gQ29uc2lkZXIgbWVtb2l6YXRpb24uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgOiAoaXNEZWVwbHlFcXVhbCA9ICExKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBrZXkgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXh0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICBrZXkubmFtZSA9PT0gbmV4dFZhbHVlLm5hbWUgJiZcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoID09PSBuZXh0VmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKChwcmV2S2luZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleSkpLFxuICAgICAgICAgICAgICAgIChuZXh0S2luZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5leHRWYWx1ZSkpLFxuICAgICAgICAgICAgICAgI
15852HByZXZLaW5kID09PSBuZXh0S2luZClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAga2V5ID1cbiAgICAgICAgICAgICAgICAgIFwiXCIgPT09IG5leHRWYWx1ZS5uYW1lID8gXCIoKSA9PiB7fVwiIDogbmV4dFZhbHVlLm5hbWUgKyBcIigpIHt9XCI7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgIFVOQ0hBTkdFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXksXG4gICAgICAgICAgICAgICAgICBrZXkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBSZWZlcmVudGlhbGx5IHVuZXF1YWwgZnVuY3Rpb24gY2xvc3VyZS4gQ29uc2lkZXIgbWVtb2l6YXRpb24uXCJcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoX2tleSwga2V5LCBwcm9wZXJ0aWVzLCBpbmRlbnQsIFJFTU9WRUQpO1xuICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoX2tleSwgbmV4dFZhbHVlLCBwcm9wZXJ0aWVzLCBpbmRlbnQsIEFEREVEKTtcbiAgICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICBBRERFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXksXG4gICAgICAgICAgICBcIlxcdTIwMjZcIlxuICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKGlzRGVlcGx5RXF1YWwgPSAhMSk7XG4gICAgICAgIHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzRGVlcGx5RXF1YWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcykge1xuICAgICAgY3VycmVudFRyYWNrID1cbiAgICAgICAgbGFuZXMgJiA2M1xuICAgICAgICAgID8gXCJCbG9ja2luZ1wiXG4gICAgICAgICAgOiBsYW5lcyAmIDY0XG4gICAgICAgICAgICA/IFwiR2VzdHVyZVwiXG4gICAgICAgICAgICA6IGxhbmVzICYgNDE5NDE3NlxuICAgICAgICAgICAgICA/IFwiVHJhbnNpdGlvblwiXG4gICAgICAgICAgICAgIDogbGFuZXMgJiA2MjkxNDU2MFxuICAgICAgICAgICAgICAgID8gXCJTdXNwZW5zZVwiXG4gICAgICAgICAgICAgICAgOiBsYW5lcyAmIDIwODAzNzQ3ODRcbiAgICAgICAgICAgICAgICAgID8gXCJJZGxlXCJcbiAgICAgICAgICAgICAgICAgIDogXCJPdGhlclwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21wb25lbnRUcmlnZ2VyKGZpYmVyLCBzdGFydFRpbWUsIGVuZFRpbWUsIHRyaWdnZXIpIHtcbiAgICAgIHN1cHBvcnRzVXNlclRpbWluZyAmJlxuICAgICAgICAoKHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucy5zdGFydCA9IHN0YXJ0VGltZSksXG4gICAgICAgIChyZXVzYWJsZUNvbXBvbmVudE9wdGlvbnMuZW5kID0gZW5kVGltZSksXG4gICAgICAgIChyZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzLmNvbG9yID0gXCJ3YXJuaW5nXCIpLFxuICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy50b29sdGlwVGV4dCA9IHRyaWdnZXIpLFxuICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy5wcm9wZXJ0aWVzID0gbnVsbCksXG4gICAgICAgIChmaWJlciA9IGZpYmVyLl9kZWJ1Z1Rhc2spXG4gICAgICAgICAgPyBmaWJlci5ydW4oXG4gICAgICAgICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUuYmluZChcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgIHJldXNhYmxlQ29tcG9uZW50T3B0aW9uc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBwZXJmb3JtYW5jZS5tZWFzdXJlKHRyaWdnZXIsIHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucyksXG4gICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXModHJpZ2dlcikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21wb25lbnRSZWFwcGVhcmVkKGZpYmVyLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoZmliZXIsIHN0YXJ0VGltZSwgZW5kVGltZSwgXCJSZWNvbm5lY3RcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0NvbXBvbmVudFJlbmRlcihcbiAgICAgIGZpYmVyLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIHdhc0h5ZHJhdGVkLFxuICAgICAgY29tbWl0dGVkTGFuZXNcbiAgICApIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcik7XG4gICAgICBpZiAobnVsbCAhPT0gbmFtZSAmJiBzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgICBzZWxmVGltZSA9IGZpYmVyLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICBpZiAobnVsbCA9PT0gYWx0ZXJuYXRlIHx8IGFsdGVybmF0ZS5jaGlsZCAhPT0gZmliZXIuY2hpbGQpXG4gICAgICAgICAgZm9yICh2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgbnVsbCAhPT0gY2hpbGQ7IGNoaWxkID0gY2hpbGQuc2libGluZylcbiAgICAgICAgICAgIHNlbGZUaW1lIC09IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICBzZWxmVGltZSA9XG4gICAgICAgICAgMC41ID4gc2VsZlRpbWVcbiAgICAgICAgICAgID8gd2FzSHlkcmF0ZWRcbiAgICAgICAgICAgICAgPyBcInRlcnRpYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgOiBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICAgICAgOiAxMCA+IHNlbGZUaW1lXG4gICAgICAgICAgICAgID8gd2FzSHlkcmF0ZWRcbiAgICAgICAgICAgICAgICA/IFwidGVydGlhcnlcIlxuICAgICAgICAgICAgICAgIDogXCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgOiAxMDAgPiBzZWxmVGltZVxuICAgICAgICAgICAgICAgID8gd2FzSHlkcmF0ZWRcbiAgICAgICAgICAgICAgICAgID8gXCJ0ZXJ0aWFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIDogXCJwcmltYXJ5LWRhcmtcIlxuICAgICAgICAgICAgICAgIDogXCJlcnJvclwiO1xuICAgICAgICB2Y
15852XIgcHJvcHMgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICB3YXNIeWRyYXRlZCA9IGZpYmVyLl9kZWJ1Z1Rhc2s7XG4gICAgICAgIG51bGwgIT09IHByb3BzICYmXG4gICAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJlxuICAgICAgICBhbHRlcm5hdGUubWVtb2l6ZWRQcm9wcyAhPT0gcHJvcHNcbiAgICAgICAgICA/ICgoY2hpbGQgPSBbcmV1c2FibGVDaGFuZ2VkUHJvcHNFbnRyeV0pLFxuICAgICAgICAgICAgKHByb3BzID0gYWRkT2JqZWN0RGlmZlRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgYWx0ZXJuYXRlLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAxIDwgY2hpbGQubGVuZ3RoXG4gICAgICAgICAgICAgID8gKHByb3BzICYmXG4gICAgICAgICAgICAgICAgIWFscmVhZHlXYXJuZWRGb3JEZWVwRXF1YWxpdHkgJiZcbiAgICAgICAgICAgICAgICAwID09PSAoYWx0ZXJuYXRlLmxhbmVzICYgY29tbWl0dGVkTGFuZXMpICYmXG4gICAgICAgICAgICAgICAgMTAwIDwgZmliZXIuYWN0dWFsRHVyYXRpb25cbiAgICAgICAgICAgICAgICAgID8gKChhbHJlYWR5V2FybmVkRm9yRGVlcEVxdWFsaXR5ID0gITApLFxuICAgICAgICAgICAgICAgICAgICAoY2hpbGRbMF0gPSByZXVzYWJsZURlZXBseUVxdWFsUHJvcHNFbnRyeSksXG4gICAgICAgICAgICAgICAgICAgIChyZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzLmNvbG9yID0gXCJ3YXJuaW5nXCIpLFxuICAgICAgICAgICAgICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy50b29sdGlwVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgREVFUF9FUVVBTElUWV9XQVJOSU5HKSlcbiAgICAgICAgICAgICAgICAgIDogKChyZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzLmNvbG9yID0gc2VsZlRpbWUpLFxuICAgICAgICAgICAgICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy50b29sdGlwVGV4dCA9IG5hbWUpKSxcbiAgICAgICAgICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy5wcm9wZXJ0aWVzID0gY2hpbGQpLFxuICAgICAgICAgICAgICAgIChyZXVzYWJsZUNvbXBvbmVudE9wdGlvbnMuc3RhcnQgPSBzdGFydFRpbWUpLFxuICAgICAgICAgICAgICAgIChyZXVzYWJsZUNvbXBvbmVudE9wdGlvbnMuZW5kID0gZW5kVGltZSksXG4gICAgICAgICAgICAgICAgKGZpYmVyID0gXCJcXHUyMDBiXCIgKyBuYW1lKSxcbiAgICAgICAgICAgICAgICBudWxsICE9IHdhc0h5ZHJhdGVkXG4gICAgICAgICAgICAgICAgICA/IHdhc0h5ZHJhdGVkLnJ1bihcbiAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVDb21wb25lbnRPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoZmliZXIsIHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucyksXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhmaWJlcikpXG4gICAgICAgICAgICAgIDogbnVsbCAhPSB3YXNIeWRyYXRlZFxuICAgICAgICAgICAgICAgID8gd2FzSHlkcmF0ZWQucnVuKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmVGltZVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgIHNlbGZUaW1lXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgIDogbnVsbCAhPSB3YXNIeWRyYXRlZFxuICAgICAgICAgICAgPyB3YXNIeWRyYXRlZC5ydW4oXG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICBzZWxmVGltZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIHNlbGZUaW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHN0YXJ0VGltZSwgZW5kVGltZSwgZXJyb3JzKSB7XG4gICAgICBpZiAoc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcik7XG4gICAgICAgIGlmIChudWxsICE9PSBuYW1lKSB7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgI
15852HZhciBkZWJ1Z1Rhc2sgPSBudWxsLCBwcm9wZXJ0aWVzID0gW10sIGkgPSAwO1xuICAgICAgICAgICAgaSA8IGVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBjYXB0dXJlZFZhbHVlID0gZXJyb3JzW2ldO1xuICAgICAgICAgICAgbnVsbCA9PSBkZWJ1Z1Rhc2sgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY2FwdHVyZWRWYWx1ZS5zb3VyY2UgJiZcbiAgICAgICAgICAgICAgKGRlYnVnVGFzayA9IGNhcHR1cmVkVmFsdWUuc291cmNlLl9kZWJ1Z1Rhc2spO1xuICAgICAgICAgICAgY2FwdHVyZWRWYWx1ZSA9IGNhcHR1cmVkVmFsdWUudmFsdWU7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goW1xuICAgICAgICAgICAgICBcIkVycm9yXCIsXG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBjYXB0dXJlZFZhbHVlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IGNhcHR1cmVkVmFsdWUgJiZcbiAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNhcHR1cmVkVmFsdWUubWVzc2FnZVxuICAgICAgICAgICAgICAgID8gU3RyaW5nKGNhcHR1cmVkVmFsdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyhjYXB0dXJlZFZhbHVlKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IGZpYmVyLmtleSAmJlxuICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXCJrZXlcIiwgZmliZXIua2V5LCBwcm9wZXJ0aWVzLCAwLCBcIlwiKTtcbiAgICAgICAgICBudWxsICE9PSBmaWJlci5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICBhZGRPYmplY3RUb1Byb3BlcnRpZXMoZmliZXIubWVtb2l6ZWRQcm9wcywgcHJvcGVydGllcywgMCwgXCJcIik7XG4gICAgICAgICAgbnVsbCA9PSBkZWJ1Z1Rhc2sgJiYgKGRlYnVnVGFzayA9IGZpYmVyLl9kZWJ1Z1Rhc2spO1xuICAgICAgICAgIGZpYmVyID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0VGltZSxcbiAgICAgICAgICAgIGVuZDogZW5kVGltZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBkZXZ0b29sczoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgdHJhY2s6IENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgdG9vbHRpcFRleHQ6XG4gICAgICAgICAgICAgICAgICAxMyA9PT0gZmliZXIudGFnXG4gICAgICAgICAgICAgICAgICAgID8gXCJIeWRyYXRpb24gZmFpbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIkVycm9yIGJvdW5kYXJ5IGNhdWdodCBhbiBlcnJvclwiLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgbmFtZSA9IFwiXFx1MjAwYlwiICsgbmFtZTtcbiAgICAgICAgICBkZWJ1Z1Rhc2tcbiAgICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQocGVyZm9ybWFuY2UsIG5hbWUsIGZpYmVyKSlcbiAgICAgICAgICAgIDogcGVyZm9ybWFuY2UubWVhc3VyZShuYW1lLCBmaWJlcik7XG4gICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21wb25lbnRFZmZlY3QoZmliZXIsIHN0YXJ0VGltZSwgZW5kVGltZSwgc2VsZlRpbWUsIGVycm9ycykge1xuICAgICAgaWYgKG51bGwgIT09IGVycm9ycykge1xuICAgICAgICBpZiAoc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gbmFtZSkge1xuICAgICAgICAgICAgc2VsZlRpbWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBlcnJvciA9IGVycm9yc1tpXS52YWx1ZTtcbiAgICAgICAgICAgICAgc2VsZlRpbWUucHVzaChbXG4gICAgICAgICAgICAgICAgXCJFcnJvclwiLFxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudWxsICE9PSBmaWJlci5rZXkgJiZcbiAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXCJrZXlcIiwgZmliZXIua2V5LCBzZWxmVGltZSwgMCwgXCJcIik7XG4gICAgICAgICAgICBudWxsICE9PSBmaWJlci5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICAgIGFkZE9iamVjdFRvUHJvcGVydGllcyhmaWJlci5tZW1vaXplZFByb3BzLCBzZWxmVGltZSwgMCwgXCJcIik7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSB7XG4gICAgICAgICAgICAgIHN0YXJ0OiBzdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZDogZW5kVGltZSxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgZGV2dG9vbHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgICB0cmFjazogQ09NUE9ORU5UU19UUkFDSyxcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0OiBcIkEgbGlmZWN5Y2xlIG9yIGVmZmVjdCBlcnJvcmVkXCIsXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBzZWxmVGltZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZpYmVyID0gZmliZXIuX2RlYnVnVGFzaztcbiAgICAgICAgICAgIGVuZFRpbWUgPSBcIlxcdTIwMGJcIiArIG5hbWU7XG4gICAgICAgICAgICBmaWJlclxuICAgICAgICAgICAgICA/IGZpYmVyLnJ1bihcbiAgICAgICAgICAgICAgICAgI
15852HBlcmZvcm1hbmNlLm1lYXN1cmUuYmluZChwZXJmb3JtYW5jZSwgZW5kVGltZSwgc3RhcnRUaW1lKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBwZXJmb3JtYW5jZS5tZWFzdXJlKGVuZFRpbWUsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGVuZFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIChuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpLFxuICAgICAgICAgIG51bGwgIT09IG5hbWUgJiZcbiAgICAgICAgICAgIHN1cHBvcnRzVXNlclRpbWluZyAmJlxuICAgICAgICAgICAgKChlcnJvcnMgPVxuICAgICAgICAgICAgICAxID4gc2VsZlRpbWVcbiAgICAgICAgICAgICAgICA/IFwic2Vjb25kYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICA6IDEwMCA+IHNlbGZUaW1lXG4gICAgICAgICAgICAgICAgICA/IFwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgIDogNTAwID4gc2VsZlRpbWVcbiAgICAgICAgICAgICAgICAgICAgPyBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcImVycm9yXCIpLFxuICAgICAgICAgICAgKGZpYmVyID0gZmliZXIuX2RlYnVnVGFzaylcbiAgICAgICAgICAgICAgPyBmaWJlci5ydW4oXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgZXJyb3JzXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ1N1c3BlbmRlZFJlbmRlclBoYXNlKHN0YXJ0VGltZSwgZW5kVGltZSwgbGFuZXMsIGRlYnVnVGFzaykge1xuICAgICAgIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICBlbmRUaW1lIDw9IHN0YXJ0VGltZSB8fFxuICAgICAgICAoKGxhbmVzID1cbiAgICAgICAgICAobGFuZXMgJiA3MzgxOTc2NTMpID09PSBsYW5lcyA/IFwidGVydGlhcnktZGFya1wiIDogXCJwcmltYXJ5LWRhcmtcIiksXG4gICAgICAgIGRlYnVnVGFza1xuICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgIFwiUHJld2FybVwiLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgXCJQcmV3YXJtXCIsXG4gICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dTdXNwZW5kZWRXaXRoRGVsYXlQaGFzZShzdGFydFRpbWUsIGVuZFRpbWUsIGxhbmVzLCBkZWJ1Z1Rhc2spIHtcbiAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgKChsYW5lcyA9XG4gICAgICAgICAgKGxhbmVzICYgNzM4MTk3NjUzKSA9PT0gbGFuZXMgPyBcInRlcnRpYXJ5LWRhcmtcIiA6IFwicHJpbWFyeS1kYXJrXCIpLFxuICAgICAgICBkZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICBcIlN1c3BlbmRlZFwiLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgXCJTdXNwZW5kZWRcIixcbiAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0Vycm9yZWRSZW5kZXJQaGFzZShzdGFydFRpbWUsIGVuZFRpbWUsIGxhbmVzLCBkZWJ1Z1Rhc2spIHtcbiAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgKGRlYnVnVGFza1xuICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgIFwiRXJyb3JlZFwiLFxuICAgICAgICAgICAgICAgI
15852HN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBcImVycm9yXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgIFwiRXJyb3JlZFwiLFxuICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgIFwiZXJyb3JcIlxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ1N1c3BlbmRlZENvbW1pdFBoYXNlKHN0YXJ0VGltZSwgZW5kVGltZSwgcmVhc29uLCBkZWJ1Z1Rhc2spIHtcbiAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgKGRlYnVnVGFza1xuICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgIFwic2Vjb25kYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21taXRFcnJvcmVkKHN0YXJ0VGltZSwgZW5kVGltZSwgZXJyb3JzLCBwYXNzaXZlLCBkZWJ1Z1Rhc2spIHtcbiAgICAgIGlmIChzdXBwb3J0c1VzZXJUaW1pbmcgJiYgIShlbmRUaW1lIDw9IHN0YXJ0VGltZSkpIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydGllcyA9IFtdLCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlcnJvciA9IGVycm9yc1tpXS52YWx1ZTtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goW1xuICAgICAgICAgICAgXCJFcnJvclwiLFxuICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgICAgICBudWxsICE9PSBlcnJvciAmJlxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgPyBTdHJpbmcoZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRUaW1lID0ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFRpbWUsXG4gICAgICAgICAgZW5kOiBlbmRUaW1lLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgZGV2dG9vbHM6IHtcbiAgICAgICAgICAgICAgY29sb3I6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgdHJhY2s6IGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgdHJhY2tHcm91cDogTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgIHRvb2x0aXBUZXh0OiBwYXNzaXZlXG4gICAgICAgICAgICAgICAgPyBcIlJlbWFpbmluZyBFZmZlY3RzIEVycm9yZWRcIlxuICAgICAgICAgICAgICAgIDogXCJDb21taXQgRXJyb3JlZFwiLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUuYmluZChwZXJmb3JtYW5jZSwgXCJFcnJvcmVkXCIsIHN0YXJ0VGltZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoXCJFcnJvcmVkXCIsIHN0YXJ0VGltZSk7XG4gICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMoXCJFcnJvcmVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21taXRQaGFzZShcbiAgICAgIHN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWUsXG4gICAgICBlcnJvcnMsXG4gICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24sXG4gICAgICBkZWJ1Z1Rhc2tcbiAgICApIHtcbiAgICAgIG51bGwgIT09IGVycm9yc1xuICAgICAgICA/IGxvZ0NvbW1pdEVycm9yZWQoc3RhcnRUaW1lLCBlbmRUaW1lLCBlcnJvcnMsICExLCBkZWJ1Z1Rhc2spXG4gICAgICAgIDogIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgIGVuZFRpbWUgPD0gc3RhcnRUaW1lIHx8XG4gICAgICAgICAgKGRlYnVnVGFza1xuICAgICAgICAgICAgPyBkZWJ1Z1Rhc2sucnVuKFxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgYWJvcnRlZFZpZXdUcmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gXCJDb21taXQgSW50ZXJydXB0ZWQgVmlldyBUcmFuc2l0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIkNvbW1pdFwiLFxuICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgYWJvcnRlZFZpZXdUcmFuc2l0aW9uID8gXCJlcnJvclwiIDogXCJzZWNvbmRhcnktZGFya1wiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgPyBcIkNvbW1pdCBJbnRlcnJ1cHRlZCBWaWV3IFRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgOiBcIkNvbW1pdFwiLFxuICAgICAgICAgICAgICAgI
15852HN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24gPyBcImVycm9yXCIgOiBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0FuaW1hdGluZ1BoYXNlKHN0YXJ0VGltZSwgZW5kVGltZSwgZGVidWdUYXNrKSB7XG4gICAgICAhc3VwcG9ydHNVc2VyVGltaW5nIHx8XG4gICAgICAgIGVuZFRpbWUgPD0gc3RhcnRUaW1lIHx8XG4gICAgICAgIChkZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICBcIkFuaW1hdGluZ1wiLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgIFwiQW5pbWF0aW5nXCIsXG4gICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgXCJzZWNvbmRhcnktZGFya1wiXG4gICAgICAgICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBlbmRJbmRleCA9IGNvbmN1cnJlbnRRdWV1ZXNJbmRleCxcbiAgICAgICAgICBpID0gKGNvbmN1cnJlbnRseVVwZGF0ZWRMYW5lcyA9IGNvbmN1cnJlbnRRdWV1ZXNJbmRleCA9IDApO1xuICAgICAgICBpIDwgZW5kSW5kZXg7XG5cbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgZmliZXIgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgICBjb25jdXJyZW50UXVldWVzW2krK10gPSBudWxsO1xuICAgICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgICBjb25jdXJyZW50UXVldWVzW2krK10gPSBudWxsO1xuICAgICAgICB2YXIgdXBkYXRlID0gY29uY3VycmVudFF1ZXVlc1tpXTtcbiAgICAgICAgY29uY3VycmVudFF1ZXVlc1tpKytdID0gbnVsbDtcbiAgICAgICAgdmFyIGxhbmUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgICBjb25jdXJyZW50UXVldWVzW2krK10gPSBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPT0gcXVldWUgJiYgbnVsbCAhPT0gdXBkYXRlKSB7XG4gICAgICAgICAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuICAgICAgICAgIG51bGwgPT09IHBlbmRpbmdcbiAgICAgICAgICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgICAgICAgICAgOiAoKHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0KSwgKHBlbmRpbmcubmV4dCA9IHVwZGF0ZSkpO1xuICAgICAgICAgIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgMCAhPT0gbGFuZSAmJiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgdXBkYXRlLCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gICAgICBjb25jdXJyZW50UXVldWVzW2NvbmN1cnJlbnRRdWV1ZXNJbmRleCsrXSA9IGZpYmVyO1xuICAgICAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSBxdWV1ZTtcbiAgICAgIGNvbmN1cnJlbnRRdWV1ZXNbY29uY3VycmVudFF1ZXVlc0luZGV4KytdID0gdXBkYXRlO1xuICAgICAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSBsYW5lO1xuICAgICAgY29uY3VycmVudGx5VXBkYXRlZExhbmVzIHw9IGxhbmU7XG4gICAgICBmaWJlci5sYW5lcyB8PSBsYW5lO1xuICAgICAgZmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICBudWxsICE9PSBmaWJlciAmJiAoZmliZXIubGFuZXMgfD0gbGFuZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICAgICAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgICAgIHJldHVybiBnZXRSb290Rm9yVXBkYXRlZEZpYmVyKGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gICAgICBlbnF1ZXVlVXBkYXRlJDEoZmliZXIsIG51bGwsIG51bGwsIGxhbmUpO1xuICAgICAgcmV0dXJuIGdldFJvb3RGb3JVcGRhdGVkRmliZXIoZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChzb3VyY2VGaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyB8PSBsYW5lO1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJiAoYWx0ZXJuYXRlLmxhbmVzIHw9IGxhbmUpO1xuICAgICAgZm9yICh2YXIgaXNIaWRkZW4gPSAhMSwgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAgICAgKHBhcmVudC5jaGlsZExhbmVzIHw9IGxhbmUpLFxuICAgICAgICAgIChhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlKSxcbiAgICAgICAgICBudWxsICE9PSBhbHRlcm5hdGUgJiYgKGFsdGVybmF0ZS5jaGlsZExhbmVzIHw9IGxhbmUpLFxuICAgICAgICAgIDIyID09PSBwYXJlbnQudGFnICYmXG4gICAgICAgICAgICAoKHNvdXJjZUZpYmVyID0gcGFyZW50LnN0YXRlTm9kZSksXG4gICAgICAgICAgICBudWxsID09PSBzb3VyY2VGaWJlciB8fFxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci5fdmlzaWJpbGl0eSAmIE9mZnNjcmVlblZpc2libGUgfHxcbiAgICAgICAgICAgICAgKGlzSGlkZGVuID0gITApKSxcbiAgICAgICAgICAoc291cmNlRmliZXIgPSBwYXJlbnQpLFxuICAgICAgICAgIChwYXJlbnQgPSBwYXJlbnQucmV0dXJuKTtcbiAgICAgIHJldHVybiAzID09PSBzb3VyY2VGaWJlci50YWdcbiAgICAgICAgPyAoKHBhcmVudCA9IHNvdXJjZUZpYmVyLnN0YXRlTm9kZSksXG4gICAgICAgICAgaXNIaWRkZW4gJiZcbiAgICAgICAgICAgIG51bGwgIT09IHVwZGF0ZSAmJlxuICAgICAgICAgICAgKChpc0hpZGRlbiA9IDMxIC0gY2x6MzIobGFuZSkpLFxuICAgICAgICAgICAgKHNvdXJjZUZpYmVyID0gcGFyZW50LmhpZGRlblVwZGF0ZXMpLFxuICAgICAgICAgICAgKGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyW2lzSGlkZGVuXSksXG4gICAgICAgICAgICBudWxsID09PSBhbHRlcm5hdGVcbiAgICAgICAgICAgICAgPyAoc291cmNlRmliZXJbaXNIaWRkZW5dID0gW3VwZGF0ZV0pXG4gICAgICAgICAgICAgIDogYWx0ZXJuYXRlLnB1c2godXBkYXRlKSxcbiAgICAgICAgICAgICh1cGRhdGUubGFuZSA9IGxhbmUgfCA1MzY4NzA5MTIpKSxcbiAgICAgICAgICBwYXJlbnQpXG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihzb3VyY2VGaWJlcikge1xuICAgICAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVClcbiAgICAgICAgdGhyb3cgKFxuICAgICAgICAgICgobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gbmVzdGVkVXBkYXRlQ291bnQgPSAwKSxcbiAgICAgICAgICAocm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGwpLFxuICAgICAgICAgIEVycm9yKFxuICAgICAgICAgICAgXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgcmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciBjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXCJcbiAgICAgICAgICApKVxuICAgICAgICApO1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID4gTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUICYmXG4gICAgICAgICgobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMCksXG4gICAgICAgIChyb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbCksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIHVzZUVmZmVjdCwgYnV0IHVzZUVmZmVjdCBlaXRoZXIgZG9lc24ndCBoYXZlIGEgZGVwZW5kZW5jeSBhcnJheSwgb3Igb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlcyBvbiBldmVyeSByZW5kZXIuXCJcbiAgICAgICAgKSk7XG4gICAgICBudWxsID09PSBzb3VyY2VGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgMCAhPT0gKHNvdXJjZUZpYmVyLmZsYWdzICYgNDA5OCkgJiZcbiAgICAgICAgd2Fyb
15852kFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICBmb3IgKHZhciBub2RlID0gc291cmNlRmliZXIsIHBhcmVudCA9IG5vZGUucmV0dXJuOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAgICAgbnVsbCA9PT0gbm9kZS5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAwICE9PSAobm9kZS5mbGFncyAmIDQwOTgpICYmXG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlciksXG4gICAgICAgICAgKG5vZGUgPSBwYXJlbnQpLFxuICAgICAgICAgIChwYXJlbnQgPSBub2RlLnJldHVybik7XG4gICAgICByZXR1cm4gMyA9PT0gbm9kZS50YWcgPyBub2RlLnN0YXRlTm9kZSA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc29sdmVUeXBlRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgICAgIGlmIChudWxsID09PSByZXNvbHZlRmFtaWx5KSByZXR1cm4gdHlwZTtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZmFtaWx5ID8gdHlwZSA6IGZhbWlseS5jdXJyZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoZmliZXIsIGVsZW1lbnQpIHtcbiAgICAgIGlmIChudWxsID09PSByZXNvbHZlRmFtaWx5KSByZXR1cm4gITE7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlc29sdmVGYW1pbHksXG4gICAgICAgIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC50eXBlO1xuICAgICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gITEsXG4gICAgICAgICQkdHlwZW9mTmV4dFR5cGUgPVxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlbGVtZW50ICYmIG51bGwgIT09IGVsZW1lbnRcbiAgICAgICAgICAgID8gZWxlbWVudC4kJHR5cGVvZlxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGVsZW1lbnQgJiYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gITApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZWxlbWVudFxuICAgICAgICAgICAgPyAobmVlZHNDb21wYXJlRmFtaWxpZXMgPSAhMClcbiAgICAgICAgICAgIDogJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgIChuZWVkc0NvbXBhcmVGYW1pbGllcyA9ICEwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFXG4gICAgICAgICAgICA/IChuZWVkc0NvbXBhcmVGYW1pbGllcyA9ICEwKVxuICAgICAgICAgICAgOiAkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUgJiZcbiAgICAgICAgICAgICAgKG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gITApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRVxuICAgICAgICAgICAgPyAobmVlZHNDb21wYXJlRmFtaWxpZXMgPSAhMClcbiAgICAgICAgICAgIDogJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgIChuZWVkc0NvbXBhcmVGYW1pbGllcyA9ICEwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmVlZHNDb21wYXJlRmFtaWxpZXMgJiZcbiAgICAgICAgKChmaWJlciA9IHJlc29sdmUocHJldlR5cGUpKSxcbiAgICAgICAgdm9pZCAwICE9PSBmaWJlciAmJiBmaWJlciA9PT0gcmVzb2x2ZShlbGVtZW50KSlcbiAgICAgICAgPyAhMFxuICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcikge1xuICAgICAgbnVsbCAhPT0gcmVzb2x2ZUZhbWlseSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBXZWFrU2V0ICYmXG4gICAgICAgIChudWxsID09PSBmYWlsZWRCb3VuZGFyaWVzICYmIChmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKSksXG4gICAgICAgIGZhaWxlZEJvdW5kYXJpZXMuYWRkKGZpYmVyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoXG4gICAgICBmaWJlcixcbiAgICAgIHVwZGF0ZWRGYW1pbGllcyxcbiAgICAgIHN0YWxlRmFtaWxpZXNcbiAgICApIHtcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIF9maWJlciA9IGZpYmVyLFxuICAgICAgICAgIGFsdGVybmF0ZSA9IF9maWJlci5hbHRlcm5hdGUsXG4gICAgICAgICAgY2hpbGQgPSBfZmliZXIuY2hpbGQsXG4gICAgICAgICAgc2libGluZyA9IF9maWJlci5zaWJsaW5nLFxuICAgICAgICAgIHRhZyA9IF9maWJlci50YWcsXG4gICAgICAgICAgdHlwZSA9IF9maWJlci50eXBlLFxuICAgICAgICAgIGVsZW1lbnRUeXBlID0gX2ZpYmVyLmVsZW1lbnRUeXBlLFxuICAgICAgICAgIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuICAgICAgICBfZmliZXIgPSBudWxsO1xuICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIF9maWJlciA9IGVsZW1lbnRUeXBlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF9maWJlciA9IGVsZW1lbnRUeXBlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIChjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXIpLCAoX2ZpYmVyID0gZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudWxsID09PSByZXNvbHZlRmFtaWx5KVxuICAgICAgICAgI
15852HRocm93IEVycm9yKFwiRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuXCIpO1xuICAgICAgICB2YXIgcmVzb2x2ZSA9IHJlc29sdmVGYW1pbHk7XG4gICAgICAgIHR5cGUgPSBlbGVtZW50VHlwZSA9ICExO1xuICAgICAgICBudWxsICE9PSBjYW5kaWRhdGVUeXBlICYmXG4gICAgICAgICAgKChjYW5kaWRhdGVUeXBlID0gcmVzb2x2ZShjYW5kaWRhdGVUeXBlKSksXG4gICAgICAgICAgdm9pZCAwICE9PSBjYW5kaWRhdGVUeXBlICYmXG4gICAgICAgICAgICAoc3RhbGVGYW1pbGllcy5oYXMoY2FuZGlkYXRlVHlwZSlcbiAgICAgICAgICAgICAgPyAodHlwZSA9ICEwKVxuICAgICAgICAgICAgICA6IHVwZGF0ZWRGYW1pbGllcy5oYXMoY2FuZGlkYXRlVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAoMSA9PT0gdGFnID8gKHR5cGUgPSAhMCkgOiAoZWxlbWVudFR5cGUgPSAhMCkpKSk7XG4gICAgICAgIHR5cGUgfHxcbiAgICAgICAgICBudWxsID09PSBfZmliZXIgfHxcbiAgICAgICAgICAoKHRhZyA9IHJlc29sdmUoX2ZpYmVyKSksXG4gICAgICAgICAgdm9pZCAwICE9PSB0YWcgJiYgc3RhbGVGYW1pbGllcy5oYXModGFnKVxuICAgICAgICAgICAgPyAodHlwZSA9ICEwKVxuICAgICAgICAgICAgOiBcIm9iamVjdFwiID09PSB0eXBlb2YgX2ZpYmVyICYmXG4gICAgICAgICAgICAgIF9maWJlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgICgodGFnID0gX2ZpYmVyLl9wYXlsb2FkKSxcbiAgICAgICAgICAgICAgMSA9PT0gdGFnLl9zdGF0dXMgJiZcbiAgICAgICAgICAgICAgICAoKHRhZyA9IHJlc29sdmUodGFnLl9yZXN1bHQuZGVmYXVsdCkpLFxuICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gdGFnICYmIHN0YWxlRmFtaWxpZXMuaGFzKHRhZykgJiYgKHR5cGUgPSAhMCkpKSk7XG4gICAgICAgIG51bGwgIT09IGZhaWxlZEJvdW5kYXJpZXMgJiZcbiAgICAgICAgICAoZmFpbGVkQm91bmRhcmllcy5oYXMoZmliZXIpIHx8XG4gICAgICAgICAgICAobnVsbCAhPT0gYWx0ZXJuYXRlICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpKSAmJlxuICAgICAgICAgICh0eXBlID0gITApO1xuICAgICAgICB0eXBlICYmIChmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSAhMCk7XG4gICAgICAgIGlmICh0eXBlIHx8IGVsZW1lbnRUeXBlKVxuICAgICAgICAgIChhbHRlcm5hdGUgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpKSxcbiAgICAgICAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoYWx0ZXJuYXRlLCBmaWJlciwgMik7XG4gICAgICAgIG51bGwgPT09IGNoaWxkIHx8XG4gICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIHVwZGF0ZWRGYW1pbGllcyxcbiAgICAgICAgICAgIHN0YWxlRmFtaWxpZXNcbiAgICAgICAgICApO1xuICAgICAgICBpZiAobnVsbCA9PT0gc2libGluZykgYnJlYWs7XG4gICAgICAgIGZpYmVyID0gc2libGluZztcbiAgICAgIH0gd2hpbGUgKDEpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgIHRoaXMuc2libGluZyA9XG4gICAgICAgIHRoaXMuY2hpbGQgPVxuICAgICAgICB0aGlzLnJldHVybiA9XG4gICAgICAgIHRoaXMuc3RhdGVOb2RlID1cbiAgICAgICAgdGhpcy50eXBlID1cbiAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgdGhpcy5yZWZDbGVhbnVwID0gdGhpcy5yZWYgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9XG4gICAgICAgIHRoaXMubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgIHRoaXMudXBkYXRlUXVldWUgPVxuICAgICAgICB0aGlzLm1lbW9pemVkUHJvcHMgPVxuICAgICAgICAgIG51bGw7XG4gICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSB0aGlzLmZsYWdzID0gMDtcbiAgICAgIHRoaXMuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIHRoaXMuY2hpbGRMYW5lcyA9IHRoaXMubGFuZXMgPSAwO1xuICAgICAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IC0wO1xuICAgICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSAtMS4xO1xuICAgICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gLTA7XG4gICAgICB0aGlzLl9kZWJ1Z1Rhc2sgPVxuICAgICAgICB0aGlzLl9kZWJ1Z1N0YWNrID1cbiAgICAgICAgdGhpcy5fZGVidWdPd25lciA9XG4gICAgICAgIHRoaXMuX2RlYnVnSW5mbyA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gITE7XG4gICAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG4gICAgICBoYXNCYWRNYXBQb2x5ZmlsbCB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgfHxcbiAgICAgICAgT2JqZWN0LnByZXZlbn
15852RFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gICAgICBDb21wb25lbnQgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICAgICAgcmV0dXJuICEoIUNvbXBvbmVudCB8fCAhQ29tcG9uZW50LmlzUmVhY3RDb21wb25lbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgICAgIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoXG4gICAgICAgICAgICBjdXJyZW50LnRhZyxcbiAgICAgICAgICAgIHBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIGN1cnJlbnQua2V5LFxuICAgICAgICAgICAgY3VycmVudC5tb2RlXG4gICAgICAgICAgKSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lciksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z1N0YWNrID0gY3VycmVudC5fZGVidWdTdGFjayksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z1Rhc2sgPSBjdXJyZW50Ll9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQpLFxuICAgICAgICAgIChjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzKSlcbiAgICAgICAgOiAoKHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IDApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSAwKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gLTApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMS4xKSk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGN1cnJlbnQuZmxhZ3MgJiAxMjA2OTEwOTc2O1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgcGVuZGluZ1Byb3BzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPVxuICAgICAgICBudWxsID09PSBwZW5kaW5nUHJvcHNcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbGFuZXM6IHBlbmRpbmdQcm9wcy5sYW5lcyxcbiAgICAgICAgICAgICAgZmlyc3RDb250ZXh0OiBwZW5kaW5nUHJvcHMuZmlyc3RDb250ZXh0LFxuICAgICAgICAgICAgICBfZGVidWdUaGVuYWJsZVN0YXRlOiBwZW5kaW5nUHJvcHMuX2RlYnVnVGhlbmFibGVTdGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnJlZkNsZWFudXAgPSBjdXJyZW50LnJlZkNsZWFudXA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0luZm8gPSBjdXJyZW50Ll9kZWJ1Z0luZm87XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgPSBjdXJyZW50Ll9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlVHlwZUZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gMTIwNjkxMDk3ODtcbiAgICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IDApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gMCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgP
15852SBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGwpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGwpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSAwKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IDApKVxuICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IDApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlKSxcbiAgICAgICAgICAocmVuZGVyTGFuZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICBudWxsID09PSByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBsYW5lczogcmVuZGVyTGFuZXMubGFuZXMsXG4gICAgICAgICAgICAgICAgICBmaXJzdENvbnRleHQ6IHJlbmRlckxhbmVzLmZpcnN0Q29udGV4dCxcbiAgICAgICAgICAgICAgICAgIF9kZWJ1Z1RoZW5hYmxlU3RhdGU6IHJlbmRlckxhbmVzLl9kZWJ1Z1RoZW5hYmxlU3RhdGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbiksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKFxuICAgICAgdHlwZSxcbiAgICAgIGtleSxcbiAgICAgIHBlbmRpbmdQcm9wcyxcbiAgICAgIG93bmVyLFxuICAgICAgbW9kZSxcbiAgICAgIGxhbmVzXG4gICAgKSB7XG4gICAgICB2Y
15852XIgZmliZXJUYWcgPSAwO1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHJlc29sdmVUeXBlRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlc29sdmVkVHlwZSlcbiAgICAgICAgc2hvdWxkQ29uc3RydWN0KHJlc29sdmVkVHlwZSkgJiYgKGZpYmVyVGFnID0gMSk7XG4gICAgICBlbHNlIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgcmVzb2x2ZWRUeXBlKVxuICAgICAgICAoZmliZXJUYWcgPSBnZXRIb3N0Q29udGV4dCgpKSxcbiAgICAgICAgICAoZmliZXJUYWcgPSBpc0hvc3RIb2lzdGFibGVUeXBlKHR5cGUsIHBlbmRpbmdQcm9wcywgZmliZXJUYWcpXG4gICAgICAgICAgICA/IDI2XG4gICAgICAgICAgICA6IFwiaHRtbFwiID09PSB0eXBlIHx8IFwiaGVhZFwiID09PSB0eXBlIHx8IFwiYm9keVwiID09PSB0eXBlXG4gICAgICAgICAgICAgID8gMjdcbiAgICAgICAgICAgICAgOiA1KTtcbiAgICAgIGVsc2VcbiAgICAgICAgYTogc3dpdGNoIChyZXNvbHZlZFR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FDVElWSVRZX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoa2V5ID0gY3JlYXRlRmliZXIoMzEsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSksXG4gICAgICAgICAgICAgIChrZXkuZWxlbWVudFR5cGUgPSBSRUFDVF9BQ1RJVklUWV9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChcbiAgICAgICAgICAgICAgcGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBtb2RlLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICAgIGZpYmVyVGFnID0gODtcbiAgICAgICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcbiAgICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAodHlwZSA9IHBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICAgIChvd25lciA9IG1vZGUpLFxuICAgICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgdHlwZS5pZCAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgdHlwZS5pZFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIChrZXkgPSBjcmVhdGVGaWJlcigxMiwgdHlwZSwga2V5LCBvd25lciB8IFByb2ZpbGVNb2RlKSksXG4gICAgICAgICAgICAgIChrZXkuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAgKGtleS5zdGF0ZU5vZGUgPSB7IGVmZmVjdER1cmF0aW9uOiAwLCBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDAgfSksXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoa2V5ID0gY3JlYXRlRmliZXIoMTMsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSksXG4gICAgICAgICAgICAgIChrZXkuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGtleSA9IGNyZWF0ZUZpYmVyKDE5LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkpLFxuICAgICAgICAgICAgICAoa2V5LmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAodHlwZSA9IG1vZGUgfCBTdXNwZW5zZXlJbWFnZXNNb2RlKSxcbiAgICAgICAgICAgICAgKGtleSA9IGNyZWF0ZUZpYmVyKDMwLCBwZW5kaW5nUHJvcHMsIGtleSwgdHlwZSkpLFxuICAgICAgICAgICAgICAoa2V5LmVsZW1lbnRUeXBlID0gUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEUpLFxuICAgICAgICAgICAgICAoa2V5LmxhbmVzID0gbGFuZXMpLFxuICAgICAgICAgICAgICAoa2V5LnN0YXRlTm9kZSA9IHtcbiAgICAgICAgICAgICAgICBhdXRvTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWlyZWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xvbmVzOiBudWxsLFxuICAgICAgICAgICAgICAgIHJlZjogbnVsbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJlc29sdmVkVHlwZSAmJiBudWxsICE9PSByZXNvbHZlZFR5cGUpXG4gICAgICAgICAgICAgIHN3aXRjaCAocmVzb2x2ZWRUeXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IDEwO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlNVTUVSX1RZUEU6XG4gICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IDk7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gMTE7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgICAgZmliZXJUYWcgPSAxNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IDE2O1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIHBlbmRpbmdQcm9wcyA9IFwiXCI7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZvaWQgMCA9PT0gdHlwZSB8fFxuICAgICAgICAgICAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgMCA9PT0gT2JqZWN0LmtleXModHlwZSkubGVuZ3RoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBwZW5kaW5nUHJvcHMgKz1cbiAgICAgICAgICAgICAgICBcIiBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSBpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgICAgICAgICBudWxsID09PSB0eXBlXG4gICAgICAgICAgICAgID8gKHJlc29sdmVkVHlwZSA9IFwibnVsbFwiKVxuICAgICAgICAgICAgICA6IGlzQXJyYXlJbXBsKHR5cGUpXG4gICAgICAgICAgICAgICAgPyAocmVzb2x2ZWRUeXBlID0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIDogdm9pZCAwICE9PSB0eXBlICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICAgICAgICAgICAgICAgICAgPyAoKHJlc29sdmVkVHlwZSA9XG4gICAgICAgICAgICAgICAgICAgICAgXCI8XCIgK1xuICAgICAgICAgICAgICAgICAgICAgIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCBcIlVua25vd25cIikgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiIC8+XCIpLFxuICAgICAgICAgICAgICAgICAgICAocGVuZGluZ1Byb3BzID1cbiAgICAgICAgICAgICAgICAgICAgICBcIiBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50P1wiKSlcbiAgICAgICAgICAgICAgICAgIDogKHJlc29sdmVkVHlwZSA9IHR5cGVvZiB0eXBlKTtcbiAgICAgICAgICAgIChmaWJlclRhZyA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21Pd25lcihvd25lcikgOiBudWxsKSAmJlxuICAgICAgICAgICAgICAocGVuZGluZ1Byb3BzICs9XG4gICAgICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBmaWJlclRhZyArIFwiYC5cIik7XG4gICAgICAgICAgICBmaWJlclRhZyA9IDI5O1xuICAgICAgICAgICAgcGVuZGluZ1Byb3BzID0gRXJyb3IoXG4gICAgICAgICAgICAgIFwiRWxlbWVudCB0eX
15852BlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiBcIiArXG4gICAgICAgICAgICAgICAgKHJlc29sdmVkVHlwZSArIFwiLlwiICsgcGVuZGluZ1Byb3BzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIGtleSA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gICAgICBrZXkuZWxlbWVudFR5cGUgPSB0eXBlO1xuICAgICAga2V5LnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gICAgICBrZXkubGFuZXMgPSBsYW5lcztcbiAgICAgIGtleS5fZGVidWdPd25lciA9IG93bmVyO1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCBtb2RlLCBsYW5lcykge1xuICAgICAgbW9kZSA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhcbiAgICAgICAgZWxlbWVudC50eXBlLFxuICAgICAgICBlbGVtZW50LmtleSxcbiAgICAgICAgZWxlbWVudC5wcm9wcyxcbiAgICAgICAgZWxlbWVudC5fb3duZXIsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGxhbmVzXG4gICAgICApO1xuICAgICAgbW9kZS5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgbW9kZS5fZGVidWdTdGFjayA9IGVsZW1lbnQuX2RlYnVnU3RhY2s7XG4gICAgICBtb2RlLl9kZWJ1Z1Rhc2sgPSBlbGVtZW50Ll9kZWJ1Z1Rhc2s7XG4gICAgICByZXR1cm4gbW9kZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgICAgIGVsZW1lbnRzID0gY3JlYXRlRmliZXIoNywgZWxlbWVudHMsIGtleSwgbW9kZSk7XG4gICAgICBlbGVtZW50cy5sYW5lcyA9IGxhbmVzO1xuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gICAgICBjb250ZW50ID0gY3JlYXRlRmliZXIoNiwgY29udGVudCwgbnVsbCwgbW9kZSk7XG4gICAgICBjb250ZW50LmxhbmVzID0gbGFuZXM7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KGRlaHlkcmF0ZWROb2RlKSB7XG4gICAgICB2Y
15852XIgZmliZXIgPSBjcmVhdGVGaWJlcigxOCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGRlaHlkcmF0ZWROb2RlO1xuICAgICAgcmV0dXJuIGZpYmVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCBtb2RlLCBsYW5lcykge1xuICAgICAgbW9kZSA9IGNyZWF0ZUZpYmVyKFxuICAgICAgICA0LFxuICAgICAgICBudWxsICE9PSBwb3J0YWwuY2hpbGRyZW4gPyBwb3J0YWwuY2hpbGRyZW4gOiBbXSxcbiAgICAgICAgcG9ydGFsLmtleSxcbiAgICAgICAgbW9kZVxuICAgICAgKTtcbiAgICAgIG1vZGUubGFuZXMgPSBsYW5lcztcbiAgICAgIG1vZGUuc3RhdGVOb2RlID0ge1xuICAgICAgICBjb250YWluZXJJbmZvOiBwb3J0YWwuY29udGFpbmVySW5mbyxcbiAgICAgICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgICAgICBpbXBsZW1lbnRhdGlvbjogcG9ydGFsLmltcGxlbWVudGF0aW9uXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG1vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdmFsdWUgJiYgbnVsbCAhPT0gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gQ2FwdHVyZWRTdGFja3MuZ2V0KHZhbHVlKTtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICAgICAgc291cmNlID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSlcbiAgICAgICAgfTtcbiAgICAgICAgQ2FwdHVyZWRTdGFja3Muc2V0KHZhbHVlLCBzb3VyY2UpO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4pIHtcbiAgICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICAgICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gICAgICB0cmVlRm9ya1Byb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbiwgaW5kZXgpIHtcbiAgICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgdmFyIGJhc2VJZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgICAgIHZhciBiYXNlTGVuZ3RoID0gMzIgLSBjbHozMihiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICAgICAgYmFzZUlkV2l0aExlYWRpbmdCaXQgJj0gfigxIDw8IGJhc2VMZW5ndGgpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIHZhciBsZW5ndGggPSAzMiAtIGNsejMyKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDtcbiAgICAgIGlmICgzMCA8IGxlbmd0aCkge1xuICAgICAgICB2Y
15852XIgbnVtYmVyT2ZPdmVyZmxvd0JpdHMgPSBiYXNlTGVuZ3RoIC0gKGJhc2VMZW5ndGggJSA1KTtcbiAgICAgICAgbGVuZ3RoID0gKFxuICAgICAgICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0ICZcbiAgICAgICAgICAoKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMSlcbiAgICAgICAgKS50b1N0cmluZygzMik7XG4gICAgICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0ID4+PSBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICAgICAgYmFzZUxlbmd0aCAtPSBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICAgICAgdHJlZUNvbnRleHRJZCA9XG4gICAgICAgICAgKDEgPDwgKDMyIC0gY2x6MzIodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoKSkgfFxuICAgICAgICAgIChpbmRleCA8PCBiYXNlTGVuZ3RoKSB8XG4gICAgICAgICAgYmFzZUlkV2l0aExlYWRpbmdCaXQ7XG4gICAgICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBsZW5ndGggKyB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH0gZWxzZVxuICAgICAgICAodHJlZUNvbnRleHRJZCA9XG4gICAgICAgICAgKDEgPDwgbGVuZ3RoKSB8IChpbmRleCA8PCBiYXNlTGVuZ3RoKSB8IGJhc2VJZFdpdGhMZWFkaW5nQml0KSxcbiAgICAgICAgICAodHJlZUNvbnRleHRPdmVyZmxvdyA9IHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm4gJiZcbiAgICAgICAgKHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgMSksIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIDEsIDApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIGZvciAoOyB3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcjsgKVxuICAgICAgICAodHJlZUZvcmtQcm92aWRlciA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XSksXG4gICAgICAgICAgKGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsKSxcbiAgICAgICAgICAodHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XSksXG4gICAgICAgICAgKGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsKTtcbiAgICAgIGZvciAoOyB3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcjsgKVxuICAgICAgICAodHJlZUNvbnRleHRQcm92aWRlciA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdKSxcbiAgICAgICAgICAoaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbCksXG4gICAgICAgICAgKHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XSksXG4gICAgICAgICAgKGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGwpLFxuICAgICAgICAgICh0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF0pLFxuICAgICAgICAgIChpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gICAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgICAgIHJldHVybiBudWxsICE9PSB0cmVlQ29udGV4dFByb3ZpZGVyXG4gICAgICAgID8geyBpZDogdHJlZUNvbnRleHRJZCwgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3cgfVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICAgICAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gICAgICB0cmVlQ29udGV4dElkID0gc3VzcGVuZGVkQ29udGV4dC5pZDtcbiAgICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gICAgICBpc0h5ZHJhdGluZyB8fFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gYmUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBidWlsZEh5ZHJhdGlvbkRpZmZOb2RlKGZpYmVyLCBkaXN0YW5jZUZyb21MZWFmKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZmliZXIucmV0dXJuKSB7XG4gICAgICAgIGlmIChudWxsID09PSBoeWRyYXRpb25EaWZmUm9vdERFVilcbiAgICAgICAgICBoeWRyYXRpb25EaWZmUm9vdERFViA9IHtcbiAgICAgICAgICAgIGZpYmVyOiBmaWJlcixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgIHNlcnZlclByb3BzOiB2b2lkIDAsXG4gICAgICAgICAgICBzZXJ2ZXJUYWlsOiBbXSxcbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUxlYWY6IGRpc3RhbmNlRnJvbUxlYWZcbiAgICAgICAgICB9O1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoaHlkcmF0aW9uRGlmZlJvb3RERVYuZmliZXIgIT09IGZpYmVyKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiU2F3IG11bHRpcGxlIGh5ZHJhdGlvbiBkaWZmIHJvb3RzIGluIGEgcGFzcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBoeWRyYXRpb25EaWZmUm9vdERFVi5kaXN0YW5jZUZyb21MZWFmID4gZGlzdGFuY2VGcm9tTGVhZiAmJlxuICAgICAgICAgICAgKGh5ZHJhdGlvbkRpZmZSb290REVWLmRpc3RhbmNlRnJvbUxlYWYgPSBkaXN0YW5jZUZyb21MZWFmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHlkcmF0aW9uRGlmZlJvb3RERVY7XG4gICAgICB9XG4gICAgICB2Y
15852XIgc2libGluZ3MgPSBidWlsZEh5ZHJhdGlvbkRpZmZOb2RlKFxuICAgICAgICBmaWJlci5yZXR1cm4sXG4gICAgICAgIGRpc3RhbmNlRnJvbUxlYWYgKyAxXG4gICAgICApLmNoaWxkcmVuO1xuICAgICAgaWYgKDAgPCBzaWJsaW5ncy5sZW5ndGggJiYgc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV0uZmliZXIgPT09IGZpYmVyKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChzaWJsaW5ncyA9IHNpYmxpbmdzW3NpYmxpbmdzLmxlbmd0aCAtIDFdKSxcbiAgICAgICAgICBzaWJsaW5ncy5kaXN0YW5jZUZyb21MZWFmID4gZGlzdGFuY2VGcm9tTGVhZiAmJlxuICAgICAgICAgICAgKHNpYmxpbmdzLmRpc3RhbmNlRnJvbUxlYWYgPSBkaXN0YW5jZUZyb21MZWFmKSxcbiAgICAgICAgICBzaWJsaW5nc1xuICAgICAgICApO1xuICAgICAgZGlzdGFuY2VGcm9tTGVhZiA9IHtcbiAgICAgICAgZmliZXI6IGZpYmVyLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHNlcnZlclByb3BzOiB2b2lkIDAsXG4gICAgICAgIHNlcnZlclRhaWw6IFtdLFxuICAgICAgICBkaXN0YW5jZUZyb21MZWFmOiBkaXN0YW5jZUZyb21MZWFmXG4gICAgICB9O1xuICAgICAgc2libGluZ3MucHVzaChkaXN0YW5jZUZyb21MZWFmKTtcbiAgICAgIHJldHVybiBkaXN0YW5jZUZyb21MZWFmO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZIeWRyYXRpbmcoKSB7XG4gICAgICBpc0h5ZHJhdGluZyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk5vbkh5ZHJhdGVkSW5zdGFuY2UoZmliZXIsIHJlamVjdGVkQ2FuZGlkYXRlKSB7XG4gICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViB8fFxuICAgICAgICAoKGZpYmVyID0gYnVpbGRIeWRyYXRpb25EaWZmTm9kZShmaWJlciwgMCkpLFxuICAgICAgICAoZmliZXIuc2VydmVyUHJvcHMgPSBudWxsKSxcbiAgICAgICAgbnVsbCAhPT0gcmVqZWN0ZWRDYW5kaWRhdGUgJiZcbiAgICAgICAgICAoKHJlamVjdGVkQ2FuZGlkYXRlID1cbiAgICAgICAgICAgIGRlc2NyaWJlSHlkcmF0YWJsZUluc3RhbmNlRm9yRGV2V2FybmluZ3MocmVqZWN0ZWRDYW5kaWRhdGUpKSxcbiAgICAgICAgICBmaWJlci5zZXJ2ZXJUYWlsLnB1c2gocmVqZWN0ZWRDYW5kaWRhdGUpKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikge1xuICAgICAgdmFyIGZyb21UZXh0ID1cbiAgICAgICAgICAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6ICExLFxuICAgICAgICBkaWZmID0gXCJcIixcbiAgICAgICAgZGlmZlJvb3QgPSBoeWRyYXRpb25EaWZmUm9vdERFVjtcbiAgICAgIG51bGwgIT09IGRpZmZSb290ICYmXG4gICAgICAgICgoaHlkcmF0aW9uRGlmZlJvb3RERVYgPSBudWxsKSwgKGRpZmYgPSBkZXNjcmliZURpZmYoZGlmZlJvb3QpKSk7XG4gICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKFxuICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihcbiAgICAgICAgICBFcnJvcihcbiAgICAgICAgICAgIFwiSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgXCIgK1xuICAgICAgICAgICAgICAoZnJvbVRleHQgPyBcInRleHRcIiA6IFwiSFRNTFwiKSArXG4gICAgICAgICAgICAgIFwiIGRpZG4ndCBtYXRjaCB0aGUgY2xpZW50LiBBcyBhIHJlc3VsdCB0aGlzIHRyZWUgd2lsbCBiZSByZWdlbmVyYXRlZCBvbiB0aGUgY2xpZW50LiBUaGlzIGNhbiBoYXBwZW4gaWYgYSBTU1ItZWQgQ2xpZW50IENvbXBvbmVudCB1c2VkOlxcblxcbi0gQSBzZXJ2ZXIvY2xpZW50IGJyYW5jaCBgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKWAuXFxuLSBWYXJpYWJsZSBpbnB1dCBzdWNoIGFzIGBEYXRlLm5vdygpYCBvciBgTWF0aC5yYW5kb20oKWAgd2hpY2ggY2hhbmdlcyBlYWNoIHRpbWUgaXQncyBjYWxsZWQuXFxuLSBEYXRlIGZvcm1hdHRpbmcgaW4gYSB1c2VyJ3MgbG9jYWxlIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlci5cXG4tIEV4dGVybmFsIGNoYW5naW5nIGRhdGEgd2l0aG91dCBzZW5kaW5nIGEgc25hcHNob3Qgb2YgaXQgYWxvbmcgd2l0aCB0aGUgSFRNTC5cXG4tIEludmFsaWQgSFRNTCB0YWcgbmVzdGluZy5cXG5cXG5JdCBjYW4gYWxzbyBoYXBwZW4gaWYgdGhlIGNsaWVudCBoYXMgYSBicm93c2VyIGV4dGVuc2lvbiBpbnN0YWxsZWQgd2hpY2ggbWVzc2VzIHdpdGggdGhlIEhUTUwgYmVmb3JlIFJlYWN0IGxvYWRlZC5cXG5cXG5odHRwczovL3JlYWN0LmRldi9saW5rL2h5ZHJhdGlvbi1taXNtYXRjaFwiICtcbiAgICAgICAgICAgICAgZGlmZlxuICAgICAgICAgICksXG4gICAgICAgICAgZmliZXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHRocm93IEh5ZHJhdGlvbk1pc21hdGNoRXhjZXB0aW9uO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgZGlkSHlkcmF0ZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZSxcbiAgICAgICAgcHJvcHMgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgZGlkSHlkcmF0ZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGZpYmVyO1xuICAgICAgZGlkSHlkcmF0ZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xuICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0eXBlLCBwcm9wcyk7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImRpYWxvZ1wiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJjYW5jZWxcIiwgZGlkSHlkcmF0ZSk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImNsb3NlXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaWZyYW1lXCI6XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgY2FzZSBcImVtYmVkXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImxvYWRcIiwgZGlkSHlkcmF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ2aWRlb1wiOlxuICAgICAgICBjYXNlIFwiYXVkaW9cIjpcbiAgICAgICAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgdHlwZSsrKVxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbdHlwZV0sIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJlcnJvclwiLCBkaWRIeWRyYXRlKTtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwibG9hZFwiLCBkaWRIeWRyYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRldGFpbHNcIjpcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwidG9nZ2xlXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKFwiaW5wdXRcIiwgcHJvcHMpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIHZhbGlkYXRlSW5wdXRQcm9wcyhkaWRIeWRyYXRlLCBwcm9wcyk7XG4gICAgICAgICAgaW5pdElucHV0KFxuICAgICAgICAgICAgZGlkSHlkcmF0ZSxcbiAgICAgICAgICAgIHByb3BzLnZhbHVlLFxuICAgICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgcHJvcHMuY2hlY2tlZCxcbiAgICAgICAgICAgIHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgcHJvcHMudHlwZSxcbiAgICAgICAgICAgIHByb3BzLm5hbWUsXG4gICAgICAgICAgICAhMFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvcHRpb25cIjpcbiAgICAgICAgICB2YWxpZGF0ZU9wdGlvblByb3BzKGRpZEh5ZHJhdGUsIHByb3BzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJzZWxlY3RcIiwgcHJvcHMpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIHZhbGlkYXRlU2VsZWN0UHJvcHMoZGlkSHlkcmF0ZSwgcHJvcHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKFwidGV4dGFyZWFcIiwgcHJvcHMpLFxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgZGlkSHlkcmF0ZSksXG4gICAgICAgICAgICB2YWxpZGF0ZVRleHRhcmVhUHJvcHMoZGlkSHlkcmF0ZSwgcHJvcHMpLFxuICAgICAgICAgICAgaW5pdFRleHRhcmVhKFxuICAgICAgICAgICAgICBkaWRIeWRyYXRlLFxuICAgICAgICAgICAgICBwcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHR5cGUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICBcIm51bWJlclwiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICBcImJpZ2ludFwiICE9PSB0eXBlb2YgdHlwZSkgfHxcbiAgICAgIGRpZEh5ZHJhdGUudGV4dENvbnRlbnQgPT09IFwiXCIgKyB0eXBlIHx8XG4gICAgICAhMCA9PT0gcHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHx8XG4gICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZGlkSHlkcmF0ZS50ZXh0Q29udGVudCwgdHlwZSlcbiAgICAgICAgPyAobnVsbCAhPSBwcm9wcy5wb3BvdmVyICYmXG4gICAgICAgICAgICAobGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImJlZm9yZXRvZ2dsZVwiLCBkaWRIeWRyYXRlKSxcbiAgICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJ0b2dnbGVcIiwgZGlkSHlkcmF0ZSkpLFxuICAgICAgICAgIG51bGwgIT0gcHJvcHMub25TY3JvbGwgJiZcbiAgICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJzY3JvbGxcIiwgZGlkSHlkcmF0ZSksXG4gICAgICAgICAgbnVsbCAhPSBwcm9wcy5vblNjcm9sbEVuZCAmJlxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInNjcm9sbGVuZFwiLCBkaWRIeWRyYXRlKSxcbiAgICAgICAgICBudWxsICE9IHByb3BzLm9uQ2xpY2sgJiYgKGRpZEh5ZHJhdGUub25jbGljayA9IG5vb3AkMSksXG4gICAgICAgICAgKGRpZEh5ZHJhdGUgPSAhMCkpXG4gICAgICAgIDogKGRpZEh5ZHJhdGUgPSAhMSk7XG4gICAgICBkaWRIeWRyYXRlIHx8IHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlciwgITApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKSB7XG4gICAgICBmb3IgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuOyBoeWRyYXRpb25QYXJlbnRGaWJlcjsgKVxuICAgICAgICBzd2l0Y2ggKGh5ZHJhdGlvblBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG4gICAgICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSByZXR1cm4gITE7XG4gICAgICBpZiAoIWlzSHlkcmF0aW5nKVxuICAgICAgICByZXR1cm4gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlciksIChpc0h5ZHJhdGluZyA9ICEwKSwgITE7XG4gICAgICB2Y
15852XIgdGFnID0gZmliZXIudGFnLFxuICAgICAgICBKU0NvbXBpbGVyX3RlbXA7XG4gICAgICBpZiAoKEpTQ29tcGlsZXJfdGVtcCA9IDMgIT09IHRhZyAmJiAyNyAhPT0gdGFnKSkge1xuICAgICAgICBpZiAoKEpTQ29tcGlsZXJfdGVtcCA9IDUgPT09IHRhZykpXG4gICAgICAgICAgKEpTQ29tcGlsZXJfdGVtcCA9IGZpYmVyLnR5cGUpLFxuICAgICAgICAgICAgKEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAgICEoXCJmb3JtXCIgIT09IEpTQ29tcGlsZXJfdGVtcCAmJiBcImJ1dHRvblwiICE9PSBKU0NvbXBpbGVyX3RlbXApIHx8XG4gICAgICAgICAgICAgIHNob3VsZFNldFRleHRDb250ZW50KGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKTtcbiAgICAgICAgSlNDb21waWxlcl90ZW1wID0gIUpTQ29tcGlsZXJfdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChKU0NvbXBpbGVyX3RlbXAgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSkge1xuICAgICAgICBmb3IgKEpTQ29tcGlsZXJfdGVtcCA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7IEpTQ29tcGlsZXJfdGVtcDsgKSB7XG4gICAgICAgICAgdmFyIGRpZmZOb2RlID0gYnVpbGRIeWRyYXRpb25EaWZmTm9kZShmaWJlciwgMCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgIGRlc2NyaWJlSHlkcmF0YWJsZUluc3RhbmNlRm9yRGV2V2FybmluZ3MoSlNDb21waWxlcl90ZW1wKTtcbiAgICAgICAgICBkaWZmTm9kZS5zZXJ2ZXJUYWlsLnB1c2goZGVzY3JpcHRpb24pO1xuICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICBcIlN1c3BlbnNlXCIgPT09IGRlc2NyaXB0aW9uLnR5cGVcbiAgICAgICAgICAgICAgPyBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJIeWRyYXRpb25Cb3VuZGFyeShKU0NvbXBpbGVyX3RlbXApXG4gICAgICAgICAgICAgIDogZ2V0TmV4dEh5ZHJhdGFibGUoSlNDb21waWxlcl90ZW1wLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpO1xuICAgICAgfVxuICAgICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgICBpZiAoMTMgPT09IHRhZykge1xuICAgICAgICBmaWJlciA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGZpYmVyID0gbnVsbCAhPT0gZmliZXIgPyBmaWJlci5kZWh5ZHJhdGVkIDogbnVsbDtcbiAgICAgICAgaWYgKCFmaWJlcilcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9XG4gICAgICAgICAgZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVySHlkcmF0aW9uQm91bmRhcnkoZmliZXIpO1xuICAgICAgfSBlbHNlIGlmICgzMSA9PT0gdGFnKSB7XG4gICAgICAgIGZpYmVyID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgZmliZXIgPSBudWxsICE9PSBmaWJlciA/IGZpYmVyLmRlaHlkcmF0ZWQgOiBudWxsO1xuICAgICAgICBpZiAoIWZpYmVyKVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICApO1xuICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID1cbiAgICAgICAgICBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJIeWRyYXRpb25Cb3VuZGFyeShmaWJlcik7XG4gICAgICB9IGVsc2VcbiAgICAgICAgMjcgPT09IHRhZ1xuICAgICAgICAgID8gKCh0YWcgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlKSxcbiAgICAgICAgICAgIGlzU2luZ2xldG9uU2NvcGUoZmliZXIudHlwZSlcbiAgICAgICAgICAgICAgPyAoKGZpYmVyID0gcHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiksXG4gICAgICAgICAgICAgICAgKHByZXZpb3VzSHlkcmF0YWJsZU9uRW50ZXJpbmdTY29wZWRTaW5nbGV0b24gPSBudWxsKSxcbiAgICAgICAgICAgICAgICAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGZpYmVyKSlcbiAgICAgICAgICAgICAgOiAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHRhZykpXG4gICAgICAgICAgOiAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyXG4gICAgICAgICAgICAgID8gZ2V0TmV4dEh5ZHJhdGFibGUoZmliZXIuc3RhdGVOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgICAgICA6IG51bGwpO1xuICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gaXNIeWRyYXRpbmcgPSAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gICAgICB2Y
15852XIgcXVldWVkRXJyb3JzID0gaHlkcmF0aW9uRXJyb3JzO1xuICAgICAgbnVsbCAhPT0gcXVldWVkRXJyb3JzICYmXG4gICAgICAgIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9yc1xuICAgICAgICAgID8gKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gcXVldWVkRXJyb3JzKVxuICAgICAgICAgIDogd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseShcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgICAgIHF1ZXVlZEVycm9yc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgKGh5ZHJhdGlvbkVycm9ycyA9IG51bGwpKTtcbiAgICAgIHJldHVybiBxdWV1ZWRFcnJvcnM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1ZXVlSHlkcmF0aW9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIG51bGwgPT09IGh5ZHJhdGlvbkVycm9yc1xuICAgICAgICA/IChoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdKVxuICAgICAgICA6IGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW1pdFBlbmRpbmdIeWRyYXRpb25XYXJuaW5ncygpIHtcbiAgICAgIHZhciBkaWZmUm9vdCA9IGh5ZHJhdGlvbkRpZmZSb290REVWO1xuICAgICAgaWYgKG51bGwgIT09IGRpZmZSb290KSB7XG4gICAgICAgIGh5ZHJhdGlvbkRpZmZSb290REVWID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgZGlmZiA9IGRlc2NyaWJlRGlmZihkaWZmUm9vdCk7IDAgPCBkaWZmUm9vdC5jaGlsZHJlbi5sZW5ndGg7IClcbiAgICAgICAgICBkaWZmUm9vdCA9IGRpZmZSb290LmNoaWxkcmVuWzBdO1xuICAgICAgICBydW5XaXRoRmliZXJJbkRFVihkaWZmUm9vdC5maWJlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkEgdHJlZSBoeWRyYXRlZCBidXQgc29tZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgSFRNTCBkaWRuJ3QgbWF0Y2ggdGhlIGNsaWVudCBwcm9wZXJ0aWVzLiBUaGlzIHdvbid0IGJlIHBhdGNoZWQgdXAuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIFNTUi1lZCBDbGllbnQgQ29tcG9uZW50IHVzZWQ6XFxuXFxuLSBBIHNlcnZlci9jbGllbnQgYnJhbmNoIGBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpYC5cXG4tIFZhcmlhYmxlIGlucHV0IHN1Y2ggYXMgYERhdGUubm93KClgIG9yIGBNYXRoLnJhbmRvbSgpYCB3aGljaCBjaGFuZ2VzIGVhY2ggdGltZSBpdCdzIGNhbGxlZC5cXG4tIERhdGUgZm9ybWF0dGluZyBpbiBhIHVzZXIncyBsb2NhbGUgd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgc2VydmVyLlxcbi0gRXh0ZXJuYWwgY2hhbmdpbmcgZGF0YSB3aXRob3V0IHNlbmRpbmcgYSBzbmFwc2hvdCBvZiBpdCBhbG9uZyB3aXRoIHRoZSBIVE1MLlxcbi0gSW52YWxpZCBIVE1MIHRhZyBuZXN0aW5nLlxcblxcbkl0IGNhbiBhbHNvIGhhcHBlbiBpZiB0aGUgY2xpZW50IGhhcyBhIGJyb3dzZXIgZXh0ZW5zaW9uIGluc3RhbGxlZCB3aGljaCBtZXNzZXMgd2l0aCB0aGUgSFRNTCBiZWZvcmUgUmVhY3QgbG9hZGVkLlxcblxcbiVzJXNcIixcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9oeWRyYXRpb24tbWlzbWF0Y2hcIixcbiAgICAgICAgICAgIGRpZmZcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAgICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICBwdXNoKHJlbmRlcmVyQ3Vyc29yREVWLCBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIsIHByb3ZpZGVyRmliZXIpO1xuICAgICAgdm9pZCAwICE9PSBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgJiZcbiAgICAgICAgbnVsbCAhPT0gY29udGV4dC5fY3VycmVudFJlbmRlcmVyICYmXG4gICAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gcmVuZGVyZXJTaWdpbCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlIHNhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcFByb3ZpZGVyKGNvbnRleHQsIHByb3ZpZGVyRmliZXIpIHtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG4gICAgICB2Y
15852XIgY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJDdXJzb3JERVYuY3VycmVudDtcbiAgICAgIHBvcChyZW5kZXJlckN1cnNvckRFViwgcHJvdmlkZXJGaWJlcik7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBjdXJyZW50UmVuZGVyZXI7XG4gICAgICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKFxuICAgICAgcGFyZW50LFxuICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICBwcm9wYWdhdGlvblJvb3RcbiAgICApIHtcbiAgICAgIGZvciAoOyBudWxsICE9PSBwYXJlbnQ7ICkge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcbiAgICAgICAgKHBhcmVudC5jaGlsZExhbmVzICYgcmVuZGVyTGFuZXMpICE9PSByZW5kZXJMYW5lc1xuICAgICAgICAgID8gKChwYXJlbnQuY2hpbGRMYW5lcyB8PSByZW5kZXJMYW5lcyksXG4gICAgICAgICAgICBudWxsICE9PSBhbHRlcm5hdGUgJiYgKGFsdGVybmF0ZS5jaGlsZExhbmVzIHw9IHJlbmRlckxhbmVzKSlcbiAgICAgICAgICA6IG51bGwgIT09IGFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgKGFsdGVybmF0ZS5jaGlsZExhbmVzICYgcmVuZGVyTGFuZXMpICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgKGFsdGVybmF0ZS5jaGlsZExhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gcHJvcGFnYXRpb25Sb290KSBicmVhaztcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmVudCAhPT0gcHJvcGFnYXRpb25Sb290ICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZXMoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIGNvbnRleHRzLFxuICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICBmb3JjZVByb3BhZ2F0ZUVudGlyZVRyZWVcbiAgICApIHtcbiAgICAgIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgbnVsbCAhPT0gZmliZXIgJiYgKGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGZvciAoOyBudWxsICE9PSBmaWJlcjsgKSB7XG4gICAgICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuICAgICAgICBpZiAobnVsbCAhPT0gbGlzdCkge1xuICAgICAgICAgIHZhciBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgICAgICBsaXN0ID0gbGlzdC5maXJzdENvbnRleHQ7XG4gICAgICAgICAgYTogZm9yICg7IG51bGwgIT09IGxpc3Q7ICkge1xuICAgICAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0O1xuICAgICAgICAgICAgbGlzdCA9IGZpYmVyO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dHNbaV0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPSBsaXN0LmFsdGVybmF0ZTtcbiAgICAgICAgICAgICAgICBudWxsICE9PSBkZXBlbmRlbmN5ICYmIChkZXBlbmRlbmN5LmxhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKFxuICAgICAgICAgICAgICAgICAgbGlzdC5yZXR1cm4sXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3JjZVByb3BhZ2F0ZUVudGlyZVRyZWUgfHwgKG5leHRGaWJlciA9IG51bGwpO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKDE4ID09PSBmaWJlci50YWcpIHtcbiAgICAgICAgICBuZXh0RmliZXIgPSBmaWJlci5yZXR1cm47XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5leHRGaWJlcilcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIldlIGp1c3QgY2FtZSBmcm9tIGEgcGFyZW50IHNvIHdlIG11c3QgaGF2ZSBoYWQgYSBwYXJlbnQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgbmV4dEZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgICAgIGxpc3QgPSBuZXh0RmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICAgIG51bGwgIT09IGxpc3QgJiYgKGxpc3QubGFuZXMgfD0gcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoXG4gICAgICAgICAgICBuZXh0RmliZXIsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAxMyA9PT0gZmliZXIudGFnICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgIG51bGwgPT09IGZpYmVyLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZFxuICAgICAgICAgICAgPyAoKGZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKG5leHRGaWJlciA9IGZpYmVyLmFsdGVybmF0ZSksXG4gICAgICAgICAgICAgIG51bGwgIT09IG5leHRGaWJlciAmJiAobmV4dEZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChcbiAgICAgICAgICAgICAgICBmaWJlci5yZXR1cm4sXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKG5leHRGaWJlciA9IGZpYmVyLmNoaWxkKSxcbiAgICAgICAgICAgICAgKG5leHRGaWJlciA9IG51bGwgIT09IG5leHRGaWJlciA/IG5leHRGaWJlci5zaWJsaW5nIDogbnVsbCkpXG4gICAgICAgICAgICA6IChuZXh0RmliZXIgPSBmaWJlci5jaGlsZCk7XG4gICAgICAgIGlmIChudWxsICE9PSBuZXh0RmliZXIpIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZvciAobmV4dEZpYmVyID0gZmliZXI7IG51bGwgIT09IG5leHRGaWJlcjsgKSB7XG4gICAgICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIGZpYmVyID0gbmV4dEZpYmVyLnNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gZmliZXIpIHtcbiAgICAgICAgICAgICAgZmliZXIucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wYWdhdGVQYXJlbnRDb250ZXh0Q2hhbmdlcyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgZm9yY2VQcm9wYWdhdGVFbnRpcmVUcmVlXG4gICAgKSB7XG4gICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBwYXJlbnQgPSB3b3JrSW5Qcm9ncmVzcywgaXNJbnNpZGVQcm9wYWdhdGlvbkJhaWxvdXQgPSAhMTtcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50O1xuXG4gICAgICApIHtcbiAgICAgICAgaWYgKCFpc0luc2lkZVByb3BhZ2F0aW9uQmFpbG91dClcbiAgICAgICAgICBpZiAoMCAhPT0gKHBhcmVudC5mbGFncyAmIDUyNDI4OCkpIGlzSW5zaWRlUHJvcGFnYXRpb25CYWlsb3V0ID0gITA7XG4gICAgICAgICAgZWxzZSBpZiAoMCAhPT0gKHBhcmVudC5mbGFncyAmIDI2MjE0NCkpIGJyZWFrO1xuICAgICAgICBpZiAoMTAgPT09IHBhcmVudC50YWcpIHtcbiAgICAgICAgICB2Y
15852XIgY3VycmVudFBhcmVudCA9IHBhcmVudC5hbHRlcm5hdGU7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRQYXJlbnQpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIlNob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIik7XG4gICAgICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnRQYXJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudFBhcmVudCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBwYXJlbnQudHlwZTtcbiAgICAgICAgICAgIG9iamVjdElzKHBhcmVudC5wZW5kaW5nUHJvcHMudmFsdWUsIGN1cnJlbnRQYXJlbnQudmFsdWUpIHx8XG4gICAgICAgICAgICAgIChudWxsICE9PSBjdXJyZW50XG4gICAgICAgICAgICAgICAgPyBjdXJyZW50LnB1c2goY29udGV4dClcbiAgICAgICAgICAgICAgICA6IChjdXJyZW50ID0gW2NvbnRleHRdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCA9PT0gaG9zdFRyYW5zaXRpb25Qcm92aWRlckN1cnNvci5jdXJyZW50KSB7XG4gICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudC5hbHRlcm5hdGU7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRQYXJlbnQpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIlNob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIik7XG4gICAgICAgICAgY3VycmVudFBhcmVudC5tZW1vaXplZFN0YXRlLm1lbW9pemVkU3RhdGUgIT09XG4gICAgICAgICAgICBwYXJlbnQubWVtb2l6ZWRTdGF0ZS5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAobnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgICAgICA/IGN1cnJlbnQucHVzaChIb3N0VHJhbnNpdGlvbkNvbnRleHQpXG4gICAgICAgICAgICAgIDogKGN1cnJlbnQgPSBbSG9zdFRyYW5zaXRpb25Db250ZXh0XSkpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICB9XG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VzKFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgZm9yY2VQcm9wYWdhdGVFbnRpcmVUcmVlXG4gICAgICAgICk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyNjIxNDQ7XG4gICAgICByZXR1cm4gbnVsbCAhPT0gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tJZkNvbnRleHRDaGFuZ2VkKGN1cnJlbnREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudERlcGVuZGVuY2llcztcblxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb2JqZWN0SXMoXG4gICAgICAgICAgICBjdXJyZW50RGVwZW5kZW5jaWVzLmNvbnRleHQuX2N1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgIGN1cnJlbnREZXBlbmRlbmNpZXMubWVtb2l6ZWRWYWx1ZVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMubmV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcbiAgICAgIG51bGwgIT09IHdvcmtJblByb2dyZXNzICYmICh3b3JrSW5Qcm9ncmVzcy5maXJzdENvbnRleHQgPSBudWxsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCkge1xuICAgICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90IGluc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dEZvckNvbnN1bWVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWFkQ29udGV4dER1cmluZ1JlY29uY2lsaWF0aW9uKGNvbnN1bWVyLCBjb250ZXh0KSB7XG4gICAgICBudWxsID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxICYmIHByZXBhcmVUb1JlYWRDb250ZXh0KGNvbnN1bWVyKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dEZvckNvbnN1bWVyKGNvbnN1bWVyLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVhZENvbnRleHRGb3JDb25zdW1lcihjb25zdW1lciwgY29udGV4dCkge1xuICAgICAgdmFyIHZhbHVlID0gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgY29udGV4dCA9IHsgY29udGV4dDogY29udGV4dCwgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsIG5leHQ6IG51bGwgfTtcbiAgICAgIGlmIChudWxsID09PSBsYXN0Q29udGV4dERlcGVuZGVuY3kpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IGNvbnN1bWVyKVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiBJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN1bWVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgICBsYW5lczogMCxcbiAgICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgICAgX2RlYnVnVGhlbmFibGVTdGF0ZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBjb25zdW1lci5mbGFncyB8PSA1MjQyODg7XG4gICAgICB9IGVsc2UgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcbiAgICAgIHJldHVybi
15852B7XG4gICAgICAgIGNvbnRyb2xsZXI6IG5ldyBBYm9ydENvbnRyb2xsZXJMb2NhbCgpLFxuICAgICAgICBkYXRhOiBuZXcgTWFwKCksXG4gICAgICAgIHJlZkNvdW50OiAwXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXRhaW5DYWNoZShjYWNoZSkge1xuICAgICAgY2FjaGUuY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCAmJlxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJBIGNhY2hlIGluc3RhbmNlIHdhcyByZXRhaW5lZCBhZnRlciBpdCB3YXMgYWxyZWFkeSBmcmVlZC4gVGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICk7XG4gICAgICBjYWNoZS5yZWZDb3VudCsrO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxlYXNlQ2FjaGUoY2FjaGUpIHtcbiAgICAgIGNhY2hlLnJlZkNvdW50LS07XG4gICAgICAwID4gY2FjaGUucmVmQ291bnQgJiZcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiQSBjYWNoZSBpbnN0YW5jZSB3YXMgcmVsZWFzZWQgYWZ0ZXIgaXQgd2FzIGFscmVhZHkgZnJlZWQuIFRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICApO1xuICAgICAgMCA9PT0gY2FjaGUucmVmQ291bnQgJiZcbiAgICAgICAgc2NoZWR1bGVDYWxsYmFjayQyKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FjaGUuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVUcmFuc2l0aW9uVHlwZXMocm9vdCwgdHJhbnNpdGlvblR5cGVzKSB7XG4gICAgICBpZiAoMCAhPT0gKHJvb3QucGVuZGluZ0xhbmVzICYgNDE5NDA0OCkpIHtcbiAgICAgICAgdmFyIHF1ZXVlZCA9IHJvb3QudHJhbnNpdGlvblR5cGVzO1xuICAgICAgICBudWxsID09PSBxdWV1ZWQgJiYgKHF1ZXVlZCA9IHJvb3QudHJhbnNpdGlvblR5cGVzID0gW10pO1xuICAgICAgICBmb3IgKHJvb3QgPSAwOyByb290IDwgdHJhbnNpdGlvblR5cGVzLmxlbmd0aDsgcm9vdCsrKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25UeXBlID0gdHJhbnNpdGlvblR5cGVzW3Jvb3RdO1xuICAgICAgICAgIC0xID09PSBxdWV1ZWQuaW5kZXhPZih0cmFuc2l0aW9uVHlwZSkgJiYgcXVldWVkLnB1c2godHJhbnNpdGlvblR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsYWltUXVldWVkVHJhbnNpdGlvblR5cGVzKHJvb3QpIHtcbiAgICAgIHZhciBjbGFpbWVkID0gcm9vdC50cmFuc2l0aW9uVHlwZXM7XG4gICAgICByb290LnRyYW5zaXRpb25UeXBlcyA9IG51bGw7XG4gICAgICByZXR1cm4gY2xhaW1lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RhcnRVcGRhdGVUaW1lckJ5TGFuZShsYW5lLCBtZXRob2QsIGZpYmVyKSB7XG4gICAgICBpZiAoMCAhPT0gKGxhbmUgJiAxMjcpKVxuICAgICAgICAwID4gYmxvY2tpbmdVcGRhdGVUaW1lICYmXG4gICAgICAgICAgKChibG9ja2luZ1VwZGF0ZVRpbWUgPSBub3coKSksXG4gICAgICAgICAgKGJsb2NraW5nVXBkYXRlVGFzayA9IGNyZWF0ZVRhc2sobWV0aG9kKSksXG4gICAgICAgICAgKGJsb2NraW5nVXBkYXRlTWV0aG9kTmFtZSA9IG1ldGhvZCksXG4gICAgICAgICAgbnVsbCAhPSBmaWJlciAmJlxuICAgICAgICAgICAgKGJsb2NraW5nVXBkYXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKSxcbiAgICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQgJiZcbiAgICAgICAgICAgICgoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSA9ICEwKSxcbiAgICAgICAgICAgIChibG9ja2luZ1VwZGF0ZVR5cGUgPSBTUEFXTkVEX1VQREFURSkpLFxuICAgICAgICAgIChsYW5lID0gcmVzb2x2ZUV2ZW50VGltZVN0YW1wKCkpLFxuICAgICAgICAgIChtZXRob2QgPSByZXNvbHZlRXZlbnRUeXBlKCkpLFxuICAgICAgICAgIGxhbmUgIT09IGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lIHx8IG1ldGhvZCAhPT0gYmxvY2tpbmdFdmVudFR5cGVcbiAgICAgICAgICAgID8gKGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gLTEuMSlcbiAgICAgICAgICAgIDogbnVsbCAhPT0gbWV0aG9kICYmIChibG9ja2luZ1VwZGF0ZVR5cGUgPSBTUEFXTkVEX1VQREFURSksXG4gICAgICAgICAgKGJsb2NraW5nRXZlbnRUaW1lID0gbGFuZSksXG4gICAgICAgICAgKGJsb2NraW5nRXZlbnRUeXBlID0gbWV0aG9kKSk7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgMCAhPT0gKGxhbmUgJiA0MTk0MDQ4KSAmJlxuICAgICAgICAwID4gdHJhbnNpdGlvblVwZGF0ZVRpbWUgJiZcbiAgICAgICAgKCh0cmFuc2l0aW9uVXBkYXRlVGltZSA9IG5vdygpKSxcbiAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVUYXNrID0gY3JlYXRlVGFzayhtZXRob2QpKSxcbiAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVNZXRob2ROYW1lID0gbWV0aG9kKSxcbiAgICAgICAgbnVsbCAhPSBmaWJlciAmJlxuICAgICAgICAgICh0cmFuc2l0aW9uVXBkYXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKSxcbiAgICAgICAgMCA+IHRyYW5zaXRpb25TdGFydFRpbWUpXG4gICAgICApIHtcbiAgICAgICAgbGFuZSA9IHJlc29sdmVFdmVudFRpbWVTdGFtcCgpO1xuICAgICAgICBtZXRob2QgPSByZXNvbHZlRXZlbnRUeXBlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBsYW5lICE9PSB0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lIHx8XG4gICAgICAgICAgbWV0aG9kICE9PSB0cmFuc2l0aW9uRXZlbnRUeXBlXG4gICAgICAgIClcbiAgICAgICAgICB0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lID0gLTEuMTtcbiAgICAgICAgdHJhbnNpdGlvbkV2ZW50VGltZSA9IGxhbmU7XG4gICAgICAgIHRyYW5zaXRpb25FdmVudFR5cGUgPSBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0SG9zdEFjdGlvblRpbWVyKGZpYmVyKSB7XG4gICAgICBpZiAoMCA+IGJsb2NraW5nVXBkYXRlVGltZSkge1xuICAgICAgICBibG9ja2luZ1VwZGF0ZVRpbWUgPSBub3coKTtcbiAgICAgICAgYmxvY2tpbmdVcGRhdGVUYXNrID0gbnVsbCAhPSBmaWJlci5fZGVidWdUYXNrID8gZmliZXIuX2RlYnVnVGFzayA6IG51bGw7XG4gICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCAmJlxuICAgICAgICAgIChibG9ja2luZ1VwZGF0ZVR5cGUgPSBTUEFXTkVEX1VQREFURSk7XG4gICAgICAgI
15852HZhciBuZXdFdmVudFRpbWUgPSByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKSxcbiAgICAgICAgICBuZXdFdmVudFR5cGUgPSByZXNvbHZlRXZlbnRUeXBlKCk7XG4gICAgICAgIG5ld0V2ZW50VGltZSAhPT0gYmxvY2tpbmdFdmVudFJlcGVhdFRpbWUgfHxcbiAgICAgICAgbmV3RXZlbnRUeXBlICE9PSBibG9ja2luZ0V2ZW50VHlwZVxuICAgICAgICAgID8gKGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gLTEuMSlcbiAgICAgICAgICA6IG51bGwgIT09IG5ld0V2ZW50VHlwZSAmJiAoYmxvY2tpbmdVcGRhdGVUeXBlID0gU1BBV05FRF9VUERBVEUpO1xuICAgICAgICBibG9ja2luZ0V2ZW50VGltZSA9IG5ld0V2ZW50VGltZTtcbiAgICAgICAgYmxvY2tpbmdFdmVudFR5cGUgPSBuZXdFdmVudFR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIDAgPiB0cmFuc2l0aW9uVXBkYXRlVGltZSAmJlxuICAgICAgICAoKHRyYW5zaXRpb25VcGRhdGVUaW1lID0gbm93KCkpLFxuICAgICAgICAodHJhbnNpdGlvblVwZGF0ZVRhc2sgPVxuICAgICAgICAgIG51bGwgIT0gZmliZXIuX2RlYnVnVGFzayA/IGZpYmVyLl9kZWJ1Z1Rhc2sgOiBudWxsKSxcbiAgICAgICAgMCA+IHRyYW5zaXRpb25TdGFydFRpbWUpXG4gICAgICApIHtcbiAgICAgICAgZmliZXIgPSByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKTtcbiAgICAgICAgbmV3RXZlbnRUaW1lID0gcmVzb2x2ZUV2ZW50VHlwZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmliZXIgIT09IHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgfHxcbiAgICAgICAgICBuZXdFdmVudFRpbWUgIT09IHRyYW5zaXRpb25FdmVudFR5cGVcbiAgICAgICAgKVxuICAgICAgICAgIHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgPSAtMS4xO1xuICAgICAgICB0cmFuc2l0aW9uRXZlbnRUaW1lID0gZmliZXI7XG4gICAgICAgIHRyYW5zaXRpb25FdmVudFR5cGUgPSBuZXdFdmVudFRpbWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdER1cmF0aW9uID0gcHJvZmlsZXJFZmZlY3REdXJhdGlvbjtcbiAgICAgIHByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgcmV0dXJuIHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wTmVzdGVkRWZmZWN0RHVyYXRpb25zKHByZXZFZmZlY3REdXJhdGlvbikge1xuICAgICAgdmFyIGVsYXBzZWRUaW1lID0gcHJvZmlsZXJFZmZlY3REdXJhdGlvbjtcbiAgICAgIHByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSBwcmV2RWZmZWN0RHVyYXRpb247XG4gICAgICByZXR1cm4gZWxhcHNlZFRpbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJ1YmJsZU5lc3RlZEVmZmVjdER1cmF0aW9ucyhwcmV2RWZmZWN0RHVyYXRpb24pIHtcbiAgICAgIHZhciBlbGFwc2VkVGltZSA9IHByb2ZpbGVyRWZmZWN0RHVyYXRpb247XG4gICAgICBwcm9maWxlckVmZmVjdER1cmF0aW9uICs9IHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICAgIHJldHVybiBlbGFwc2VkVGltZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRDb21wb25lbnRFZmZlY3RUaW1lcnMoKSB7XG4gICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lID0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lID0gLTEuMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCkge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSA9IC0xLjE7XG4gICAgICByZXR1cm4gcHJldkVmZmVjdFN0YXJ0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpIHtcbiAgICAgIDAgPD0gcHJldkVmZmVjdFN0YXJ0ICYmIChjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgPSBwcmV2RWZmZWN0U3RhcnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdER1cmF0aW9uID0gY29tcG9uZW50RWZmZWN0RHVyYXRpb247XG4gICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbiA9IC0wO1xuICAgICAgcmV0dXJuIHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKSB7XG4gICAgICAwIDw9IHByZXZFZmZlY3REdXJhdGlvbiAmJiAoY29tcG9uZW50RWZmZWN0RHVyYXRpb24gPSBwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoQ29tcG9uZW50RWZmZWN0RXJyb3JzKCkge1xuICAgICAgdmFyIHByZXZFcnJvcnMgPSBjb21wb25lbnRFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBudWxsO1xuICAgICAgcmV0dXJuIHByZXZFcnJvcnM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpIHtcbiAgICAgIHZhciBwcmV2ID0gY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSAhMTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcbiAgICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAwID4gZmliZXIuYWN0dWFsU3RhcnRUaW1lICYmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBwcm9maWxlclN0YXJ0VGltZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRHVyYXRpb24oZmliZXIpIHtcbiAgICAgIGlmICgwIDw9IHByb2ZpbGVyU3RhcnRUaW1lKSB7XG4gICAgICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdygpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkSW5jb21wbGV0ZUR1cmF0aW9uKGZpYmVyKSB7XG4gICAgICBpZiAoMCA8PSBwcm9maWxlclN0YXJ0VGltZSkge1xuICAgICAgICB2Y
15852XIgZWxhcHNlZFRpbWUgPSBub3coKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgICAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjb3JkRWZmZWN0RHVyYXRpb24oKSB7XG4gICAgICBpZiAoMCA8PSBwcm9maWxlclN0YXJ0VGltZSkge1xuICAgICAgICB2YXIgZW5kVGltZSA9IG5vdygpLFxuICAgICAgICAgIGVsYXBzZWRUaW1lID0gZW5kVGltZSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgICAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICAgICAgICBwcm9maWxlckVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSA9IGVuZFRpbWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY29yZEVmZmVjdEVycm9yKGVycm9ySW5mbykge1xuICAgICAgbnVsbCA9PT0gY29tcG9uZW50RWZmZWN0RXJyb3JzICYmIChjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBbXSk7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMucHVzaChlcnJvckluZm8pO1xuICAgICAgbnVsbCA9PT0gY29tbWl0RXJyb3JzICYmIChjb21taXRFcnJvcnMgPSBbXSk7XG4gICAgICBjb21taXRFcnJvcnMucHVzaChlcnJvckluZm8pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEVmZmVjdFRpbWVyKCkge1xuICAgICAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3coKTtcbiAgICAgIDAgPiBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgKGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSA9IHByb2ZpbGVyU3RhcnRUaW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAgICAgZm9yICh2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgY2hpbGQ7IClcbiAgICAgICAgKGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uKSwgKGNoaWxkID0gY2hpbGQuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudGFuZ2xlQXN5bmNBY3Rpb24odHJhbnNpdGlvbiwgdGhlbmFibGUpIHtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50RW50YW5nbGVkTGlzdGVuZXJzKSB7XG4gICAgICAgIHZhciBlbnRhbmdsZWRMaXN0ZW5lcnMgPSAoY3VycmVudEVudGFuZ2xlZExpc3RlbmVycyA9IFtdKTtcbiAgICAgICAgY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCA9IDA7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRMYW5lID0gcmVxdWVzdFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGVudGFuZ2xlZExpc3RlbmVycy5wdXNoKHJlc29sdmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbnRhbmdsZWRQZW5kaW5nQ291bnQrKztcbiAgICAgIHRoZW5hYmxlLnRoZW4ocGluZ0VuZ3RhbmdsZWRBY3Rpb25TY29wZSwgcGluZ0VuZ3RhbmdsZWRBY3Rpb25TY29wZSk7XG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpbmdFbmd0YW5nbGVkQWN0aW9uU2NvcGUoKSB7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IC0tY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCAmJlxuICAgICAgICAoLTEgPCB0cmFuc2l0aW9uVXBkYXRlVGltZSB8fCAodHJhbnNpdGlvblN0YXJ0VGltZSA9IC0xLjEpLFxuICAgICAgICAoZW50YW5nbGVkVHJhbnNpdGlvblR5cGVzID0gbnVsbCksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnMpXG4gICAgICApIHtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlICYmXG4gICAgICAgICAgKGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZS5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiKTtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnM7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICBjdXJyZW50RW50YW5nbGVkTGFuZSA9IDA7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSAoMCwgbGlzdGVuZXJzW2ldKSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjaGFpblRoZW5hYmxlVmFsdWUodGhlbmFibGUsIHJlc3VsdCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IFtdLFxuICAgICAgICB0aGVuYWJsZVdpdGhPdmVycmlkZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgIHJlYXNvbjogbnVsbCxcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gocmVzb2x2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgdGhlbmFibGUudGhlbihcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnN0YXR1cyA9IFwiZnVsZmlsbGVkXCI7XG4gICAgICAgICAgdGhlbmFibGVXaXRoT3ZlcnJpZGUudmFsdWUgPSByZXN1bHQ7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspICgwLCBsaXN0ZW5lcnNbaV0pKHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgICAgICB0aGVuYWJsZVdpdGhPdmVycmlkZS5yZWFzb24gPSBlcnJvcjtcbiAgICAgICAgICBmb3IgKGVycm9yID0gMDsgZXJyb3IgPCBsaXN0ZW5lcnMubGVuZ3RoOyBlcnJvcisrKVxuICAgICAgICAgICAgKDAsIGxpc3RlbmVyc1tlcnJvcl0pKHZvaWQgMCk7XG4gICAgICAgI
15852H1cbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhlbmFibGVXaXRoT3ZlcnJpZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBlZWtDYWNoZUZyb21Qb29sKCkge1xuICAgICAgdmFyIGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlciA9IHJlc3VtZWRDYWNoZS5jdXJyZW50O1xuICAgICAgcmV0dXJuIG51bGwgIT09IGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlclxuICAgICAgICA/IGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlclxuICAgICAgICA6IHdvcmtJblByb2dyZXNzUm9vdC5wb29sZWRDYWNoZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFRyYW5zaXRpb24ob2Zmc2NyZWVuV29ya0luUHJvZ3Jlc3MsIHByZXZDYWNoZVBvb2wpIHtcbiAgICAgIG51bGwgPT09IHByZXZDYWNoZVBvb2xcbiAgICAgICAgPyBwdXNoKHJlc3VtZWRDYWNoZSwgcmVzdW1lZENhY2hlLmN1cnJlbnQsIG9mZnNjcmVlbldvcmtJblByb2dyZXNzKVxuICAgICAgICA6IHB1c2gocmVzdW1lZENhY2hlLCBwcmV2Q2FjaGVQb29sLnBvb2wsIG9mZnNjcmVlbldvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gICAgICB2YXIgY2FjaGVGcm9tUG9vbCA9IHBlZWtDYWNoZUZyb21Qb29sKCk7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gY2FjaGVGcm9tUG9vbFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7IHBhcmVudDogQ2FjaGVDb250ZXh0Ll9jdXJyZW50VmFsdWUsIHBvb2w6IGNhY2hlRnJvbVBvb2wgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlVGhlbmFibGVTdGF0ZSgpIHtcbiAgICAgIHJldHVybiB7IGRpZFdhcm5BYm91dFVuY2FjaGVkUHJvbWlzZTogITEsIHRoZW5hYmxlczogW10gfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNUaGVuYWJsZVJlc29sdmVkKHRoZW5hYmxlKSB7XG4gICAgICB0aGVuYWJsZSA9IHRoZW5hYmxlLnN0YXR1cztcbiAgICAgIHJldHVybiBcImZ1bGZpbGxlZFwiID09PSB0aGVuYWJsZSB8fCBcInJlamVjdGVkXCIgPT09IHRoZW5hYmxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFja1VzZWRUaGVuYWJsZSh0aGVuYWJsZVN0YXRlLCB0aGVuYWJsZSwgaW5kZXgsIGZpYmVyKSB7XG4gICAgICBudWxsICE9PSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSAmJlxuICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuZGlkVXNlUHJvbWlzZSA9ICEwKTtcbiAgICAgIHZhciB0cmFja2VkVGhlbmFibGVzID0gdGhlbmFibGVTdGF0ZS50aGVuYWJsZXM7XG4gICAgICBpbmRleCA9IHRyYWNrZWRUaGVuYWJsZXNbaW5kZXhdO1xuICAgICAgdm9pZCAwID09PSBpbmRleFxuICAgICAgICA/IHRyYWNrZWRUaGVuYWJsZXMucHVzaCh0aGVuYWJsZSlcbiAgICAgICAgOiBpbmRleCAhPT0gdGhlbmFibGUgJiZcbiAgICAgICAgICAodGhlbmFibGVTdGF0ZS5kaWRXYXJuQWJvdXRVbmNhY2hlZFByb21pc2UgfHxcbiAgICAgICAgICAgICgodGhlbmFibGVTdGF0ZS5kaWRXYXJuQWJvdXRVbmNhY2hlZFByb21pc2UgPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IHdhcyBzdXNwZW5kZWQgYnkgYW4gdW5jYWNoZWQgcHJvbWlzZS4gQ3JlYXRpbmcgcHJvbWlzZXMgaW5zaWRlIGEgQ2xpZW50IENvbXBvbmVudCBvciBob29rIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBleGNlcHQgdmlhIGEgU3VzcGVuc2UtY29tcGF0aWJsZSBsaWJyYXJ5IG9yIGZyYW1ld29yay5cIlxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgdGhlbmFibGUudGhlbihub29wJDEsIG5vb3AkMSksXG4gICAgICAgICAgKHRoZW5hYmxlID0gaW5kZXgpKTtcbiAgICAgIGlmICh2b2lkIDAgPT09IHRoZW5hYmxlLl9kZWJ1Z0luZm8pIHtcbiAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0cmFja2VkVGhlbmFibGVzID0gdGhlbmFibGUuZGlzcGxheU5hbWU7XG4gICAgICAgIHZhciBpb0luZm8gPSB7XG4gICAgICAgICAgbmFtZTpcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiB0cmFja2VkVGhlbmFibGVzID8gdHJhY2tlZFRoZW5hYmxlcyA6IFwiUHJvbWlzZVwiLFxuICAgICAgICAgIHN0YXJ0OiB0aGVuYWJsZVN0YXRlLFxuICAgICAgICAgIGVuZDogdGhlbmFibGVTdGF0ZSxcbiAgICAgICAgICB2YWx1ZTogdGhlbmFibGVcbiAgICAgICAgfTtcbiAgICAgICAgdGhlbmFibGUuX2RlYnVnSW5mbyA9IFt7IGF3YWl0ZWQ6IGlvSW5mbyB9XTtcbiAgICAgICAgXCJmdWxmaWxsZWRcIiAhPT0gdGhlbmFibGUuc3RhdHVzICYmXG4gICAgICAgICAgXCJyZWplY3RlZFwiICE9PSB0aGVuYWJsZS5zdGF0dXMgJiZcbiAgICAgICAgICAoKHRoZW5hYmxlU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpb0luZm8uZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhlbmFibGUudGhlbih0aGVuYWJsZVN0YXRlLCB0aGVuYWJsZVN0YXRlKSk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgICAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgICAgICBmaWJlciA9IHRoZW5hYmxlLnJlYXNvbjtcbiAgICAgICAgICBjaGVja0lmVXNlV3JhcHBlZEluQXN5bmNDYXRjaChmaWJlcik7XG4gICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZmliZXIgJiYgIShcInJlYXNvblwiIGluIHRoZW5hYmxlKSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIkEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgcGFzc2VkIHRvIFJlYWN0IHdpdGhvdXQgYSBgcmVhc29uYCBwcm9wZXJ0eS4gUmVhY3QgdGhyZXcgYSBnZW5lcmljIGVycm9yIGZyb20gd2hlcmUgdGhlIFByb21pc2Ugd2FzIHVzZWQgdG8gYXNzaXN0IGluIGlkZW50aWZ5aW5nIHRoZSBwcm9ibGVtYXRpYyBQcm9taXNlLiBNYWtlIHN1cmUgdGhhdCBpbnN0cnVtZW50ZWQgUHJvbWlzZXMgY29ycmVjdGx5IHNldCB0aGUgYHJlYXNvbmAgcHJvcGVydHkgd2hlbiBzZXR0aW5nIGBzdGF0dXNgIHRvIGAncmVqZWN0ZWQnYC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBmaWJlcjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHRoZW5
15852hYmxlLnN0YXR1cylcbiAgICAgICAgICAgIHRoZW5hYmxlLnRoZW4obm9vcCQxLCBub29wJDEpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHdvcmtJblByb2dyZXNzUm9vdDtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbnVsbCAhPT0gdGhlbmFibGVTdGF0ZSAmJlxuICAgICAgICAgICAgICAxMDAgPCB0aGVuYWJsZVN0YXRlLnNoZWxsU3VzcGVuZENvdW50ZXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJBbiB1bmtub3duIENvbXBvbmVudCBpcyBhbiBhc3luYyBDbGllbnQgQ29tcG9uZW50LiBPbmx5IFNlcnZlciBDb21wb25lbnRzIGNhbiBiZSBhc3luYyBhdCB0aGUgbW9tZW50LiBUaGlzIGVycm9yIGlzIG9mdGVuIGNhdXNlZCBieSBhY2NpZGVudGFsbHkgYWRkaW5nIGAndXNlIGNsaWVudCdgIHRvIGEgbW9kdWxlIHRoYXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHRoZW5hYmxlO1xuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZS5zdGF0dXMgPSBcInBlbmRpbmdcIjtcbiAgICAgICAgICAgIHRoZW5hYmxlU3RhdGUudGhlbihcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKGZ1bGZpbGxlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwicGVuZGluZ1wiID09PSB0aGVuYWJsZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBmdWxmaWxsZWRUaGVuYWJsZSA9IHRoZW5hYmxlO1xuICAgICAgICAgICAgICAgICAgZnVsZmlsbGVkVGhlbmFibGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIjtcbiAgICAgICAgICAgICAgICAgIGZ1bGZpbGxlZFRoZW5hYmxlLnZhbHVlID0gZnVsZmlsbGVkVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlamVjdGVkVGhlbmFibGUgPSB0aGVuYWJsZTtcbiAgICAgICAgICAgICAgICAgIHJlamVjdGVkVGhlbmFibGUuc3RhdHVzID0gXCJyZWplY3RlZFwiO1xuICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRUaGVuYWJsZS5yZWFzb24gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAodGhlbmFibGUuc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgICAgIHJldHVybiB0aGVuYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICAgKChmaWJlciA9IHRoZW5hYmxlLnJlYXNvbiksXG4gICAgICAgICAgICAgICAgY2hlY2tJZlVzZVdyYXBwZWRJbkFzeW5jQ2F0Y2goZmliZXIpLFxuICAgICAgICAgICAgICAgIGZpYmVyKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXNwZW5kZWRUaGVuYWJsZSA9IHRoZW5hYmxlO1xuICAgICAgICAgIG5lZWRzVG9SZXNldFN1c3BlbmRlZFRoZW5hYmxlREVWID0gITA7XG4gICAgICAgICAgZGlkSXNzdWVVc2VXYXJuaW5nIHx8XG4gICAgICAgICAgICBudWxsID09PSBmaWJlciB8fFxuICAgICAgICAgICAgbnVsbCAhPT0gZmliZXIuYWx0ZXJuYXRlIHx8XG4gICAgICAgICAgICAoKGxhc3RTdXNwZW5kZWRGaWJlciA9IGZpYmVyKSxcbiAgICAgICAgICAgIChsYXN0U3VzcGVuZGVkU3RhY2sgPSBFcnJvcihcbiAgICAgICAgICAgICAgXCJUaGlzIGxpYnJhcnkgY2FsbGVkIHVzZSgpIHRvIHN1c3BlbmQgaW4gYSBwcmV2aW91cyByZW5kZXIgYnV0IGRpZCBub3QgY2FsbCB1c2UoKSB3aGVuIGl0IGZpbmlzaGVkLiBUaGlzIGluZGljYXRlcyBhbiBpbmNvcnJlY3QgdXNlIG9mIHVzZSgpLiBMZWFybiBtb3JlOiBodHRwczovL3JlYWN0LmRldi93YXJuaW5ncy9jb25kaXRpb25hbC11c2Utb2YtdXNlXCJcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgICB0aHJvdyBTdXNwZW5zZUV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsTGF6eUluaXRJbkRFVihsYXp5VHlwZSk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGlmIChudWxsICE9PSB4ICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB4ICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHgudGhlbilcbiAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAoKHN1c3BlbmRlZFRoZW5hYmxlID0geCksXG4gICAgICAgICAgICAobmVlZHNUb1Jlc2V0U3VzcGVuZGVkVGhlbmFibGVERVYgPSAhMCksXG4gICAgICAgICAgICBTdXNwZW5zZUV4Y2VwdGlvbilcbiAgICAgICAgICApO1xuICAgICAgICB0aHJvdyB4O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdXNwZW5kZWRUaGVuYWJsZSgpIHtcbiAgICAgIGlmIChudWxsID09PSBzdXNwZW5kZWRUaGVuYWJsZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCBhIHN1c3BlbmRlZCB0aGVuYWJsZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICAgIHZhciB0aGVuYWJsZSA9IHN1c3BlbmRlZFRoZW5hYmxlO1xuICAgICAgc3VzcGVuZGVkVGhlbmFibGUgPSBudWxsO1xuICAgICAgbmVlZHNUb1Jlc2V0U3VzcGVuZGVkVGhlbmFibGVERVYgPSAhMTtcbiAgICAgIHJldHVybiB0aGVuYWJsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tJZlVzZVdyYXBwZWRJbkFzeW5jQ2F0Y2gocmVqZWN0ZWRSZWFzb24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmVqZWN0ZWRSZWFzb24gPT09IFN1c3BlbnNlRXhjZXB0aW9uIHx8XG4gICAgICAgIHJlamVjdGVkUmVhc29uID09PSBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvblxuICAgICAgKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIkhvb2tzIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBhbiBhc3luYyBjb21wb25lbnQuIFRoaXMgZXJyb3IgaXMgb2Z0ZW4gY2F1c2VkIGJ5IGFjY2lkZW50YWxseSBhZGRpbmcgYCd1c2UgY2xpZW50J2AgdG8gYSBtb2R1bGUgdGhhdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgc2VydmVyLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFyZVNhbWVLZXlQYXRoKGEsIGIpIHtcbiAgICAgIHJldHVybi
15852BhID09PSBiXG4gICAgICAgID8gITBcbiAgICAgICAgOiBhLnRhZyAhPT0gYi50YWcgfHxcbiAgICAgICAgICAgIGEudHlwZSAhPT0gYi50eXBlIHx8XG4gICAgICAgICAgICBhLmtleSAhPT0gYi5rZXkgfHxcbiAgICAgICAgICAgIGEuaW5kZXggIT09IGIuaW5kZXggfHxcbiAgICAgICAgICAgICgzID09PSBhLnRhZyAmJiBhLnN0YXRlTm9kZSAhPT0gYi5zdGF0ZU5vZGUpIHx8XG4gICAgICAgICAgICBudWxsID09PSBhLnJldHVybiB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gYi5yZXR1cm5cbiAgICAgICAgICA/ICExXG4gICAgICAgICAgOiBhcmVTYW1lS2V5UGF0aChhLnJldHVybiwgYi5yZXR1cm4pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoRGVidWdJbmZvKGRlYnVnSW5mbykge1xuICAgICAgdmFyIHByZXZpb3VzRGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgIG51bGwgIT0gZGVidWdJbmZvICYmXG4gICAgICAgIChjdXJyZW50RGVidWdJbmZvID1cbiAgICAgICAgICBudWxsID09PSBwcmV2aW91c0RlYnVnSW5mb1xuICAgICAgICAgICAgPyBkZWJ1Z0luZm9cbiAgICAgICAgICAgIDogcHJldmlvdXNEZWJ1Z0luZm8uY29uY2F0KGRlYnVnSW5mbykpO1xuICAgICAgcmV0dXJuIHByZXZpb3VzRGVidWdJbmZvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50RGVidWdUYXNrKCkge1xuICAgICAgdmFyIGRlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICBpZiAobnVsbCAhPSBkZWJ1Z0luZm8pXG4gICAgICAgIGZvciAodmFyIGkgPSBkZWJ1Z0luZm8ubGVuZ3RoIC0gMTsgMCA8PSBpOyBpLS0pXG4gICAgICAgICAgaWYgKG51bGwgIT0gZGVidWdJbmZvW2ldLm5hbWUpIHtcbiAgICAgICAgICAgIHZhciBkZWJ1Z1Rhc2sgPSBkZWJ1Z0luZm9baV0uZGVidWdUYXNrO1xuICAgICAgICAgICAgaWYgKG51bGwgIT0gZGVidWdUYXNrKSByZXR1cm4gZGVidWdUYXNrO1xuICAgICAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCwgZmliZXIsIHJldHVybkZpYmVyKSB7XG4gICAgICBmb3IgKHZhciBrZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5wcm9wcyksIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
15852XIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKFwiY2hpbGRyZW5cIiAhPT0ga2V5ICYmIFwia2V5XCIgIT09IGtleSAmJiBcInJlZlwiICE9PSBrZXkpIHtcbiAgICAgICAgICBudWxsID09PSBmaWJlciAmJlxuICAgICAgICAgICAgKChmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgMCkpLFxuICAgICAgICAgICAgKGZpYmVyLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIChmaWJlci5yZXR1cm4gPSByZXR1cm5GaWJlcikpO1xuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3JlZEtleSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIFwiSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCwgYHJlZmAsIGFuZCBgY2hpbGRyZW5gIHByb3BzLlwiLFxuICAgICAgICAgICAgICAgIGVycm9yZWRLZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVud3JhcFRoZW5hYmxlKHRoZW5hYmxlKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGVuYWJsZUluZGV4Q291bnRlciQxO1xuICAgICAgdGhlbmFibGVJbmRleENvdW50ZXIkMSArPSAxO1xuICAgICAgbnVsbCA9PT0gdGhlbmFibGVTdGF0ZSQxICYmICh0aGVuYWJsZVN0YXRlJDEgPSBjcmVhdGVUaGVuYWJsZVN0YXRlKCkpO1xuICAgICAgcmV0dXJuIHRyYWNrVXNlZFRoZW5hYmxlKHRoZW5hYmxlU3RhdGUkMSwgdGhlbmFibGUsIGluZGV4LCBudWxsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29lcmNlUmVmKHdvcmtJblByb2dyZXNzLCBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5wcm9wcy5yZWY7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSB2b2lkIDAgIT09IGVsZW1lbnQgPyBlbGVtZW50IDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlSW1wbChyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEVHQUNZX0VMRU1FTlRfVFlQRSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ0EgUmVhY3QgRWxlbWVudCBmcm9tIGFuIG9sZG
15852VyIHZlcnNpb24gb2YgUmVhY3Qgd2FzIHJlbmRlcmVkLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGNhbiBoYXBwZW4gaWY6XFxuLSBNdWx0aXBsZSBjb3BpZXMgb2YgdGhlIFwicmVhY3RcIiBwYWNrYWdlIGlzIHVzZWQuXFxuLSBBIGxpYnJhcnkgcHJlLWJ1bmRsZWQgYW4gb2xkIGNvcHkgb2YgXCJyZWFjdFwiIG9yIFwicmVhY3QvanN4LXJ1bnRpbWVcIi5cXG4tIEEgY29tcGlsZXIgdHJpZXMgdG8gXCJpbmxpbmVcIiBKU1ggaW5zdGVhZCBvZiB1c2luZyB0aGUgcnVudGltZS4nXG4gICAgICAgICk7XG4gICAgICByZXR1cm5GaWJlciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICtcbiAgICAgICAgICAoXCJbb2JqZWN0IE9iamVjdF1cIiA9PT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgID8gXCJvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKFwiLCBcIikgKyBcIn1cIlxuICAgICAgICAgICAgOiByZXR1cm5GaWJlcikgK1xuICAgICAgICAgIFwiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gICAgICB2YXIgZGVidWdUYXNrID0gZ2V0Q3VycmVudERlYnVnVGFzaygpO1xuICAgICAgbnVsbCAhPT0gZGVidWdUYXNrXG4gICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZUltcGwuYmluZChudWxsLCByZXR1cm5GaWJlciwgbmV3Q2hpbGQpXG4gICAgICAgICAgKVxuICAgICAgICA6IHRocm93T25JbnZhbGlkT2JqZWN0VHlwZUltcGwocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlSW1wbChyZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKSB7XG4gICAgICB2Y
15852XIgcGFyZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8IFwiQ29tcG9uZW50XCI7XG4gICAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbcGFyZW50TmFtZV0gfHxcbiAgICAgICAgKChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbcGFyZW50TmFtZV0gPSAhMCksXG4gICAgICAgIChpbnZhbGlkQ2hpbGQgPVxuICAgICAgICAgIGludmFsaWRDaGlsZC5kaXNwbGF5TmFtZSB8fCBpbnZhbGlkQ2hpbGQubmFtZSB8fCBcIkNvbXBvbmVudFwiKSxcbiAgICAgICAgMyA9PT0gcmV0dXJuRmliZXIudGFnXG4gICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkZ1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiB5b3UgcmV0dXJuICVzIGluc3RlYWQgb2YgPCVzIC8+IGZyb20gcmVuZGVyLiBPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC5cXG4gIHJvb3QucmVuZGVyKCVzKVwiLFxuICAgICAgICAgICAgICBpbnZhbGlkQ2hpbGQsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZCxcbiAgICAgICAgICAgICAgaW52YWxpZENoaWxkXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkZ1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiB5b3UgcmV0dXJuICVzIGluc3RlYWQgb2YgPCVzIC8+IGZyb20gcmVuZGVyLiBPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC5cXG4gIDwlcz57JXN9PC8lcz5cIixcbiAgICAgICAgICAgICAgaW52YWxpZENoaWxkLFxuICAgICAgICAgICAgICBpbnZhbGlkQ2hpbGQsXG4gICAgICAgICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZCxcbiAgICAgICAgICAgICAgcGFyZW50TmFtZVxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKSB7XG4gICAgICB2Y
15852XIgZGVidWdUYXNrID0gZ2V0Q3VycmVudERlYnVnVGFzaygpO1xuICAgICAgbnVsbCAhPT0gZGVidWdUYXNrXG4gICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZUltcGwuYmluZChudWxsLCByZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKVxuICAgICAgICAgIClcbiAgICAgICAgOiB3YXJuT25GdW5jdGlvblR5cGVJbXBsKHJldHVybkZpYmVyLCBpbnZhbGlkQ2hpbGQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuT25TeW1ib2xUeXBlSW1wbChyZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKSB7XG4gICAgICB2YXIgcGFyZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8IFwiQ29tcG9uZW50XCI7XG4gICAgICBvd25lckhhc1N5bWJvbFR5cGVXYXJuaW5nW3BhcmVudE5hbWVdIHx8XG4gICAgICAgICgob3duZXJIYXNTeW1ib2xUeXBlV2FybmluZ1twYXJlbnROYW1lXSA9ICEwKSxcbiAgICAgICAgKGludmFsaWRDaGlsZCA9IFN0cmluZyhpbnZhbGlkQ2hpbGQpKSxcbiAgICAgICAgMyA9PT0gcmV0dXJuRmliZXIudGFnXG4gICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlN5bWJvbHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLlxcbiAgcm9vdC5yZW5kZXIoJXMpXCIsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJTeW1ib2xzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC5cXG4gIDwlcz4lczwvJXM+XCIsXG4gICAgICAgICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZCxcbiAgICAgICAgICAgICAgcGFyZW50TmFtZVxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5PblN5bWJvbFR5cGUocmV0dXJuRmliZXIsIGludmFsaWRDaGlsZCkge1xuICAgICAgdmFyIGRlYnVnVGFzayA9IGdldEN1cnJlbnREZWJ1Z1Rhc2soKTtcbiAgICAgIG51bGwgIT09IGRlYnVnVGFza1xuICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICB3YXJuT25TeW1ib2xUeXBlSW1wbC5iaW5kKG51bGwsIHJldHVybkZpYmVyLCBpbnZhbGlkQ2hpbGQpXG4gICAgICAgICAgKVxuICAgICAgICA6IHdhcm5PblN5bWJvbFR5cGVJbXBsKHJldHVybkZpYmVyLCBpbnZhbGlkQ2hpbGQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICB2Y
15852XIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuICAgICAgICAgIG51bGwgPT09IGRlbGV0aW9uc1xuICAgICAgICAgICAgPyAoKHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlci5mbGFncyB8PSAxNikpXG4gICAgICAgICAgICA6IGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAgICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgZm9yICg7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSxcbiAgICAgICAgICAgIChjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgICAgIGZvciAodmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApXG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudEZpcnN0Q2hpbGQua2V5XG4gICAgICAgICAgICA/IGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGN1cnJlbnRGaXJzdENoaWxkLmluZGV4LCBjdXJyZW50Rmlyc3RDaGlsZClcbiAgICAgICAgICAgIDogZXhpc3RpbmdDaGlsZHJlbi5zZXQoY3VycmVudEZpcnN0Q2hpbGQua2V5LCBjdXJyZW50Rmlyc3RDaGlsZCksXG4gICAgICAgICAgICAoY3VycmVudEZpcnN0Q2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgICAgIGZpYmVyID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgICAgIGZpYmVyLmluZGV4ID0gMDtcbiAgICAgICAgZmliZXIuc2libGluZyA9IG51bGw7XG4gICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICAgICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcbiAgICAgICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKVxuICAgICAgICAgIHJldHVybiAobmV3RmliZXIuZmxhZ3MgfD0gMTA0ODU3NiksIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgICAgbmV3SW5kZXggPSBuZXdGaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIGlmIChudWxsICE9PSBuZXdJbmRleClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKG5ld0luZGV4ID0gbmV3SW5kZXguaW5kZXgpLFxuICAgICAgICAgICAgbmV3SW5kZXggPCBsYXN0UGxhY2VkSW5kZXhcbiAgICAgICAgICAgICAgPyAoKG5ld0ZpYmVyLmZsYWdzIHw9IDIpLCBsYXN0UGxhY2VkSW5kZXgpXG4gICAgICAgICAgICAgIDogbmV3SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSAxMzQyMTc3MzA7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgICAgIHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICBudWxsID09PSBuZXdGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAobmV3RmliZXIuZmxhZ3MgfD0gMTM0MjE3NzMwKTtcbiAgICAgICAgcmV0dXJuIG5ld0ZpYmVyO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudCB8fCA2ICE9PSBjdXJyZW50LnRhZylcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGN1cnJlbnQgPSBjcmVhdGVGaWJlckZyb21UZXh0KFxuICAgICAgICAgICAgICB0ZXh0Q29udGVudCxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKGN1cnJlbnQucmV0dXJuID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgKGN1cnJlbnQuX2RlYnVnT3duZXIgPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAoY3VycmVudC5fZGVidWdUYXNrID0gcmV0dXJuRmliZXIuX2RlYnVnVGFzayksXG4gICAgICAgICAgICAoY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbyksXG4gICAgICAgICAgICBjdXJyZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgY3VycmVudCA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgICAgICB2Y
15852XIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGN1cnJlbnQgPSB1cGRhdGVGcmFnbWVudChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICBlbGVtZW50LmtleVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBjb2VyY2VSZWYoY3VycmVudCwgZWxlbWVudCksXG4gICAgICAgICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCwgY3VycmVudCwgcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgY3VycmVudFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8XG4gICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgfHxcbiAgICAgICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgZWxlbWVudFR5cGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gZWxlbWVudFR5cGUgJiZcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJlxuICAgICAgICAgICAgICByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGN1cnJlbnQgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKSksXG4gICAgICAgICAgICBjb2VyY2VSZWYoY3VycmVudCwgZWxlbWVudCksXG4gICAgICAgICAgICAoY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAoY3VycmVudC5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyKSxcbiAgICAgICAgICAgIChjdXJyZW50Ll9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIGN1cnJlbnRcbiAgICAgICAgICApO1xuICAgICAgICBjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICAgIGNvZXJjZVJlZihjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICA0ICE9PSBjdXJyZW50LnRhZyB8fFxuICAgICAgICAgIGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8XG4gICAgICAgICAgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpKSxcbiAgICAgICAgICAgIChjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIChjdXJyZW50Ll9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIGN1cnJlbnRcbiAgICAgICAgICApO1xuICAgICAgICBjdXJyZW50ID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQgfHwgNyAhPT0gY3VycmVudC50YWcpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgICAgICByZXR1cm5GaWJlci5tb2RlLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIChjdXJyZW50Ll9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgKGN1cnJlbnQuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgKGN1cnJlbnQuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pLFxuICAgICAgICAgICAgY3VycmVudFxuICAgICAgICAgICk7XG4gICAgICAgIGN1cnJlbnQgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICAgIGN1cnJlbnQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIGN1cnJlbnQuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBcIlwiICE9PSBuZXdDaGlsZCkgfHxcbiAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgbmV3Q2hpbGQgfHxcbiAgICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgbmV3Q2hpbGRcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAobmV3Q2hpbGQgPSBjcmVhdGVGaWJlckZyb21UZXh0KFxuICAgICAgICAgICAgICBcIlwiICsgbmV3Q2hpbGQsXG4gICAgICAgICAgICAgI
15852HJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChuZXdDaGlsZC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAobmV3Q2hpbGQuX2RlYnVnT3duZXIgPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAobmV3Q2hpbGQuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgKG5ld0NoaWxkLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIG5ld0NoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIGNvZXJjZVJlZihsYW5lcywgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAobmV3Q2hpbGQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwoXG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIChuZXdDaGlsZC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKG5ld0NoaWxkLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgICBuZXdDaGlsZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIHZhciBfcHJldkRlYnVnSW5mbyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbyk7XG4gICAgICAgICAgICAgIG5ld0NoaWxkID0gcmVzb2x2ZUxhenkobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICByZXR1cm5GaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgICBjdXJyZW50RGVidWdJbmZvID0gX3ByZXZEZWJ1Z0luZm87XG4gICAgICAgICAgICAgIHJldHVybiByZXR1cm5GaWJlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzQXJyYXlJbXBsKG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSlcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnREZWJ1Z0luZm8gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZC50aGVuKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKF9wcmV2RGVidWdJbmZvID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGNyZWF0ZUNoaWxkKFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIHVud3JhcFRoZW5hYmxlKG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnREZWJ1Z0luZm8gPSBfcHJldkRlYnVnSW5mbyksXG4gICAgICAgICAgICAgIHJldHVybkZpYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFKVxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgcmVhZENvbnRleHREdXJpbmdSZWNvbmNpbGlhdGlvbihyZXR1cm5GaWJlciwgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJlxuICAgICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgd2Fyb
15852k9uU3ltYm9sVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAgICAgdmFyIGtleSA9IG51bGwgIT09IG9sZEZpYmVyID8gb2xkRmliZXIua2V5IDogbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbmV3Q2hpbGQpIHx8XG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gbnVsbCAhPT0ga2V5XG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBcIlwiICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQua2V5ID09PSBrZXlcbiAgICAgICAgICAgICAgICA/ICgoa2V5ID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSB1cGRhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGtleSksXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQua2V5ID09PSBrZXlcbiAgICAgICAgICAgICAgICA/IHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcylcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAoa2V5ID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgICAgKG5ld0NoaWxkID0gcmVzb2x2ZUxhenkobmV3Q2hpbGQpKSxcbiAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSB1cGRhdGVTbG90KFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGtleSksXG4gICAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzQXJyYXlJbXBsKG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGtleSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBrZXkgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSB1cGRhdGVGcmFnbWVudChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjdXJyZW50RGVidWdJbmZvID0ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIHJldHVybkZpYmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbmV3Q2hpbGQudGhlbilcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChrZXkgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gdXBkYXRlU2xvdChcbiAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChjdXJyZW50RGVidWdJbmZvID0ga2V5KSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICByZWFkQ29udGV4dER1cmluZ1JlY29uY2lsaWF0aW9uKHJldHVybkZpYmVyLCBuZXdDaGlsZCksXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIFwic3ltYm9sXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiB3YXJuT25TeW1ib2xUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbixcbiAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgIG5ld0lkeCxcbiAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbm
15852V3Q2hpbGQpIHx8XG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2hpbGRyZW4gPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGwpLFxuICAgICAgICAgICAgdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGV4aXN0aW5nQ2hpbGRyZW4sIFwiXCIgKyBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChuZXdJZHggPVxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5nZXQoXG4gICAgICAgICAgICAgICAgICAgIG51bGwgPT09IG5ld0NoaWxkLmtleSA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleVxuICAgICAgICAgICAgICAgICAgKSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICAoZXhpc3RpbmdDaGlsZHJlbiA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbykpLFxuICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHVwZGF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGV4aXN0aW5nQ2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChleGlzdGluZ0NoaWxkcmVuID1cbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KFxuICAgICAgICAgICAgICAgICAgICBudWxsID09PSBuZXdDaGlsZC5rZXkgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXlcbiAgICAgICAgICAgICAgICAgICkgfHwgbnVsbCksXG4gICAgICAgICAgICAgICAgdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBleGlzdGluZ0NoaWxkcmVuLCBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgdmFyIF9wcmV2RGVidWdJbmZvNyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbyk7XG4gICAgICAgICAgICAgIG5ld0NoaWxkID0gcmVzb2x2ZUxhenkobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICByZXR1cm5GaWJlciA9IHVwZGF0ZUZyb21NYXAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbixcbiAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICBuZXdJZHgsXG4gICAgICAgICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY3VycmVudERlYnVnSW5mbyA9IF9wcmV2RGVidWdJbmZvNztcbiAgICAgICAgICAgICAgcmV0dXJuIHJldHVybkZpYmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNBcnJheUltcGwobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKG5ld0lkeCA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbCksXG4gICAgICAgICAgICAgIChleGlzdGluZ0NoaWxkcmVuID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHVwZGF0ZUZyYWdtZW50KFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGV4aXN0aW5nQ2hpbGRyZW4pLFxuICAgICAgICAgICAgICByZXR1cm5GaWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbmV3Q2hpbGQudGhlbilcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChfcHJldkRlYnVnSW5mbzcgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChjdXJyZW50RGVidWdJbmZvID0gX3ByZXZEZWJ1Z0luZm83KSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbixcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgcmVhZENvbnRleHREdXJpbmdSZWNvbmNpbGlhdGlvbihyZXR1cm5GaWJlciwgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJlxuICAgICAgICAgI
15852Hdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgd2Fybk9uU3ltYm9sVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkocmV0dXJuRmliZXIsIHdvcmtJblByb2dyZXNzLCBjaGlsZCwga25vd25LZXlzKSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiICE9PSB0eXBlb2YgY2hpbGQgfHwgbnVsbCA9PT0gY2hpbGQpIHJldHVybiBrbm93bktleXM7XG4gICAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkocmV0dXJuRmliZXIsIHdvcmtJblByb2dyZXNzLCBjaGlsZCk7XG4gICAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT09IHR5cGVvZiBrZXkpIGJyZWFrO1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGtub3duS2V5cykge1xuICAgICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYod29ya0luUHJvZ3Jlc3MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIkVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSBhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSBkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIFxcdTIwMTQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCBjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi5cIixcbiAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAoY2hpbGQgPSByZXNvbHZlTGF6eShjaGlsZCkpLFxuICAgICAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KHJldHVybkZpYmVyLCB3b3JrSW5Qcm9ncmVzcywgY2hpbGQsIGtub3duS2V5cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoXG4gICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGRyZW4sXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2Y
15852XIga25vd25LZXlzID0gbnVsbCxcbiAgICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsLFxuICAgICAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG51bGwsXG4gICAgICAgICAgICBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgbmV3SWR4ID0gKGN1cnJlbnRGaXJzdENoaWxkID0gMCksXG4gICAgICAgICAgICBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgICAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICBuZXdJZHgrK1xuICAgICAgICApIHtcbiAgICAgICAgICBvbGRGaWJlci5pbmRleCA+IG5ld0lkeFxuICAgICAgICAgICAgPyAoKG5leHRPbGRGaWJlciA9IG9sZEZpYmVyKSwgKG9sZEZpYmVyID0gbnVsbCkpXG4gICAgICAgICAgICA6IChuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KFxuICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5ld0ZpYmVyKSB7XG4gICAgICAgICAgICBudWxsID09PSBvbGRGaWJlciAmJiAob2xkRmliZXIgPSBuZXh0T2xkRmliZXIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIG5ld0ZpYmVyLFxuICAgICAgICAgICAgbmV3Q2hpbGRyZW5bbmV3SWR4XSxcbiAgICAgICAgICAgIGtub3duS2V5c1xuICAgICAgICAgICk7XG4gICAgICAgICAgc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJlxuICAgICAgICAgICAgb2xkRmliZXIgJiZcbiAgICAgICAgICAgIG51bGwgPT09IG5ld0ZpYmVyLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdJZHgpO1xuICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcilcbiAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyKTtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpLFxuICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpLFxuICAgICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChudWxsID09PSBvbGRGaWJlcikge1xuICAgICAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKVxuICAgICAgICAgICAgKG9sZEZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKSksXG4gICAgICAgICAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmXG4gICAgICAgICAgICAgICAgKChrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgICAgICAgICAgICBrbm93bktleXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudEZpcnN0Q2hpbGQgPSBwbGFjZUNoaWxkKFxuICAgICAgICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgIG5ld0lkeFxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBvbGRGaWJlcilcbiAgICAgICAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG9sZEZpYmVyKSxcbiAgICAgICAgICAgICAgICAocHJldmlvdXNOZXdGaWJlciA9IG9sZEZpYmVyKSk7XG4gICAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgb2xkRmliZXIgPSBtYXBSZW1haW5pbmdDaGlsZHJlbihvbGRGaWJlcik7XG4gICAgICAgICAgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgIG5ld0lkeCsrXG4gICAgICAgIClcbiAgICAgICAgICAobmV4dE9sZEZpYmVyID0gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICBuZXdJZHgsXG4gICAgICAgICAgICBuZXdDaGlsZHJlbltuZXdJZHhdLFxuICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICApKSxcbiAgICAgICAgICAgIG51bGwgIT09IG5leHRPbGRGaWJlciAmJlxuICAgICAgICAgICAgICAoKGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoXG4gICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgbmV4dE9sZEZpYmVyLFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgICAgICAgICAga25vd25LZXlzXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmXG4gICAgICAgICAgICAgICAgKChuZXdGaWJlciA9IG5leHRPbGRGaWJlci5hbHRlcm5hdGUpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IG5ld0ZpYmVyICYmXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlci5kZWxldGUoXG4gICAgICAgICAgICAgICAgICAgIG51bGwgPT09IG5ld0ZpYmVyLmtleSA/IG5ld0lkeCA6IG5ld0ZpYmVyLmtleVxuICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChjdXJyZW50Rmlyc3RDaGlsZCA9IHBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgICAgbmV4dE9sZEZpYmVyLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICAgIG5ld0lkeFxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICAgICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXh0T2xkRmliZXIpXG4gICAgICAgICAgICAgICAgOiAocHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV4dE9sZEZpYmVyKSxcbiAgICAgICAgICAgICAgKHByZXZpb3VzTmV3RmliZXIgPSBuZXh0T2xkRmliZXIpKTtcbiAgICAgICAgc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJlxuICAgICAgICAgIG9sZEZpYmVyLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoXG4gICAgICAgI
15852HJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGRyZW4sXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgaWYgKG51bGwgPT0gbmV3Q2hpbGRyZW4pXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuXCIpO1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbCxcbiAgICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBudWxsLFxuICAgICAgICAgICAgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgIG5ld0lkeCA9IChjdXJyZW50Rmlyc3RDaGlsZCA9IDApLFxuICAgICAgICAgICAgbmV4dE9sZEZpYmVyID0gbnVsbCxcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG51bGwsXG4gICAgICAgICAgICBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmICFzdGVwLmRvbmU7XG4gICAgICAgICAgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgb2xkRmliZXIuaW5kZXggPiBuZXdJZHhcbiAgICAgICAgICAgID8gKChuZXh0T2xkRmliZXIgPSBvbGRGaWJlciksIChvbGRGaWJlciA9IG51bGwpKVxuICAgICAgICAgICAgOiAobmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZyk7XG4gICAgICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gbmV3RmliZXIpIHtcbiAgICAgICAgICAgIG51bGwgPT09IG9sZEZpYmVyICYmIChvbGRGaWJlciA9IG5leHRPbGRGaWJlcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShcbiAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgbmV3RmliZXIsXG4gICAgICAgICAgICBzdGVwLnZhbHVlLFxuICAgICAgICAgICAga25vd25LZXlzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmXG4gICAgICAgICAgICBvbGRGaWJlciAmJlxuICAgICAgICAgICAgbnVsbCA9PT0gbmV3RmliZXIuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChuZXdGaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0lkeCk7XG4gICAgICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICAgICAgPyAocmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyKVxuICAgICAgICAgICAgOiAocHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXIpO1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcC5kb25lKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpLFxuICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpLFxuICAgICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChudWxsID09PSBvbGRGaWJlcikge1xuICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSlcbiAgICAgICAgICAgIChvbGRGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcykpLFxuICAgICAgICAgICAgICBudWxsICE9PSBvbGRGaWJlciAmJlxuICAgICAgICAgICAgICAgICgoa25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICAgICAgICBzdGVwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAga25vd25LZXlzXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgICAgICBuZXdJZHhcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSBwcmV2aW91c05ld0ZpYmVyXG4gICAgICAgICAgICAgICAgICA/IChyZXN1bHRpbmdGaXJzdENoaWxkID0gb2xkRmliZXIpXG4gICAgICAgICAgICAgICAgICA6IChwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBvbGRGaWJlciksXG4gICAgICAgICAgICAgICAgKHByZXZpb3VzTmV3RmliZXIgPSBvbGRGaWJlcikpO1xuICAgICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIG9sZEZpYmVyID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ob2xkRmliZXIpO1xuICAgICAgICAgICFzdGVwLmRvbmU7XG4gICAgICAgICAgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KClcbiAgICAgICAgKVxuICAgICAgICAgIChuZXh0T2xkRmliZXIgPSB1cGRhdGVGcm9tTWFwKFxuICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgIHN0ZXAudmFsdWUsXG4gICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICkpLFxuICAgICAgICAgICAgbnVsbCAhPT0gbmV4dE9sZEZpYmVyICYmXG4gICAgICAgICAgICAgICgoa25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShcbiAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICBuZXh0T2xkRmliZXIsXG4gICAgICAgICAgICAgICAgc3RlcC52YWx1ZSxcbiAgICAgICAgICAgICAgICBrbm93bktleXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgI
15852HNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICAgICAgICAoKHN0ZXAgPSBuZXh0T2xkRmliZXIuYWx0ZXJuYXRlKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBzdGVwICYmXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlci5kZWxldGUobnVsbCA9PT0gc3RlcC5rZXkgPyBuZXdJZHggOiBzdGVwLmtleSkpLFxuICAgICAgICAgICAgICAoY3VycmVudEZpcnN0Q2hpbGQgPSBwbGFjZUNoaWxkKFxuICAgICAgICAgICAgICAgIG5leHRPbGRGaWJlcixcbiAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICBuZXdJZHhcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgICAgICA/IChyZXN1bHRpbmdGaXJzdENoaWxkID0gbmV4dE9sZEZpYmVyKVxuICAgICAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5leHRPbGRGaWJlciksXG4gICAgICAgICAgICAgIChwcmV2aW91c05ld0ZpYmVyID0gbmV4dE9sZEZpYmVyKSk7XG4gICAgICAgIHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICBvbGRGaWJlci5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVyc0ltcGwoXG4gICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICAgICAgbnVsbCAhPT0gbmV3Q2hpbGQgJiZcbiAgICAgICAgICBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmXG4gICAgICAgICAgbnVsbCA9PT0gbmV3Q2hpbGQua2V5ICYmXG4gICAgICAgICAgdm9pZCAwID09PSBuZXdDaGlsZC5wcm9wcy5yZWYgJiZcbiAgICAgICAgICAodmFsaWRhdGVGcmFnbWVudFByb3BzKG5ld0NoaWxkLCBudWxsLCByZXR1cm5GaWJlciksXG4gICAgICAgICAgKG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW4pKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICB2Y
15852XIgcHJldkRlYnVnSW5mbyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbyk7XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgPSBuZXdDaGlsZC5rZXk7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXdDaGlsZC50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKDcgPT09IGN1cnJlbnRGaXJzdENoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZXMgPSB1c2VGaWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29lcmNlUmVmKGxhbmVzLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmVzLl9kZWJ1Z093bmVyID0gbmV3Q2hpbGQuX293bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMobmV3Q2hpbGQsIGxhbmVzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlciA9IGxhbmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQuZWxlbWVudFR5cGUgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBrZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVMYXp5KGtleSkgPT09IGN1cnJlbnRGaXJzdENoaWxkLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBsYW5lcyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZC5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgY29lcmNlUmVmKGxhbmVzLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMuX2RlYnVnT3duZXIgPSBuZXdDaGlsZC5fb3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBsYW5lcztcbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEVcbiAgICAgICAgICAgICAgICAgID8gKChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQua2V5XG4gICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICBjb2VyY2VSZWYobGFuZXMsIG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMobmV3Q2hpbGQsIGxhbmVzLCByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSlcbiAgICAgICAgICAgICAgICAgIDogKChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgY29lcmNlUmVmKGxhbmVzLCBuZXdDaGlsZCksXG4gICAgICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgICAgIChsYW5lcy5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbyksXG4gICAgICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSk7XG4gICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBwbGFjZVNpbmdsZUNoaWxkKHJldHVybkZpYmVyKTtcbiAgICAgICAgICAgICAgY3VycmVudERlYnVnSW5mbyA9IHByZXZEZWJ1Z0luZm87XG4gICAgICAgICAgICAgIHJldHVybiByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICBwcmV2RGVidWdJbmZvID0gbmV3Q2hpbGQ7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkID0gcHJldkRlYnVnSW5mby5rZXk7XG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkLmtleSA9PT0gbmV3Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICA0ID09PSBjdXJyZW50Rmlyc3RDaGlsZC50YWcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEZWJ1Z0luZm8uY29udGFpbmVySW5mbyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEZWJ1Z0luZm8uaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxhbmVzID0gdXNlRmliZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEZWJ1Z0luZm8uY2hpbGRyZW4gfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyID0gbGFuZXM7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhbmVzID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKFxuICAgICAgICAgICAgICAgICAgcHJldkRlYnVnSW5mbyxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGFuZXMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBsYW5lcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZXR1cm5GaWJlcik7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAocHJldkRlYnVnSW5mbyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbykpLFxuICAgICAgICAgICAgICAgIChuZXdDaGlsZCA9IHJlc29sdmVMYXp5KG5ld0NoaWxkKSksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IHByZXZEZWJ1Z0luZm8pLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0FycmF5SW1wbChuZXdDaGlsZCkpXG4gICAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgICAgICBwcmV2RGVidWdJbmZvID0gbmV3Q2hpbGQ7XG4gICAgICAgICAgICBuZXdDaGlsZCA9IGdldEl0ZXJhdG9yRm4ocHJldkRlYnVnSW5mbyk7XG4gICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgbmV3Q2hpbGQpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAga2V5ID0gbmV3Q2hpbGQuY2FsbChwcmV2RGVidWdJbmZvKTtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHByZXZEZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIDAgIT09IHJldHVybkZpYmVyLnRhZyB8fFxuICAgICAgICAgICAgICAgIFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIiAhPT1cbiAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXR1cm5GaWJlci50eXBlKSB8fFxuICAgICAgICAgICAgICAgIFwiW29iamVjdCBHZW5lcmF0b3JdXCIgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChrZXkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzIHx8XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlVzaW5nIEl0ZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgdW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlIGBbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gWW91IGNhbiBhbHNvIHVzZSBhbiBJdGVyYWJsZSB0aGF0IGNhbiBpdGVyYXRlIG11bHRpcGxlIHRpbWVzIG92ZXIgdGhlIHNhbWUgaXRlbXMuXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAoZGlkV2Fyb
15852kFib3V0R2VuZXJhdG9ycyA9ICEwKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBwcmV2RGVidWdJbmZvLmVudHJpZXMgIT09IG5ld0NoaWxkIHx8XG4gICAgICAgICAgICAgICAgZGlkV2FybkFib3V0TWFwcyB8fFxuICAgICAgICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuXCJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIChkaWRXYXJuQWJvdXRNYXBzID0gITApKTtcbiAgICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZC50aGVuKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKHByZXZEZWJ1Z0luZm8gPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICAgIHVud3JhcFRoZW5hYmxlKG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnREZWJ1Z0luZm8gPSBwcmV2RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgIHJlYWRDb250ZXh0RHVyaW5nUmVjb25jaWxpYXRpb24ocmV0dXJuRmliZXIsIG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbmV3Q2hpbGQpIHx8XG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHByZXZEZWJ1Z0luZm8gPSBcIlwiICsgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudEZpcnN0Q2hpbGQgJiYgNiA9PT0gY3VycmVudEZpcnN0Q2hpbGQudGFnXG4gICAgICAgICAgICAgID8gKGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAobGFuZXMgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgcHJldkRlYnVnSW5mbykpLFxuICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gbGFuZXMpKVxuICAgICAgICAgICAgICA6IChkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpLFxuICAgICAgICAgICAgICAgIChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoXG4gICAgICAgICAgICAgICAgICBwcmV2RGVidWdJbmZvLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnT3duZXIgPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z1Rhc2sgPSByZXR1cm5GaWJlci5fZGVidWdUYXNrKSxcbiAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pLFxuICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSksXG4gICAgICAgICAgICBwbGFjZVNpbmdsZUNoaWxkKHJldHVybkZpYmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIFwic3ltYm9sXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiB3YXJuT25TeW1ib2xUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgICAgICB2Y
15852XIgcHJldkRlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgIGN1cnJlbnREZWJ1Z0luZm8gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwO1xuICAgICAgICAgIHZhciBmaXJzdENoaWxkRmliZXIgPSByZWNvbmNpbGVDaGlsZEZpYmVyc0ltcGwoXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhlbmFibGVTdGF0ZSQxID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gZmlyc3RDaGlsZEZpYmVyO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgaWYgKHggPT09IFN1c3BlbnNlRXhjZXB0aW9uIHx8IHggPT09IFN1c3BlbnNlQWN0aW9uRXhjZXB0aW9uKSB0aHJvdyB4O1xuICAgICAgICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKDI5LCB4LCBudWxsLCByZXR1cm5GaWJlci5tb2RlKTtcbiAgICAgICAgICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICAgICAgICAgIGZpYmVyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHZhciBkZWJ1Z0luZm8gPSAoZmliZXIuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pO1xuICAgICAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIuX2RlYnVnT3duZXI7XG4gICAgICAgICAgZmliZXIuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2s7XG4gICAgICAgICAgaWYgKG51bGwgIT0gZGVidWdJbmZvKVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlYnVnSW5mby5sZW5ndGggLSAxOyAwIDw9IGk7IGktLSlcbiAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBkZWJ1Z0luZm9baV0uc3RhY2spIHtcbiAgICAgICAgICAgICAgICBmaWJlci5fZGVidWdPd25lciA9IGRlYnVnSW5mb1tpXTtcbiAgICAgICAgICAgICAgICBmaWJlci5fZGVidWdUYXNrID0gZGVidWdJbmZvW2ldLmRlYnVnVGFzaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50RGVidWdJbmZvID0gcHJldkRlYnVnSW5mbztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gICAgICB2Y
15852XIgaXNBbkFycmF5ID0gaXNBcnJheUltcGwoY2hpbGRTbG90KTtcbiAgICAgIGNoaWxkU2xvdCA9ICFpc0FuQXJyYXkgJiYgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpO1xuICAgICAgcmV0dXJuIGlzQW5BcnJheSB8fCBjaGlsZFNsb3RcbiAgICAgICAgPyAoKGlzQW5BcnJheSA9IGlzQW5BcnJheSA/IFwiYXJyYXlcIiA6IFwiaXRlcmFibGVcIiksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiA8L1N1c3BlbnNlTGlzdD5cIixcbiAgICAgICAgICAgIGlzQW5BcnJheSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgaXNBbkFycmF5XG4gICAgICAgICAgKSxcbiAgICAgICAgICAhMSlcbiAgICAgICAgOiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgICAgICBzaGFyZWQ6IHsgcGVuZGluZzogbnVsbCwgbGFuZXM6IDAsIGhpZGRlbkNhbGxiYWNrczogbnVsbCB9LFxuICAgICAgICBjYWxsYmFja3M6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0ge1xuICAgICAgICAgIGJhc2VTdGF0ZTogY3VycmVudC5iYXNlU3RhdGUsXG4gICAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50LmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudC5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgICAgICBzaGFyZWQ6IGN1cnJlbnQuc2hhcmVkLFxuICAgICAgICAgIGNhbGxiYWNrczogbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGxhbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhbmU6IGxhbmUsXG4gICAgICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgICAgIHBheWxvYWQ6IG51bGwsXG4gICAgICAgIGNhbGxiYWNrOiBudWxsLFxuICAgICAgICBuZXh0OiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuICAgICAgaWYgKG51bGwgPT09IHVwZGF0ZVF1ZXVlKSByZXR1cm4gbnVsbDtcbiAgICAgIHVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHVwZGF0ZVF1ZXVlICYmXG4gICAgICAgICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlXG4gICAgICApIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkFuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCB3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSBjYWxsYmFjay5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50OiAlc1wiLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9ICEwO1xuICAgICAgfVxuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoY29tcG9uZW50TmFtZSA9IHVwZGF0ZVF1ZXVlLnBlbmRpbmcpLFxuICAgICAgICAgIG51bGwgPT09IGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgICAgICAgICAgOiAoKHVwZGF0ZS5uZXh0ID0gY29tcG9uZW50TmFtZS5uZXh0KSxcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUubmV4dCA9IHVwZGF0ZSkpLFxuICAgICAgICAgICh1cGRhdGVRdWV1ZS5wZW5kaW5nID0gdXBkYXRlKSxcbiAgICAgICAgICAodXBkYXRlID0gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihmaWJlcikpLFxuICAgICAgICAgIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBudWxsLCBsYW5lKSxcbiAgICAgICAgICB1cGRhdGVcbiAgICAgICAgKTtcbiAgICAgIGVucXVldWVVcGRhdGUkMShmaWJlciwgdXBkYXRlUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICByZXR1cm4gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgICAgIGZpYmVyID0gZmliZXIudXBkYXRlUXVldWU7XG4gICAgICBpZiAobnVsbCAhPT0gZmliZXIgJiYgKChmaWJlciA9IGZpYmVyLnNoYXJlZCksIDAgIT09IChsYW5lICYgNDE5NDA0OCkpKSB7XG4gICAgICAgIHZhciBxdWV1ZUxhbmVzID0gZmliZXIubGFuZXM7XG4gICAgICAgIHF1ZXVlTGFuZXMgJj0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gICAgICAgIGxhbmUgfD0gcXVldWVMYW5lcztcbiAgICAgICAgZmliZXIubGFuZXMgPSBsYW5lO1xuICAgICAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjYXB0dXJlZFVwZGF0ZSkge1xuICAgICAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUsXG4gICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgKChjdXJyZW50ID0gY3VycmVudC51cGRhdGV
15852RdWV1ZSksIHF1ZXVlID09PSBjdXJyZW50KVxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZXdGaXJzdCA9IG51bGwsXG4gICAgICAgICAgbmV3TGFzdCA9IG51bGw7XG4gICAgICAgIHF1ZXVlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICAgICAgICBpZiAobnVsbCAhPT0gcXVldWUpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgICAgIGxhbmU6IHF1ZXVlLmxhbmUsXG4gICAgICAgICAgICAgIHRhZzogcXVldWUudGFnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBxdWV1ZS5wYXlsb2FkLFxuICAgICAgICAgICAgICBjYWxsYmFjazogbnVsbCxcbiAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG51bGwgPT09IG5ld0xhc3RcbiAgICAgICAgICAgICAgPyAobmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmUpXG4gICAgICAgICAgICAgIDogKG5ld0xhc3QgPSBuZXdMYXN0Lm5leHQgPSBjbG9uZSk7XG4gICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLm5leHQ7XG4gICAgICAgICAgfSB3aGlsZSAobnVsbCAhPT0gcXVldWUpO1xuICAgICAgICAgIG51bGwgPT09IG5ld0xhc3RcbiAgICAgICAgICAgID8gKG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlKVxuICAgICAgICAgICAgOiAobmV3TGFzdCA9IG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlKTtcbiAgICAgICAgfSBlbHNlIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICBxdWV1ZSA9IHtcbiAgICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnQuYmFzZVN0YXRlLFxuICAgICAgICAgIGZpcnN0QmFzZVVwZGF0ZTogbmV3Rmlyc3QsXG4gICAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgICAgc2hhcmVkOiBjdXJyZW50LnNoYXJlZCxcbiAgICAgICAgICBjYWxsYmFja3M6IGN1cnJlbnQuY2FsbGJhY2tzXG4gICAgICAgIH07XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdvcmtJblByb2dyZXNzID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG4gICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICA/IChxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZSlcbiAgICAgICAgOiAod29ya0luUHJvZ3Jlc3MubmV4dCA9IGNhcHR1cmVkVXBkYXRlKTtcbiAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKSB7XG4gICAgICBpZiAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbikge1xuICAgICAgICB2Y
15852XIgZW50YW5nbGVkQWN0aW9uVGhlbmFibGUgPSBjdXJyZW50RW50YW5nbGVkQWN0aW9uVGhlbmFibGU7XG4gICAgICAgIGlmIChudWxsICE9PSBlbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSkgdGhyb3cgZW50YW5nbGVkQWN0aW9uVGhlbmFibGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZShcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgcHJvcHMsXG4gICAgICBpbnN0YW5jZSRqc2NvbXAkMCxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITE7XG4gICAgICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICAgIGhhc0ZvcmNlVXBkYXRlID0gITE7XG4gICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgICBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcbiAgICAgIGlmIChudWxsICE9PSBwZW5kaW5nUXVldWUpIHtcbiAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWUsXG4gICAgICAgICAgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7XG4gICAgICAgIG51bGwgPT09IGxhc3RCYXNlVXBkYXRlXG4gICAgICAgICAgPyAoZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlKVxuICAgICAgICAgIDogKGxhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGUpO1xuICAgICAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB2Y
15852XIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgIChwZW5kaW5nUXVldWUgPSBjdXJyZW50Lmxhc3RCYXNlVXBkYXRlKSxcbiAgICAgICAgICBwZW5kaW5nUXVldWUgIT09IGxhc3RCYXNlVXBkYXRlICYmXG4gICAgICAgICAgICAobnVsbCA9PT0gcGVuZGluZ1F1ZXVlXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlKVxuICAgICAgICAgICAgICA6IChwZW5kaW5nUXVldWUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZSksXG4gICAgICAgICAgICAoY3VycmVudC5sYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlKSkpO1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgIT09IGZpcnN0QmFzZVVwZGF0ZSkge1xuICAgICAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7XG4gICAgICAgIGxhc3RCYXNlVXBkYXRlID0gMDtcbiAgICAgICAgY3VycmVudCA9IGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlID0gbnVsbDtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gZmlyc3RCYXNlVXBkYXRlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIHVwZGF0ZUxhbmUgPSBwZW5kaW5nUXVldWUubGFuZSAmIC01MzY4NzA5MTMsXG4gICAgICAgICAgICBpc0hpZGRlblVwZGF0ZSA9IHVwZGF0ZUxhbmUgIT09IHBlbmRpbmdRdWV1ZS5sYW5lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzSGlkZGVuVXBkYXRlXG4gICAgICAgICAgICAgID8gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgdXBkYXRlTGFuZSkgPT09IHVwZGF0ZUxhbmVcbiAgICAgICAgICAgICAgOiAocmVuZGVyTGFuZXMgJiB1cGRhdGVMYW5lKSA9PT0gdXBkYXRlTGFuZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgMCAhPT0gdXBkYXRlTGFuZSAmJlxuICAgICAgICAgICAgICB1cGRhdGVMYW5lID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICAgICAgICAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbiA9ICEwKTtcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50Lm5leHQgPVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhbmU6IDAsXG4gICAgICAgICAgICAgICAgICB0YWc6IHBlbmRpbmdRdWV1ZS50YWcsXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkOiBwZW5kaW5nUXVldWUucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBudWxsLFxuICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICB1cGRhdGVMYW5lID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIHZhciBwYXJ0aWFsU3RhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgICAgICAgICAgIHZhciBuZXh0UHJvcHMgPSBwcm9wcyxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGluc3RhbmNlJGpzY29tcCQwO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcnRpYWxTdGF0ZS50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IHBhcnRpYWxTdGF0ZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHBhcnRpYWxTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXJ0aWFsU3RhdGUuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUxhbmUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGF0ZS5jYWxsKGluc3RhbmNlLCBuZXdTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITE7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBwYXJ0aWFsU3RhdGU7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2FwdHVyZVVwZGF0ZTpcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUxhbmUuZmxhZ3MgPSAodXBkYXRlTGFuZS5mbGFncyAmIC02NTUzNykgfCAxMjg7XG4gICAgICAgICAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTpcbiAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IHBhcnRpYWxTdGF0ZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG5leHRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITA7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IG5leHRTdGF0ZS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9wc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlTGFuZS5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgI
15852HNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwoaW5zdGFuY2UsIG5ld1N0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSAhMTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBwYXJ0aWFsU3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gcGFydGlhbFN0YXRlIHx8IHZvaWQgMCA9PT0gcGFydGlhbFN0YXRlKSBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NpZ24oe30sIG5ld1N0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAgICAgICAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSAhMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlTGFuZSA9IHBlbmRpbmdRdWV1ZS5jYWxsYmFjaztcbiAgICAgICAgICAgIG51bGwgIT09IHVwZGF0ZUxhbmUgJiZcbiAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA2NCksXG4gICAgICAgICAgICAgIGlzSGlkZGVuVXBkYXRlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKSxcbiAgICAgICAgICAgICAgKGlzSGlkZGVuVXBkYXRlID0gcXVldWUuY2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gaXNIaWRkZW5VcGRhdGVcbiAgICAgICAgICAgICAgICA/IChxdWV1ZS5jYWxsYmFja3MgPSBbdXBkYXRlTGFuZV0pXG4gICAgICAgICAgICAgICAgOiBpc0hpZGRlblVwZGF0ZS5wdXNoKHVwZGF0ZUxhbmUpKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIChpc0hpZGRlblVwZGF0ZSA9IHtcbiAgICAgICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICAgICAgdGFnOiBwZW5kaW5nUXVldWUudGFnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBwZW5kaW5nUXVldWUucGF5bG9hZCxcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IHBlbmRpbmdRdWV1ZS5jYWxsYmFjayxcbiAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICAgICAgICA/ICgoZmlyc3RQZW5kaW5nVXBkYXRlID0gY3VycmVudCA9IGlzSGlkZGVuVXBkYXRlKSxcbiAgICAgICAgICAgICAgICAgIChsYXN0UGVuZGluZ1VwZGF0ZSA9IG5ld1N0YXRlKSlcbiAgICAgICAgICAgICAgICA6IChjdXJyZW50ID0gY3VycmVudC5uZXh0ID0gaXNIaWRkZW5VcGRhdGUpLFxuICAgICAgICAgICAgICAobGFzdEJhc2VVcGRhdGUgfD0gdXBkYXRlTGFuZSk7XG4gICAgICAgICAgcGVuZGluZ1F1ZXVlID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHBlbmRpbmdRdWV1ZSlcbiAgICAgICAgICAgIGlmICgoKHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nKSwgbnVsbCA9PT0gcGVuZGluZ1F1ZXVlKSlcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIChpc0hpZGRlblVwZGF0ZSA9IHBlbmRpbmdRdWV1ZSksXG4gICAgICAgICAgICAgICAgKHBlbmRpbmdRdWV1ZSA9IGlzSGlkZGVuVXBkYXRlLm5leHQpLFxuICAgICAgICAgICAgICAgIChpc0hpZGRlblVwZGF0ZS5uZXh0ID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gaXNIaWRkZW5VcGRhdGUpLFxuICAgICAgICAgICAgICAgIChxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGwpO1xuICAgICAgICB9IHdoaWxlICgxKTtcbiAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJiAobGFzdFBlbmRpbmdVcGRhdGUgPSBuZXdTdGF0ZSk7XG4gICAgICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY3VycmVudDtcbiAgICAgICAgbnVsbCA9PT0gZmlyc3RCYXNlVXBkYXRlICYmIChxdWV1ZS5zaGFyZWQubGFuZXMgPSAwKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzIHw9IGxhc3RCYXNlVXBkYXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhc3RCYXNlVXBkYXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICB9XG4gICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjYWxsYmFjaylcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogXCIgK1xuICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgKTtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhpZGRlbkNhbGxiYWNrcyh1cGRhdGVRdWV1ZSwgY29udGV4dCkge1xuICAgICAgdmFyIGhpZGRlbkNhbGxiYWNrcyA9IHVwZGF0ZVF1ZXVlLnNoYXJlZC5oaWRkZW5DYWxsYmFja3M7XG4gICAgICBpZiAobnVsbCAhPT0gaGlkZGVuQ2FsbGJhY2tzKVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIHVwZGF0ZVF1ZXVlLnNoYXJlZC5oaWRkZW5DYWxsYmFja3MgPSBudWxsLCB1cGRhdGVRdWV1ZSA9IDA7XG4gICAgICAgICAgdXBkYXRlUXVldWUgPCBoaWRkZW5DYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgI
15852HVwZGF0ZVF1ZXVlKytcbiAgICAgICAgKVxuICAgICAgICAgIGNhbGxDYWxsYmFjayhoaWRkZW5DYWxsYmFja3NbdXBkYXRlUXVldWVdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0Q2FsbGJhY2tzKHVwZGF0ZVF1ZXVlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY2FsbGJhY2tzID0gdXBkYXRlUXVldWUuY2FsbGJhY2tzO1xuICAgICAgaWYgKG51bGwgIT09IGNhbGxiYWNrcylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5jYWxsYmFja3MgPSBudWxsLCB1cGRhdGVRdWV1ZSA9IDA7XG4gICAgICAgICAgdXBkYXRlUXVldWUgPCBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgIHVwZGF0ZVF1ZXVlKytcbiAgICAgICAgKVxuICAgICAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFja3NbdXBkYXRlUXVldWVdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaEhpZGRlbkNvbnRleHQoZmliZXIsIGNvbnRleHQpIHtcbiAgICAgIHZhciBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXMgPSBlbnRhbmdsZWRSZW5kZXJMYW5lcztcbiAgICAgIHB1c2gocHJldkVudGFuZ2xlZFJlbmRlckxhbmVzQ3Vyc29yLCBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXMsIGZpYmVyKTtcbiAgICAgIHB1c2goY3VycmVudFRyZWVIaWRkZW5TdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXMgPSBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXMgfCBjb250ZXh0LmJhc2VMYW5lcztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjayhmaWJlcikge1xuICAgICAgcHVzaChwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IsIGVudGFuZ2xlZFJlbmRlckxhbmVzLCBmaWJlcik7XG4gICAgICBwdXNoKFxuICAgICAgICBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yLFxuICAgICAgICBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yLmN1cnJlbnQsXG4gICAgICAgIGZpYmVyXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BIaWRkZW5Db250ZXh0KGZpYmVyKSB7XG4gICAgICBlbnRhbmdsZWRSZW5kZXJMYW5lcyA9IHByZXZFbnRhbmdsZWRSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICAgICAgcG9wKGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHBvcChwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaGFuZGxlci5hbHRlcm5hdGU7XG4gICAgICBwdXNoKFxuICAgICAgICBzdXNwZW5zZVN0YWNrQ3Vyc29yLFxuICAgICAgICBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcbiAgICAgIHB1c2goc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGhhbmRsZXIsIGhhbmRsZXIpO1xuICAgICAgbnVsbCA9PT0gc2hlbGxCb3VuZGFyeSAmJlxuICAgICAgICAobnVsbCA9PT0gY3VycmVudCB8fCBudWxsICE9PSBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yLmN1cnJlbnRcbiAgICAgICAgICA/IChzaGVsbEJvdW5kYXJ5ID0gaGFuZGxlcilcbiAgICAgICAgICA6IG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAmJiAoc2hlbGxCb3VuZGFyeSA9IGhhbmRsZXIpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaERlaHlkcmF0ZWRBY3Rpdml0eVN1c3BlbnNlSGFuZGxlcihmaWJlcikge1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIGZpYmVyKTtcbiAgICAgIHB1c2goc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5ICYmIChzaGVsbEJvdW5kYXJ5ID0gZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoT2Zmc2NyZWVuU3VzcGVuc2VIYW5kbGVyKGZpYmVyKSB7XG4gICAgICAyMiA9PT0gZmliZXIudGFnXG4gICAgICAgID8gKHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBmaWJlciksXG4gICAgICAgICAgcHVzaChzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKSxcbiAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5ICYmIChzaGVsbEJvdW5kYXJ5ID0gZmliZXIpKVxuICAgICAgICA6IHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayhmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayhmaWJlcikge1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIGZpYmVyKTtcbiAgICAgIHB1c2goXG4gICAgICAgIHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLFxuICAgICAgICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvci5jdXJyZW50LFxuICAgICAgICBmaWJlclxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wU3VzcGVuc2VIYW5kbGVyKGZpYmVyKSB7XG4gICAgICBwb3Aoc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHNoZWxsQm91bmRhcnkgPT09IGZpYmVyICYmIChzaGVsbEJvdW5kYXJ5ID0gbnVsbCk7XG4gICAgICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoU3VzcGVuc2VMaXN0Q29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICAgICAgcHVzaChcbiAgICAgICAgc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsXG4gICAgICAgIHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQsXG4gICAgICAgIGZpYmVyXG4gICAgICApO1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBuZXdDb250ZXh0LCBmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcFN1c3BlbnNlTGlzdENvbnRleHQoZmliZXIpIHtcbiAgICAgIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgICBwb3Aoc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHNoZWxsQm91bmRhcnkgPT09IGZpYmVyICYmIChzaGVsbEJvdW5kYXJ5ID0gbnVsbCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgICAgIGZvciAodmFyIG5vZGUgPSByb3c7IG51bGwgIT09IG5vZGU7ICkge1xuICAgICAgICBpZiAoMTMgPT09IG5vZGUudGFnKSB7XG4gICAgICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGwgIT09IHN0YXRlICYmXG4gICAgICAgICAgICAoKHN0YXRlID0gc3RhdGUuZGVoeWRyYXRlZCksXG4gICAgICAgICAgICBudWxsID09PSBzdGF0ZSB8fFxuICAgICAgICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN0YXRlKSB8fFxuICAgICAgICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdGF0ZSkpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgI
15852H0gZWxzZSBpZiAoXG4gICAgICAgICAgMTkgPT09IG5vZGUudGFnICYmXG4gICAgICAgICAgXCJpbmRlcGVuZGVudFwiICE9PSBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKDAgIT09IChub2RlLmZsYWdzICYgMTI4KSkgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSBpZiAobnVsbCAhPT0gbm9kZS5jaGlsZCkge1xuICAgICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSA9PT0gcm93KSBicmVhaztcbiAgICAgICAgZm9yICg7IG51bGwgPT09IG5vZGUuc2libGluZzsgKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHJldHVybiBudWxsO1xuICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gICAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcbiAgICAgIG51bGwgPT09IGhvb2tUeXBlc0RldlxuICAgICAgICA/IChob29rVHlwZXNEZXYgPSBbaG9va05hbWVdKVxuICAgICAgICA6IGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICAgICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGhvb2tUeXBlc0RldiAmJlxuICAgICAgICAoaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKyxcbiAgICAgICAgaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpXG4gICAgICApIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpICYmXG4gICAgICAgICAgKGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSksXG4gICAgICAgICAgbnVsbCAhPT0gaG9va1R5cGVzRGV2KVxuICAgICAgICApIHtcbiAgICAgICAgICBmb3IgKHZhciB0YWJsZSA9IFwiXCIsIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXSxcbiAgICAgICAgICAgICAgbmV3SG9va05hbWUgPVxuICAgICAgICAgICAgICAgIGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gaG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIG9sZEhvb2tOYW1lID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTtcbiAgICAgICAgICAgICAgMzAgPiBvbGRIb29rTmFtZS5sZW5ndGg7XG5cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgb2xkSG9va05hbWUgKz0gXCIgXCI7XG4gICAgICAgICAgICBvbGRIb29rTmFtZSArPSBuZXdIb29rTmFtZSArIFwiXFxuXCI7XG4gICAgICAgICAgICB0YWJsZSArPSBvbGRIb29rTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuIFRoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbiAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJXMgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG5cIixcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICB0YWJsZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcykge1xuICAgICAgdm9pZCAwID09PSBkZXBzIHx8XG4gICAgICAgIG51bGwgPT09IGRlcHMgfHxcbiAgICAgICAgaXNBcnJheUltcGwoZGVwcykgfHxcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIiVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuIHNwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuXCIsXG4gICAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYsXG4gICAgICAgICAgdHlwZW9mIGRlcHNcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk9uVXNlRm9ybVN0YXRlSW5EZXYoKSB7XG4gICAgICB2Y
15852XIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIpO1xuICAgICAgZGlkV2FybkFib3V0VXNlRm9ybVN0YXRlLmhhcyhjb21wb25lbnROYW1lKSB8fFxuICAgICAgICAoZGlkV2FybkFib3V0VXNlRm9ybVN0YXRlLmFkZChjb21wb25lbnROYW1lKSxcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlJlYWN0RE9NLnVzZUZvcm1TdGF0ZSBoYXMgYmVlbiByZW5hbWVkIHRvIFJlYWN0LnVzZUFjdGlvblN0YXRlLiBQbGVhc2UgdXBkYXRlICVzIHRvIHVzZSBSZWFjdC51c2VBY3Rpb25TdGF0ZS5cIixcbiAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAgICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykgcmV0dXJuICExO1xuICAgICAgaWYgKG51bGwgPT09IHByZXZEZXBzKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGl0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLlwiLFxuICAgICAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXZcbiAgICAgICAgICApLFxuICAgICAgICAgICExXG4gICAgICAgICk7XG4gICAgICBuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG5QcmV2aW91czogJXNcXG5JbmNvbWluZzogJXNcIixcbiAgICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldixcbiAgICAgICAgICBcIltcIiArIHByZXZEZXBzLmpvaW4oXCIsIFwiKSArIFwiXVwiLFxuICAgICAgICAgIFwiW1wiICsgbmV4dERlcHMuam9pbihcIiwgXCIpICsgXCJdXCJcbiAgICAgICAgKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSByZXR1cm4gITE7XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIHByb3BzLFxuICAgICAgc2Vjb25kQXJnLFxuICAgICAgbmV4dFJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICBob29rVHlwZXNEZXYgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID1cbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICBpZiAoXG4gICAgICAgIFwiW29iamVjdCBBc3luY0Z1bmN0aW9uXVwiID09PVxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChDb21wb25lbnQpIHx8XG4gICAgICAgIFwiW29iamVjdCBBc3luY0dlbmVyYXRvckZ1bmN0aW9uXVwiID09PVxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChDb21wb25lbnQpXG4gICAgICApXG4gICAgICAgIChuZXh0UmVuZGVyTGFuZXMgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKSksXG4gICAgICAgICAgZGlkV2FybkFib3V0QXN5bmNDbGllbnRDb21wb25lbnQuaGFzKG5leHRSZW5kZXJMYW5lcykgfHxcbiAgICAgICAgICAgIChkaWRXYXJuQWJvdXRBc3luY0NsaWVudENvbXBvbmVudC5hZGQobmV4dFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXMgaXMgYW4gYXN5bmMgQ2xpZW50IENvbXBvbmVudC4gT25seSBTZXJ2ZXIgQ29tcG9uZW50cyBjYW4gYmUgYXN5bmMgYXQgdGhlIG1vbWVudC4gVGhpcyBlcnJvciBpcyBvZnRlbiBjYXVzZWQgYnkgYWNjaWRlbnRhbGx5IGFkZGluZyBgJ3VzZSBjbGllbnQnYCB0byBhIG1vZHVsZSB0aGF0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSBzZXJ2ZXIuXCIsXG4gICAgICAgICAgICAgIG51bGwgPT09IG5leHRSZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgID8gXCJBbiB1bmtub3duIENvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgOiBcIjxcIiArIG5leHRSZW5kZXJMYW5lcyArIFwiPlwiXG4gICAgICAgICAgICApKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSAwO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgPyBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWXG4gICAgICAgICAgOiBudWxsICE9PSB
15852ob29rVHlwZXNEZXZcbiAgICAgICAgICAgID8gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVlxuICAgICAgICAgICAgOiBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICBzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFViA9IG5leHRSZW5kZXJMYW5lcyA9XG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IGNhbGxDb21wb25lbnRJbkRFVihDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcpO1xuICAgICAgc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYgPSAhMTtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyAmJlxuICAgICAgICAoY2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3NBZ2FpbihcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgc2Vjb25kQXJnXG4gICAgICAgICkpO1xuICAgICAgaWYgKG5leHRSZW5kZXJMYW5lcykge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3NBZ2FpbihcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBzZWNvbmRBcmdcbiAgICAgICAgICApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmluaXNoUmVuZGVyaW5nSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5pc2hSZW5kZXJpbmdIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzXG4gICAgICAgID8gbnVsbCAhPT0gdGhlbmFibGVTdGF0ZSAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgICAgICBsYW5lczogMCxcbiAgICAgICAgICAgIGZpcnN0Q29udGV4dDogbnVsbCxcbiAgICAgICAgICAgIF9kZWJ1Z1RoZW5hYmxlU3RhdGU6IHRoZW5hYmxlU3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMuX2RlYnVnVGhlbmFibGVTdGF0ZSA9IHRoZW5hYmxlU3RhdGUpO1xuICAgICAgdmFyIHRoZW5hYmxlU3RhdGUkanNjb21wJDAgPSB0aGVuYWJsZVN0YXRlO1xuICAgICAgbnVsbCAhPT0gbGFzdFN1c3BlbmRlZEZpYmVyICYmXG4gICAgICAgIGFyZVNhbWVLZXlQYXRoKGxhc3RTdXNwZW5kZWRGaWJlciwgd29ya0luUHJvZ3Jlc3MpICYmXG4gICAgICAgIChudWxsICE9PSB0aGVuYWJsZVN0YXRlJGpzY29tcCQwIHx8XG4gICAgICAgICAgbnVsbCA9PT0gbGFzdFN1c3BlbmRlZFN0YWNrIHx8XG4gICAgICAgICAgZGlkSXNzdWVVc2VXYXJuaW5nIHx8XG4gICAgICAgICAgKChkaWRJc3N1ZVVzZVdhcm5pbmcgPSAhMCksIGNvbnNvbGUuZXJyb3IobGFzdFN1c3BlbmRlZFN0YWNrKSksXG4gICAgICAgIChsYXN0U3VzcGVuZGVkU3RhY2sgPSBsYXN0U3VzcGVuZGVkRmliZXIgPSBudWxsKSk7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICAgICAgdGhlbmFibGVTdGF0ZSRqc2NvbXAkMCA9XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRIb29rICYmIG51bGwgIT09IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICByZW5kZXJMYW5lcyA9IDA7XG4gICAgICBob29rVHlwZXNEZXYgPVxuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9XG4gICAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9XG4gICAgICAgIGN1cnJlbnRIb29rID1cbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPVxuICAgICAgICAgIG51bGw7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAoY3VycmVudC5mbGFncyAmIDEyMDY5MTA5NzYpICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjA2OTEwOTc2KSAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEV4cGVjdGVkIHN0YXRpYyBmbGFnIHdhcyBtaXNzaW5nLiBQbGVhc2Ugbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLlwiXG4gICAgICAgICk7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gITE7XG4gICAgICB0aGVuYWJsZUluZGV4Q291bnRlciA9IDA7XG4gICAgICB0aGVuYWJsZVN0YXRlID0gbnVsbDtcbiAgICAgIGlmICh0aGVuYWJsZVN0YXRlJGpzY29tcCQwKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlJlbmRlcmVkIGZld2VyIGhvb2tzIHRoYW4gZXhwZWN0ZWQuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhbiBhY2NpZGVudGFsIGVhcmx5IHJldHVybiBzdGF0ZW1lbnQuXCJcbiAgICAgICAgKTtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSB8fFxuICAgICAgICAoKGN1cnJlbnQgPSBjdXJyZW50LmRlcGVuZGVuY2llcyksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudCkgJiZcbiAgICAgICAgICAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKSk7XG4gICAgICBuZWVkc1RvUmVzZXRTdXNwZW5kZWRUaGVuYWJsZURFVlxuICAgICAgICA/ICgobmVlZHNUb1Jlc2V0U3VzcGVuZGVkVGhlbmFibGVERVYgPSAhMSksIChjdXJyZW50ID0gITApKVxuICAgICAgICA6IChjdXJyZW50ID0gITEpO1xuICAgICAgY3VycmVudCAmJlxuICAgICAgICAoKHdvcmtJblByb2dyZXNzID1cbiAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCBcIlVua25vd25cIiksXG4gICAgICAgIGRpZFdhcm5BYm91dFVzZVdyYXBwZWRJblRyeUNhdGNoLmhhcyh3b3JrSW5Qcm9ncmVzcykgfHxcbiAgICAgICAgICBkaWRXYXJuQWJvdXRBc3luY0NsaWVudENvbXBvbmVudC5oYXMod29ya0luUHJvZ3Jlc3MpIHx8XG4gICAgICAgICAgKGRpZFdhcm5BYm91dFVzZVdyYXBwZWRJblRyeUNhdGNoLmFkZCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiYHVzZWAgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIHRyeS9jYXRjaCBibG9jay4gVGhpcyBpcyBub3QgYWxsb3dlZCBhbmQgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci4gVG8gaGFuZGxlIGVycm9ycyB0cmlnZ2VyZWQgYnkgYHVzZWAsIHdyYXAgeW91ciBjb21wb25lbnQgaW4gYSBlcnJvciBib3VuZGFyeS5cIlxuICAgICAgICAgICkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzQWdhaW4od29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZykge1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyAmJiAodGhlbmFibGVTdGF0ZSA9IG51bGwpO1xuICAgICAgICB0aGVuYWJsZUluZGV4Q291bnRlciA9IDA7XG4gICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9ICExO1xuICAgICAgICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPj0gUkVfUkVOREVSX0xJTUlUKVxuICAgICAgICAgI
15852HRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gITE7XG4gICAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgICAgaWYgKG51bGwgIT0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICAgICAgICBjaGlsZHJlbi5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgICBjaGlsZHJlbi5ldmVudHMgPSBudWxsO1xuICAgICAgICAgIGNoaWxkcmVuLnN0b3JlcyA9IG51bGw7XG4gICAgICAgICAgbnVsbCAhPSBjaGlsZHJlbi5tZW1vQ2FjaGUgJiYgKGNoaWxkcmVuLm1lbW9DYWNoZS5pbmRleCA9IDApO1xuICAgICAgICB9XG4gICAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG4gICAgICAgIGNoaWxkcmVuID0gY2FsbENvbXBvbmVudEluREVWKENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZyk7XG4gICAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2l0aW9uQXdhcmVIb3N0Q29tcG9uZW50KCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5ILFxuICAgICAgICBtYXliZVRoZW5hYmxlID0gZGlzcGF0Y2hlci51c2VTdGF0ZSgpWzBdO1xuICAgICAgbWF5YmVUaGVuYWJsZSA9XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG1heWJlVGhlbmFibGUudGhlblxuICAgICAgICAgID8gdXNlVGhlbmFibGUobWF5YmVUaGVuYWJsZSlcbiAgICAgICAgICA6IG1heWJlVGhlbmFibGU7XG4gICAgICBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlci51c2VTdGF0ZSgpWzBdO1xuICAgICAgKG51bGwgIT09IGN1cnJlbnRIb29rID8gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSA6IG51bGwpICE9PVxuICAgICAgICBkaXNwYXRjaGVyICYmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSAxMDI0KTtcbiAgICAgIHJldHVybiBtYXliZVRoZW5hYmxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgICAgIHZhciBkaWRSZW5kZXJJZEhvb2sgPSAwICE9PSBsb2NhbElkQ291bnRlcjtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgICAgIHJldHVybiBkaWRSZW5kZXJJZEhvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID1cbiAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZVxuICAgICAgICAgID8gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAtODA1MzA4NDIxXG4gICAgICAgICAgOiB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIC0yMDUzO1xuICAgICAgY3VycmVudC5sYW5lcyAmPSB+bGFuZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0SG9va3NPblVud2luZCh3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MucXVldWU7XG4gICAgICAgICAgbnVsbCAhPT0gcXVldWUgJiYgKHF1ZXVlLnBlbmRpbmcgPSBudWxsKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9ICExO1xuICAgICAgfVxuICAgICAgcmVuZGVyTGFuZXMgPSAwO1xuICAgICAgaG9va1R5cGVzRGV2ID1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID1cbiAgICAgICAgY3VycmVudEhvb2sgPVxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSAhMTtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyID0gbG9jYWxJZENvdW50ZXIgPSAwO1xuICAgICAgdGhlbmFibGVTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAgICAgdmFyIGhvb2sgPSB7XG4gICAgICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICAgICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgICAgICBxdWV1ZTogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIG51bGwgPT09IHdvcmtJblByb2dyZXNzSG9va1xuICAgICAgICA/IChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaylcbiAgICAgICAgOiAod29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50SG9vaykge1xuICAgICAgICB2Y
15852XIgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICBuZXh0Q3VycmVudEhvb2sgPVxuICAgICAgICAgIG51bGwgIT09IG5leHRDdXJyZW50SG9vayA/IG5leHRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlIDogbnVsbDtcbiAgICAgIH0gZWxzZSBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgdmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPVxuICAgICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc0hvb2tcbiAgICAgICAgICA/IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICA6IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgICAgaWYgKG51bGwgIT09IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2spXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXh0V29ya0luUHJvZ3Jlc3NIb29rKSxcbiAgICAgICAgICAoY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2spO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChudWxsID09PSBuZXh0Q3VycmVudEhvb2spIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIuYWx0ZXJuYXRlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiVXBkYXRlIGhvb2sgY2FsbGVkIG9uIGluaXRpYWwgcmVuZGVyLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgICAgICBuZXh0Q3VycmVudEhvb2sgPSB7XG4gICAgICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc0hvb2tcbiAgICAgICAgICA/IChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID1cbiAgICAgICAgICAgICAgbmV4dEN1cnJlbnRIb29rKVxuICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV4dEN1cnJlbnRIb29rKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gICAgICByZXR1cm4geyBsYXN0RWZmZWN0OiBudWxsLCBldmVudHM6IG51bGwsIHN0b3JlczogbnVsbCwgbWVtb0NhY2hlOiBudWxsIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZVRoZW5hYmxlKHRoZW5hYmxlKSB7XG4gICAgICB2Y
15852XIgaW5kZXggPSB0aGVuYWJsZUluZGV4Q291bnRlcjtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyICs9IDE7XG4gICAgICBudWxsID09PSB0aGVuYWJsZVN0YXRlICYmICh0aGVuYWJsZVN0YXRlID0gY3JlYXRlVGhlbmFibGVTdGF0ZSgpKTtcbiAgICAgIHRoZW5hYmxlID0gdHJhY2tVc2VkVGhlbmFibGUoXG4gICAgICAgIHRoZW5hYmxlU3RhdGUsXG4gICAgICAgIHRoZW5hYmxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXJcbiAgICAgICk7XG4gICAgICBpbmRleCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyO1xuICAgICAgbnVsbCA9PT1cbiAgICAgICAgKG51bGwgPT09IHdvcmtJblByb2dyZXNzSG9va1xuICAgICAgICAgID8gaW5kZXgubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgIDogd29ya0luUHJvZ3Jlc3NIb29rLm5leHQpICYmXG4gICAgICAgICgoaW5kZXggPSBpbmRleC5hbHRlcm5hdGUpLFxuICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9XG4gICAgICAgICAgbnVsbCAhPT0gaW5kZXggJiYgbnVsbCAhPT0gaW5kZXgubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgPyBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWXG4gICAgICAgICAgICA6IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVikpO1xuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2UodXNhYmxlKSB7XG4gICAgICBpZiAobnVsbCAhPT0gdXNhYmxlICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1c2FibGUpIHtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVzYWJsZS50aGVuKSByZXR1cm4gdXNlVGhlbmFibGUodXNhYmxlKTtcbiAgICAgICAgaWYgKHVzYWJsZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVDT1ZFUkFCTEVfVFlQRSkgcmV0dXJuO1xuICAgICAgICBpZiAodXNhYmxlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpIHJldHVybiByZWFkQ29udGV4dCh1c2FibGUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgRXJyb3IoXCJBbiB1bnN1cHBvcnRlZCB0eXBlIHdhcyBwYXNzZWQgdG8gdXNlKCk6IFwiICsgU3RyaW5nKHVzYWJsZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VNZW1vQ2FjaGUoc2l6ZSkge1xuICAgICAgdmFyIG1lbW9DYWNoZSA9IG51bGwsXG4gICAgICAgIHVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWU7XG4gICAgICBudWxsICE9PSB1cGRhdGVRdWV1ZSAmJiAobWVtb0NhY2hlID0gdXBkYXRlUXVldWUubWVtb0NhY2hlKTtcbiAgICAgIGlmIChudWxsID09IG1lbW9DYWNoZSkge1xuICAgICAgICB2Y
15852XIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQubWVtb0NhY2hlKSxcbiAgICAgICAgICAgIG51bGwgIT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAobWVtb0NhY2hlID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGN1cnJlbnQuZGF0YS5tYXAoZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpbmRleDogMFxuICAgICAgICAgICAgICB9KSkpO1xuICAgICAgfVxuICAgICAgbnVsbCA9PSBtZW1vQ2FjaGUgJiYgKG1lbW9DYWNoZSA9IHsgZGF0YTogW10sIGluZGV4OiAwIH0pO1xuICAgICAgbnVsbCA9PT0gdXBkYXRlUXVldWUgJiZcbiAgICAgICAgKCh1cGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSksXG4gICAgICAgIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlKSk7XG4gICAgICB1cGRhdGVRdWV1ZS5tZW1vQ2FjaGUgPSBtZW1vQ2FjaGU7XG4gICAgICB1cGRhdGVRdWV1ZSA9IG1lbW9DYWNoZS5kYXRhW21lbW9DYWNoZS5pbmRleF07XG4gICAgICBpZiAodm9pZCAwID09PSB1cGRhdGVRdWV1ZSB8fCBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB1cGRhdGVRdWV1ZSA9IG1lbW9DYWNoZS5kYXRhW21lbW9DYWNoZS5pbmRleF0gPSBBcnJheShzaXplKSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgICAgIGN1cnJlbnQgPCBzaXplO1xuICAgICAgICAgIGN1cnJlbnQrK1xuICAgICAgICApXG4gICAgICAgICAgdXBkYXRlUXVldWVbY3VycmVudF0gPSBSRUFDVF9NRU1PX0NBQ0hFX1NFTlRJTkVMO1xuICAgICAgZWxzZVxuICAgICAgICB1cGRhdGVRdWV1ZS5sZW5ndGggIT09IHNpemUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBhIGNvbnN0YW50IHNpemUgYXJndW1lbnQgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiB1c2VNZW1vQ2FjaGUuIFRoZSBwcmV2aW91cyBjYWNoZSB3YXMgYWxsb2NhdGVkIHdpdGggc2l6ZSAlcyBidXQgc2l6ZSAlcyB3YXMgcmVxdWVzdGVkLlwiLFxuICAgICAgICAgICAgdXBkYXRlUXVldWUubGVuZ3RoLFxuICAgICAgICAgICAgc2l6ZVxuICAgICAgICAgICk7XG4gICAgICBtZW1vQ2FjaGUuaW5kZXgrKztcbiAgICAgIHJldHVybiB1cGRhdGVRdWV1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvbiA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBpZiAodm9pZCAwICE9PSBpbml0KSB7XG4gICAgICAgIHZhciBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICAgICAgICBpZiAoc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYpIHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluaXQoaW5pdGlhbEFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpbml0aWFsU3RhdGUgPSBpbml0aWFsQXJnO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICByZWR1Y2VyID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgICAgIH07XG4gICAgICBob29rLnF1ZXVlID0gcmVkdWNlcjtcbiAgICAgIHJlZHVjZXIgPSByZWR1Y2VyLmRpc3BhdGNoID0gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLFxuICAgICAgICByZWR1Y2VyXG4gICAgICApO1xuICAgICAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIHJlZHVjZXJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIpIHtcbiAgICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVkdWNlckltcGwoaG9vaywgY3VycmVudEhvb2ssIHJlZHVjZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVSZWR1Y2VySW1wbChob29rLCBjdXJyZW50LCByZWR1Y2VyKSB7XG4gICAgICB2Y
15852XIgcXVldWUgPSBob29rLnF1ZXVlO1xuICAgICAgaWYgKG51bGwgPT09IHF1ZXVlKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlNob3VsZCBoYXZlIGEgcXVldWUuIFlvdSBhcmUgbGlrZWx5IGNhbGxpbmcgSG9va3MgY29uZGl0aW9uYWxseSwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIChodHRwczovL3JlYWN0LmRldi9saW5rL2ludmFsaWQtaG9vay1jYWxsKVwiXG4gICAgICAgICk7XG4gICAgICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHZhciBiYXNlUXVldWUgPSBob29rLmJhc2VRdWV1ZSxcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcbiAgICAgIGlmIChudWxsICE9PSBwZW5kaW5nUXVldWUpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgICAgICBiYXNlUXVldWUubmV4dCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgICAgIHBlbmRpbmdRdWV1ZS5uZXh0ID0gYmFzZUZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSB0byBiZSBhIGNsb25lLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgY3VycmVudC5iYXNlUXVldWUgPSBiYXNlUXVldWUgPSBwZW5kaW5nUXVldWU7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1F1ZXVlID0gaG9vay5iYXNlU3RhdGU7XG4gICAgICBpZiAobnVsbCA9PT0gYmFzZVF1ZXVlKSBob29rLm1lbW9pemVkU3RhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY3VycmVudCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgICB2Y
15852XIgbmV3QmFzZVF1ZXVlRmlyc3QgPSAoYmFzZUZpcnN0ID0gbnVsbCksXG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG51bGwsXG4gICAgICAgICAgdXBkYXRlID0gY3VycmVudCxcbiAgICAgICAgICBkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lICYgLTUzNjg3MDkxMztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB1cGRhdGVMYW5lICE9PSB1cGRhdGUubGFuZVxuICAgICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIHVwZGF0ZUxhbmUpID09PSB1cGRhdGVMYW5lXG4gICAgICAgICAgICAgIDogKHJlbmRlckxhbmVzICYgdXBkYXRlTGFuZSkgPT09IHVwZGF0ZUxhbmVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciByZXZlcnRMYW5lID0gdXBkYXRlLnJldmVydExhbmU7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcmV2ZXJ0TGFuZSlcbiAgICAgICAgICAgICAgbnVsbCAhPT0gbmV3QmFzZVF1ZXVlTGFzdCAmJlxuICAgICAgICAgICAgICAgIChuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID1cbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFuZTogMCxcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0TGFuZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUxhbmUgPT09IGN1cnJlbnRFbnRhbmdsZWRMYW5lICYmXG4gICAgICAgICAgICAgICAgICAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbiA9ICEwKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKChyZW5kZXJMYW5lcyAmIHJldmVydExhbmUpID09PSByZXZlcnRMYW5lKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICAgICAgICByZXZlcnRMYW5lID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICAgICAgICAgIChkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITApO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAodXBkYXRlTGFuZSA9IHtcbiAgICAgICAgICAgICAgICBsYW5lOiAwLFxuICAgICAgICAgICAgICAgIHJldmVydExhbmU6IHVwZGF0ZS5yZXZlcnRMYW5lLFxuICAgICAgICAgICAgICAgIGdlc3R1cmU6IG51bGwsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgICAgICAgICAgPyAoKG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbmV3QmFzZVF1ZXVlTGFzdCA9IHVwZGF0ZUxhbmUpLFxuICAgICAgICAgICAgICAgICAgICAoYmFzZUZpcnN0ID0gcGVuZGluZ1F1ZXVlKSlcbiAgICAgICAgICAgICAgICAgIDogKG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSB1cGRhdGVMYW5lKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIubGFuZXMgfD0gcmV2ZXJ0TGFuZSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyB8PSByZXZlcnRMYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZUxhbmUgPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgICAgc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYgJiZcbiAgICAgICAgICAgICAgcmVkdWNlcihwZW5kaW5nUXVldWUsIHVwZGF0ZUxhbmUpO1xuICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gdXBkYXRlLmhhc0VhZ2VyU3RhdGVcbiAgICAgICAgICAgICAgPyB1cGRhdGUuZWFnZXJTdGF0ZVxuICAgICAgICAgICAgICA6IHJlZHVjZXIocGVuZGluZ1F1ZXVlLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIChyZXZlcnRMYW5lID0ge1xuICAgICAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgICAgICByZXZlcnRMYW5lOiB1cGRhdGUucmV2ZXJ0TGFuZSxcbiAgICAgICAgICAgICAgZ2VzdHVyZTogdXBkYXRlLmdlc3R1cmUsXG4gICAgICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgICAgICAgID8gKChuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSByZXZlcnRMYW5lKSxcbiAgICAgICAgICAgICAgICAgIChiYXNlRmlyc3QgPSBwZW5kaW5nUXVldWUpKVxuICAgICAgICAgICAgICAgIDogKG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSByZXZlcnRMYW5lKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IHVwZGF0ZUxhbmUpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzIHw9IHVwZGF0ZUxhbmUpO1xuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlIChudWxsICE9PSB1cGRhdGUgJiYgdXBkYXRlICE9PSBjdXJyZW50KTtcbiAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgID8gKGJhc2VGaXJzdCA9IHBlbmRpbmdRdWV1ZSlcbiAgICAgICAgICA6IChuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBuZXdCYXNlUXVldWVGaXJzdCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb2JqZWN0SXMocGVuZGluZ1F1ZXVlLCBob29rLm1lbW9pemVkU3RhdGUpICYmXG4gICAgICAgICAgKChkaWRSZWNlaXZlVXBkYXRlID0gITApLFxuICAgICAgICAgIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24gJiZcbiAgICAgICAgICAgICgocmVkdWNlciA9IGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSksIG51bGwgIT09IHJlZHVjZXIpKVxuICAgICAgICApXG4gICAgICAgICAgdGhyb3cgcmVkdWNlcjtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgICAgICBob29rLmJhc2VTdGF0ZSA9IGJhc2VGaXJzdDtcbiAgICAgICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgICAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICAgIH1cbiAgICAgIG51bGwgPT09IGJhc2VRdWV1ZSAmJiAocXVldWUubGFuZXMgPSAwKTtcbiAgICAgIHJldHVybi
15852BbaG9vay5tZW1vaXplZFN0YXRlLCBxdWV1ZS5kaXNwYXRjaF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyKSB7XG4gICAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLFxuICAgICAgICBxdWV1ZSA9IGhvb2sucXVldWU7XG4gICAgICBpZiAobnVsbCA9PT0gcXVldWUpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFwiU2hvdWxkIGhhdmUgYSBxdWV1ZS4gWW91IGFyZSBsaWtlbHkgY2FsbGluZyBIb29rcyBjb25kaXRpb25hbGx5LCB3aGljaCBpcyBub3QgYWxsb3dlZC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvaW52YWxpZC1ob29rLWNhbGwpXCJcbiAgICAgICAgKTtcbiAgICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICAgICAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2gsXG4gICAgICAgIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmcsXG4gICAgICAgIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICAgICAgaWYgKG51bGwgIT09IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dCk7XG4gICAgICAgIGRvXG4gICAgICAgICAgKG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgdXBkYXRlLmFjdGlvbikpLCAodXBkYXRlID0gdXBkYXRlLm5leHQpO1xuICAgICAgICB3aGlsZSAodXBkYXRlICE9PSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUpO1xuICAgICAgICBvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSB8fCAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKTtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIG51bGwgPT09IGhvb2suYmFzZVF1ZXVlICYmIChob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlKTtcbiAgICAgICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90KVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3Igc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFdpbGwgcmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXCJcbiAgICAgICAgICApO1xuICAgICAgICB2Y
15852XIgbmV4dFNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QgPT09IGdldFNlcnZlclNuYXBzaG90KCkgfHxcbiAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3BcIlxuICAgICAgICAgICksXG4gICAgICAgICAgKGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gITApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90IHx8XG4gICAgICAgICAgKChnZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNuYXBzaG90KCkpLFxuICAgICAgICAgIG9iamVjdElzKG5leHRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHx8XG4gICAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcFwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gITApKSk7XG4gICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIDAgIT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDEyNykgfHxcbiAgICAgICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICAgIH1cbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICAgIGdldFNlcnZlclNuYXBzaG90ID0geyB2YWx1ZTogbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QgfTtcbiAgICAgIGhvb2sucXVldWUgPSBnZXRTZXJ2ZXJTbmFwc2hvdDtcbiAgICAgIG1vdW50RWZmZWN0KFxuICAgICAgICBzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGdldFNlcnZlclNuYXBzaG90LCBzdWJzY3JpYmUpLFxuICAgICAgICBbc3Vic2NyaWJlXVxuICAgICAgKTtcbiAgICAgIGZpYmVyLmZsYWdzIHw9IDIwNDg7XG4gICAgICBwdXNoU2ltcGxlRWZmZWN0KFxuICAgICAgICBIYXNFZmZlY3QgfCBQYXNzaXZlLFxuICAgICAgICB7IGRlc3Ryb3k6IHZvaWQgMCB9LFxuICAgICAgICB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBmaWJlcixcbiAgICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdCxcbiAgICAgICAgICBuZXh0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U25hcHNob3RcbiAgICAgICAgKSxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXh0U25hcHNob3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgc3Vic2NyaWJlLFxuICAgICAgZ2V0U25hcHNob3QsXG4gICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICkge1xuICAgICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICAgICAgaXNIeWRyYXRpbmckanNjb21wJDAgPSBpc0h5ZHJhdGluZztcbiAgICAgIGlmIChpc0h5ZHJhdGluZyRqc2NvbXAkMCkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBnZXRTZXJ2ZXJTbmFwc2hvdClcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiTWlzc2luZyBnZXRTZXJ2ZXJTbmFwc2hvdCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHNlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgZ2V0U2VydmVyU25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKChnZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNuYXBzaG90KCkpLCAhZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpXG4gICAgICApIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcbiAgICAgICAgb2JqZWN0SXMoZ2V0U2VydmVyU25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSB8fFxuICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSAhMCkpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAoY2FjaGVkU25hcHNob3QgPSAhb2JqZWN0SXMoXG4gICAgICAgICAgKGN1cnJlbnRIb29rIHx8IGhvb2spLm1lbW9pemVkU3RhdGUsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKSlcbiAgICAgIClcbiAgICAgICAgKGhvb2subWVtb2l6ZWRTdGF0ZSA9IGdldFNlcnZlclNuYXBzaG90KSwgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCk7XG4gICAgICBob29rID0gaG9vay5xdWV1ZTtcbiAgICAgIHZhciBjcmVhdGUgPSBzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGhvb2ssIHN1YnNjcmliZSk7XG4gICAgICB1cGRhdGVFZmZlY3RJbXBsKDIwNDgsIFBhc3NpdmUsIGNyZWF0ZSwgW3N1YnNjcmliZV0pO1xuICAgICAgc3Vic2NyaWJlID1cbiAgICAgICAgaG9vay5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHxcbiAgICAgICAgY2FjaGVkU25hcHNob3QgfHxcbiAgICAgICAgKG51bGwgIT09IHdvcmtJblByb2dyZXNzSG9vayAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc0hvb2subWVtb2l6ZWRTdGF0ZS50YWcgJiBIYXNFZmZlY3QpICE9PSBOb0ZsYWdzKTtcbiAgICAgIHB1c2hTaW1wbGVFZmZlY3QoXG4gICAgICAgI
15852HN1YnNjcmliZSA/IEhhc0VmZmVjdCB8IFBhc3NpdmUgOiBQYXNzaXZlLFxuICAgICAgICB7IGRlc3Ryb3k6IHZvaWQgMCB9LFxuICAgICAgICB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBmaWJlcixcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIGdldFNlcnZlclNuYXBzaG90LFxuICAgICAgICAgIGdldFNuYXBzaG90XG4gICAgICAgICksXG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gICAgICBpZiAoc3Vic2NyaWJlKSB7XG4gICAgICAgIGZpYmVyLmZsYWdzIHw9IDIwNDg7XG4gICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGlzSHlkcmF0aW5nJGpzY29tcCQwIHx8XG4gICAgICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgMTI3KSB8fFxuICAgICAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0U2VydmVyU25hcHNob3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCByZW5kZXJlZFNuYXBzaG90KSB7XG4gICAgICBmaWJlci5mbGFncyB8PSAxNjM4NDtcbiAgICAgIGZpYmVyID0geyBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90IH07XG4gICAgICBnZXRTbmFwc2hvdCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLnVwZGF0ZVF1ZXVlO1xuICAgICAgbnVsbCA9PT0gZ2V0U25hcHNob3RcbiAgICAgICAgPyAoKGdldFNuYXBzaG90ID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWUgPSBnZXRTbmFwc2hvdCksXG4gICAgICAgICAgKGdldFNuYXBzaG90LnN0b3JlcyA9IFtmaWJlcl0pKVxuICAgICAgICA6ICgocmVuZGVyZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90LnN0b3JlcyksXG4gICAgICAgICAgbnVsbCA9PT0gcmVuZGVyZWRTbmFwc2hvdFxuICAgICAgICAgICAgPyAoZ2V0U25hcHNob3Quc3RvcmVzID0gW2ZpYmVyXSlcbiAgICAgICAgICAgIDogcmVuZGVyZWRTbmFwc2hvdC5wdXNoKGZpYmVyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgICAgIGluc3QudmFsdWUgPSBuZXh0U25hcHNob3Q7XG4gICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiZcbiAgICAgICAgICAoc3RhcnRVcGRhdGVUaW1lckJ5TGFuZSgyLCBcInVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKClcIiwgZmliZXIpLFxuICAgICAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICAgICAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgICAgIGluc3QgPSBpbnN0LnZhbHVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgICAgIHJldHVybiAhb2JqZWN0SXMoaW5zdCwgbmV4dFZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMik7XG4gICAgICBudWxsICE9PSByb290ICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgMik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50U3RhdGVJbXBsKGluaXRpYWxTdGF0ZSkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluaXRpYWxTdGF0ZSkge1xuICAgICAgICB2YXIgaW5pdGlhbFN0YXRlSW5pdGlhbGl6ZXIgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZUluaXRpYWxpemVyKCk7XG4gICAgICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5pdGlhbFN0YXRlSW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICBob29rLnF1ZXVlID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgICAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSBtb3VudFN0YXRlSW1wbChpbml0aWFsU3RhdGUpO1xuICAgICAgdmFyIHF1ZXVlID0gaW5pdGlhbFN0YXRlLnF1ZXVlLFxuICAgICAgICBkaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciwgcXVldWUpO1xuICAgICAgcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICAgIHJldHVybiBbaW5pdGlhbFN0YXRlLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRPcHRpbWlzdGljKHBhc3N0aHJvdWdoKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IHBhc3N0aHJvdWdoO1xuICAgICAgdmFyIHF1ZXVlID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBudWxsXG4gICAgICB9O1xuICAgICAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICAgICAgaG9vayA9IGRpc3BhdGNoT3B0aW1pc3RpY1NldFN0YXRlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLFxuICAgICAgICAhMCxcbiAgICAgICAgcXVldWVcbiAgICAgICk7XG4gICAgICBxdWV1ZS5kaXNwYXRjaCA9IGhvb2s7XG4gICAgICByZXR1cm4gW3Bhc3N0aHJvdWdoLCBob29rXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlT3B0aW1pc3RpYyhwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiB1cGRhdGVPcHRpbWlzdGljSW1wbChob29rLCBjdXJyZW50SG9vaywgcGFzc3Rocm91Z2gsIHJlZHVjZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPcHRpbWlzdGljSW1wbChob29rLCBjdXJyZW50LCBwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBwYXNzdGhyb3VnaDtcbiAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VySW1wbChcbiAgICAgICAgaG9vayxcbiAgICAgICAgY3VycmVudEhvb2ssXG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZHVjZXIgPyByZWR1Y2VyIDogYmFzaWNTdGF0ZVJlZHVjZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcmVuZGVyT3B0aW1pc3RpYyhwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50SG9vaylcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9wdGltaXN0aWNJbXBsKGhvb2ssIGN1cnJlbnRIb29rLCBwYXNzdGhyb3VnaCwgcmVkdWNlcik7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHBhc3N0aHJvdWdoO1xuICAgICAgcmV0dXJuIFtwYXNzdGhyb3VnaCwgaG9vay5xdWV1ZS5kaXNwYXRjaF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoQWN0aW9uU3RhdGUoXG4gICAgICBmaWJlcixcbiAgICAgIGFjdGlvblF1ZXVlLFxuICAgICAgc2V0UGVuZGluZ1N0YXRlLFxuICAgICAgc2V0U3RhdGUsXG4gICAgICBwYXlsb2FkXG4gICAgKSB7XG4gICAgICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpXG4gICAgICAgIHRocm93IEVycm9yKFwiQ2Fubm90IHVwZGF0ZSBhY3Rpb24gc3RhdGUgd2hpbGUgcmVuZGVyaW5nLlwiKTtcbiAgICAgIGZpYmVyID0gYWN0aW9uUXVldWUuYWN0aW9uO1xuICAgICAgaWYgKG51bGwgIT09IGZpYmVyKSB7XG4gICAgICAgIHZhciBhY3Rpb25Ob2RlID0ge1xuICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgICAgYWN0aW9uOiBmaWJlcixcbiAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgIGlzVHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICByZWFzb246IG51bGwsXG4gICAgICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGFjdGlvbk5vZGUubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVFxuICAgICAgICAgID8gc2V0UGVuZGluZ1N0YXRlKCEwKVxuICAgICAgICAgIDogKGFjdGlvbk5vZGUuaXNUcmFuc2l0aW9uID0gITEpO1xuICAgICAgICBzZXRTdGF0ZShhY3Rpb25Ob2RlKTtcbiAgICAgICAgc2V0UGVuZGluZ1N0YXRlID0gYWN0aW9uUXVldWUucGVuZGluZztcbiAgICAgICAgbnVsbCA9PT0gc2V0UGVuZGluZ1N0YXRlXG4gICAgICAgICAgPyAoKGFjdGlvbk5vZGUubmV4dCA9IGFjdGlvblF1ZXVlLnBlbmRpbmcgPSBhY3Rpb25Ob2RlKSxcbiAgICAgICAgICAgIHJ1bkFjdGlvblN0YXRlQWN0aW9uKGFjdGlvblF1ZXVlLCBhY3Rpb25Ob2RlKSlcbiAgICAgICAgICA6ICgoYWN0aW9uTm9kZS5uZXh0ID0gc2V0UGVuZGluZ1N0YXRlLm5leHQpLFxuICAgICAgICAgICAgKGFjdGlvblF1ZXVlLnBlbmRpbmcgPSBzZXRQZW5kaW5nU3RhdGUubmV4dCA9IGFjdGlvbk5vZGUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuQWN0aW9uU3RhdGVBY3Rpb24oYWN0aW9uUXVldWUsIG5vZGUpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBub2RlLmFjdGlvbixcbiAgICAgICAgcGF5bG9hZCA9IG5vZGUucGF5bG9hZCxcbiAgICAgICAgcHJldlN0YXRlID0gYWN0aW9uUXVldWUuc3RhdGU7XG4gICAgICBpZiAobm9kZS5pc1RyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCxcbiAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi50eXBlcyA9XG4gICAgICAgICAgbnVsbCAhPT0gcHJldlRyYW5zaXRpb24gPyBwcmV2VHJhbnNpdGlvbi50eXBlcyA6IG51bGw7XG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gY3VycmVudFRyYW5zaXRpb247XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHJldHVyblZhbHVlID0gYWN0aW9uKHByZXZTdGF0ZSwgcGF5bG9hZCksXG4gICAgICAgICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgICAgICAgbnVsbCAhPT0gb25TdGFydFRyYW5zaXRpb25GaW5pc2ggJiZcbiAgICAgICAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoKGN1cnJlbnRUcmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgaGFuZGxlQWN0aW9uUmV0dXJuVmFsdWUoYWN0aW9uUXVldWUsIG5vZGUsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBvbkFjdGlvbkVycm9yKGFjdGlvblF1ZXVlLCBub2RlLCBlcnJvcik7XG4gICAgICAgI
15852H0gZmluYWxseSB7XG4gICAgICAgICAgbnVsbCAhPT0gcHJldlRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnRUcmFuc2l0aW9uLnR5cGVzICYmXG4gICAgICAgICAgICAobnVsbCAhPT0gcHJldlRyYW5zaXRpb24udHlwZXMgJiZcbiAgICAgICAgICAgICAgcHJldlRyYW5zaXRpb24udHlwZXMgIT09IGN1cnJlbnRUcmFuc2l0aW9uLnR5cGVzICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJXZSBleHBlY3RlZCBpbm5lciBUcmFuc2l0aW9ucyB0byBoYXZlIHRyYW5zZmVycmVkIHRoZSBvdXRlciB0eXBlcyBzZXQgYW5kIHRoYXQgeW91IGNhbm5vdCBhZGQgdG8gdGhlIG91dGVyIFRyYW5zaXRpb24gd2hpbGUgaW5zaWRlIHRoZSBpbm5lci5UaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAocHJldlRyYW5zaXRpb24udHlwZXMgPSBjdXJyZW50VHJhbnNpdGlvbi50eXBlcykpLFxuICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbiksXG4gICAgICAgICAgICBudWxsID09PSBwcmV2VHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyAmJlxuICAgICAgICAgICAgICAoKGFjdGlvblF1ZXVlID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZSksXG4gICAgICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCksXG4gICAgICAgICAgICAgIDEwIDwgYWN0aW9uUXVldWUgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBcIkRldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLlwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIChjdXJyZW50VHJhbnNpdGlvbiA9IGFjdGlvbihwcmV2U3RhdGUsIHBheWxvYWQpKSxcbiAgICAgICAgICAgIGhhbmRsZUFjdGlvblJldHVyblZhbHVlKGFjdGlvblF1ZXVlLCBub2RlLCBjdXJyZW50VHJhbnNpdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yJDUpIHtcbiAgICAgICAgICBvbkFjdGlvbkVycm9yKGFjdGlvblF1ZXVlLCBub2RlLCBlcnJvciQ1KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoYW5kbGVBY3Rpb25SZXR1cm5WYWx1ZShhY3Rpb25RdWV1ZSwgbm9kZSwgcmV0dXJuVmFsdWUpIHtcbiAgICAgIG51bGwgIT09IHJldHVyblZhbHVlICYmXG4gICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcmV0dXJuVmFsdWUgJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW5cbiAgICAgICAgPyAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuYXN5bmNUcmFuc2l0aW9ucysrLFxuICAgICAgICAgIHJldHVyblZhbHVlLnRoZW4ocmVsZWFzZUFzeW5jVHJhbnNpdGlvbiwgcmVsZWFzZUFzeW5jVHJhbnNpdGlvbiksXG4gICAgICAgICAgcmV0dXJuVmFsdWUudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uIChuZXh0U3RhdGUpIHtcbiAgICAgICAgICAgICAgb25BY3Rpb25TdWNjZXNzKGFjdGlvblF1ZXVlLCBub2RlLCBuZXh0U3RhdGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgbm9kZSwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgbm9kZS5pc1RyYW5zaXRpb24gfHxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiQW4gYXN5bmMgZnVuY3Rpb24gd2l0aCB1c2VBY3Rpb25TdGF0ZSB3YXMgY2FsbGVkIG91dHNpZGUgb2YgYSB0cmFuc2l0aW9uLiBUaGlzIGlzIGxpa2VseSBub3Qgd2hhdCB5b3UgaW50ZW5kZWQgKGZvciBleGFtcGxlLCBpc1BlbmRpbmcgd2lsbCBub3QgdXBkYXRlIGNvcnJlY3RseSkuIEVpdGhlciBjYWxsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLCBvciBwYXNzIGl0IHRvIGFuIGBhY3Rpb25gIG9yIGBmb3JtQWN0aW9uYCBwcm9wLlwiXG4gICAgICAgICAgICApKVxuICAgICAgICA6IG9uQWN0aW9uU3VjY2VzcyhhY3Rpb25RdWV1ZSwgbm9kZSwgcmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvbkFjdGlvblN1Y2Nlc3MoYWN0aW9uUXVldWUsIGFjdGlvbk5vZGUsIG5leHRTdGF0ZSkge1xuICAgICAgYWN0aW9uTm9kZS5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiO1xuICAgICAgYWN0aW9uTm9kZS52YWx1ZSA9IG5leHRTdGF0ZTtcbiAgICAgIG5vdGlmeUFjdGlvbkxpc3RlbmVycyhhY3Rpb25Ob2RlKTtcbiAgICAgIGFjdGlvblF1ZXVlLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgYWN0aW9uTm9kZSA9IGFjdGlvblF1ZXVlLnBlbmRpbmc7XG4gICAgICBudWxsICE9PSBhY3Rpb25Ob2RlICYmXG4gICAgICAgICgobmV4dFN0YXRlID0gYWN0aW9uTm9kZS5uZXh0KSxcbiAgICAgICAgbmV4dFN0YXRlID09PSBhY3Rpb25Ob2RlXG4gICAgICAgICAgPyAoYWN0aW9uUXVldWUucGVuZGluZyA9IG51bGwpXG4gICAgICAgICAgOiAoKG5leHRTdGF0ZSA9IG5leHRTdGF0ZS5uZXh0KSxcbiAgICAgICAgICAgIChhY3Rpb25Ob2RlLm5leHQgPSBuZXh0U3RhdGUpLFxuICAgICAgICAgICAgcnVuQWN0aW9uU3RhdGVBY3Rpb24oYWN0aW9uUXVldWUsIG5leHRTdGF0ZSkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgYWN0aW9uTm9kZSwgZXJyb3IpIHtcbiAgICAgIHZhciBsYXN0ID0gYWN0aW9uUXVldWUucGVuZGluZztcbiAgICAgIGFjdGlvblF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgaWYgKG51bGwgIT09IGxhc3QpIHtcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcbiAgICAgICAgZG9cbiAgICAgICAgICAoYWN0aW9uTm9kZS5zdGF0dXMgPSBcInJlamVjdGVkXCIpLFxuICAgICAgICAgICAgKGFjdGlvbk5vZGUucmVhc29uID0gZXJyb3IpLFxuICAgICAgICAgICAgbm90aWZ5QWN0aW9uTGlzdGVuZXJzKGFjdGlvbk5vZGUpLFxuICAgICAgICAgICAgKGFjdGlvbk5vZGUgPSBhY3Rpb25Ob2RlLm5leHQpO1xuICAgICAgICB3aGlsZSAoYWN0aW9uTm9kZSAhPT0gbGFzdCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25RdWV1ZS5hY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub3RpZnlBY3Rpb25MaXN0ZW5lcnMoYWN0aW9uTm9kZSkge1xuICAgICAgYWN0aW9uTm9kZSA9IGFjdGlvbk5vZGUubGlzdGVuZXJzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3Rpb25Ob2RlLmxlbmd0aDsgaSsrKSAoMCwgYWN0aW9uTm9kZVtpXSkoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWN0aW9uU3RhdGVSZWR1Y2VyKG9sZFN0YXRlLCBuZXdTdGF0ZSkge1xuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlUHJv
15852cCkge1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHZhciBzc3JGb3JtU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc1Jvb3QuZm9ybVN0YXRlO1xuICAgICAgICBpZiAobnVsbCAhPT0gc3NyRm9ybVN0YXRlKSB7XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgdmFyIGlzTWF0Y2hpbmcgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcjtcbiAgICAgICAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICAgICAgICBpZiAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXJJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5Sb290T3JTaW5nbGV0b24gPSByb290T3JTaW5nbGV0b25Db250ZXh0O1xuICAgICAgICAgICAgICAgICAgICA4ICE9PSBtYXJrZXJJbnN0YW5jZS5ub2RlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5Sb290T3JTaW5nbGV0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckluc3RhbmNlLm5leHRTaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBtYXJrZXJJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpblJvb3RPclNpbmdsZXRvbiA9IG1hcmtlckluc3RhbmNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZSA9XG4gICAgICAgICAgICAgICAgICAgIGluUm9vdE9yU2luZ2xldG9uID09PSBGT1JNX1NUQVRFX0lTX01BVENISU5HIHx8XG4gICAgICAgICAgICAgICAgICAgIGluUm9vdE9yU2luZ2xldG9uID09PSBGT1JNX1NUQVRFX0lTX05PVF9NQVRDSElOR1xuICAgICAgICAgICAgICAgICAgICAgID8gbWFya2VySW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXJrZXJJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZS5uZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlzTWF0Y2hpbmcgPSBtYXJrZXJJbnN0YW5jZS5kYXRhID09PSBGT1JNX1NUQVRFX0lTX01BVENISU5HO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGlzTWF0Y2hpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNNYXRjaGluZyA9ICExO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpc01hdGNoaW5nICYmIChpbml0aWFsU3RhdGVQcm9wID0gc3NyRm9ybVN0YXRlWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3NyRm9ybVN0YXRlID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHNzckZvcm1TdGF0ZS5tZW1vaXplZFN0YXRlID0gc3NyRm9ybVN0YXRlLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZVByb3A7XG4gICAgICBpc01hdGNoaW5nID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGFjdGlvblN0YXRlUmVkdWNlcixcbiAgICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVByb3BcbiAgICAgIH07XG4gICAgICBzc3JGb3JtU3RhdGUucXVldWUgPSBpc01hdGNoaW5nO1xuICAgICAgc3NyRm9ybVN0YXRlID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgaXNNYXRjaGluZ1xuICAgICAgKTtcbiAgICAgIGlzTWF0Y2hpbmcuZGlzcGF0Y2ggPSBzc3JGb3JtU3RhdGU7XG4gICAgICBpc01hdGNoaW5nID0gbW91bnRTdGF0ZUltcGwoITEpO1xuICAgICAgaW5Sb290T3JTaW5nbGV0b24gPSBkaXNwYXRjaE9wdGltaXN0aWNTZXRTdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgITEsXG4gICAgICAgIGlzTWF0Y2hpbmcucXVldWVcbiAgICAgICk7XG4gICAgICBpc01hdGNoaW5nID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIG1hcmtlckluc3RhbmNlID0ge1xuICAgICAgICBzdGF0ZTogaW5pdGlhbFN0YXRlUHJvcCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBwZW5kaW5nOiBudWxsXG4gICAgICB9O1xuICAgICAgaXNNYXRjaGluZy5xdWV1ZSA9IG1hcmtlckluc3RhbmNlO1xuICAgICAgc3NyRm9ybVN0YXRlID0gZGlzcGF0Y2hBY3Rpb25TdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgbWFya2VySW5zdGFuY2UsXG4gICAgICAgIGluUm9vdE9yU2luZ2xldG9uLFxuICAgICAgICBzc3JGb3JtU3RhdGVcbiAgICAgICk7XG4gICAgICBtYXJrZXJJbnN0YW5jZS5kaXNwYXRjaCA9IHNzckZvcm1TdGF0ZTtcbiAgICAgIGlzTWF0Y2hpbmcubWVtb2l6ZWRTdGF0ZSA9IGFjdGlvbjtcbiAgICAgIHJldHVybiBbaW5pdGlhbFN0YXRlUHJv
15852cCwgc3NyRm9ybVN0YXRlLCAhMV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUFjdGlvblN0YXRlKGFjdGlvbikge1xuICAgICAgdmFyIHN0YXRlSG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUFjdGlvblN0YXRlSW1wbChzdGF0ZUhvb2ssIGN1cnJlbnRIb29rLCBhY3Rpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVBY3Rpb25TdGF0ZUltcGwoc3RhdGVIb29rLCBjdXJyZW50U3RhdGVIb29rLCBhY3Rpb24pIHtcbiAgICAgIGN1cnJlbnRTdGF0ZUhvb2sgPSB1cGRhdGVSZWR1Y2VySW1wbChcbiAgICAgICAgc3RhdGVIb29rLFxuICAgICAgICBjdXJyZW50U3RhdGVIb29rLFxuICAgICAgICBhY3Rpb25TdGF0ZVJlZHVjZXJcbiAgICAgIClbMF07XG4gICAgICBzdGF0ZUhvb2sgPSB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGN1cnJlbnRTdGF0ZUhvb2sgJiZcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudFN0YXRlSG9vayAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjdXJyZW50U3RhdGVIb29rLnRoZW5cbiAgICAgIClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB1c2VUaGVuYWJsZShjdXJyZW50U3RhdGVIb29rKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGlmICh4ID09PSBTdXNwZW5zZUV4Y2VwdGlvbikgdGhyb3cgU3VzcGVuc2VBY3Rpb25FeGNlcHRpb247XG4gICAgICAgICAgdGhyb3cgeDtcbiAgICAgICAgfVxuICAgICAgZWxzZSBzdGF0ZSA9IGN1cnJlbnRTdGF0ZUhvb2s7XG4gICAgICBjdXJyZW50U3RhdGVIb29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICB2Y
15852XIgYWN0aW9uUXVldWUgPSBjdXJyZW50U3RhdGVIb29rLnF1ZXVlLFxuICAgICAgICBkaXNwYXRjaCA9IGFjdGlvblF1ZXVlLmRpc3BhdGNoO1xuICAgICAgYWN0aW9uICE9PSBjdXJyZW50U3RhdGVIb29rLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgKChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSAyMDQ4KSxcbiAgICAgICAgcHVzaFNpbXBsZUVmZmVjdChcbiAgICAgICAgICBIYXNFZmZlY3QgfCBQYXNzaXZlLFxuICAgICAgICAgIHsgZGVzdHJveTogdm9pZCAwIH0sXG4gICAgICAgICAgYWN0aW9uU3RhdGVBY3Rpb25FZmZlY3QuYmluZChudWxsLCBhY3Rpb25RdWV1ZSwgYWN0aW9uKSxcbiAgICAgICAgICBudWxsXG4gICAgICAgICkpO1xuICAgICAgcmV0dXJuIFtzdGF0ZSwgZGlzcGF0Y2gsIHN0YXRlSG9va107XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFjdGlvblN0YXRlQWN0aW9uRWZmZWN0KGFjdGlvblF1ZXVlLCBhY3Rpb24pIHtcbiAgICAgIGFjdGlvblF1ZXVlLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXJBY3Rpb25TdGF0ZShhY3Rpb24pIHtcbiAgICAgIHZhciBzdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICAgICAgY3VycmVudFN0YXRlSG9vayA9IGN1cnJlbnRIb29rO1xuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRTdGF0ZUhvb2spXG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZUltcGwoc3RhdGVIb29rLCBjdXJyZW50U3RhdGVIb29rLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBzdGF0ZUhvb2sgPSBzdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHZhciBkaXNwYXRjaCA9IGN1cnJlbnRTdGF0ZUhvb2sucXVldWUuZGlzcGF0Y2g7XG4gICAgICBjdXJyZW50U3RhdGVIb29rLm1lbW9pemVkU3RhdGUgPSBhY3Rpb247XG4gICAgICByZXR1cm4gW3N0YXRlSG9vaywgZGlzcGF0Y2gsICExXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFNpbXBsZUVmZmVjdCh0YWcsIGluc3QsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgdGFnID0geyB0YWc6IHRhZywgY3JlYXRlOiBjcmVhdGUsIGRlcHM6IGRlcHMsIGluc3Q6IGluc3QsIG5leHQ6IG51bGwgfTtcbiAgICAgIGluc3QgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZTtcbiAgICAgIG51bGwgPT09IGluc3QgJiZcbiAgICAgICAgKChpbnN0ID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLnVwZGF0ZVF1ZXVlID0gaW5zdCkpO1xuICAgICAgY3JlYXRlID0gaW5zdC5sYXN0RWZmZWN0O1xuICAgICAgbnVsbCA9PT0gY3JlYXRlXG4gICAgICAgID8gKGluc3QubGFzdEVmZmVjdCA9IHRhZy5uZXh0ID0gdGFnKVxuICAgICAgICA6ICgoZGVwcyA9IGNyZWF0ZS5uZXh0KSxcbiAgICAgICAgICAoY3JlYXRlLm5leHQgPSB0YWcpLFxuICAgICAgICAgICh0YWcubmV4dCA9IGRlcHMpLFxuICAgICAgICAgIChpbnN0Lmxhc3RFZmZlY3QgPSB0YWcpKTtcbiAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaW5pdGlhbFZhbHVlID0geyBjdXJyZW50OiBpbml0aWFsVmFsdWUgfTtcbiAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gaW5pdGlhbFZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSBmaWJlckZsYWdzO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaFNpbXBsZUVmZmVjdChcbiAgICAgICAgSGFzRWZmZWN0IHwgaG9va0ZsYWdzLFxuICAgICAgICB7IGRlc3Ryb3k6IHZvaWQgMCB9LFxuICAgICAgICBjcmVhdGUsXG4gICAgICAgIHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gICAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgZGVwcyA9IHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzO1xuICAgICAgdmFyIGluc3QgPSBob29rLm1lbW9pemVkU3RhdGUuaW5zdDtcbiAgICAgIG51bGwgIT09IGN1cnJlbnRIb29rICYmXG4gICAgICBudWxsICE9PSBkZXBzICYmXG4gICAgICBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZS5kZXBzKVxuICAgICAgICA/IChob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoU2ltcGxlRWZmZWN0KGhvb2tGbGFncywgaW5zdCwgY3JlYXRlLCBkZXBzKSlcbiAgICAgICAgOiAoKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmZsYWdzIHw9IGZpYmVyRmxhZ3MpLFxuICAgICAgICAgIChob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoU2ltcGxlRWZmZWN0KFxuICAgICAgICAgICAgSGFzRWZmZWN0IHwgaG9va0ZsYWdzLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNyZWF0ZSxcbiAgICAgICAgICAgIGRlcHNcbiAgICAgICAgICApKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICAgICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZVxuICAgICAgICA/IG1vdW50RWZmZWN0SW1wbCg1NDUyNjE1NjgsIFBhc3NpdmUsIGNyZWF0ZSwgZGVwcylcbiAgICAgICAgOiBtb3VudEVmZmVjdEltcGwoODM5MDY1NiwgUGFzc2l2ZSwgY3JlYXRlLCBkZXBzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXNlRWZmZWN0RXZlbnRJbXBsKHBheWxvYWQpIHtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmZsYWdzIHw9IDQ7XG4gICAgICB2Y
15852XIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZTtcbiAgICAgIGlmIChudWxsID09PSBjb21wb25lbnRVcGRhdGVRdWV1ZSlcbiAgICAgICAgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZSksXG4gICAgICAgICAgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmV2ZW50cyA9IFtwYXlsb2FkXSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmV2ZW50cztcbiAgICAgICAgbnVsbCA9PT0gZXZlbnRzXG4gICAgICAgICAgPyAoY29tcG9uZW50VXBkYXRlUXVldWUuZXZlbnRzID0gW3BheWxvYWRdKVxuICAgICAgICAgIDogZXZlbnRzLnB1c2gocGF5bG9hZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50RXZlbnQoY2FsbGJhY2spIHtcbiAgICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICAgICAgcmVmID0geyBpbXBsOiBjYWxsYmFjayB9O1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcmVmO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dClcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiQSBmdW5jdGlvbiB3cmFwcGVkIGluIHVzZUVmZmVjdEV2ZW50IGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgcmVuZGVyaW5nLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlZi5pbXBsLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGNhbGxiYWNrKSB7XG4gICAgICB2Y
15852XIgcmVmID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHVzZUVmZmVjdEV2ZW50SW1wbCh7IHJlZjogcmVmLCBuZXh0SW1wbDogY2FsbGJhY2sgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJBIGZ1bmN0aW9uIHdyYXBwZWQgaW4gdXNlRWZmZWN0RXZlbnQgY2FuJ3QgYmUgY2FsbGVkIGR1cmluZyByZW5kZXJpbmcuXCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVmLmltcGwuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gICAgICB2YXIgZmliZXJGbGFncyA9IDQxOTQzMDg7XG4gICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIChmaWJlckZsYWdzIHw9IDI2ODQzNTQ1Nik7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdChjcmVhdGUsIHJlZikge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZikge1xuICAgICAgICBjcmVhdGUgPSBjcmVhdGUoKTtcbiAgICAgICAgdmFyIHJlZkNsZWFudXAgPSByZWYoY3JlYXRlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWZDbGVhbnVwID8gcmVmQ2xlYW51cCgpIDogcmVmKG51bGwpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgIT09IHJlZiAmJiB2b2lkIDAgIT09IHJlZilcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICByZWYuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50XCIpIHx8XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSByZWYgY2FsbGJhY2sgb3IgUmVhY3QuY3JlYXRlUmVmKCkgb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICAgICAgXCJhbiBvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKHJlZikuam9pbihcIiwgXCIpICsgXCJ9XCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKGNyZWF0ZSA9IGNyZWF0ZSgpKSxcbiAgICAgICAgICAocmVmLmN1cnJlbnQgPSBjcmVhdGUpLFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY3JlYXRlICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICBudWxsICE9PSBjcmVhdGUgPyB0eXBlb2YgY3JlYXRlIDogXCJudWxsXCJcbiAgICAgICAgKTtcbiAgICAgIGRlcHMgPSBudWxsICE9PSBkZXBzICYmIHZvaWQgMCAhPT0gZGVwcyA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gICAgICB2Y
15852XIgZmliZXJGbGFncyA9IDQxOTQzMDg7XG4gICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIChmaWJlckZsYWdzIHw9IDI2ODQzNTQ1Nik7XG4gICAgICBtb3VudEVmZmVjdEltcGwoXG4gICAgICAgIGZpYmVyRmxhZ3MsXG4gICAgICAgIExheW91dCxcbiAgICAgICAgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSxcbiAgICAgICAgZGVwc1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY3JlYXRlICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICBudWxsICE9PSBjcmVhdGUgPyB0eXBlb2YgY3JlYXRlIDogXCJudWxsXCJcbiAgICAgICAgKTtcbiAgICAgIGRlcHMgPSBudWxsICE9PSBkZXBzICYmIHZvaWQgMCAhPT0gZGVwcyA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gICAgICB1cGRhdGVFZmZlY3RJbXBsKFxuICAgICAgICA0LFxuICAgICAgICBMYXlvdXQsXG4gICAgICAgIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksXG4gICAgICAgIGRlcHNcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZSA9IFtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzXG4gICAgICBdO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGRlcHMgPSB2b2lkIDAgPT09IGRlcHMgPyBudWxsIDogZGVwcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gZGVwcyAmJiBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgcHJldlN0YXRlWzFdKSlcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgZGVwc107XG4gICAgICByZXR1cm4gY2FsbGJhY2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBkZXBzID0gdm9pZCAwID09PSBkZXBzID8gbnVsbCA6IGRlcHM7XG4gICAgICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICAgICAgaWYgKHNob3VsZERvdWJsZUludm9rZVVzZXJGbnNJbkhvb2tzREVWKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXh0Q3JlYXRlKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBkZXBzXTtcbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGRlcHMgPSB2b2lkIDAgPT09IGRlcHMgPyBudWxsIDogZGVwcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gZGVwcyAmJiBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgcHJldlN0YXRlWzFdKSlcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIHByZXZTdGF0ZSA9IG5leHRDcmVhdGUoKTtcbiAgICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV4dENyZWF0ZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gW3ByZXZTdGF0ZSwgZGVwc107XG4gICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgdmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChcbiAgICAgICAgaG9vayxcbiAgICAgICAgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gY3VycmVudEhvb2tcbiAgICAgICAgPyBtb3VudERlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHZhbHVlLCBpbml0aWFsVmFsdWUpXG4gICAgICAgIDogdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoXG4gICAgICAgICAgICBob29rLFxuICAgICAgICAgICAgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlSW1wbChob29rLCB2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHZvaWQgMCA9PT0gaW5pdGlhbFZhbHVlIHx8XG4gICAgICAgICgwICE9PSAocmVuZGVyTGFuZXMgJiAxMDczNzQxODI0KSAmJlxuICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDI2MTkzMCkpXG4gICAgICApXG4gICAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgaG9vayA9IHJlcXVlc3REZWZlcnJlZExhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IGhvb2s7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gaG9vaztcbiAgICAgIHJldHVybiBpbml0aWFsVmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgaWYgKG9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudFRyZWVIaWRkZW5TdGFja0N1cnNvci5jdXJyZW50KVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChob29rID0gbW91bnREZWZlcnJlZFZhbHVlSW1wbChob29rLCB2YWx1ZSwgaW5pdGlhbFZhbHVlKSksXG4gICAgICAgICAgb2JqZWN0SXMoaG9vaywgcHJldlZhbHVlKSB8fCAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKSxcbiAgICAgICAgICBob29rXG4gICAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IChyZW5kZXJMYW5lcyAmIDEwNikgfHxcbiAgICAgICAgKDAgIT09IChyZW5kZXJMYW5lcyAmIDEwNzM3NDE4MjQpICYmXG4gICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgMjYxOTMwKSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIChkaWRSZWNlaXZlVXBkYXRlID0gITApLCAoaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWUpO1xuICAgICAgaG9vayA9IHJlcXVlc3REZWZlcnJlZExhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IGhvb2s7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gaG9vaztcbiAgICAgIHJldHVybiBwcmV2VmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGVhc2VBc3luY1RyYW5zaXRpb24oKSB7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5hc3luY1
15852RyYW5zaXRpb25zLS07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihcbiAgICAgIGZpYmVyLFxuICAgICAgcXVldWUsXG4gICAgICBwZW5kaW5nU3RhdGUsXG4gICAgICBmaW5pc2hlZFN0YXRlLFxuICAgICAgY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPVxuICAgICAgICAwICE9PSBwcmV2aW91c1ByaW9yaXR5ICYmIHByZXZpb3VzUHJpb3JpdHkgPCBDb250aW51b3VzRXZlbnRQcmlvcml0eVxuICAgICAgICAgID8gcHJldmlvdXNQcmlvcml0eVxuICAgICAgICAgIDogQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gICAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5ULFxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbiA9IHt9O1xuICAgICAgY3VycmVudFRyYW5zaXRpb24udHlwZXMgPVxuICAgICAgICBudWxsICE9PSBwcmV2VHJhbnNpdGlvbiA/IHByZXZUcmFuc2l0aW9uLnR5cGVzIDogbnVsbDtcbiAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IGN1cnJlbnRUcmFuc2l0aW9uO1xuICAgICAgZGlzcGF0Y2hPcHRpbWlzdGljU2V0U3RhdGUoZmliZXIsICExLCBxdWV1ZSwgcGVuZGluZ1N0YXRlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGNhbGxiYWNrKCksXG4gICAgICAgICAgb25TdGFydFRyYW5zaXRpb25GaW5pc2ggPSBSZWFjdFNoYXJlZEludGVybmFscy5TO1xuICAgICAgICBudWxsICE9PSBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCAmJlxuICAgICAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoKGN1cnJlbnRUcmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBudWxsICE9PSByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuYXN5bmNUcmFuc2l0aW9ucysrO1xuICAgICAgICAgIHJldHVyblZhbHVlLnRoZW4ocmVsZWFzZUFzeW5jVHJhbnNpdGlvbiwgcmVsZWFzZUFzeW5jVHJhbnNpdGlvbik7XG4gICAgICAgICAgdmFyIHRoZW5hYmxlRm9yRmluaXNoZWRTdGF0ZSA9IGNoYWluVGhlbmFibGVWYWx1ZShcbiAgICAgICAgICAgIHJldHVyblZhbHVlLFxuICAgICAgICAgICAgZmluaXNoZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZGlzcGF0Y2hTZXRTdGF0ZUludGVybmFsKFxuICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICBxdWV1ZSxcbiAgICAgICAgICAgIHRoZW5hYmxlRm9yRmluaXNoZWRTdGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgcXVldWUsXG4gICAgICAgICAgICBmaW5pc2hlZFN0YXRlLFxuICAgICAgICAgICAgcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpXG4gICAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgICBmaWJlcixcbiAgICAgICAgICBxdWV1ZSxcbiAgICAgICAgICB7IHRoZW46IGZ1bmN0aW9uICgpIHt9LCBzdGF0dXM6IFwicmVqZWN0ZWRcIiwgcmVhc29uOiBlcnJvciB9LFxuICAgICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBwcmV2aW91c1ByaW9yaXR5KSxcbiAgICAgICAgICBudWxsICE9PSBwcmV2VHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFRyYW5zaXRpb24udHlwZXMgJiZcbiAgICAgICAgICAgIChudWxsICE9PSBwcmV2VHJhbnNpdGlvbi50eXBlcyAmJlxuICAgICAgICAgICAgICBwcmV2VHJhbnNpdGlvbi50eXBlcyAhPT0gY3VycmVudFRyYW5zaXRpb24udHlwZXMgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIldlIGV4cGVjdGVkIGlubmVyIFRyYW5zaXRpb25zIHRvIGhhdmUgdHJhbnNmZXJyZWQgdGhlIG91
15852dGVyIHR5cGVzIHNldCBhbmQgdGhhdCB5b3UgY2Fubm90IGFkZCB0byB0aGUgb3V0ZXIgVHJhbnNpdGlvbiB3aGlsZSBpbnNpZGUgdGhlIGlubmVyLlRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChwcmV2VHJhbnNpdGlvbi50eXBlcyA9IGN1cnJlbnRUcmFuc2l0aW9uLnR5cGVzKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbiksXG4gICAgICAgICAgbnVsbCA9PT0gcHJldlRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzICYmXG4gICAgICAgICAgICAoKGZpYmVyID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZSksXG4gICAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpLFxuICAgICAgICAgICAgMTAgPCBmaWJlciAmJlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgXCJEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uIElmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuIE90aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS5cIlxuICAgICAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RhcnRIb3N0VHJhbnNpdGlvbihmb3JtRmliZXIsIHBlbmRpbmdTdGF0ZSwgYWN0aW9uLCBmb3JtRGF0YSkge1xuICAgICAgaWYgKDUgIT09IGZvcm1GaWJlci50YWcpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFwiRXhwZWN0ZWQgdGhlIGZvcm0gaW5zdGFuY2UgdG8gYmUgYSBIb3N0Q29tcG9uZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICk7XG4gICAgICB2Y
15852XIgcXVldWUgPSBlbnN1cmVGb3JtQ29tcG9uZW50SXNTdGF0ZWZ1bChmb3JtRmliZXIpLnF1ZXVlO1xuICAgICAgc3RhcnRIb3N0QWN0aW9uVGltZXIoZm9ybUZpYmVyKTtcbiAgICAgIHN0YXJ0VHJhbnNpdGlvbihcbiAgICAgICAgZm9ybUZpYmVyLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcGVuZGluZ1N0YXRlLFxuICAgICAgICBOb3RQZW5kaW5nVHJhbnNpdGlvbixcbiAgICAgICAgbnVsbCA9PT0gYWN0aW9uXG4gICAgICAgICAgPyBub29wXG4gICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJlcXVlc3RGb3JtUmVzZXQkMShmb3JtRmliZXIpO1xuICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uKGZvcm1EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVuc3VyZUZvcm1Db21wb25lbnRJc1N0YXRlZnVsKGZvcm1GaWJlcikge1xuICAgICAgdmFyIGV4aXN0aW5nU3RhdGVIb29rID0gZm9ybUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gZXhpc3RpbmdTdGF0ZUhvb2spIHJldHVybiBleGlzdGluZ1N0YXRlSG9vaztcbiAgICAgIGV4aXN0aW5nU3RhdGVIb29rID0ge1xuICAgICAgICBtZW1vaXplZFN0YXRlOiBOb3RQZW5kaW5nVHJhbnNpdGlvbixcbiAgICAgICAgYmFzZVN0YXRlOiBOb3RQZW5kaW5nVHJhbnNpdGlvbixcbiAgICAgICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgICAgICBxdWV1ZToge1xuICAgICAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICAgICAgbGFuZXM6IDAsXG4gICAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IE5vdFBlbmRpbmdUcmFuc2l0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2Y
15852XIgaW5pdGlhbFJlc2V0U3RhdGUgPSB7fTtcbiAgICAgIGV4aXN0aW5nU3RhdGVIb29rLm5leHQgPSB7XG4gICAgICAgIG1lbW9pemVkU3RhdGU6IGluaXRpYWxSZXNldFN0YXRlLFxuICAgICAgICBiYXNlU3RhdGU6IGluaXRpYWxSZXNldFN0YXRlLFxuICAgICAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgICAgIHF1ZXVlOiB7XG4gICAgICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgICAgICBsYW5lczogMCxcbiAgICAgICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgICAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICAgICAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFJlc2V0U3RhdGVcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGZvcm1GaWJlci5tZW1vaXplZFN0YXRlID0gZXhpc3RpbmdTdGF0ZUhvb2s7XG4gICAgICBmb3JtRmliZXIgPSBmb3JtRmliZXIuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCAhPT0gZm9ybUZpYmVyICYmIChmb3JtRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGV4aXN0aW5nU3RhdGVIb29rKTtcbiAgICAgIHJldHVybiBleGlzdGluZ1N0YXRlSG9vaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVxdWVzdEZvcm1SZXNldCQxKGZvcm1GaWJlcikge1xuICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwicmVxdWVzdEZvcm1SZXNldCB3YXMgY2FsbGVkIG91dHNpZGUgYSB0cmFuc2l0aW9uIG9yIGFjdGlvbi4gVG8gZml4LCBtb3ZlIHRvIGFuIGFjdGlvbiwgb3Igd3JhcCB3aXRoIHN0YXJ0VHJhbnNpdGlvbi5cIlxuICAgICAgICApO1xuICAgICAgdmFyIHN0YXRlSG9vayA9IGVuc3VyZUZvcm1Db21wb25lbnRJc1N0YXRlZnVsKGZvcm1GaWJlcik7XG4gICAgICBudWxsID09PSBzdGF0ZUhvb2submV4dCAmJlxuICAgICAgICAoc3RhdGVIb29rID0gZm9ybUZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlKTtcbiAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgZm9ybUZpYmVyLFxuICAgICAgICBzdGF0ZUhvb2submV4dC5xdWV1ZSxcbiAgICAgICAge30sXG4gICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZvcm1GaWJlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50VHJhbnNpdGlvbigpIHtcbiAgICAgIHZhciBzdGF0ZUhvb2sgPSBtb3VudFN0YXRlSW1wbCghMSk7XG4gICAgICBzdGF0ZUhvb2sgPSBzdGFydFRyYW5zaXRpb24uYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIHN0YXRlSG9vay5xdWV1ZSxcbiAgICAgICAgITAsXG4gICAgICAgICExXG4gICAgICApO1xuICAgICAgbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlID0gc3RhdGVIb29rO1xuICAgICAgcmV0dXJuIFshMSwgc3RhdGVIb29rXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVHJhbnNpdGlvbigpIHtcbiAgICAgIHZhciBib29sZWFuT3JUaGVuYWJsZSA9IHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpWzBdLFxuICAgICAgICBzdGFydCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIGJvb2xlYW5PclRoZW5hYmxlXG4gICAgICAgICAgPyBib29sZWFuT3JUaGVuYWJsZVxuICAgICAgICAgIDogdXNlVGhlbmFibGUoYm9vbGVhbk9yVGhlbmFibGUpLFxuICAgICAgICBzdGFydFxuICAgICAgXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICAgICAgdmFyIGJvb2xlYW5PclRoZW5hYmxlID0gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKVswXSxcbiAgICAgICAgc3RhcnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiBib29sZWFuT3JUaGVuYWJsZVxuICAgICAgICAgID8gYm9vbGVhbk9yVGhlbmFibGVcbiAgICAgICAgICA6IHVzZVRoZW5hYmxlKGJvb2xlYW5PclRoZW5hYmxlKSxcbiAgICAgICAgc3RhcnRcbiAgICAgIF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzKCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KEhvc3RUcmFuc2l0aW9uQ29udGV4dCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50SWQoKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCksXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSB3b3JrSW5Qcm9ncmVzc1Jvb3QuaWRlbnRpZmllclByZWZpeDtcbiAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICB2YXIgdHJlZUlkID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgICAgICAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICAgICAgICB0cmVlSWQgPVxuICAgICAgICAgIChcbiAgICAgICAgICAgIGlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgKDMyIC0gY2x6MzIoaWRXaXRoTGVhZGluZ0JpdCkgLSAxKSlcbiAgICAgICAgICApLnRvU3RyaW5nKDMyKSArIHRyZWVJZDtcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCA9IFwiX1wiICsgaWRlbnRpZmllclByZWZpeCArIFwiUl9cIiArIHRyZWVJZDtcbiAgICAgICAgdHJlZUlkID0gbG9jYWxJZENvdW50ZXIrKztcbiAgICAgICAgMCA8IHRyZWVJZCAmJiAoaWRlbnRpZmllclByZWZpeCArPSBcIkhcIiArIHRyZWVJZC50b1N0cmluZygzMikpO1xuICAgICAgICBpZGVudGlmaWVyUHJlZml4ICs9IFwiX1wiO1xuICAgICAgfSBlbHNlXG4gICAgICAgICh0cmVlSWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIrKyksXG4gICAgICAgICAgKGlkZW50aWZpZXJQcmVmaXggPVxuICAgICAgICAgICAgXCJfXCIgKyBpZGVudGlmaWVyUHJlZml4ICsgXCJyX1wiICsgdHJlZUlkLnRvU3RyaW5nKDMyKSArIFwiX1wiKTtcbiAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gaWRlbnRpZmllclByZWZpeCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50UmVmcmVzaCgpIHtcbiAgICAgIHJldHVybiAobW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlID0gcmVmcmVzaENhY2hlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyXG4gICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVmcmVzaENhY2hlKGZpYmVyLCBzZWVkS2V5KSB7XG4gICAgICBmb3IgKHZhciBwcm92aWRlciA9IGZpYmVyLnJldHVybjsgbnVsbCAhPT0gcHJvdmlkZXI7ICkge1xuICAgICAgICBzd2l0Y2ggKHByb3ZpZGVyLnRhZykge1xuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShwcm92aWRlciksXG4gICAgICAgICAgICAgIHJlZnJlc2hVcGRhdGUgPSBjcmVhdGVVcGRhdGUobGFuZSksXG4gICAgICAgICAgICAgIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHByb3ZpZGVyLCByZWZyZXNoVXBkYXRlLCBsYW5lKTtcbiAgICAgICAgICAgIG51bGwgIT09IHJvb3QgJiZcbiAgICAgICAgICAgICAgKHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUobGFuZSwgXCJyZWZyZXNoKClcIiwgZmliZXIpLFxuICAgICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgcHJvdmlkZXIsIGxhbmUpLFxuICAgICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIHByb3ZpZGVyLCBsYW5lKSk7XG4gICAgICAgICAgICBmaWJlciA9IGNyZWF0ZUNhY2hlKCk7XG4gICAgICAgICAgICBudWxsICE9PSBzZWVkS2V5ICYmXG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gc2VlZEtleSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJUaGUgc2VlZCBhcmd1bWVudCBpcyBub3QgZW5hYmxlZCBvdXRzaWRlIGV4cGVyaW1lbnRhbCBjaGFubmVscy5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVmcmVzaFVwZGF0ZS5wYXlsb2FkID0geyBjYWNoZTogZmliZXIgfTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwcm92aWRlciA9IHByb3ZpZGVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gICAgICB2Y
15852XIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFyZ3NbM10gJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIHNlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS5cIlxuICAgICAgICApO1xuICAgICAgYXJncyA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgIHZhciB1cGRhdGUgPSB7XG4gICAgICAgIGxhbmU6IGFyZ3MsXG4gICAgICAgIHJldmVydExhbmU6IDAsXG4gICAgICAgIGdlc3R1cmU6IG51bGwsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBoYXNFYWdlclN0YXRlOiAhMSxcbiAgICAgICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpXG4gICAgICAgID8gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpXG4gICAgICAgIDogKCh1cGRhdGUgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGFyZ3MpKSxcbiAgICAgICAgICBudWxsICE9PSB1cGRhdGUgJiZcbiAgICAgICAgICAgIChzdGFydFVwZGF0ZVRpbWVyQnlMYW5lKGFyZ3MsIFwiZGlzcGF0Y2goKVwiLCBmaWJlciksXG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIodXBkYXRlLCBmaWJlciwgYXJncyksXG4gICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUodXBkYXRlLCBxdWV1ZSwgYXJncykpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzWzNdICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuXCJcbiAgICAgICAgKTtcbiAgICAgIGFyZ3MgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgICBkaXNwYXRjaFNldFN0YXRlSW50ZXJuYWwoZmliZXIsIHF1ZXVlLCBhY3Rpb24sIGFyZ3MpICYmXG4gICAgICAgIHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUoYXJncywgXCJzZXRTdGF0ZSgpXCIsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZUludGVybmFsKGZpYmVyLCBxdWV1ZSwgYWN0aW9uLCBsYW5lKSB7XG4gICAgICB2Y
15852XIgdXBkYXRlID0ge1xuICAgICAgICBsYW5lOiBsYW5lLFxuICAgICAgICByZXZlcnRMYW5lOiAwLFxuICAgICAgICBnZXN0dXJlOiBudWxsLFxuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgaGFzRWFnZXJTdGF0ZTogITEsXG4gICAgICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG4gICAgICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgMCA9PT0gZmliZXIubGFuZXMgJiZcbiAgICAgICAgICAobnVsbCA9PT0gYWx0ZXJuYXRlIHx8IDAgPT09IGFsdGVybmF0ZS5sYW5lcykgJiZcbiAgICAgICAgICAoKGFsdGVybmF0ZSA9IHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIpLCBudWxsICE9PSBhbHRlcm5hdGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGUsXG4gICAgICAgICAgICAgIGVhZ2VyU3RhdGUgPSBhbHRlcm5hdGUoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSAhMDtcbiAgICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcbiAgICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGVucXVldWVVcGRhdGUkMShmaWJlciwgcXVldWUsIHVwZGF0ZSwgMCksXG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ICYmXG4gICAgICAgICAgICAgICAgICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCksXG4gICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFjdGlvbiA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgIGlmIChudWxsICE9PSBhY3Rpb24pXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihhY3Rpb24sIGZpYmVyLCBsYW5lKSxcbiAgICAgICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShhY3Rpb24sIHF1ZXVlLCBsYW5lKSxcbiAgICAgICAgICAgICEwXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hPcHRpbWlzdGljU2V0U3RhdGUoXG4gICAgICBmaWJlcixcbiAgICAgIHRocm93SWZEdXJpbmdSZW5kZXIsXG4gICAgICBxdWV1ZSxcbiAgICAgIGFjdGlvblxuICAgICkge1xuICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCAmJlxuICAgICAgICAwID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQW4gb3B0aW1pc3RpYyBzdGF0ZSB1cGRhdGUgb2NjdXJyZWQgb3V0c2lkZSBhIHRyYW5zaXRpb24gb3IgYWN0aW9uLiBUbyBmaXgsIG1vdmUgdGhlIHVwZGF0ZSB0byBhbiBhY3Rpb24sIG9yIHdyYXAgd2l0aCBzdGFydFRyYW5zaXRpb24uXCJcbiAgICAgICAgKTtcbiAgICAgIGFjdGlvbiA9IHtcbiAgICAgICAgbGFuZTogMixcbiAgICAgICAgcmV2ZXJ0TGFuZTogcmVxdWVzdFRyYW5zaXRpb25MYW5lKCksXG4gICAgICAgIGdlc3R1cmU6IG51bGwsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBoYXNFYWdlclN0YXRlOiAhMSxcbiAgICAgICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgICAgICBpZiAodGhyb3dJZkR1cmluZ1JlbmRlcilcbiAgICAgICAgICB0aHJvdyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgb3B0aW1pc3RpYyBzdGF0ZSB3aGlsZSByZW5kZXJpbmcuXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IGNhbGwgc3RhcnRUcmFuc2l0aW9uIHdoaWxlIHJlbmRlcmluZy5cIik7XG4gICAgICB9IGVsc2VcbiAgICAgICAgKHRocm93SWZEdXJpbmdSZW5kZXIgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoXG4gICAgICAgICAgZmliZXIsXG4gICAgICAgICAgcXVldWUsXG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIDJcbiAgICAgICAgKSksXG4gICAgICAgICAgbnVsbCAhPT0gdGhyb3dJZkR1cmluZ1JlbmRlciAmJlxuICAgICAgICAgICAgKHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUoMiwgXCJzZXRPcHRpbWlzdGljKClcIiwgZmliZXIpLFxuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHRocm93SWZEdXJpbmdSZW5kZXIsIGZpYmVyLCAyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBmaWJlciA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIgfHxcbiAgICAgICAgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9XG4gICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSAhMDtcbiAgICAgIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcbiAgICAgIG51bGwgPT09IHBlbmRpbmdcbiAgICAgICAgPyAodXBkYXRlLm5leHQgPSB1cGRhdGUpXG4gICAgICAgIDogKCh1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dCksIChwZW5kaW5nLm5leHQgPSB1cGRhdGUpKTtcbiAgICAgIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSkge1xuICAgICAgaWYgKDAgIT09IChsYW5lICYgNDE5NDA0OCkpIHtcbiAgICAgICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lcztcbiAgICAgICAgcXVldWVMYW5lcyAmPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAgICAgbGFuZSB8PSBxdWV1ZUxhbmVzO1xuICAgICAgICBxdWV1ZS5sYW5lcyA9IGxhbmU7XG4gICAgICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGxhbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgIGlmIChudWxsICE9PSBjYWxsYmFjayAmJiBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjYWxsYmFjaykge1xuICAgICAgICB2Y
15852XIga2V5ID0gU3RyaW5nKGNhbGxiYWNrKTtcbiAgICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpIHx8XG4gICAgICAgICAgKGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLlwiLFxuICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIGN0b3IsXG4gICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsXG4gICAgICBuZXh0UHJvcHNcbiAgICApIHtcbiAgICAgIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLFxuICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm9pZCAwID09PSBwYXJ0aWFsU3RhdGUgJiZcbiAgICAgICAgKChjdG9yID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8IFwiQ29tcG9uZW50XCIpLFxuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuaGFzKGN0b3IpIHx8XG4gICAgICAgICAgKGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5hZGQoY3RvciksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuXCIsXG4gICAgICAgICAgICBjdG9yXG4gICAgICAgICAgKSkpO1xuICAgICAgcHJldlN0YXRlID1cbiAgICAgICAgbnVsbCA9PT0gcGFydGlhbFN0YXRlIHx8IHZvaWQgMCA9PT0gcGFydGlhbFN0YXRlXG4gICAgICAgICAgPyBwcmV2U3RhdGVcbiAgICAgICAgICA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHByZXZTdGF0ZTtcbiAgICAgIDAgPT09IHdvcmtJblByb2dyZXNzLmxhbmVzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBwcmV2U3RhdGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgY3RvcixcbiAgICAgIG9sZFByb3BzLFxuICAgICAgbmV3UHJvcHMsXG4gICAgICBvbGRTdGF0ZSxcbiAgICAgIG5ld1N0YXRlLFxuICAgICAgbmV4dENvbnRleHRcbiAgICApIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgb2xkUHJvcHMgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUoXG4gICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgbmV3U3RhdGUsXG4gICAgICAgICAgbmV4dENvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvbGRQcm9wcyA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICBuZXh0Q29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2b2lkIDAgPT09IG9sZFByb3BzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLlwiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8IFwiQ29tcG9uZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gb2xkUHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnRcbiAgICAgICAgPyAhc2hhbGxvd0VxdWFsKG9sZFByb3BzLCBuZXdQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChvbGRTdGF0ZSwgbmV3U3RhdGUpXG4gICAgICAgIDogITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ld1Byb3BzLFxuICAgICAgbmV4dENvbnRleHRcbiAgICApIHtcbiAgICAgIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlICYmXG4gICAgICAgICgod29ya0luUHJvZ3Jlc3MgPVxuICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8IFwiQ29tcG9uZW50XCIpLFxuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKHdvcmtJblByb2dyZXNzKSB8fFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICApKSxcbiAgICAgICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgaW5zdGFuY2Uuc3RhdGUsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZUNsYXNzQ29tcG9uZW50UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgICAgIHZhciBuZXdQcm9wcyA9IGJhc2VQcm9wcztcbiAgICAgIGlmIChcInJlZlwiIGluIGJhc2VQcm9wcykge1xuICAgICAgICBuZXdQcm9wcyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBiYXNlUHJvcHMpXG4gICAgICAgICAgXCJyZWZcIiAhPT0gcHJvcE5hbWUgJiYgKG5ld1Byb3BzW3Byb3BOYW1lXSA9IGJhc2VQcm9wc1twcm9wTmFtZV0pO1xuICAgICAgfVxuICAgICAgaWYgKChDb21wb25lbnQgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzKSkge1xuICAgICAgICBuZXdQcm9wcyA9PT0gYmFzZVByb3BzICYmIChuZXdQcm9wcyA9IGFzc2lnbih7fSwgbmV3UHJvcHMpKTtcbiAgICAgICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIENvbXBvbmVudClcbiAgICAgICAgICB2b2lkIDAgPT09IG5ld1Byb3BzW19wcm9wTmFtZV0gJiZcbiAgICAgICAgICAgIChuZXdQcm9wc1tfcHJvcE5hbWVdID0gQ29tcG9uZW50W19wcm9wTmFtZV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZh
15852dWx0T25VbmNhdWdodEVycm9yKGVycm9yKSB7XG4gICAgICByZXBvcnRHbG9iYWxFcnJvcihlcnJvcik7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiJXNcXG5cXG4lc1xcblwiLFxuICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgPyBcIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSA8XCIgKyBjb21wb25lbnROYW1lICsgXCI+IGNvbXBvbmVudC5cIlxuICAgICAgICAgIDogXCJBbiBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzLlwiLFxuICAgICAgICBcIkNvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcblZpc2l0IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkNhdWdodEVycm9yKGVycm9yKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lXG4gICAgICAgICAgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQuXCJcbiAgICAgICAgICA6IFwiVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHMuXCIsXG4gICAgICAgIHJlY3JlYXRlTWVzc2FnZSA9XG4gICAgICAgICAgXCJSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArXG4gICAgICAgICAgKChlcnJvckJvdW5kYXJ5TmFtZSB8fCBcIkFub255bW91c1wiKSArIFwiLlwiKTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvci5lbnZpcm9ubWVudE5hbWVcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gZXJyb3IuZW52aXJvbm1lbnROYW1lO1xuICAgICAgICBlcnJvciA9IFtcbiAgICAgICAgICBcIiVvXFxuXFxuJXNcXG5cXG4lc1xcblwiLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVNZXNzYWdlLFxuICAgICAgICAgIHJlY3JlYXRlTWVzc2FnZVxuICAgICAgICBdLnNsaWNlKDApO1xuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3JbMF1cbiAgICAgICAgICA/IGVycm9yLnNwbGljZShcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgYmFkZ2VGb3JtYXQgKyBcIiBcIiArIGVycm9yWzBdLFxuICAgICAgICAgICAgICBiYWRnZVN0eWxlLFxuICAgICAgICAgICAgICBwYWQgKyBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgKyBwYWQsXG4gICAgICAgICAgICAgIHJlc2V0U3R5bGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGVycm9yLnNwbGljZShcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgYmFkZ2VGb3JtYXQsXG4gICAgICAgICAgICAgIGJhZGdlU3R5bGUsXG4gICAgICAgICAgICAgIHBhZCArIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCArIHBhZCxcbiAgICAgICAgICAgICAgcmVzZXRTdHlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgZXJyb3IudW5zaGlmdChjb25zb2xlKTtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gYmluZC5hcHBseShjb25zb2xlLmVycm9yLCBlcnJvcik7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCgpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCIlb1xcblxcbiVzXFxuXFxuJXNcXG5cIixcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBjb21wb25lbnROYW1lTWVzc2FnZSxcbiAgICAgICAgICByZWNyZWF0ZU1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcihlcnJvcikge1xuICAgICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dVbmNhdWdodEVycm9yKHJvb3QsIGVycm9ySW5mbykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tcG9uZW50TmFtZSA9IGVycm9ySW5mby5zb3VyY2VcbiAgICAgICAgICA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZXJyb3JJbmZvLnNvdXJjZSlcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGVycm9yQm91bmRhcnlOYW1lID0gbnVsbDtcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgICBpZiAobnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUpXG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2Y
15852XIgb25VbmNhdWdodEVycm9yID0gcm9vdC5vblVuY2F1Z2h0RXJyb3I7XG4gICAgICAgICAgb25VbmNhdWdodEVycm9yKGVycm9yLCB7IGNvbXBvbmVudFN0YWNrOiBlcnJvckluZm8uc3RhY2sgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUkNikge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlJDY7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDYXVnaHRFcnJvcihyb290LCBib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21wb25lbnROYW1lID0gZXJyb3JJbmZvLnNvdXJjZVxuICAgICAgICAgID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihlcnJvckluZm8uc291cmNlKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KTtcbiAgICAgICAgdmFyIG9uQ2F1Z2h0RXJyb3IgPSByb290Lm9uQ2F1Z2h0RXJyb3I7XG4gICAgICAgIG9uQ2F1Z2h0RXJyb3IoZXJyb3JJbmZvLnZhbHVlLCB7XG4gICAgICAgICAgY29tcG9uZW50U3RhY2s6IGVycm9ySW5mby5zdGFjayxcbiAgICAgICAgICBlcnJvckJvdW5kYXJ5OiAxID09PSBib3VuZGFyeS50YWcgPyBib3VuZGFyeS5zdGF0ZU5vZGUgOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSQ3KSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IGUkNztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290LCBlcnJvckluZm8sIGxhbmUpIHtcbiAgICAgIGxhbmUgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gICAgICBsYW5lLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gICAgICBsYW5lLnBheWxvYWQgPSB7IGVsZW1lbnQ6IG51bGwgfTtcbiAgICAgIGxhbmUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKGVycm9ySW5mby5zb3VyY2UsIGxvZ1VuY2F1Z2h0RXJyb3IsIHJvb3QsIGVycm9ySW5mbyk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGxhbmU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUobGFuZSkge1xuICAgICAgbGFuZSA9IGNyZWF0ZVVwZGF0ZShsYW5lKTtcbiAgICAgIGxhbmUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgICAgIHJldHVybiBsYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZSh1cGRhdGUsIHJvb3QsIGZpYmVyLCBlcnJvckluZm8pIHtcbiAgICAgIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IpIHtcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGVycm9ySW5mby5zb3VyY2UsXG4gICAgICAgICAgICBsb2dDYXVnaHRFcnJvcixcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIGVycm9ySW5mb1xuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2Y
15852XIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIG51bGwgIT09IGluc3QgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdC5jb21wb25lbnREaWRDYXRjaCAmJlxuICAgICAgICAodXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGVycm9ySW5mby5zb3VyY2UsXG4gICAgICAgICAgICBsb2dDYXVnaHRFcnJvcixcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIGVycm9ySW5mb1xuICAgICAgICAgICk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICYmXG4gICAgICAgICAgICAobnVsbCA9PT0gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWRcbiAgICAgICAgICAgICAgPyAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFt0aGlzXSkpXG4gICAgICAgICAgICAgIDogbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKHRoaXMpKTtcbiAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkQ2F0Y2hJbkRFVih0aGlzLCBlcnJvckluZm8pO1xuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciB8fFxuICAgICAgICAgICAgKDAgPT09IChmaWJlci5sYW5lcyAmIDIpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCIlczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiBJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS5cIixcbiAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIlVua25vd25cIlxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKFxuICAgICAgcm9vdCxcbiAgICAgIHJldHVybkZpYmVyLFxuICAgICAgc291cmNlRmliZXIsXG4gICAgICB2YWx1ZSxcbiAgICAgIHJvb3RSZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gMzI3Njg7XG4gICAgICBpc0RldlRvb2xzUHJlc2VudCAmJiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IHZhbHVlICYmXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB2YWx1ZS50aGVuXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIG51bGwgIT09IHJldHVybkZpYmVyICYmXG4gICAgICAgICAgcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIHNvdXJjZUZpYmVyLFxuICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgITBcbiAgICAgICAgICApO1xuICAgICAgICBpc0h5ZHJhdGluZyAmJiAoZGlkU3VzcGVuZE9yRXJyb3JERVYgPSAhMCk7XG4gICAgICAgIHNvdXJjZUZpYmVyID0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgICAgaWYgKG51bGwgIT09IHNvdXJjZUZpYmVyKSB7XG4gICAgICAgICAgc3dpdGNoIChzb3VyY2VGaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgICA/IHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKVxuICAgICAgICAgICAgICAgICAgOiBudWxsID09PSBzb3VyY2VGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkKSxcbiAgICAgICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgICAoc291cmNlRmliZXIubGFuZXMgPSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIHZhbHVlID09PSBub29wU3VzcGVuc2V5Q29tbWl0VGhlbmFibGVcbiAgICAgICAgICAgICAgICAgID8gKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDE2Mzg0KVxuICAgICAgICAgICAgICAgICAgOiAoKHJldHVybkZpYmVyID0gc291cmNlRmliZXIudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgICAgICAgICBudWxsID09PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgICAgID8gKHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gbmV3IFNldChbdmFsdWVdKSlcbiAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybkZpYmVyLmFkZCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gbm9vcFN1c3BlbnNleUNvbW1pdFRoZW5hYmxlXG4gICAgICAgICAgICAgICAgICA/IChzb3VyY2VGaWJlci5mbGFncyB8PSAxNjM4NClcbiAgICAgICAgICAgICAgICAgIDogKChyZXR1cm5GaWJlciA9IHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICA/ICgocmV0dXJuRmliZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
15852HRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5UXVldWU6IG5ldyBTZXQoW3ZhbHVlXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gcmV0dXJuRmliZXIpKVxuICAgICAgICAgICAgICAgICAgICAgIDogKChzb3VyY2VGaWJlciA9IHJldHVybkZpYmVyLnJldHJ5UXVldWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gc291cmNlRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAocmV0dXJuRmliZXIucmV0cnlRdWV1ZSA9IG5ldyBTZXQoW3ZhbHVlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogc291cmNlRmliZXIuYWRkKHZhbHVlKSksXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlVuZXhwZWN0ZWQgU3VzcGVuc2UgaGFuZGxlciB0YWcgKFwiICtcbiAgICAgICAgICAgICAgc291cmNlRmliZXIudGFnICtcbiAgICAgICAgICAgICAgXCIpLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgaWYgKGlzSHlkcmF0aW5nKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChkaWRTdXNwZW5kT3JFcnJvckRFViA9ICEwKSxcbiAgICAgICAgICAocmV0dXJuRmliZXIgPSBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvci5jdXJyZW50KSxcbiAgICAgICAgICBudWxsICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgPyAoMTkgPT09IHJldHVybkZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIlN1c3BlbnNlTGlzdCBzaG91bGQgbmV2ZXIgY2F0Y2ggd2hpbGUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgMCA9PT0gKHJldHVybkZpYmVyLmZsYWdzICYgNjU1MzYpICYmIChyZXR1cm5GaWJlci5mbGFncyB8PSAyNTYpLFxuICAgICAgICAgICAgICAocmV0dXJuRmliZXIuZmxhZ3MgfD0gNjU1MzYpLFxuICAgICAgICAgICAgICAocmV0dXJuRmliZXIubGFuZXMgPSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICB2YWx1ZSAhPT0gSHlkcmF0aW9uTWlzbWF0Y2hFeGNlcHRpb24gJiZcbiAgICAgICAgICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoXG4gICAgICAgICAgICAgICAgICAgIEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyBidXQgUmVhY3Qgd2FzIGFibGUgdG8gcmVjb3ZlciBieSBpbnN0ZWFkIGNsaWVudCByZW5kZXJpbmcgZnJvbSB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeS5cIixcbiAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiB2YWx1ZSB9XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpYmVyXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogKHZhbHVlICE9PSBIeWRyYXRpb25NaXNtYXRjaEV4Y2VwdGlvbiAmJlxuICAgICAgICAgICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihcbiAgICAgICAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIGJ1dCBSZWFjdCB3YXMgYWJsZSB0byByZWNvdmVyIGJ5IGluc3RlYWQgY2xpZW50IHJlbmRlcmluZyB0aGUgZW50aXJlIHJvb3QuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogdmFsdWUgfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWJlclxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIChyb290ID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZSksXG4gICAgICAgICAgICAgIChyb290LmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgKHJvb3RSZW5kZXJMYW5lcyAmPSAtcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKHJvb3QubGFuZXMgfD0gcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSksXG4gICAgICAgICAgICAgIChyb290UmVuZGVyTGFuZXMgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUoXG4gICAgICAgICAgICAgICAgcm9vdC5zdGF0ZU5vZGUsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUocm9vdCwgcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSAmJlxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQpKSxcbiAgICAgICAgICAhMVxuICAgICAgICApO1xuICAgICAgdmFyIGVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoXG4gICAgICAgIEVycm9yKFxuICAgICAgICAgIFwiVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBjb25jdXJyZW50IHJlbmRlcmluZyBidXQgUmVhY3Qgd2FzIGFibGUgdG8gcmVjb3ZlciBieSBpbnN0ZWFkIHN5bmNocm9ub3VzbHkgcmVuZGVyaW5nIHRoZSBlbnRpcmUgcm9vdC5cIixcbiAgICAgICAgICB7IGNhdXNlOiB2YWx1ZSB9XG4gICAgICAgICksXG4gICAgICAgI
15852HNvdXJjZUZpYmVyXG4gICAgICApO1xuICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9yc1xuICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gW2Vycm9yXSlcbiAgICAgICAgOiB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSAmJlxuICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RFcnJvcmVkKTtcbiAgICAgIGlmIChudWxsID09PSByZXR1cm5GaWJlcikgcmV0dXJuICEwO1xuICAgICAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpO1xuICAgICAgc291cmNlRmliZXIgPSByZXR1cm5GaWJlcjtcbiAgICAgIGRvIHtcbiAgICAgICAgc3dpdGNoIChzb3VyY2VGaWJlci50YWcpIHtcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgfD0gNjU1MzYpLFxuICAgICAgICAgICAgICAocm9vdCA9IHJvb3RSZW5kZXJMYW5lcyAmIC1yb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAoc291cmNlRmliZXIubGFuZXMgfD0gcm9vdCksXG4gICAgICAgICAgICAgIChyb290ID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKFxuICAgICAgICAgICAgICAgIHNvdXJjZUZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUoc291cmNlRmliZXIsIHJvb3QpLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm5GaWJlciA9IHNvdXJjZUZpYmVyLnR5cGU7XG4gICAgICAgICAgICBlcnJvciA9IHNvdXJjZUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgMCA9PT0gKHNvdXJjZUZpYmVyLmZsYWdzICYgMTI4KSAmJlxuICAgICAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmV0dXJuRmliZXIuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIHx8XG4gICAgICAgICAgICAgICAgKG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBlcnJvci5jb21wb25lbnREaWRDYXRjaCAmJlxuICAgICAgICAgICAgICAgICAgKG51bGwgPT09IGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICFsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoZXJyb3IpKSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgICAocm9vdFJlbmRlckxhbmVzICY9IC1yb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIChzb3VyY2VGaWJlci5sYW5lcyB8PSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIChyb290UmVuZGVyTGFuZXMgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHJvb3RSZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemVDbGFzc0Vycm9yVXBkYXRlKFxuICAgICAgICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZUZpYmVyLFxuICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZShzb3VyY2VGaWJlciwgcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIGlmIChudWxsICE9PSBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlKVxuICAgICAgICAgICAgICByZXR1cm4gKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSwgITE7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5yZXR1cm47XG4gICAgICB9IHdoaWxlIChudWxsICE9PSBzb3VyY2VGaWJlcik7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgbmV4dENoaWxkcmVuLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID1cbiAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgID8gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcylcbiAgICAgICAgICA6IHJlY29uY2lsZUNoaWxkRmliZXJzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgY3VycmVudC5jaGlsZCxcbiAgICAgICAgICAgICAgbmV4dENoaWxkcmVuLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIG5leHRQcm9wcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBDb21wb25lbnQgPSBDb21wb25lbnQucmVuZGVyO1xuICAgICAgdmFyIHJlc29sdmVkUmVuZGVyID0gcmVzb2x2ZVR5cGVGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgIHJlc29sdmVkUmVuZGVyICE9PSBDb21wb25lbnQgJiZcbiAgICAgICAgKChDb21wb25lbnQgPSByZXNvbHZlZFJlbmRlciksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCkpO1xuICAgICAgcmVzb2x2ZWRSZW5kZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgICBpZiAoXCJyZWZcIiBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgdmFyIHByb3BzV2l0aG91dFJlZiA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmV4dFByb3BzKVxuICAgICAgICAgIFwicmVmXCIgIT09IGtleSAmJiAocHJvcHNXaXRob3V0UmVmW2tleV0gPSBuZXh0UHJvcHNba2V5XSk7XG4gICAgICB9IGVsc2UgcHJvcHNXaXRob3V0UmVmID0gbmV4dFByb3BzO1xuICAgICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dFByb3BzID0gcmVuZGVyV2l0aEhvb2tzKFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBwcm9wc1dpdGhvdXRSZWYsXG4gICAgICAgI
15852HJlc29sdmVkUmVuZGVyLFxuICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICAgIGtleSA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICAgICAgKTtcbiAgICAgIGlzSHlkcmF0aW5nICYmIGtleSAmJiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE7XG4gICAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBDb21wb25lbnQsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgICAhc2hvdWxkQ29uc3RydWN0KHR5cGUpICYmXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlLmRlZmF1bHRQcm9wcyAmJlxuICAgICAgICAgIG51bGwgPT09IENvbXBvbmVudC5jb21wYXJlXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKENvbXBvbmVudCA9IHJlc29sdmVUeXBlRm9ySG90UmVsb2FkaW5nKHR5cGUpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy50YWcgPSAxNSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCksXG4gICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIHR5cGUpLFxuICAgICAgICAgICAgdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIGN1cnJlbnQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gICAgICAgICAgQ29tcG9uZW50LnR5cGUsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubW9kZSxcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApO1xuICAgICAgICBjdXJyZW50LnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgdHlwZSA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICB2Y
15852XIgcHJldlByb3BzID0gdHlwZS5tZW1vaXplZFByb3BzO1xuICAgICAgICBDb21wb25lbnQgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICAgICAgQ29tcG9uZW50ID0gbnVsbCAhPT0gQ29tcG9uZW50ID8gQ29tcG9uZW50IDogc2hhbGxvd0VxdWFsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgQ29tcG9uZW50KHByZXZQcm9wcywgbmV4dFByb3BzKSAmJlxuICAgICAgICAgIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWZcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgICAgIGN1cnJlbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyh0eXBlLCBuZXh0UHJvcHMpO1xuICAgICAgY3VycmVudC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgICBjdXJyZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgbmV4dFByb3BzLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50KSB7XG4gICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmXG4gICAgICAgICAgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZVxuICAgICAgICApXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKChkaWRSZWNlaXZlVXBkYXRlID0gITEpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcyksXG4gICAgICAgICAgICBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMzEwNzIpICYmIChkaWRSZWNlaXZlVXBkYXRlID0gITApO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXMpLFxuICAgICAgICAgICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgbmV4dFByb3BzXG4gICAgKSB7XG4gICAgICB2Y
15852XIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcmV2U3RhdGUgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSB7XG4gICAgICAgICAgX3Zpc2liaWxpdHk6IE9mZnNjcmVlblZpc2libGUsXG4gICAgICAgICAgX3BlbmRpbmdNYXJrZXJzOiBudWxsLFxuICAgICAgICAgIF9yZXRyeUNhY2hlOiBudWxsLFxuICAgICAgICAgIF90cmFuc2l0aW9uczogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIGlmIChcImhpZGRlblwiID09PSBuZXh0UHJvcHMubW9kZSkge1xuICAgICAgICBpZiAoMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KSkge1xuICAgICAgICAgIHByZXZTdGF0ZSA9XG4gICAgICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIHwgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgOiByZW5kZXJMYW5lcztcbiAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCkge1xuICAgICAgICAgICAgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgICAgICAgZm9yIChuZXh0Q2hpbGRyZW4gPSAwOyBudWxsICE9PSBuZXh0UHJvcHM7IClcbiAgICAgICAgICAgICAgKG5leHRDaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgbmV4dENoaWxkcmVuIHwgbmV4dFByb3BzLmxhbmVzIHwgbmV4dFByb3BzLmNoaWxkTGFuZXMpLFxuICAgICAgICAgICAgICAgIChuZXh0UHJvcHMgPSBuZXh0UHJvcHMuc2libGluZyk7XG4gICAgICAgICAgICBuZXh0UHJvcHMgPSBuZXh0Q2hpbGRyZW4gJiB+cHJldlN0YXRlO1xuICAgICAgICAgIH0gZWxzZSAobmV4dFByb3BzID0gMCksICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGwpO1xuICAgICAgICAgIHJldHVybiBkZWZlckhpZGRlbk9mZnNjcmVlbkNvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHByZXZTdGF0ZSxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSlcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHsgYmFzZUxhbmVzOiAwLCBjYWNoZVBvb2w6IG51bGwgfSksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIHB1c2hUcmFuc2l0aW9uKFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSA/IHByZXZTdGF0ZS5jYWNoZVBvb2wgOiBudWxsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgPyBwdXNoSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlKVxuICAgICAgICAgICAgICA6IHJldXNlSGlkZGVuQ29udGV4dE9uU3RhY2sod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcHVzaE9mZnNjcmVlblN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmxhbmVzID0gNTM2ODcwOTEyKSxcbiAgICAgICAgICAgIGRlZmVySGlkZGVuT2Zmc2NyZWVuQ29tcG9uZW50KFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcHJldlN0YXRlXG4gICAgICAgICAgICAgICAgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIHwgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICA6IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICA/IChwdXNoVHJhbnNpdGlvbih3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlLmNhY2hlUG9vbCksXG4gICAgICAgICAgICBwdXNoSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlKSxcbiAgICAgICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGwpKVxuICAgICAgICAgIDogKG51bGwgIT09IGN1cnJlbnQgJiYgcHVzaFRyYW5zaXRpb24od29ya0luUHJvZ3Jlc3MsIG51bGwpLFxuICAgICAgICAgICAgcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICByZXVzZVN1c3BlbnNlSGFuZGxlck9uU3RhY2sod29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmFpbG91dE9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgMjIgPT09IGN1cnJlbnQudGFnKSB8fFxuICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgfHxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IHtcbiAgICAgICAgICBfdmlzaWJpbGl0eTogT2Zmc2NyZWVuVmlzaWJsZSxcbiAgICAgICAgICBfcGVuZGluZ01hcmtlcnM6IG51bGwsXG4gICAgICAgICAgX3JldHJ5Q2FjaGU6IG51bGwsXG4gICAgICAgICAgX3RyYW5zaXRpb25zOiBudWxsXG4gICAgICAgI
15852H0pO1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmVySGlkZGVuT2Zmc2NyZWVuQ29tcG9uZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgbmV4dEJhc2VMYW5lcyxcbiAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgcmVtYWluaW5nQ2hpbGRMYW5lc1xuICAgICkge1xuICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IHBlZWtDYWNoZUZyb21Qb29sKCk7XG4gICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICBudWxsID09PSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgcGFyZW50OiBDYWNoZUNvbnRleHQuX2N1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgcG9vbDogSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0XG4gICAgICAgICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgfTtcbiAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgcHVzaFRyYW5zaXRpb24od29ya0luUHJvZ3Jlc3MsIG51bGwpO1xuICAgICAgcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjayh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoT2Zmc2NyZWVuU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAhMCk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gcmVtYWluaW5nQ2hpbGRMYW5lcztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudEFjdGl2aXR5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcykge1xuICAgICAgdmFyIGhpZGRlblByb3AgPSBuZXh0UHJvcHMuaGlkZGVuO1xuICAgICAgdm9pZCAwICE9PSBoaWRkZW5Qcm9wICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJzxBY3Rpdml0eT4gZG9lc25cXCd0IGFjY2VwdCBhIGhpZGRlbiBwcm9wLiBVc2UgbW9kZT1cImhpZGRlblwiIGluc3RlYWQuXFxuLSA8QWN0aXZpdHkgJXM+XFxuKyA8QWN0aXZpdHkgJXM+JyxcbiAgICAgICAgICAhMCA9PT0gaGlkZGVuUHJvcFxuICAgICAgICAgICAgPyBcImhpZGRlblwiXG4gICAgICAgICAgICA6ICExID09PSBoaWRkZW5Qcm9wXG4gICAgICAgICAgICAgID8gXCJoaWRkZW49e2ZhbHNlfVwiXG4gICAgICAgICAgICAgIDogXCJoaWRkZW49ey4uLn1cIixcbiAgICAgICAgICBoaWRkZW5Qcm9wID8gJ21vZGU9XCJoaWRkZW5cIicgOiAnbW9kZT1cInZpc2libGVcIidcbiAgICAgICAgKTtcbiAgICAgIG5leHRQcm9wcyA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgeyBtb2RlOiBuZXh0UHJvcHMubW9kZSwgY2hpbGRyZW46IG5leHRQcm9wcy5jaGlsZHJlbiB9LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlXG4gICAgICApO1xuICAgICAgbmV4dFByb3BzLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzO1xuICAgICAgbmV4dFByb3BzLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmV0dXJuIG5leHRQcm9wcztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV0cnlBY3Rpdml0eUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgICAgIGN1cnJlbnQgPSBtb3VudEFjdGl2aXR5Q2hpbGRyZW4oXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHNcbiAgICAgICk7XG4gICAgICBjdXJyZW50LmZsYWdzIHw9IDI7XG4gICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQWN0aXZpdHlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gICAgICB2Y
15852XIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICBkaWRTdXNwZW5kID0gMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xMjk7XG4gICAgICBpZiAobnVsbCA9PT0gY3VycmVudCkge1xuICAgICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICBpZiAoXCJoaWRkZW5cIiA9PT0gbmV4dFByb3BzLm1vZGUpXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoY3VycmVudCA9IG1vdW50QWN0aXZpdHlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzKSksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDUzNjg3MDkxMiksXG4gICAgICAgICAgICAgIChjdXJyZW50Lm1lbW9pemVkU3RhdGUgPSB7IGJhc2VMYW5lczogMCwgY2FjaGVQb29sOiBudWxsIH0pLFxuICAgICAgICAgICAgICBiYWlsb3V0T2Zmc2NyZWVuQ29tcG9uZW50KG51bGwsIGN1cnJlbnQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHB1c2hEZWh5ZHJhdGVkQWN0aXZpdHlTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIChjdXJyZW50ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSlcbiAgICAgICAgICAgID8gKChyZW5kZXJMYW5lcyA9IGNhbkh5ZHJhdGVIeWRyYXRpb25Cb3VuZGFyeShcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiYgcmVuZGVyTGFuZXMuZGF0YSA9PT0gQUNUSVZJVFlfU1RBUlRfREFUQVxuICAgICAgICAgICAgICAgICAgPyByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKG5leHRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICAgICAgICByZXRyeUxhbmU6IDUzNjg3MDkxMixcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICAgICAobmV4dFByb3BzID0gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KHJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAgICAgKG5leHRQcm9wcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICAgICAoaHlkcmF0aW9uUGFyZW50RmliZXIgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsKSkpXG4gICAgICAgICAgICA6IChyZW5kZXJMYW5lcyA9IG51bGwpO1xuICAgICAgICAgIGlmIChudWxsID09PSByZW5kZXJMYW5lcylcbiAgICAgICAgICAgIHRocm93IChcbiAgICAgICAgICAgICAgKHdhcm5Ob25IeWRyYXRlZEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKHdvcmtJblByb2dyZXNzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSA1MzY4NzA5MTI7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vdW50QWN0aXZpdHlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBhY3Rpdml0eUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgIHB1c2hEZWh5ZHJhdGVkQWN0aXZpdHlTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBpZiAoZGlkU3VzcGVuZClcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAyNTYpXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9IHJldHJ5QWN0aXZpdHlDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgZWxzZSBpZiAobnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gbnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiQ2xpZW50IHJlbmRlcmluZyBhbiBBY3Rpdml0eSBzdXNwZW5kZWQgaXQgYWdhaW4uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICh3YXJuSWZIeWRyYXRpbmcoKSxcbiAgICAgICAgICAwICE9PSAocmVuZGVyTGFuZXMgJiA1MzY4NzA5MTIpICYmXG4gICAgICAgICAgICBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlIHx8XG4gICAgICAgICAgICBwcm9wYWdhdGVQYXJlbnRDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgI
15852HJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkU3VzcGVuZCA9IDAgIT09IChyZW5kZXJMYW5lcyAmIGN1cnJlbnQuY2hpbGRMYW5lcykpLFxuICAgICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgfHwgZGlkU3VzcGVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudCkge1xuICAgICAgICAgICAgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBudWxsICE9PSBuZXh0UHJvcHMgJiZcbiAgICAgICAgICAgICAgKChhY3Rpdml0eUluc3RhbmNlID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIDAgIT09IGFjdGl2aXR5SW5zdGFuY2UgJiZcbiAgICAgICAgICAgICAgICBhY3Rpdml0eUluc3RhbmNlICE9PSBwcmV2U3RhdGUucmV0cnlMYW5lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICAgKChwcmV2U3RhdGUucmV0cnlMYW5lID0gYWN0aXZpdHlJbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGFjdGl2aXR5SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihuZXh0UHJvcHMsIGN1cnJlbnQsIGFjdGl2aXR5SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvbilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSByZXRyeUFjdGl2aXR5Q29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgKGN1cnJlbnQgPSBwcmV2U3RhdGUudHJlZUNvbnRleHQpLFxuICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShcbiAgICAgICAgICAgICAgYWN0aXZpdHlJbnN0YW5jZS5uZXh0U2libGluZ1xuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAoaHlkcmF0aW9uUGFyZW50RmliZXIgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoaXNIeWRyYXRpbmcgPSAhMCksXG4gICAgICAgICAgICAoaHlkcmF0aW9uRXJyb3JzID0gbnVsbCksXG4gICAgICAgICAgICAoZGlkU3VzcGVuZE9yRXJyb3JERVYgPSAhMSksXG4gICAgICAgICAgICAoaHlkcmF0aW9uRGlmZlJvb3RERVYgPSBudWxsKSxcbiAgICAgICAgICAgIChyb290T3JTaW5nbGV0b25Db250ZXh0ID0gITEpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gbW91bnRBY3Rpdml0eUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMzQyMjE4MjQpO1xuICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9XG4gICAgICBwcmV2U3RhdGUgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgbmV4dFByb3BzID0geyBtb2RlOiBuZXh0UHJvcHMubW9kZSwgY2hpbGRyZW46IG5leHRQcm9wcy5jaGlsZHJlbiB9O1xuICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSAmJlxuICAgICAgICAwICE9PSAocmVuZGVyTGFuZXMgJiBjdXJyZW50LmxhbmVzKSAmJlxuICAgICAgICBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGN1cnJlbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICBjdXJyZW50LnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudDtcbiAgICAgIGN1cnJlbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgIGlmIChudWxsID09PSByZWYpXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50LnJlZiAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0ODE2KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgcmVmICYmIFwib2JqZWN0XCIgIT09IHR5cGVvZiByZWYpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIHVuZGVmaW5lZC9udWxsLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQgfHwgY3VycmVudC5yZWYgIT09IHJlZilcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0ODE2O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIG5leHRQcm9wcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8IFwiVW5rbm93blwiO1xuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSB8fFxuICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSB0byBjYXVzZSBlcnJvcnMuIENoYW5nZSAlcyB0byBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuXCIsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICksXG4gICAgICAgICAgKGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gITApKTtcbiAgICAgIH1cbiAgICAgIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmXG4gICAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgKHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSksXG4gICAgICAgIENvbXBvbmVudC5jb250ZXh0VHlwZXMgJiZcbiAgICAgICAgICAoKGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCBcIlVua25vd25cIiksXG4gICAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVzW2NvbXBvbmVudE5hbWVdIHx8XG4gICAgICAgICAgICAoKGRpZFdhcm5BYm91dENvbnRleHRUeXBlc1tjb21wb25lbnROYW1lXSA9ICEwKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggd2FzIHJlbW92ZWQgaW4gUmVhY3QgMTkuIFVzZSBSZWFjdC5jcmVhdGVDb250ZXh0KCkgd2l0aCBSZWFjdC51c2VDb250ZXh0KCkgaW5zdGVhZC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvbGVnYWN5LWNvbnRleHQpXCIsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICkpKSk7XG4gICAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBDb21wb25lbnQgPSByZW5kZXJXaXRoSG9va3MoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICAgIG5leHRQcm9wcyA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICAgICAgKTtcbiAgICAgIGlzSHlkcmF0aW5nICYmIG5leHRQcm9wcyAmJiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE7XG4gICAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcyk7XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcGxheUZ1bmN0aW9uQ29tcG9uZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgbmV4dFByb3BzLFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgc2Vjb25kQXJnLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgbmV4dFByb3BzID0gcmVuZGVyV2l0aEhvb2tzQWdhaW4oXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgc2Vjb25kQXJnXG4gICAgICApO1xuICAgICAgZmluaXNoUmVuZGVyaW5nSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgQ29tcG9uZW50ID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50ICYmICFkaWRSZWNlaXZlVXBkYXRlKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpLFxuICAgICAgICAgIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKVxuICAgICAgICApO1xuICAgICAgaXNIeWRyYXRpbmcgJiYgQ29tcG9uZW50ICYmIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBDb21wb25lbnQsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgc3dpdGNoIChzaG91bGRFcnJvckltcGwod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgIGNhc2UgITE6XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSxcbiAgICAgICAgICAgI
15852HN0YXRlID0gbmV3IHdvcmtJblByb2dyZXNzLnR5cGUoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIF9pbnN0YW5jZS5jb250ZXh0XG4gICAgICAgICAgICApLnN0YXRlO1xuICAgICAgICAgIF9pbnN0YW5jZS51cGRhdGVyLmVucXVldWVTZXRTdGF0ZShfaW5zdGFuY2UsIHN0YXRlLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAhMDpcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjg7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNjU1MzY7XG4gICAgICAgICAgX2luc3RhbmNlID0gRXJyb3IoXCJTaW11bGF0ZWQgZXJyb3IgY29taW5nIGZyb20gRGV2VG9vbHNcIik7XG4gICAgICAgICAgdmFyIGxhbmUgPSByZW5kZXJMYW5lcyAmIC1yZW5kZXJMYW5lcztcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyB8PSBsYW5lO1xuICAgICAgICAgIHN0YXRlID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICAgIGlmIChudWxsID09PSBzdGF0ZSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBsYW5lID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShsYW5lKTtcbiAgICAgICAgICBpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZShcbiAgICAgICAgICAgIGxhbmUsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoX2luc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICApO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgbGFuZSk7XG4gICAgICB9XG4gICAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKSB7XG4gICAgICAgIHN0YXRlID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgICAgICBfaW5zdGFuY2UgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgICAgIFwiY29udGV4dFR5cGVcIiBpbiBDb21wb25lbnQgJiZcbiAgICAgICAgICBudWxsICE9PSBfaW5zdGFuY2UgJiZcbiAgICAgICAgICAodm9pZCAwID09PSBfaW5zdGFuY2UgfHwgX2luc3RhbmNlLiQkdHlwZW9mICE9PSBSRUFDVF9DT05URVhUX1RZUEUpICYmXG4gICAgICAgICAgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoQ29tcG9uZW50KSAmJlxuICAgICAgICAgIChkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKENvbXBvbmVudCksXG4gICAgICAgICAgKGxhbmUgPVxuICAgICAgICAgICAgdm9pZCAwID09PSBfaW5zdGFuY2VcbiAgICAgICAgICAgICAgPyBcIiBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiBUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyB0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuXCJcbiAgICAgICAgICAgICAgOiBcIm9iamVjdFwiICE9PSB0eXBlb2YgX2luc3RhbmNlXG4gICAgICAgICAgICAgICAgPyBcIiBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSBcIiArIHR5cGVvZiBfaW5zdGFuY2UgKyBcIi5cIlxuICAgICAgICAgICAgICAgIDogX2luc3RhbmNlLiQkdHlwZW9mID09PSBSRUFDVF9DT05TVU1FUl9UWVBFXG4gICAgICAgICAgICAgICAgICA/IFwiIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD9cIlxuICAgICAgICAgICAgICAgICAgOiBcIiBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7XCIgK1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfaW5zdGFuY2UpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgICAgIFwifS5cIiksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiBjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lc1wiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJDb21wb25lbnRcIixcbiAgICAgICAgICAgIGxhbmVcbiAgICAgICAgICApKTtcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIF9pbnN0YW5jZSAmJlxuICAgICAgICAgIG51bGwgIT09IF9pbnN0YW5jZSAmJlxuICAgICAgICAgIChzdGF0ZSA9IHJlYWRDb250ZXh0KF9pbnN0YW5jZSkpO1xuICAgICAgICBfaW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50KG5leHRQcm9wcywgc3RhdGUpO1xuICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBDb21wb25lbnQobmV4dFByb3BzLCBzdGF0ZSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID1cbiAgICAgICAgICBudWxsICE9PSBfaW5zdGFuY2Uuc3RhdGUgJiYgdm9pZCAwICE9PSBfaW5zdGFuY2Uuc3RhdGVcbiAgICAgICAgICAgID8gX2luc3RhbmNlLnN0YXRlXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIF9pbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBfaW5zdGFuY2U7XG4gICAgICAgIF9pbnN0YW5jZS5fcmVhY3RJb
15852nRlcm5hbHMgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgX2luc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAmJlxuICAgICAgICAgIG51bGwgPT09IHN0YXRlICYmXG4gICAgICAgICAgKChzdGF0ZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8IFwiQ29tcG9uZW50XCIpLFxuICAgICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoc3RhdGUpIHx8XG4gICAgICAgICAgICAoZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChzdGF0ZSksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcImAlc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJXMuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLiBJbnN0ZWFkLCBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgYnkgYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuIFRoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS5cIixcbiAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgIG51bGwgPT09IF9pbnN0YW5jZS5zdGF0ZSA/IFwibnVsbFwiIDogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgfHxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAobGFuZSA9IHN0YXRlID0gbnVsbCk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICEwICE9PSBfaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICAgID8gKHN0YXRlID0gXCJjb21wb25lbnRXaWxsTW91bnRcIilcbiAgICAgICAgICAgIDogXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgKHN0YXRlID0gXCJVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50XCIpO1xuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmXG4gICAgICAgICAgITAgIT09XG4gICAgICAgICAgICBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nXG4gICAgICAgICAgICA/IChsYW5lID0gXCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIpXG4gICAgICAgICAgICA6IFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgICAgICAgICB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmXG4gICAgICAgICAgICAgIChsYW5lID0gXCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1wiKTtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICEwICE9PSBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nXG4gICAgICAgICAgICA/IChmb3VuZFdpbGxVcGRhdGVOYW1lID0gXCJjb21wb25lbnRXaWxsVXBkYXRlXCIpXG4gICAgICAgICAgICA6IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAoZm91bmRXaWxsVXBkYXRlTmFtZSA9IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVcIik7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHN0YXRlIHx8IG51bGwgIT09IGxhbmUgfHwgbnVsbCAhPT0gZm91bmRXaWxsVXBkYXRlTmFtZSkge1xuICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJDb21wb25lbnRcIjtcbiAgICAgICAgICAgIHZhciBuZXdBcGlOYW1lID1cbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuICAgICAgICAgICAgICAgID8gXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKVwiXG4gICAgICAgICAgICAgICAgOiBcImdldFNuYXBzaG90QmVmb3JlVXBkYXRlKClcIjtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuaGFzKF9pbnN0YW5jZSkgfHxcbiAgICAgICAgICAgICAgKGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuYWRkKF9pbnN0YW5jZSksXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4lcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuaHR0cHM6Ly9yZWFjdC5kZXYvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXNcIixcbiAgICAgICAgICAgICAgICBfaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgbmV3QXBpTmFtZSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBzdGF0ZSA/IFwiXFxuICBcIiArIHN0YXRlIDogXCJcIixcbiAgICAgICAgICAgICAgICBudWxsICE9PSBsYW5lID8gXCJcXG4gIFwiICsgbGFuZSA6
15852IFwiXCIsXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gZm91bmRXaWxsVXBkYXRlTmFtZSA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiBcIlwiXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHN0YXRlID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJDb21wb25lbnRcIjtcbiAgICAgICAgX2luc3RhbmNlLnJlbmRlciB8fFxuICAgICAgICAgIChDb21wb25lbnQucHJvdG90eXBlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJcbiAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIk5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgJXMgaW5zdGFuY2U6IGRpZCB5b3UgYWNjaWRlbnRhbGx5IHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY29uc3RydWN0b3I/XCIsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIFwiTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSAlcyBpbnN0YW5jZTogeW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBkZWZpbmUgYHJlbmRlcmAuXCIsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICFfaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlIHx8XG4gICAgICAgICAgX2luc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCB8fFxuICAgICAgICAgIF9pbnN0YW5jZS5zdGF0ZSB8fFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcImdldEluaXRpYWxTdGF0ZSB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuIERpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkP1wiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBfaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzICYmXG4gICAgICAgICAgIV9pbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBfaW5zdGFuY2UuY29udGV4dFR5cGUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZSBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMgJiZcbiAgICAgICAgICAhZGlkV2FybkFib3V0Q2hpbGRDb250ZXh0VHlwZXMuaGFzKENvbXBvbmVudCkgJiZcbiAgICAgICAgICAoZGlkV2FybkFib3V0Q2hpbGRDb250ZXh0VHlwZXMuYWRkKENvbXBvbmVudCksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgdXNlcyB0aGUgbGVnYWN5IGNoaWxkQ29udGV4dFR5cGVzIEFQSSB3aGljaCB3YXMgcmVtb3ZlZCBpbiBSZWFjdCAxOS4gVXNlIFJlYWN0LmNyZWF0ZUNvbnRleHQoKSBpbnN0ZWFkLiAoaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9sZWdhY3ktY29udGV4dClcIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKSk7XG4gICAgICAgIENvbXBvbmVudC5jb250ZXh0VHlwZXMgJiZcbiAgICAgICAgICAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVzJDEuaGFzKENvbXBvbmVudCkgJiZcbiAgICAgICAgICAoZGlkV2FybkFib3V0Q29udGV4dFR5cGVzJDEuYWRkKENvbXBvbmVudCksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggd2FzIHJlbW92ZWQgaW4gUmVhY3QgMTkuIFVzZSBSZWFjdC5jcmVhdGVDb250ZXh0KCkgd2l0aCBzdGF0aWMgY29udGV4dFR5cGUgaW5zdGVhZC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvbGVnYWN5LWNvbnRleHQpXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICkpO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyBUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUgJiZcbiAgICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlcyBoYXMgYSBtZXRob2QgY2FsbGVkIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpLiBzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuIFBsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLlwiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJBIHB1cmUgY29tcG9uZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzIGhhcyBhIG
158521ldGhvZCBjYWxsZWQgY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT9cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuIElmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCB1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciBydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS5cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlcyBoYXMgYSBtZXRob2QgY2FsbGVkIGNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT9cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT9cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgbGFuZSA9IF9pbnN0YW5jZS5wcm9wcyAhPT0gbm
15852V4dFByb3BzO1xuICAgICAgICB2b2lkIDAgIT09IF9pbnN0YW5jZS5wcm9wcyAmJlxuICAgICAgICAgIGxhbmUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyB1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgX2luc3RhbmNlLmRlZmF1bHRQcm9wcyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlNldHRpbmcgZGVmYXVsdFByb3BzIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy5cIixcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgfHxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlIHx8XG4gICAgICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhDb21wb25lbnQpIHx8XG4gICAgICAgICAgKGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoQ29tcG9uZW50KSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiBUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS5cIixcbiAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpXG4gICAgICAgICAgKSk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBh
15852IHN0YXRpYyBtZXRob2QuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIENvbXBvbmVudC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kIGFuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLlwiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICAobGFuZSA9IF9pbnN0YW5jZS5zdGF0ZSkgJiZcbiAgICAgICAgICAoXCJvYmplY3RcIiAhPT0gdHlwZW9mIGxhbmUgfHwgaXNBcnJheUltcGwobGFuZSkpICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIiVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbFwiLCBzdGF0ZSk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgJiZcbiAgICAgICAgICBcIm9iamVjdFwiICE9PSB0eXBlb2YgQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgX2luc3RhbmNlLnByb3BzID0gbmV4dFByb3BzO1xuICAgICAgICBfaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfaW5zdGFuY2UucmVmcyA9IHt9O1xuICAgICAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBzdGF0ZSA9IENvbXBvbmVudC5jb250ZXh0VHlwZTtcbiAgICAgICAgX2luc3RhbmNlLmNvbnRleHQgPVxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBzdGF0ZSAmJiBudWxsICE9PSBzdGF0ZVxuICAgICAgICAgICAgPyByZWFkQ29udGV4dChzdGF0ZSlcbiAgICAgICAgICAgIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgICAgICBfaW5zdGFuY2Uuc3RhdGUgPT09IG5leHRQcm9wcyAmJlxuICAgICAgICAgICgoc3RhdGUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCBcIkNvbXBvbmVudFwiKSxcbiAgICAgICAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoc3RhdGUpIHx8XG4gICAgICAgICAgICAoZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKHN0YXRlKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS5cIixcbiAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiZcbiAgICAgICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyhcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgX2luc3RhbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MoXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgX2luc3RhbmNlXG4gICAgICAgICk7XG4gICAgICAgIF9pbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIHN0YXRlID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygc3RhdGUgJiZcbiAgICAgICAgICAoYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoX2luc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkpO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIHx8XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIHx8XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB8fFxuICAgICAgICAgICgoc3RhdGUgPSBfaW5zdGFuY2Uuc3RhdGUpLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKSxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICAgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSxcbiAgICAgICAgICBzdGF0ZSAhPT0gX2luc3RhbmNlLnN0YXRlICYmXG4gICAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCIlcy5jb21wb25lbnRXaWxsTW91bnQoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvIHRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuXCIsXG4gICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8IFwiQ29tcG9uZW50XCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlLFxuICAgICAgICAgICAgICBfaW5zdGFuY2Uuc3RhdGUsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgI
15852HByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBfaW5zdGFuY2UsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICBzdXNwZW5kSWZVcGRhdGVSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uKCksXG4gICAgICAgICAgKF9pbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQxOTQzMDgpO1xuICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDI2ODQzNTQ1Nik7XG4gICAgICAgIF9pbnN0YW5jZSA9ICEwO1xuICAgICAgfSBlbHNlIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgICAgIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRPbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gICAgICAgIGxhbmUgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gICAgICAgIF9pbnN0YW5jZS5wcm9wcyA9IGxhbmU7XG4gICAgICAgIHZhciBvbGRDb250ZXh0ID0gX2luc3RhbmNlLmNvbnRleHQ7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgICAgIHN0YXRlID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgZm91bmRXaWxsVXBkYXRlTmFtZSAmJlxuICAgICAgICAgIG51bGwgIT09IGZvdW5kV2lsbFVwZGF0ZU5hbWUgJiZcbiAgICAgICAgICAoc3RhdGUgPSByZWFkQ29udGV4dChmb3VuZFdpbGxVcGRhdGVOYW1lKSk7XG4gICAgICAgIG5ld0FwaU5hbWUgPSBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID1cbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdBcGlOYW1lIHx8XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuICAgICAgICB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgIT09IHVucmVzb2x2ZWRPbGRQcm9wcztcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSB8fFxuICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgJiZcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB8fFxuICAgICAgICAgICgodW5yZXNvbHZlZE9sZFByb3BzIHx8IG9sZENvbnRleHQgIT09IHN0YXRlKSAmJlxuICAgICAgICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBfaW5zdGFuY2UsXG4gICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICkpO1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgICAgICB2Y
15852XIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgICAgICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIF9pbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBzdXNwZW5kSWZVcGRhdGVSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uKCk7XG4gICAgICAgIG9sZENvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB1bnJlc29sdmVkT2xkUHJvcHMgfHwgb2xkU3RhdGUgIT09IG9sZENvbnRleHQgfHwgaGFzRm9yY2VVcGRhdGVcbiAgICAgICAgICA/IChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdBcGlOYW1lICYmXG4gICAgICAgICAgICAgIChhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyhcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgbmV3QXBpTmFtZSxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKG9sZENvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKSksXG4gICAgICAgICAgICAobGFuZSA9XG4gICAgICAgICAgICAgIGhhc0ZvcmNlVXBkYXRlIHx8XG4gICAgICAgICAgICAgIGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBsYW5lLFxuICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICBvbGRTdGF0ZSxcbiAgICAgICAgICAgICAgICBvbGRDb250ZXh0LFxuICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgID8gKGZvdW5kV2lsbFVwZGF0ZU5hbWUgfHxcbiAgICAgICAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB8fFxuICAgICAgICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpLFxuICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ICYmXG4gICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwOCksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDI2ODQzNTQ1NikpXG4gICAgICAgICAgICAgIDogKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQxOTQzMDgpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyNjg0MzU0NTYpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG9sZENvbnRleHQpKSxcbiAgICAgICAgICAgIChfaW5zdGFuY2UucHJvcHMgPSBuZXh0UHJvcHMpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5zdGF0ZSA9IG9sZENvbnRleHQpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5jb250ZXh0ID0gc3RhdGUpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZSA9IGxhbmUpKVxuICAgICAgICAgIDogKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwOCksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyNjg0MzU0NTYpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZSA9ICExKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhDb21wb25lbnQsIHN0YXRlKTtcbiAgICAgICAgX2luc3RhbmNlLnByb3BzID0gZm91bmRXaWxsVXBkYXRlTmFtZTtcbiAgICAgICAgbmV3QXBpTmFtZSA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgb2xkU3RhdGUgPSBfaW5zdGFuY2UuY29udGV4dDtcbiAgICAgICAgb2xkQ29udGV4dCA9IENvbXBvbmVudC5jb250ZXh0VHlwZTtcbiAgICAgICAgbGFuZSA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9sZENvbnRleHQgJiZcbiAgICAgICAgICBudWxsICE9PSBvbGRDb250ZXh0ICYmXG4gICAgICAgICAgKGxhbmUgPSByZWFkQ29udGV4dChvbGRDb250ZXh0KSk7XG4gICAgICAgI
15852HVucmVzb2x2ZWRPbGRQcm9wcyA9IENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gICAgICAgIChvbGRDb250ZXh0ID1cbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB1bnJlc29sdmVkT2xkUHJvcHMgfHxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpIHx8XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHx8XG4gICAgICAgICAgKChzdGF0ZSAhPT0gbmV3QXBpTmFtZSB8fCBvbGRTdGF0ZSAhPT0gbGFuZSkgJiZcbiAgICAgICAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgX2luc3RhbmNlLFxuICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgIGxhbmVcbiAgICAgICAgICAgICkpO1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgICAgICBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIF9pbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgX2luc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgc3RhdGUgIT09IG5ld0FwaU5hbWUgfHxcbiAgICAgICAgb2xkU3RhdGUgIT09IG5ld1N0YXRlIHx8XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlIHx8XG4gICAgICAgIChudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5kZXBlbmRlbmNpZXMgJiZcbiAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudC5kZXBlbmRlbmNpZXMpKVxuICAgICAgICAgID8gKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVucmVzb2x2ZWRPbGRQcm9wcyAmJlxuICAgICAgICAgICAgICAoYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRPbGRQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkpLFxuICAgICAgICAgICAgKGZvdW5kV2lsbFVwZGF0ZU5hbWUgPVxuICAgICAgICAgICAgICBoYXNGb3JjZVVwZGF0ZSB8fFxuICAgICAgICAgICAgICBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgb2xkU3RhdGUsXG4gICAgICAgICAgICAgICAgbmV3U3RhdGUsXG4gICAgICAgICAgICAgICAgbGFuZVxuICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgIChudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5kZXBlbmRlbmNpZXMgJiZcbiAgICAgICAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudC5kZXBlbmRlbmNpZXMpKSlcbiAgICAgICAgICAgICAgPyAob2xkQ29udGV4dCB8fFxuICAgICAgICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5ld1N0YXRlLCBsYW5lKSxcbiAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGxhbmVcbiAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpLFxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEwMjQpKVxuICAgICAgICAgICAgICA6IChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlIHx8XG4gICAgICAgICAgICAgICAgICAoc3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgICAgICBvbGRTdGF0ZSA9PT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpLFxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgKHN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgJiZcbiAgICAgICAgICAgICAgICAgICAgb2xkU3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZSkpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5wcm9wcyA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICAoX2luc3RhbmNlLnN0YXRlID0gbmV3U3RhdGUpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5jb250ZXh0ID0gbGFuZSksXG4gICAgICAgICAgICAoX2luc3RhbmNlID0gZm91bmRXaWxsVXBkYXRlTmFtZSkpXG4gICAgICAgICAgOiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSB8fFxuICAgICAgICAgICAgICAoc3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHx8XG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSB8fFxuICAgICAgICAgICAgICAoc3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHx8XG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgICAgIChfaW5zdGFuY2UgPSAhMSkpO1xuICAgICAgfVxuICAgICAgbGFuZSA9IF9pbnN0YW5jZTtcbiAgICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgc3RhdGUgPSAwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpO1xuICAgICAgaWYgKGxhbmUgfHwgc3RhdGUpIHtcbiAgICAgICAgbGFuZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgaWYgKHN0YXRlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IpXG4gICAgICAgICAgKENvbXBvbmVudCA9IG51bGwpLCAocHJvZmlsZXJTdGFydFRpbWUgPSAtMSk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICgoQ29tcG9uZW50ID0gY2FsbFJlbmRlckluREVWKGxhbmUpKSxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgICBjYWxsUmVuZGVySW5ERVYobGFuZSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiBzdGF0ZVxuICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgY3VycmVudC5jaGlsZCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApKSlcbiAgICAgICAgICA6IHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGxhbmUuc3RhdGU7XG4gICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBjdXJyZW50ID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICk7XG4gICAgICByZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIF9pbnN0YW5jZSAmJlxuICAgICAgICByZW5kZXJMYW5lcy5wcm9wcyAhPT0gbm
15852V4dFByb3BzICYmXG4gICAgICAgIChkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzIHx8XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgY2FuIGxlYWQgdG8gY29uZnVzaW5nIGJ1Z3MuXCIsXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCBcImEgY29tcG9uZW50XCJcbiAgICAgICAgICApLFxuICAgICAgICAoZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9ICEwKSk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBuZXh0Q2hpbGRyZW4sXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMjU2O1xuICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCkge1xuICAgICAgQ29tcG9uZW50ICYmXG4gICAgICAgIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiY2hpbGRDb250ZXh0VHlwZXMgY2Fubm90IGJlIGRlZmluZWQgb24gYSBmdW5jdGlvbiBjb21wb25lbnQuXFxuICAlcy5jaGlsZENvbnRleHRUeXBlcyA9IC4uLlwiLFxuICAgICAgICAgIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICk7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICYmXG4gICAgICAgICgod29ya0luUHJvZ3Jlc3MgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCBcIlVua25vd25cIiksXG4gICAgICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbd29ya0luUHJvZ3Jlc3NdIHx8XG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy5cIixcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFt3b3JrSW5Qcm9ncmVzc10gPVxuICAgICAgICAgICAgITApKSk7XG4gICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgQ29tcG9uZW50LmNvbnRleHRUeXBlICYmXG4gICAgICAgIG51bGwgIT09IENvbXBvbmVudC5jb250ZXh0VHlwZSAmJlxuICAgICAgICAoKENvbXBvbmVudCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8IFwiVW5rbm93blwiKSxcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W0NvbXBvbmVudF0gfHxcbiAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuXCIsXG4gICAgICAgICAgICBDb21wb25lbnRcbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbQ29tcG9uZW50XSA9ICEwKSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIHtcbiAgICAgIHJldHVybiB7IGJhc2VMYW5lczogcmVuZGVyTGFuZXMsIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwcmltYXJ5VHJlZURpZERlZmVyLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIGN1cnJlbnQgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5jaGlsZExhbmVzICYgfnJlbmRlckxhbmVzIDogMDtcbiAgICAgIHByaW1hcnlUcmVlRGlkRGVmZXIgJiYgKGN1cnJlbnQgfD0gd29ya0luUHJvZ3Jlc3NEZWZlcnJlZExhbmUpO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAgICAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgIHNob3VsZFN1c3BlbmRJbXBsKHdvcmtJblByb2dyZXNzKSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KTtcbiAgICAgIHZhciBzaG93RmFsbGJhY2sgPSAhMSxcbiAgICAgICAgZGlkU3VzcGVuZCA9IDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCksXG4gICAgICAgIEpTQ29tcGlsZXJfdGVtcDtcbiAgICAgIChKU0NvbXBpbGVyX3RlbXAgPSBkaWRTdXNwZW5kKSB8fFxuICAgICAgICAoSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIG51bGwgPT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgPyAhMVxuICAgICAgICAgICAgOiAwICE9PSAoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50ICYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSk7XG4gICAgICBKU0NvbXBpbGVyX3RlbXAgJiYgKChzaG93RmFsbGJhY2sgPSAhMCksICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMTI5KSk7XG4gICAgICBKU0NvbXBpbGVyX3RlbXAgPSAwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAzMik7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMzM7XG4gICAgICBpZiAobnVsbCA9PT0gY3VycmVudCkge1xuICAgICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICBzaG93RmFsbGJhY2tcbiAgICAgICAgICAgID8gcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgOiByZXVzZVN1c3BlbnNlSGFuZGxlck9uU3RhY2sod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIChjdXJyZW50ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSlcbiAgICAgICAgICAgID8gKChyZW5kZXJMYW5lcyA9IGNhbkh5ZHJhdGVIeWRyYXRpb25Cb3VuZGFyeShcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgI
15852HJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiYgcmVuZGVyTGFuZXMuZGF0YSAhPT0gQUNUSVZJVFlfU1RBUlRfREFUQVxuICAgICAgICAgICAgICAgICAgPyByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKEpTQ29tcGlsZXJfdGVtcCA9IHtcbiAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICAgICAgICByZXRyeUxhbmU6IDUzNjg3MDkxMixcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gSlNDb21waWxlcl90ZW1wKSxcbiAgICAgICAgICAgICAgICAoSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChyZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgICAgIChKU0NvbXBpbGVyX3RlbXAucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IEpTQ29tcGlsZXJfdGVtcCksXG4gICAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbCkpKVxuICAgICAgICAgICAgOiAocmVuZGVyTGFuZXMgPSBudWxsKTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gcmVuZGVyTGFuZXMpXG4gICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICh3YXJuTm9uSHlkcmF0ZWRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCksXG4gICAgICAgICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCh3b3JrSW5Qcm9ncmVzcykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHJlbmRlckxhbmVzKVxuICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MubGFuZXMgPSAzMilcbiAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLmxhbmVzID0gNTM2ODcwOTEyKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkaWRTdXNwZW5kID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgICBuZXh0UHJvcHMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIGlmIChzaG93RmFsbGJhY2spXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gd29ya0luUHJvZ3Jlc3MubW9kZSksXG4gICAgICAgICAgICAoZGlkU3VzcGVuZCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgICAgICAgeyBtb2RlOiBcImhpZGRlblwiLCBjaGlsZHJlbjogZGlkU3VzcGVuZCB9LFxuICAgICAgICAgICAgICBzaG93RmFsbGJhY2tcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgIHNob3dGYWxsYmFjayxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKGRpZFN1c3BlbmQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKG5leHRQcm9wcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoZGlkU3VzcGVuZC5zaWJsaW5nID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGRpZFN1c3BlbmQpLFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgIChuZXh0UHJvcHMubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgICAgICAgIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgKG5leHRQcm9wcy5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSKSxcbiAgICAgICAgICAgIGJhaWxvdXRPZmZzY3JlZW5Db21wb25lbnQobnVsbCwgbmV4dFByb3BzKVxuICAgICAgICAgICk7XG4gICAgICAgIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBfZGVoeWRyYXRlZDIgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgaWYgKG51bGwgIT09IF9kZWh5ZHJhdGVkMilcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgZGlkU3VzcGVuZCxcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgIF9kZWh5ZHJhdGVkMixcbiAgICAgICAgICAgIHByZXZTdGF0ZSxcbiAgICAgICAgICAgI
15852HJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG93RmFsbGJhY2spXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcmV1c2VTdXNwZW5zZUhhbmRsZXJPblN0YWNrKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gbmV4dFByb3BzLmZhbGxiYWNrKSxcbiAgICAgICAgICAoZGlkU3VzcGVuZCA9IHdvcmtJblByb2dyZXNzLm1vZGUpLFxuICAgICAgICAgIChwcmV2U3RhdGUgPSBjdXJyZW50LmNoaWxkKSxcbiAgICAgICAgICAoX2RlaHlkcmF0ZWQyID0gcHJldlN0YXRlLnNpYmxpbmcpLFxuICAgICAgICAgIChuZXh0UHJvcHMgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhwcmV2U3RhdGUsIHtcbiAgICAgICAgICAgIG1vZGU6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIChuZXh0UHJvcHMuc3VidHJlZUZsYWdzID0gcHJldlN0YXRlLnN1YnRyZWVGbGFncyAmIDEyMDY5MTA5NzYpLFxuICAgICAgICAgIG51bGwgIT09IF9kZWh5ZHJhdGVkMlxuICAgICAgICAgICAgPyAoc2hvd0ZhbGxiYWNrID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoX2RlaHlkcmF0ZWQyLCBzaG93RmFsbGJhY2spKVxuICAgICAgICAgICAgOiAoKHNob3dGYWxsYmFjayA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgIHNob3dGYWxsYmFjayxcbiAgICAgICAgICAgICAgICBkaWRTdXNwZW5kLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChzaG93RmFsbGJhY2suZmxhZ3MgfD0gMikpLFxuICAgICAgICAgIChzaG93RmFsbGJhY2sucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgIChuZXh0UHJvcHMucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgIChuZXh0UHJvcHMuc2libGluZyA9IHNob3dGYWxsYmFjayksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzKSxcbiAgICAgICAgICBiYWlsb3V0T2Zmc2NyZWVuQ29tcG9uZW50KG51bGwsIG5leHRQcm9wcyksXG4gICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICBudWxsID09PSBzaG93RmFsbGJhY2tcbiAgICAgICAgICAgID8gKHNob3dGYWxsYmFjayA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykpXG4gICAgICAgICAgICA6ICgoZGlkU3VzcGVuZCA9IHNob3dGYWxsYmFjay5jYWNoZVBvb2wpLFxuICAgICAgICAgICAgICBudWxsICE9PSBkaWRTdXNwZW5kXG4gICAgICAgICAgICAgICAgPyAoKHByZXZTdGF0ZSA9IENhY2hlQ29udGV4dC5fY3VycmVudFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgIChkaWRTdXNwZW5kID1cbiAgICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZC5wYXJlbnQgIT09IHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgID8geyBwYXJlbnQ6IHByZXZTdGF0ZSwgcG9vbDogcHJldlN0YXRlIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IGRpZFN1c3BlbmQpKVxuICAgICAgICAgICAgICAgIDogKGRpZFN1c3BlbmQgPSBnZXRTdXNwZW5kZWRDYWNoZSgpKSxcbiAgICAgICAgICAgICAgKHNob3dGYWxsYmFjayA9IHtcbiAgICAgICAgICAgICAgICBiYXNlTGFuZXM6IHNob3dGYWxsYmFjay5iYXNlTGFuZXMgfCByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICBjYWNoZVBvb2w6IGRpZFN1c3BlbmRcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIChuZXh0UHJvcHMubWVtb2l6ZWRTdGF0ZSA9IHNob3dGYWxsYmFjayksXG4gICAgICAgICAgKG5leHRQcm9wcy5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgSlNDb21waWxlcl90ZW1wLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVIpLFxuICAgICAgICAgIGJhaWxvdXRPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudC5jaGlsZCwgbmV4dFByb3BzKVxuICAgICAgICApO1xuICAgICAgbnVsbCAhPT0gcHJldlN0YXRlICYmXG4gICAgICAgIChyZW5kZXJMYW5lcyAmIDYyOTE0NTYwKSA9PT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgY3VycmVudC5sYW5lcykgJiZcbiAgICAgICAgbWFya1JlbmRlckRlcml2ZWRDYXVzZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmVuZGVyTGFuZXMgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgY3VycmVudCA9IHJlbmRlckxhbmVzLnNpYmxpbmc7XG4gICAgICByZW5kZXJMYW5lcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJlbmRlckxhbmVzLCB7XG4gICAgICAgIG1vZGU6IFwidmlzaWJsZVwiLFxuICAgICAgICBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICB9KTtcbiAgICAgIHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmVuZGVyTGFuZXMuc2libGluZyA9IG51bGw7XG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zKSxcbiAgICAgICAgbnVsbCA9PT0gSlNDb21waWxlcl90ZW1wXG4gICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50XSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTYpKVxuICAgICAgICAgIDogSlNDb21waWxlcl90ZW1wLnB1c2goY3VycmVudCkpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJMYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIHJlbmRlckxhbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pIHtcbiAgICAgIHByaW1hcnlDaGlsZHJlbiA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgeyBtb2RlOiBcInZpc2libGVcIiwgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlbiB9LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlXG4gICAgICApO1xuICAgICAgcHJpbWFyeUNoaWxkcmVuLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSkge1xuICAgICAgb2Zmc2NyZWVuUHJvcHMgP
15852SBjcmVhdGVGaWJlcigyMiwgb2Zmc2NyZWVuUHJvcHMsIG51bGwsIG1vZGUpO1xuICAgICAgb2Zmc2NyZWVuUHJvcHMubGFuZXMgPSAwO1xuICAgICAgcmV0dXJuIG9mZnNjcmVlblByb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICAgICAgY3VycmVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW5cbiAgICAgICk7XG4gICAgICBjdXJyZW50LmZsYWdzIHw9IDI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBkaWRTdXNwZW5kLFxuICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICBzdXNwZW5zZUluc3RhbmNlLFxuICAgICAgc3VzcGVuc2VTdGF0ZSxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAyNTYpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBmYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrLFxuICAgICAgICAgIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGUsXG4gICAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoXG4gICAgICAgICAgICB7IG1vZGU6IFwidmlzaWJsZVwiLCBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuIH0sXG4gICAgICAgICAgICBmaWJlck1vZGVcbiAgICAgICAgICApO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgICAgZmFsbGJhY2tDaGlsZHJlbixcbiAgICAgICAgICBmaWJlck1vZGUsXG4gICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuLmZsYWdzIHw9IDI7XG4gICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZHJlbjtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgZmFsbGJhY2tDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuLm1lbW9pemVkU3RhdGUgPVxuICAgICAgICAgIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICAgIGZhbGxiYWNrQ2hpbGRyZW4uY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIsXG4gICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T2Zmc2NyZWVuQ29tcG9uZW50KG51bGwsIGZhbGxiYWNrQ2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdhcm5JZkh5ZHJhdGluZygpO1xuICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSAmJiBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgICBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlciA9XG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZyAmJiBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gICAgICAgIGlmIChkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlcikge1xuICAgICAgICAgIGZhbGxiYWNrQ2hpbGRyZW4gPSBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlci5kZ3N0O1xuICAgICAgICAgI
15852HZhciBtZXNzYWdlID0gZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIubXNnO1xuICAgICAgICAgIGZpYmVyTW9kZSA9IGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLnN0Y2s7XG4gICAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlci5jc3RjaztcbiAgICAgICAgfVxuICAgICAgICBzdXNwZW5zZUluc3RhbmNlID0gbWVzc2FnZTtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGZhbGxiYWNrQ2hpbGRyZW47XG4gICAgICAgIG5leHRQcm9wcyA9IGZpYmVyTW9kZTtcbiAgICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgICAgZmFsbGJhY2tDaGlsZHJlbiA9IHN1c3BlbnNlU3RhdGU7XG4gICAgICAgIGZpYmVyTW9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7XG4gICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbmV4dFByb3BzO1xuICAgICAgICBuZXh0UHJvcHMgPSBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlcjtcbiAgICAgICAgZmFsbGJhY2tDaGlsZHJlbiAhPT0gUkVBQ1RfUkVDT1ZFUkFCTEVfRElHRVNUICYmXG4gICAgICAgICAgKChkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlciA9IGZpYmVyTW9kZVxuICAgICAgICAgICAgPyBFcnJvcihmaWJlck1vZGUpXG4gICAgICAgICAgICA6IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhlIHNlcnZlciBjb3VsZCBub3QgZmluaXNoIHRoaXMgU3VzcGVuc2UgYm91bmRhcnksIGxpa2VseSBkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuXCJcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgKGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLnN0YWNrID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQgfHwgXCJcIiksXG4gICAgICAgICAgKGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLmRpZ2VzdCA9IGZhbGxiYWNrQ2hpbGRyZW4pLFxuICAgICAgICAgIChmYWxsYmFja0NoaWxkcmVuID0gdm9pZCAwID09PSBuZXh0UHJvcHMgPyBudWxsIDogbmV4dFByb3BzKSxcbiAgICAgICAgICAoZmliZXJNb2RlID0ge1xuICAgICAgICAgICAgdmFsdWU6IGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLFxuICAgICAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICAgICAgc3RhY2s6IGZhbGxiYWNrQ2hpbGRyZW5cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZmFsbGJhY2tDaGlsZHJlbiAmJlxuICAgICAgICAgICAgQ2FwdHVyZWRTdGFja3Muc2V0KGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLCBmaWJlck1vZGUpLFxuICAgICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoZmliZXJNb2RlKSk7XG4gICAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlIHx8XG4gICAgICAgIHByb3BhZ2F0ZVBhcmVudENvbnRleHRDaGFuZ2VzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgITEpO1xuICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIgPSAwICE9PSAocmVuZGVyTGFuZXMgJiBjdXJyZW50LmNoaWxkTGFuZXMpO1xuICAgICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudClcbiAgICAgICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgIGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbnVsbCAhPT0gZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIgJiZcbiAgICAgICAgICAoKGZhbGxiYWNrQ2hpbGRyZW4gPSBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKFxuICAgICAgICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICkpLFxuICAgICAgICAgIDAgIT09IGZhbGxiYWNrQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgIGZhbGxiYWNrQ2hpbGRyZW4gIT09IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lKVxuICAgICAgICApXG4gICAgICAgICAgdGhyb3cgKFxuICAgICAgICAgICAgKChzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGZhbGxiYWNrQ2hpbGRyZW4pLFxuICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGZhbGxiYWNrQ2hpbGRyZW4pLFxuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKFxuICAgICAgICAgICAgICBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlcixcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgZmFsbGJhY2tDaGlsZHJlblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvbilcbiAgICAgICAgICApO1xuICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpIHx8XG4gICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoc3VzcGVuc2VJbnN0YW5jZSkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE5MiksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZCksXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgY3VycmVudCA9IHN1c3BlbnNlU3RhdGUudHJlZUNvbnRleHQ7XG4gICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZyk7XG4gICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgaXNIeWRyYXRpbmcgPSAhMDtcbiAgICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9ICExO1xuICAgICAgaHlkcmF0aW9uRGlmZlJvb3RERVYgPSBudWxsO1xuICAgICAgcm9vdE9yU2luZ2xldG9uQ29udGV4dCA9ICExO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICApO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTM0MjIxODI0O1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJiAoYWx0ZXJuYXRlLmxhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoXG4gICAgICAgIGZpYmVyLnJldHVybixcbiAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgI
15852HByb3BhZ2F0aW9uUm9vdFxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgICAgIGZvciAodmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDsgbnVsbCAhPT0gZmlyc3RDaGlsZDsgKSB7XG4gICAgICAgIHZhciBjdXJyZW50Um93ID0gZmlyc3RDaGlsZC5hbHRlcm5hdGU7XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRSb3cgJiZcbiAgICAgICAgICBudWxsID09PSBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgJiZcbiAgICAgICAgICAobGFzdENvbnRlbnRSb3cgPSBmaXJzdENoaWxkKTtcbiAgICAgICAgZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXN0Q29udGVudFJvdztcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBpc0JhY2t3YXJkcyxcbiAgICAgIHRhaWwsXG4gICAgICBsYXN0Q29udGVudFJvdyxcbiAgICAgIHRhaWxNb2RlLFxuICAgICAgdHJlZUZvcmtDb3VudFxuICAgICkge1xuICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIG51bGwgPT09IHJlbmRlclN0YXRlXG4gICAgICAgID8gKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICAgICAgICBpc0JhY2t3YXJkczogaXNCYWNrd2FyZHMsXG4gICAgICAgICAgICByZW5kZXJpbmc6IG51bGwsXG4gICAgICAgICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICAgICAgICBsYXN0OiBsYXN0Q29udGVudFJvdyxcbiAgICAgICAgICAgIHRhaWw6IHRhaWwsXG4gICAgICAgICAgICB0YWlsTW9kZTogdGFpbE1vZGUsXG4gICAgICAgICAgICB0cmVlRm9ya0NvdW50OiB0cmVlRm9ya0NvdW50XG4gICAgICAgICAgfSlcbiAgICAgICAgOiAoKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHMpLFxuICAgICAgICAgIChyZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsKSxcbiAgICAgICAgICAocmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMCksXG4gICAgICAgICAgKHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdyksXG4gICAgICAgICAgKHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsKSxcbiAgICAgICAgICAocmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZSksXG4gICAgICAgICAgKHJlbmRlclN0YXRlLnRyZWVGb3JrQ291bnQgPSB0cmVlRm9ya0NvdW50KSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJldmVyc2VDaGlsZHJlbihmaWJlcikge1xuICAgICAgdmFyIHJvdyA9IGZpYmVyLmNoaWxkO1xuICAgICAgZm9yIChmaWJlci5jaGlsZCA9IG51bGw7IG51bGwgIT09IHJvdzsgKSB7XG4gICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgIHJvdy5zaWJsaW5nID0gZmliZXIuY2hpbGQ7XG4gICAgICAgIGZpYmVyLmNoaWxkID0gcm93O1xuICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gICAgICB2Y
15852XIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcixcbiAgICAgICAgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbCxcbiAgICAgICAgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOClcbiAgICAgICAgcmV0dXJuIHB1c2hTdXNwZW5zZUxpc3RDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpLCBudWxsO1xuICAgICAgKG5leHRQcm9wcyA9IDAgIT09IChzdXNwZW5zZUNvbnRleHQgJiBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKVxuICAgICAgICA/ICgoc3VzcGVuc2VDb250ZXh0ID1cbiAgICAgICAgICAgIChzdXNwZW5zZUNvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaykgfFxuICAgICAgICAgICAgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSlcbiAgICAgICAgOiAoc3VzcGVuc2VDb250ZXh0ICY9IFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrKTtcbiAgICAgIHB1c2hTdXNwZW5zZUxpc3RDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuICAgICAgc3VzcGVuc2VDb250ZXh0ID0gbnVsbCA9PSByZXZlYWxPcmRlciA/IFwibnVsbFwiIDogcmV2ZWFsT3JkZXI7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgXCJmb3J3YXJkc1wiICE9PSByZXZlYWxPcmRlciAmJlxuICAgICAgICBcImJhY2t3YXJkc1wiICE9PSByZXZlYWxPcmRlciAmJlxuICAgICAgICBcInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHNcIiAhPT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgXCJ0b2dldGhlclwiICE9PSByZXZlYWxPcmRlciAmJlxuICAgICAgICBcImluZGVwZW5kZW50XCIgIT09IHJldmVhbE9yZGVyICYmXG4gICAgICAgICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltzdXNwZW5zZUNvbnRleHRdXG4gICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3N1c3BlbnNlQ29udGV4dF0gPSAhMCksXG4gICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHJldmVhbE9yZGVyKVxuICAgICAgICApXG4gICAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwidG9nZXRoZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3J3YXJkc1wiOlxuICAgICAgICAgICAgY2FzZSBcImJhY2t3YXJkc1wiOlxuICAgICAgICAgICAgY2FzZSBcImluZGVwZW5kZW50XCI6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gVXNlIGxvd2VyY2FzZSBcIiVzXCIgaW5zdGVhZC4nLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9yd2FyZFwiOlxuICAgICAgICAgICAgY2FzZSBcImJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gUmVhY3QgdXNlcyB0aGUgLXMgc3VmZml4IGluIHRoZSBzcGVsbGluZy4gVXNlIFwiJXNzXCIgaW5zdGVhZC4nLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uIERpZCB5b3UgbWVhbiBcImluZGVwZW5kZW50XCIsIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JyxcbiAgICAgICAgICAgICAgICByZXZlYWxPcmRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiBEaWQgeW91IG1lYW4gXCJpbmRlcGVuZGVudFwiLCBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsXG4gICAgICAgICAgICByZXZlYWxPcmRlclxuICAgICAgICAgICk7XG4gICAgICBzdXNwZW5zZUNvbnRleHQgPSBudWxsID09IHRhaWxNb2RlID8gXCJudWxsXCIgOiB0YWlsTW9kZTtcbiAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3N1c3BlbnNlQ29udGV4dF0gfHxcbiAgICAgICAgbnVsbCA9PSB0YWlsTW9kZSB8fFxuICAgICAgICAoXCJ2aXNpYmxlXCIgIT09IHRhaWxNb2RlICYmXG4gICAgICAgIFwiY29sbGFwc2VkXCIgIT09IHRhaWxNb2RlICYmXG4gICAgICAgIFwiaGlkZGVuXCIgIT09IHRhaWxNb2RlXG4gICAgICAgICAgPyAoKGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3N1c3BlbnNlQ29udGV4dF0gPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAnXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiBEaWQgeW91IG1lYW4gXCJ2aXNpYmxlXCIsIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLFxuICAgICAgICAgICAgICB0YWlsTW9kZVxuICAgICAgICAgICAgKSlcbiAgICAgICAgICA6IG51bGwgIT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgICAgIFwiZm9yd2FyZHNcIiAhPT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgICAgIFwiYmFja3dhcmRzXCIgIT09IHJldmVhbE9yZGVyICYmXG4gICAgICAgICAgICBcInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHNcIiAhPT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgICAgICgoZGlkV2Fyb
15852kFib3V0VGFpbE9wdGlvbnNbc3VzcGVuc2VDb250ZXh0XSA9ICEwKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgXCJmb3J3YXJkc1wiIChkZWZhdWx0KSBvciBcImJhY2t3YXJkc1wiLiBEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JyxcbiAgICAgICAgICAgICAgdGFpbE1vZGVcbiAgICAgICAgICAgICkpKTtcbiAgICAgIGE6IGlmIChcbiAgICAgICAgKG51bGwgPT0gcmV2ZWFsT3JkZXIgfHxcbiAgICAgICAgICBcImZvcndhcmRzXCIgPT09IHJldmVhbE9yZGVyIHx8XG4gICAgICAgICAgXCJiYWNrd2FyZHNcIiA9PT0gcmV2ZWFsT3JkZXIgfHxcbiAgICAgICAgICBcInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHNcIiA9PT0gcmV2ZWFsT3JkZXIpICYmXG4gICAgICAgIHZvaWQgMCAhPT0gbmV3Q2hpbGRyZW4gJiZcbiAgICAgICAgbnVsbCAhPT0gbmV3Q2hpbGRyZW4gJiZcbiAgICAgICAgITEgIT09IG5ld0NoaWxkcmVuXG4gICAgICApXG4gICAgICAgIGlmIChpc0FycmF5SW1wbChuZXdDaGlsZHJlbikpXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IDA7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPCBuZXdDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChcbiAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbltzdXNwZW5zZUNvbnRleHRdLFxuICAgICAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAoKHN1c3BlbnNlQ29udGV4dCA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW4pKSxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBzdXNwZW5zZUNvbnRleHQpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICgoc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VDb250ZXh0LmNhbGwobmV3Q2hpbGRyZW4pKSlcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIHZhciBzdGVwID0gc3VzcGVuc2VDb250ZXh0Lm5leHQoKSwgX2kgPSAwO1xuICAgICAgICAgICAgICAhc3RlcC5kb25lO1xuICAgICAgICAgICAgICBzdGVwID0gc3VzcGVuc2VDb250ZXh0Lm5leHQoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIGJyZWFrIGE7XG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuIERpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsXG4gICAgICAgICAgICByZXZlYWxPcmRlclxuICAgICAgICAgICk7XG4gICAgICBcImJhY2t3YXJkc1wiID09PSByZXZlYWxPcmRlciAmJiBudWxsICE9PSBjdXJyZW50XG4gICAgICAgID8gKHJldmVyc2VDaGlsZHJlbihjdXJyZW50KSxcbiAgICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICByZXZlcnNlQ2hpbGRyZW4oY3VycmVudCkpXG4gICAgICAgIDogcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICBpc0h5ZHJhdGluZ1xuICAgICAgICA/ICh3YXJuSWZOb3RIeWRyYXRpbmcoKSwgKG5ld0NoaWxkcmVuID0gdHJlZUZvcmtDb3VudCkpXG4gICAgICAgIDogKG5ld0NoaWxkcmVuID0gMCk7XG4gICAgICBpZiAoIW5leHRQcm9wcyAmJiBudWxsICE9PSBjdXJyZW50ICYmIDAgIT09IChjdXJyZW50LmZsYWdzICYgMTI4KSlcbiAgICAgICAgYTogZm9yIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7IG51bGwgIT09IGN1cnJlbnQ7ICkge1xuICAgICAgICAgIGlmICgxMyA9PT0gY3VycmVudC50YWcpXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGN1cnJlbnQsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgZWxzZSBpZiAoMTkgPT09IGN1cnJlbnQudGFnKVxuICAgICAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGN1cnJlbnQsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgZWxzZSBpZiAobnVsbCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgICAgICAgICAgY3VycmVudC5jaGlsZC5yZXR1cm4gPSBjdXJyZW50O1xuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHdvcmtJblByb2dyZXNzKSBicmVhayBhO1xuICAgICAgICAgIGZvciAoOyBudWxsID09PSBjdXJyZW50LnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQucmV0dXJuIHx8IGN1cnJlbnQucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudC5zaWJsaW5nLnJldHVybiA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgI
15852H1cbiAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICAgICAgY2FzZSBcImJhY2t3YXJkc1wiOlxuICAgICAgICAgIHJlbmRlckxhbmVzID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICBudWxsID09PSByZW5kZXJMYW5lc1xuICAgICAgICAgICAgPyAoKHJldmVhbE9yZGVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsKSlcbiAgICAgICAgICAgIDogKChyZXZlYWxPcmRlciA9IHJlbmRlckxhbmVzLnNpYmxpbmcpLFxuICAgICAgICAgICAgICAocmVuZGVyTGFuZXMuc2libGluZyA9IG51bGwpLFxuICAgICAgICAgICAgICByZXZlcnNlQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICEwLFxuICAgICAgICAgICAgcmV2ZWFsT3JkZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGFpbE1vZGUsXG4gICAgICAgICAgICBuZXdDaGlsZHJlblxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzXCI6XG4gICAgICAgICAgcmVuZGVyTGFuZXMgPSBudWxsO1xuICAgICAgICAgIHJldmVhbE9yZGVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgZm9yICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7IG51bGwgIT09IHJldmVhbE9yZGVyOyApIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSByZXZlYWxPcmRlci5hbHRlcm5hdGU7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsID09PSBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZXZlYWxPcmRlcjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gcmV2ZWFsT3JkZXIuc2libGluZztcbiAgICAgICAgICAgIHJldmVhbE9yZGVyLnNpYmxpbmcgPSByZW5kZXJMYW5lcztcbiAgICAgICAgICAgIHJlbmRlckxhbmVzID0gcmV2ZWFsT3JkZXI7XG4gICAgICAgICAgICByZXZlYWxPcmRlciA9IGN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgITAsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB0YWlsTW9kZSxcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRvZ2V0aGVyXCI6XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAhMSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgbmV3Q2hpbGRyZW5cbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5kZXBlbmRlbnRcIjpcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAocmVuZGVyTGFuZXMgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpKSxcbiAgICAgICAgICAgIG51bGwgPT09IHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgID8gKChyZXZlYWxPcmRlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsKSlcbiAgICAgICAgICAgICAgOiAoKHJldmVhbE9yZGVyID0gcmVuZGVyTGFuZXMuc2libGluZyksXG4gICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzLnNpYmxpbmcgPSBudWxsKSksXG4gICAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAhMSxcbiAgICAgICAgICAgICAgcmV2ZWFsT3JkZXIsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICB0YWlsTW9kZSxcbiAgICAgICAgICAgICAgbmV3Q2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgbmV3UHJvcHMgP
15852SB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG4gICAgICBcInZhbHVlXCIgaW4gbmV3UHJvcHMgfHxcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgfHxcbiAgICAgICAgKChoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9ICEwKSxcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlRoZSBgdmFsdWVgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoZSBgPENvbnRleHQuUHJvdmlkZXI+YC4gRGlkIHlvdSBtaXNzcGVsbCBpdCBvciBmb3JnZXQgdG8gcGFzcyBpdD9cIlxuICAgICAgICApKTtcbiAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBuZXdQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiAod29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXMpO1xuICAgICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyB8PSB3b3JrSW5Qcm9ncmVzcy5sYW5lcztcbiAgICAgIGlmICgwID09PSAocmVuZGVyTGFuZXMgJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSlcbiAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAocHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAwID09PSAocmVuZGVyTGFuZXMgJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHJldHVybiBudWxsO1xuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpXG4gICAgICAgIHRocm93IEVycm9yKFwiUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIGlmIChudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5jaGlsZCkge1xuICAgICAgICBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgIHJlbmRlckxhbmVzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgY3VycmVudC5wZW5kaW5nUHJvcHMpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzO1xuICAgICAgICBmb3IgKHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzOyBudWxsICE9PSBjdXJyZW50LnNpYmxpbmc7IClcbiAgICAgICAgICAoY3VycmVudCA9IGN1cnJlbnQuc2libGluZyksXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcy5zaWJsaW5nID1cbiAgICAgICAgICAgICAgY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgY3VycmVudC5wZW5kaW5nUHJvcHMpKSxcbiAgICAgICAgICAgIChyZW5kZXJMYW5lcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlbmRlckxhbmVzLnNpYmxpbmcgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAgICAgaWYgKDAgIT09IChjdXJyZW50LmxhbmVzICYgcmVuZGVyTGFuZXMpKSByZXR1cm4gITA7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgICByZXR1cm4gbnVsbCAhPT0gY3VycmVudCAmJiBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudCkgPyAhMCA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHVzaEhvc3RDb250YWluZXIoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwdXNoUHJvdmlkZXIoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENhY2hlQ29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGFpbmVyKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcHVzaFByb3ZpZGVyKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykgJiZcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4O1xuICAgICAgICAgI
15852HZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gLTA7XG4gICAgICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IC0wO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIGlmIChudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEyOCksXG4gICAgICAgICAgICAgIHB1c2hEZWh5ZHJhdGVkQWN0aXZpdHlTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHN0YXRlTm9kZSkge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHN0YXRlTm9kZS5kZWh5ZHJhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEyOCksXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RhdGVOb2RlID0gcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2Y
15852XIgcHJpbWFyeUNoaWxkTGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZC5jaGlsZExhbmVzO1xuICAgICAgICAgICAgaWYgKHN0YXRlTm9kZSB8fCAwICE9PSAocmVuZGVyTGFuZXMgJiBwcmltYXJ5Q2hpbGRMYW5lcykpXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgY3VycmVudCA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5zaWJsaW5nIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcHJpbWFyeUNoaWxkTGFuZXMgPSAwICE9PSAoY3VycmVudC5mbGFncyAmIDEyOCk7XG4gICAgICAgICAgc3RhdGVOb2RlID0gMCAhPT0gKHJlbmRlckxhbmVzICYgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG4gICAgICAgICAgc3RhdGVOb2RlIHx8XG4gICAgICAgICAgICAocHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAoc3RhdGVOb2RlID0gMCAhPT0gKHJlbmRlckxhbmVzICYgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpKTtcbiAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkTGFuZXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZU5vZGUpXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmltYXJ5Q2hpbGRMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgbnVsbCAhPT0gcHJpbWFyeUNoaWxkTGFuZXMgJiZcbiAgICAgICAgICAgICgocHJpbWFyeUNoaWxkTGFuZXMucmVuZGVyaW5nID0gbnVsbCksXG4gICAgICAgICAgICAocHJpbWFyeUNoaWxkTGFuZXMudGFpbCA9IG51bGwpLFxuICAgICAgICAgICAgKHByaW1hcnlDaGlsZExhbmVzLmxhc3RFZmZlY3QgPSBudWxsKSk7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlTGlzdENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gICAgICAgICAgaWYgKHN0YXRlTm9kZSkgYnJlYWs7XG4gICAgICAgICAgZWxzZSByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gMCksXG4gICAgICAgICAgICB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICBwdXNoUHJvdmlkZXIoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENhY2hlQ29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBiZWdpbldvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ICYmIG51bGwgIT09IGN1cnJlbnQpIHtcbiAgICAgICAgcmVuZGVyTGFuZXMgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gICAgICAgICAgcmVzb2x2ZVR5cGVGb3JIb3RSZWxvYWRpbmcod29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmtleSxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzXG4gICAgICAgICk7XG4gICAgICAgIHJlbmRlckxhbmVzLl9kZWJ1Z1N0YWNrID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU3RhY2s7XG4gICAgICAgIHJlbmRlckxhbmVzLl9kZWJ1Z1Rhc2sgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdUYXNrO1xuICAgICAgICB2Y
15852XIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgICAgIGlmIChudWxsID09PSByZXR1cm5GaWJlcikgdGhyb3cgRXJyb3IoXCJDYW5ub3Qgc3dhcCB0aGUgcm9vdCBmaWJlci5cIik7XG4gICAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgICAgcmVuZGVyTGFuZXMuaW5kZXggPSB3b3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICAgICAgcmVuZGVyTGFuZXMuc2libGluZyA9IHdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgICAgIHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICAgICAgcmVuZGVyTGFuZXMucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgICAgICByZW5kZXJMYW5lcy5fZGVidWdJbmZvID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnSW5mbztcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSByZXR1cm5GaWJlci5jaGlsZClcbiAgICAgICAgICByZXR1cm5GaWJlci5jaGlsZCA9IHJlbmRlckxhbmVzO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJldlNpYmxpbmcgPSByZXR1cm5GaWJlci5jaGlsZDtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gcHJldlNpYmxpbmcpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIHBhcmVudCB0byBoYXZlIGEgY2hpbGQuXCIpO1xuICAgICAgICAgIGZvciAoOyBwcmV2U2libGluZy5zaWJsaW5nICE9PSB3b3JrSW5Qcm9ncmVzczsgKVxuICAgICAgICAgICAgaWYgKCgocHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nKSwgbnVsbCA9PT0gcHJldlNpYmxpbmcpKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIHRvIGZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcuXCIpO1xuICAgICAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSByZW5kZXJMYW5lcztcbiAgICAgICAgfVxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcbiAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICA/ICgocmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2N1cnJlbnRdKSwgKHJldHVybkZpYmVyLmZsYWdzIHw9IDE2KSlcbiAgICAgICAgICA6IHdvcmtJblByb2dyZXNzLnB1c2goY3VycmVudCk7XG4gICAgICAgIHJlbmRlckxhbmVzLmZsYWdzIHw9IDEzNDIxNzczMDtcbiAgICAgICAgcmV0dXJuIHJlbmRlckxhbmVzO1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyB8fFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZVxuICAgICAgICApXG4gICAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpICYmXG4gICAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMSksXG4gICAgICAgICAgICAgIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMzEwNzIpID8gITAgOiAhMTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSAhMTtcbiAgICAgICAgaWYgKChyZXR1cm5GaWJlciA9IGlzSHlkcmF0aW5nKSlcbiAgICAgICAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEwNDg1NzYpKTtcbiAgICAgICAgcmV0dXJuRmliZXIgJiZcbiAgICAgICAgICAoKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MuaW5kZXgpLFxuICAgICAgICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpLFxuICAgICAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRyZWVGb3JrQ291bnQsIHJldHVybkZpYmVyKSk7XG4gICAgICB9XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDA7XG4gICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIGE6IGlmIChcbiAgICAgICAgICAgICgocmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMpLFxuICAgICAgICAgICAgKGN1cnJlbnQgPSByZXNvbHZlTGF6eSh3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkpLFxuICAgICAgICAgICAgKGN1cnJlbnQgPSByZXNvbHZlVHlwZUZvckhvdFJlbG9hZGluZyhjdXJyZW50KSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQpLFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY3VycmVudClcbiAgICAgICAgICApXG4gICAgICAgICAgICBzaG91bGRDb25zdHJ1Y3QoY3VycmVudClcbiAgICAgICAgICAgICAgPyAoKHJldHVybkZpYmVyID0gcmVzb2x2ZUNsYXNzQ29tcG9uZW50UHJvcHMoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudGFnID0gMSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gdXBkYXRlQ2xhc3NDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3MudGFnID0gMCksXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgI
15852HJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICAgKSkpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gY3VycmVudCAmJiBudWxsICE9PSBjdXJyZW50KVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKChwcmV2U2libGluZyA9IGN1cnJlbnQuJCR0eXBlb2YpLFxuICAgICAgICAgICAgICAgIHByZXZTaWJsaW5nID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSAxMTtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHVwZGF0ZUZvcndhcmRSZWYoXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2U2libGluZyA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gMTQ7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSB1cGRhdGVNZW1vQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldlNpYmxpbmcgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IDEwO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gdXBkYXRlQ29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gXCJcIjtcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgY3VycmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9XG4gICAgICAgICAgICAgICAgXCIgRGlkIHlvdSB3cmFwIGEgY29tcG9uZW50IGluIFJlYWN0LmxhenkoKSBtb3JlIHRoYW4gb25jZT9cIik7XG4gICAgICAgICAgICByZW5kZXJMYW5lcyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdXJyZW50KSB8fCBjdXJyZW50O1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiRWxlbWVudCB0eX
15852BlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgK1xuICAgICAgICAgICAgICAgIFwiLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MudHlwZSksXG4gICAgICAgICAgICAocHJldlNpYmxpbmcgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wc1xuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICB1cGRhdGVDbGFzc0NvbXBvbmVudChcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgcHVzaEhvc3RDb250YWluZXIoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlNob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICB2Y
15852XIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHByZXZTaWJsaW5nID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gICAgICAgICAgICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcmV0dXJuRmliZXIsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBuZXh0U3RhdGUuY2FjaGU7XG4gICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgIT09IHByZXZTdGF0ZS5jYWNoZSAmJlxuICAgICAgICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBbQ2FjaGVDb250ZXh0XSxcbiAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAhMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgc3VzcGVuZElmVXBkYXRlUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBuZXh0U3RhdGUuZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkKVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKChwcmV2U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50OiByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgIGlzRGVoeWRyYXRlZDogITEsXG4gICAgICAgICAgICAgICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IHByZXZTdGF0ZSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBwcmV2U3RhdGUpLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICYgMjU2KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5GaWJlciAhPT0gcHJldlNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBwcmV2U2libGluZyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKFxuICAgICAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVGhpcyByb290IHJlY2VpdmVkIGFuIGVhcmx5IHVwZGF0ZSwgYmVmb3JlIGFueXRoaW5nIHdhcyBhYmxlIGh5ZHJhdGUuIFN3aXRjaGVkIHRoZSBlbnRpcmUgcm9vdCB0byBjbGllbnQgcmVuZGVyaW5nLlwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocHJldlNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICBcIkhUTUxcIiA9PT0gY3VycmVudC5ub2RlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoY3VycmVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgICAgIGlzSHlkcmF0aW5nID0gITA7XG4gICAgICAgICAgICAgICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9ICExO1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkRpZmZSb290REVWID0gbnVsbDtcbiAgICAgICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgPSBtb3VudENoaWxkRmliZXJzKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzOyByZW5kZXJMYW5lczsgKVxuICAgICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzLmZsYWdzID0gKHJlbmRlckxhbmVzLmZsYWdzICYgLTMpIHwgMTM0MjIxODI0KSxcbiAgICAgICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXMuc2libGluZyk7XG4gICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgICAgIGlmIChyZXR1cm5GaWJlciA9PT0gcHJldlNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgICAgICA/IChyZW5kZXJMYW5lcyA9IGdldFJlc291cmNlKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gcmVuZGVyTGFuZXMpXG4gICAgICAgICAgICAgICAgOiBpc0h5ZHJhdGluZyB8fFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZUhvaXN0YWJsZUluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBnZXRSZXNvdXJjZShcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICBpc0h5ZHJhdGluZyAmJlxuICAgICAgICAgICAgICAoKHJldHVybkZpYmVyID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gZ2V0SG9zdENvbnRleHQoKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVNpbmdsZXRvbkluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViB8fFxuICAgICAgICAgICAgICAgICgocHJldlNpYmxpbmcgPSBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmdcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgKGJ1aWxkSHlkcmF0aW9uRGlmZk5vZGUod29ya0luUHJvZ3Jlc3MsIDApLnNlcnZlclByb3BzID1cbiAgICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcpKSxcbiAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAocm9vdE9yU2luZ2xldG9uQ29udGV4dCA9ICEwKSxcbiAgICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSksXG4gICAgICAgICAgICAgIGlzU2luZ2xldG9uU2NvcGUod29ya0luUHJvZ3Jlc3MudHlwZSlcbiAgICAgICAgICAgICAgICA/ICgocHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiA9IHByZXZTaWJsaW5nKSxcbiAgICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLmZpcnN0Q2hpbGRcbiAgICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICAgIDogKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBwcmV2U2libGluZykpLFxuICAgICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsID09PSBjdXJyZW50ICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0MzA0KSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBudWxsID09PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIGlzSHlkcmF0aW5nICYmXG4gICAgICAgICAgICAgICgocHJldlN0YXRlID0gZ2V0SG9zdENvbnRleHQoKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHZhbGlkYXRlRE9NTmVzdGluZyhcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgIHByZXZTdGF0ZS5hbmNlc3RvckluZm9cbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChwcmV2U2libGluZyA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2UpLFxuICAgICAgICAgICAgICAobmV4dFN0YXRlID0gIXByZXZTaWJsaW5nKSB8fFxuICAgICAgICAgICAgICAgICgobmV4dFN0YXRlID0gY2FuSHlkcmF0ZUluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgICAgICAgcm9vdE9yU2luZ2xldG9uQ29udGV4dFxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IG5leHRTdGF0ZVxuICAgICAgICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG5leHRTdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGRpZFN1c3BlbmRPckVycm9yREVWIHx8XG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2U3RhdGUgPSBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWxkSHlkcmF0aW9uRGlmZk5vZGUod29ya0luUHJvZ3Jlc3MsIDApLnNlcnZlclByb3BzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlKSksXG4gICAgICAgICAgICAgICAgICAgIChoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUuZmlyc3RDaGlsZFxuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgKHJvb3RPclNpbmdsZXRvbkNvbnRleHQgPSAhMSksXG4gICAgICAgICAgICAgICAgICAgIChwcmV2U3RhdGUgPSAhMCkpXG4gICAgICAgICAgICAgICAgICA6IChwcmV2U3RhdGUgPSAhMSksXG4gICAgICAgICAgICAgICAgKG5leHRTdGF0ZSA9ICFwcmV2U3RhdGUpKSxcbiAgICAgICAgICAgICAgbmV4dFN0YXRlICYmXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyICYmXG4gICAgICAgICAgICAgICAgICB3YXJuTm9uSHlkcmF0ZWRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcHJldlNpYmxpbmcpLFxuICAgICAgICAgICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCh3b3JrSW5Qcm9ncmVzcykpKSxcbiAgICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAocHJldlNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy50eXBlKSxcbiAgICAgICAgICAgIChwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMpLFxuICAgICAgICAgICAgKG5leHRTdGF0ZSA9IG51bGwgIT09IGN1cnJlbnQgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHByZXZTdGF0ZS5jaGlsZHJlbiksXG4gICAgICAgICAgICBzaG91bGRTZXRUZXh0Q29udGVudChwcmV2U2libGluZywgcHJldlN0YXRlKVxuICAgICAgICAgICAgICA/IChyZXR1cm5GaWJlciA9IG51bGwpXG4gICAgICAgICAgICAgIDogbnVsbCAhPT0gbmV4dFN0YXRlICYmXG4gICAgICAgICAgICAgICAgc2hvdWxkU2V0VGV4dENvbnRlbnQocHJldlNpYmxpbmcsIG5leHRTdGF0ZSkgJiZcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMzIpLFxuICAgICAgICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAoKHByZXZTaWJsaW5nID0gcmVuZGVyV2l0aEhvb2tzKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgVHJhbnNpdGlvbkF3YXJlSG9zdENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChIb3N0VHJhbnNpdGlvbkNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IHByZXZTaWJsaW5nKSksXG4gICAgICAgICAgICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgI
15852HJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiZcbiAgICAgICAgICAgICAgKChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gZ2V0SG9zdENvbnRleHQoKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGN1cnJlbnQuYW5jZXN0b3JJbmZvLmN1cnJlbnQpLFxuICAgICAgICAgICAgICAocmVuZGVyTGFuZXMgPVxuICAgICAgICAgICAgICAgIG51bGwgIT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICAgID8gdmFsaWRhdGVUZXh0TmVzdGluZyhcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlci50YWcsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hbmNlc3RvckluZm8uaW1wbGljaXRSb290U2NvcGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiAhMCksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9ICFjdXJyZW50KSB8fFxuICAgICAgICAgICAgICAgICgocmV0dXJuRmliZXIgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICAgICAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSAhMCkpXG4gICAgICAgICAgICAgICAgICA6IChyZXR1cm5GaWJlciA9ICExKSxcbiAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSAhcmV0dXJuRmliZXIpKSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIgJiZcbiAgICAgICAgICAgICAgICAocmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgICAgIHdhcm5Ob25IeWRyYXRlZEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2god29ya0luUHJvZ3Jlc3MpKSksXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwdXNoSG9zdENvbnRhaW5lcihcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzKSxcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyhcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICA6IHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcndhcmRSZWYoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDIwNDgpLFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlci5lZmZlY3REdXJhdGlvbiA9IC0wKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlci5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAtMCksXG4gICAgICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChwcmV2U2libGluZyA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQpLFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHJldHVybkZpYmVyICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgdGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCB0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC5cIlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gcmVhZENvbnRleHQocHJldlNpYmxpbmcpKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGNhbGxDb21wb25lbnRJbkRFVihcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIHByZXZTaWJsaW5nLFxuICAgICAgICAgICAgICB2b2lkIDBcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEpLFxuICAgICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJldHVybiB1cGRhdGVBY3Rpdml0eUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHJlYWRDb250ZXh0KENhY2hlQ29udGV4dCkpLFxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgICAgICA/ICgocHJldlNpYmxpbmcgPSBwZWVrQ2FjaGVGcm9tUG9vbCgpKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSBwcmV2U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgKChwcmV2U2libGluZyA9IHdvcmtJblByb2dyZXNzUm9vdCksXG4gICAgICAgICAgICAgICAgICAocHJldlN0YXRlID0gY3JlYXRlQ2FjaGUoKSksXG4gICAgICAgICAgICAgICAgICAocHJldlNpYmxpbmcucG9vbGVkQ2FjaGUgPSBwcmV2U3RhdGUpLFxuICAgICAgICAgICAgICAgICAgcmV0YWluQ2FjaGUocHJldlN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICAocHJldlNpYmxpbmcucG9vbGVkQ2FjaGVMYW5lcyB8PSByZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAgICAgICAocHJldlNpYmxpbmcgPSBwcmV2U3RhdGUpKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgI
15852HBhcmVudDogcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBjYWNoZTogcHJldlNpYmxpbmdcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ2FjaGVDb250ZXh0LCBwcmV2U2libGluZykpXG4gICAgICAgICAgICAgIDogKDAgIT09IChjdXJyZW50LmxhbmVzICYgcmVuZGVyTGFuZXMpICYmXG4gICAgICAgICAgICAgICAgICAoY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG51bGwsIG51bGwsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgICAgIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKSksXG4gICAgICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gY3VycmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgICAgICAocHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgICAgICAgcHJldlNpYmxpbmcucGFyZW50ICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgPyAoKHByZXZTaWJsaW5nID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGU6IHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHByZXZTaWJsaW5nKSxcbiAgICAgICAgICAgICAgICAgICAgMCA9PT0gd29ya0luUHJvZ3Jlc3MubGFuZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U2libGluZyksXG4gICAgICAgICAgICAgICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ2FjaGVDb250ZXh0LCByZXR1cm5GaWJlcikpXG4gICAgICAgICAgICAgICAgICA6ICgocmV0dXJuRmliZXIgPSBwcmV2U3RhdGUuY2FjaGUpLFxuICAgICAgICAgICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlciAhPT0gcHJldlNpYmxpbmcuY2FjaGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgW0NhY2hlQ29udGV4dF0sXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgICAgICAgKSkpLFxuICAgICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IHtcbiAgICAgICAgICAgICAgICBhdXRvTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWlyZWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xvbmVzOiBudWxsLFxuICAgICAgICAgICAgICAgIHJlZjogbnVsbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICBudWxsICE9IHJldHVybkZpYmVyLm5hbWUgJiYgXCJhdXRvXCIgIT09IHJldHVybkZpYmVyLm5hbWVcbiAgICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gbnVsbCA9PT0gY3VycmVudCA/IDE4ODgyNTYwIDogMTg4NzQzNjgpXG4gICAgICAgICAgICAgIDogaXNIeWRyYXRpbmcgJiYgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICB2b2lkIDAgIT09IHJldHVybkZpYmVyLmNsYXNzTmFtZSAmJlxuICAgICAgICAgICAgICAoKHByZXZTaWJsaW5nID1cbiAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcmV0dXJuRmliZXIuY2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHJldHVybkZpYmVyLmNsYXNzTmFtZSlcbiAgICAgICAgICAgICAgICAgIDogXCJ7Li4ufVwiKSxcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0Q2xhc3NOYW1lT25WaWV3VHJhbnNpdGlvbltwcmV2U2libGluZ10gfHxcbiAgICAgICAgICAgICAgICAoKGRpZFdhcm5BYm91dENsYXNzTmFtZU9uVmlld1RyYW5zaXRpb25bcHJldlNpYmxpbmddID0gITApLFxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnPFZpZXdUcmFuc2l0aW9uPiBkb2VzblxcJ3QgYWNjZXB0IGEgXCJjbGFzc05hbWVcIiBwcm9wLiBJdCBoYXMgYmVlbiByZW5hbWVkIHRvIFwiZGVmYXVsdFwiLlxcbi0gICA8Vmlld1RyYW5zaXRpb24gY2xhc3NOYW1lPSVzPlxcbisgICA8Vmlld1RyYW5zaXRpb24gZGVmYXVsdD0lcz4nLFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICBwcmV2U2libGluZ1xuICAgICAgICAgICAgICAgICkpKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgY3VycmVudC5tZW1vaXplZFByb3BzLm5hbWUgIT09IHJldHVybkZpYmVyLm5hbWVcbiAgICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDgxNilcbiAgICAgICAgICAgICAgOiBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgI
15852HJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgIHRocm93IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgK1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyArXG4gICAgICAgICAgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVsb2FkSW5zdGFuY2VBbmRTdXNwZW5kSWZOZWVkZWQoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHR5cGUsXG4gICAgICBvbGRQcm9wcyxcbiAgICAgIG5ld1Byb3BzLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIHZhciBKU0NvbXBpbGVyX3RlbXA7XG4gICAgICBpZiAoXG4gICAgICAgIChKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3VzcGVuc2V5SW1hZ2VzTW9kZSkgIT09IE5vTW9kZSlcbiAgICAgIClcbiAgICAgICAgSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgICBudWxsID09PSBvbGRQcm9wc1xuICAgICAgICAgICAgPyBtYXlTdXNwZW5kQ29tbWl0KHR5cGUsIG5ld1Byb3BzKVxuICAgICAgICAgICAgOiBtYXlTdXNwZW5kQ29tbWl0KHR5cGUsIG5ld1Byb3BzKSAmJlxuICAgICAgICAgICAgICAobmV3UHJvcHMuc3JjICE9PSBvbGRQcm9wcy5zcmMgfHxcbiAgICAgICAgICAgICAgICBuZXdQcm9wcy5zcmNTZXQgIT09IG9sZFByb3BzLnNyY1NldCk7XG4gICAgICBpZiAoSlNDb21waWxlcl90ZW1wKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE2Nzc3MjE2KSxcbiAgICAgICAgICAocmVuZGVyTGFuZXMgJiAzMzU1NDQxMjgpID09PSByZW5kZXJMYW5lcylcbiAgICAgICAgKVxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29tcGxldGUpIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDgxOTI7XG4gICAgICAgICAgZWxzZSBpZiAoc2hvdWxkUmVtYWluT25QcmV2aW91c1NjcmVlbigpKSB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IChcbiAgICAgICAgICAgICAgKChzdXNwZW5kZWRUaGVuYWJsZSA9IG5vb3BTdXNwZW5zZXlDb21taXRUaGVuYWJsZSksXG4gICAgICAgICAgICAgIFN1c3BlbnNleUNvbW1pdEV4Y2VwdGlvbilcbiAgICAgICAgICAgICk7XG4gICAgICB9IGVsc2Ugd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTE2Nzc3MjE3O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVsb2FkUmVzb3VyY2VBbmRTdXNwZW5kSWZOZWVkZWQod29ya0luUHJvZ3Jlc3MsIHJlc291cmNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwic3R5bGVzaGVldFwiICE9PSByZXNvdXJjZS50eXBlIHx8XG4gICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgSW5zZXJ0ZWQpICE9PSBOb3RMb2FkZWRcbiAgICAgIClcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTE2Nzc3MjE3O1xuICAgICAgZWxzZSBpZiAoKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxNjc3NzIxNiksICFwcmVsb2FkUmVzb3VyY2UocmVzb3VyY2UpKSlcbiAgICAgICAgaWYgKHNob3VsZFJlbWFpbk9uUHJldmlvdXNTY3JlZW4oKSkgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gODE5MjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IChcbiAgICAgICAgICAgICgoc3VzcGVuZGVkVGhlbmFibGUgPSBub29wU3VzcGVuc2V5Q29tbWl0VGhlbmFibGUpLFxuICAgICAgICAgICAgU3VzcGVuc2V5Q29tbWl0RXhjZXB0aW9uKVxuICAgICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmV0cnlFZmZlY3Qod29ya0luUHJvZ3Jlc3MsIHJldHJ5UXVldWUpIHtcbiAgICAgIG51bGwgIT09IHJldHJ5UXVldWUgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxNjM4NCAmJlxuICAgICAgICAoKHJldHJ5UXVldWUgPVxuICAgICAgICAgIDIyICE9PSB3b3JrSW5Qcm9ncmVzcy50YWcgPyBjbGFpbU5leHRSZXRyeUxhbmUoKSA6IDUzNjg3MDkxMiksXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyB8PSByZXRyeVF1ZXVlKSxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyB8PSByZXRyeVF1ZXVlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gICAgICBpZiAoIWlzSHlkcmF0aW5nKVxuICAgICAgICBzd2l0Y2ggKHJlbmRlclN0YXRlLnRhaWxNb2RlKSB7XG4gICAgICAgICAgY2FzZSBcInZpc2libGVcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjb2xsYXBzZWRcIjpcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWwsIGxhc3RUYWlsTm9kZSA9IG51bGw7XG4gICAgICAgICAgICAgIG51bGwgIT09IHRhaWxOb2RlO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIG51bGwgIT09IHRhaWxOb2RlLmFsdGVybmF0ZSAmJiAobGFzdFRhaWxOb2RlID0gdGFpbE5vZGUpLFxuICAgICAgICAgICAgICAgICh0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmcpO1xuICAgICAgICAgICAgbnVsbCA9PT0gbGFzdFRhaWxOb2RlXG4gICAgICAgICAgICAgID8gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrIHx8IG51bGwgPT09IHJlbmRlclN0YXRlLnRhaWxcbiAgICAgICAgICAgICAgICA/IChyZW5kZXJTdGF0ZS50YWlsID0gbnVsbClcbiAgICAgICAgICAgICAgICA6IChyZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsKVxuICAgICAgICAgICAgICA6IChsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgICBmb3IgKHRhaWxOb2RlID0gbnVsbDsgbnVsbCAhPT0gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrOyApXG4gICAgICAgICAgICAgIG51bGwgIT09IGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjay5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgICAgICAodGF
15852pbE5vZGUgPSBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2spLFxuICAgICAgICAgICAgICAgIChoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgPSBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2suc2libGluZyk7XG4gICAgICAgICAgICBudWxsID09PSB0YWlsTm9kZVxuICAgICAgICAgICAgICA/IChyZW5kZXJTdGF0ZS50YWlsID0gbnVsbClcbiAgICAgICAgICAgICAgOiAodGFpbE5vZGUuc2libGluZyA9IG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICAgICAgdmFyIGRpZEJhaWxvdXQgPVxuICAgICAgICAgIG51bGwgIT09IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQsXG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSAwLFxuICAgICAgICBzdWJ0cmVlRmxhZ3MgPSAwO1xuICAgICAgaWYgKGRpZEJhaWxvdXQpXG4gICAgICAgIGlmICgoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgdmFyIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uLFxuICAgICAgICAgICAgICBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgICAgICAgICAgIG51bGwgIT09IF9jaGlsZDI7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICAobmV3Q2hpbGRMYW5lcyB8PSBfY2hpbGQyLmxhbmVzIHwgX2NoaWxkMi5jaGlsZExhbmVzKSxcbiAgICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIDEyMDY5MTA5NzYpLFxuICAgICAgICAgICAgICAoc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiAxMjA2OTEwOTc2KSxcbiAgICAgICAgICAgICAgKF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbiksXG4gICAgICAgICAgICAgIChfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nKTtcbiAgICAgICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgICAgICAgICAgIG51bGwgIT09IF90cmVlQmFzZUR1cmF0aW9uO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgKG5ld0NoaWxkTGFuZXMgfD1cbiAgICAgICAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24ubGFuZXMgfCBfdHJlZUJhc2VEdXJhdGlvbi5jaGlsZExhbmVzKSxcbiAgICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5zdWJ0cmVlRmxhZ3MgJiAxMjA2OTEwOTc2KSxcbiAgICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5mbGFncyAmIDEyMDY5MTA5NzYpLFxuICAgICAgICAgICAgICAoX3RyZWVCYXNlRHVyYXRpb24ucmV0dXJuID0gY29tcGxldGVkV29yayksXG4gICAgICAgICAgICAgIChfdHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uLnNpYmxpbmcpO1xuICAgICAgZWxzZSBpZiAoKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgICAgZm9yICh2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkOyBudWxsICE9PSBjaGlsZDsgKVxuICAgICAgICAgIChuZXdDaGlsZExhbmVzIHw9IGNoaWxkLmxhbmVzIHwgY2hpbGQuY2hpbGRMYW5lcyksXG4gICAgICAgICAgICAoc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncyksXG4gICAgICAgICAgICAoc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzKSxcbiAgICAgICAgICAgIChfdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbiksXG4gICAgICAgICAgICAoX2NoaWxkMiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uKSxcbiAgICAgICAgICAgIChjaGlsZCA9IGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF9jaGlsZDI7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG4gICAgICAgICAgbnVsbCAhPT0gX3RyZWVCYXNlRHVyYXRpb247XG5cbiAgICAgICAgKVxuICAgICAgICAgIChuZXdDaGlsZExhbmVzIHw9XG4gICAgICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbi5sYW5lcyB8IF90cmVlQmFzZUR1cmF0aW9uLmNoaWxkTGFuZXMpLFxuICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5zdWJ0cmVlRmxhZ3MpLFxuICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5mbGFncyksXG4gICAgICAgICAgICAoX3RyZWVCYXNlRHVyYXRpb24ucmV0dXJuID0gY29tcGxldGVkV29yayksXG4gICAgICAgICAgICAoX3RyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbi5zaWJsaW5nKTtcbiAgICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgICAgIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gICAgICByZXR1cm4gZGlkQmFpbG91dDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAgICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgI
15852HJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIG5ld1Byb3BzID0gbnVsbDtcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIChuZXdQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZSk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZS5jYWNoZSAhPT0gbmV3UHJvcHMgJiZcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4KTtcbiAgICAgICAgICBwb3BQcm92aWRlcihDYWNoZUNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZW5kZXJMYW5lcy5wZW5kaW5nQ29udGV4dCAmJlxuICAgICAgICAgICAgKChyZW5kZXJMYW5lcy5jb250ZXh0ID0gcmVuZGVyTGFuZXMucGVuZGluZ0NvbnRleHQpLFxuICAgICAgICAgICAgKHJlbmRlckxhbmVzLnBlbmRpbmdDb250ZXh0ID0gbnVsbCkpO1xuICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50IHx8IG51bGwgPT09IGN1cnJlbnQuY2hpbGQpXG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgPyAoZW1pdFBlbmRpbmdIeWRyYXRpb25XYXJuaW5ncygpLCBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSlcbiAgICAgICAgICAgICAgOiBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgICAgKGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NikpIHx8XG4gICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpKTtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICB2Y
15852XIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICAgID8gKG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICBudWxsICE9PSBuZXh0UmVzb3VyY2VcbiAgICAgICAgICAgICAgICA/IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgIHByZWxvYWRSZXNvdXJjZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZVxuICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgIHByZWxvYWRJbnN0YW5jZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgKSkpXG4gICAgICAgICAgICA6IG5leHRSZXNvdXJjZVxuICAgICAgICAgICAgICA/IG5leHRSZXNvdXJjZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICAgICAgPyAobWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgIHByZWxvYWRSZXNvdXJjZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZVxuICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMTY3NzcyMTcpKVxuICAgICAgICAgICAgICA6ICgoY3VycmVudCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyksXG4gICAgICAgICAgICAgICAgY3VycmVudCAhPT0gbmV3UHJvcHMgJiYgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgcHJlbG9hZEluc3RhbmNlQW5kU3VzcGVuZElmTmVlZGVkKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmVuZGVyTGFuZXMgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gICAgICAgICAgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpXG4gICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKVxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmPSAtMzM1NTQ0MzM7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgPyBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdXJyZW50KVxuICAgICAgICAgICAgICA6ICgoY3VycmVudCA9IHJlc29sdmVTaW5nbGV0b25JbnN0YW5jZShcbiAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQpLFxuICAgICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICY9IC0zMzU1NDQzMztcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsICE9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSlcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAhPT0gbm
15852V3UHJvcHMgJiYgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIldlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICY9IC0zMzU1NDQzMztcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgICBpZiAocG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpKVxuICAgICAgICAgICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBfY3VycmVudEhvc3RDb250ZXh0KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gICAgICAgICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBfY3VycmVudEhvc3RDb250ZXh0LmFuY2VzdG9ySW5mbyk7XG4gICAgICAgICAgICAgIF9jdXJyZW50SG9zdENvbnRleHQgPSBfY3VycmVudEhvc3RDb250ZXh0LmNvbnRleHQ7XG4gICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihuZXh0UmVzb3VyY2UpO1xuICAgICAgICAgICAgICBzd2l0Y2ggKF9jdXJyZW50SG9zdENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb250ZXh0TmFtZXNwYWNlU3ZnOlxuICAgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAgICAgICAgICAgU1ZHX05BTUVTUEFDRSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbnRleHROYW1lc3BhY2VNYXRoOlxuICAgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAgICAgICAgICAgTUFUSF9OQU1FU1BBQ0UsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdmdcIjpcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBuZXh0UmVzb3VyY2UuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICAgICAgICAgICAgICAgU1ZHX05BTUVTUEFDRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IG5leHRSZXNvdXJjZS5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVRIX05BTUVTUEFDRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgZGlkV2FyblNjcmlwdFRhZ3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2NyaXB0RGF0YUJsb2NrKG5ld1Byb3BzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiRW5jb3VudGVyZWQgYSBzY3JpcHQgdGFnIHdoaWxlIHJlbmRlcmluZyBSZWFjdCBjb21wb25lbnQuIFNjcmlwdHMgaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMgYXJlIG5ldmVyIGV4ZWN1dGVkIHdoZW4gcmVuZGVyaW5nIG9uIHRoZSBjbGllbnQuIENvbnNpZGVyIHVzaW5nIHRlbXBsYXRlIHRhZyBpbnN0ZWFkIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGVtcGxhdGUpLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZFdhcm5TY3JpcHRUYWdzID0gITApKTtcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UuaW5uZXJIVE1MID0gXCI8c2NyaXB0PlxceDNjL3NjcmlwdD5cIjtcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBuZXh0UmVzb3VyY2UucmVtb3ZlQ2hpbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UuZmlyc3RDaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5ld1Byb3BzLmlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXM6IG5ld1Byb3BzLmlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXh0UmVzb3VyY2UuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAobmV4dFJlc291cmNlLm11bHRpcGxlID0gITApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ld1Byb3BzLnNpemUgJiYgKG5leHRSZXNvdXJjZS5zaXplID0gbmV3UHJvcHMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgKG5leHRSZXNvdXJjZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3UHJvcHMuaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0UmVzb3VyY2UuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpczogbmV3UHJvcHMuaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5leHRSZXNvdXJjZS5jcmVhdGVFbGVtZW50KHR5cGUpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSB0eXBlLmluZGV4T2YoXCItXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8JXMgLz4gaXMgdXN
15852pbmcgaW5jb3JyZWN0IGNhc2luZy4gVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsIG9yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIltvYmplY3QgSFRNTFVua25vd25FbGVtZW50XVwiICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXh0UmVzb3VyY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gITApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlRoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5leHRSZXNvdXJjZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgICBuZXh0UmVzb3VyY2VbaW50ZXJuYWxQcm9wc0tleV0gPSBuZXdQcm9wcztcbiAgICAgICAgICAgICAgYTogZm9yIChcbiAgICAgICAgICAgICAgICBfY3VycmVudEhvc3RDb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gX2N1cnJlbnRIb3N0Q29udGV4dDtcblxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICA1ID09PSBfY3VycmVudEhvc3RDb250ZXh0LnRhZyB8fFxuICAgICAgICAgICAgICAgICAgNiA9PT0gX2N1cnJlbnRIb3N0Q29udGV4dC50YWdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UuYXBwZW5kQ2hpbGQoX2N1cnJlbnRIb3N0Q29udGV4dC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgNCAhPT0gX2N1cnJlbnRIb3N0Q29udGV4dC50YWcgJiZcbiAgICAgICAgICAgICAgICAgIDI3ICE9PSBfY3VycmVudEhvc3RDb250ZXh0LnRhZyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gX2N1cnJlbnRIb3N0Q29udGV4dC5jaGlsZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgX2N1cnJlbnRIb3N0Q29udGV4dC5jaGlsZC5yZXR1cm4gPSBfY3VycmVudEhvc3RDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgX2N1cnJlbnRIb3N0Q29udGV4dCA9IF9jdXJyZW50SG9zdENvbnRleHQuY2hpbGQ7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9jdXJyZW50SG9zdENvbnRleHQgPT09IHdvcmtJblByb2dyZXNzKSBicmVhayBhO1xuICAgICAgICAgICAgICAgIGZvciAoOyBudWxsID09PSBfY3VycmVudEhvc3RDb250ZXh0LnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBudWxsID09PSBfY3VycmVudEhvc3RDb250ZXh0LnJldHVybiB8fFxuICAgICAgICAgICAgICAgICAgICBfY3VycmVudEhvc3RDb250ZXh0LnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgIF9jdXJyZW50SG9zdENvbnRleHQgPSBfY3VycmVudEhvc3RDb250ZXh0LnJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRIb3N0Q29udGV4dC5zaWJsaW5nLnJldHVybiA9IF9jdXJyZW50SG9zdENvbnRleHQucmV0dXJuO1xuICAgICAgICAgICAgICAgIF9jdXJyZW50SG9zdENvbnRleHQgPSBfY3VycmVudEhvc3RDb250ZXh0LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbmV4dFJlc291cmNlO1xuICAgICAgICAgICAgICBhOiBzd2l0Y2ggKFxuICAgICAgICAgICAgICAgIChzZXRJbml0aWFsUHJvcGVydGllcyhuZXh0UmVzb3VyY2UsIHR5cGUsIG5ld1Byb3BzKSwgdHlwZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gISFuZXdQcm9wcy5hdXRvRm9jdXM7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gITA7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBuZXdQcm9wcyA9ICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJj0gLTMzNTU0NDMzO1xuICAgICAgICAgIHByZWxvYWRJbnN0YW5jZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgPyBudWxsIDogY3VycmVudC5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICAgI
15852HJldHVybiBudWxsO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgbnVsbCAhPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpXG4gICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgbmV3UHJvcHMgJiZcbiAgICAgICAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY3VycmVudCA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgICAgICAgICAgIHJlbmRlckxhbmVzID0gZ2V0SG9zdENvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgICB0eXBlID0gIWRpZFN1c3BlbmRPckVycm9yREVWO1xuICAgICAgICAgICAgICBuZXdQcm9wcyA9IG51bGw7XG4gICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbmV4dFJlc291cmNlKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dFJlc291cmNlLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCh0eXBlID0gZGlmZkh5ZHJhdGVkVGV4dEZvckRldldhcm5pbmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnVpbGRIeWRyYXRpb25EaWZmTm9kZSh3b3JrSW5Qcm9ncmVzcywgMCkuc2VydmVyUHJvcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgKG5ld1Byb3BzID0gbmV4dFJlc291cmNlLm1lbW9pemVkUHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICgodHlwZSA9IGRpZmZIeWRyYXRlZFRleHRGb3JEZXZXYXJuaW5ncyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWxkSHlkcmF0aW9uRGlmZk5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLnNlcnZlclByb3BzID0gdHlwZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3VycmVudFtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAgICAgICBjdXJyZW50Lm5vZGVWYWx1ZSA9PT0gcmVuZGVyTGFuZXMgfHxcbiAgICAgICAgICAgICAgICAobnVsbCAhPT0gbmV3UHJvcHMgJiZcbiAgICAgICAgICAgICAgICAgICEwID09PSBuZXdQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGN1cnJlbnQubm9kZVZhbHVlLCByZW5kZXJMYW5lcylcbiAgICAgICAgICAgICAgICAgID8gITBcbiAgICAgICAgICAgICAgICAgIDogITE7XG4gICAgICAgICAgICAgIGN1cnJlbnQgfHwgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKHdvcmtJblByb2dyZXNzLCAhMCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgKHR5cGUgPSByZW5kZXJMYW5lcy5hbmNlc3RvckluZm8uY3VycmVudCksXG4gICAgICAgICAgICAgICAgbnVsbCAhPSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0ZVRleHROZXN0aW5nKFxuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZS50YWcsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLmFuY2VzdG9ySW5mby5pbXBsaWNpdFJvb3RTY29wZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudCA9XG4gICAgICAgICAgICAgICAgICBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoY3VycmVudCkuY3JlYXRlVGV4dE5vZGUoXG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudFtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgI
15852HJldHVybiBudWxsO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudCB8fCBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgIG5ld1Byb3BzID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHJlbmRlckxhbmVzKSB7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdQcm9wcylcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbCAhPT0gY3VycmVudCA/IGN1cnJlbnQuZGVoeWRyYXRlZCA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KVxuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIGFjdGl2aXR5IGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgKChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPVxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbikpO1xuICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBlbWl0UGVuZGluZ0h5ZHJhdGlvbldhcm5pbmdzKCksXG4gICAgICAgICAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpICYmXG4gICAgICAgICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZCksXG4gICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50cmVlQmFzZUR1cmF0aW9uKSk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSAhMTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAocmVuZGVyTGFuZXMgPSB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgICAgIChjdXJyZW50Lm1lbW9pemVkU3RhdGUuaHlkcmF0aW9uRXJyb3JzID0gcmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIChjdXJyZW50ID0gITApO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NilcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSwgd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCkpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2xpZW50IHJlbmRlcmluZyBhbiBBY3Rpdml0eSBzdXNwZW5kZWQgaXQgYWdhaW4uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgbmV3UHJvcHMgP
15852SB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICAgIChudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gbmV3UHJvcHM7XG4gICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdHlwZSAmJiBudWxsICE9PSB0eXBlLmRlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRSZXNvdXJjZSlcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9XG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBuZXh0UmVzb3VyY2UgPyBuZXh0UmVzb3VyY2UuZGVoeWRyYXRlZCA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0UmVzb3VyY2UpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbmV4dFJlc291cmNlW2ludGVybmFsSW5zdGFuY2VLZXldID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgKCh0eXBlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSB0eXBlLnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgZW1pdFBlbmRpbmdIeWRyYXRpb25XYXJuaW5ncygpLFxuICAgICAgICAgICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KSAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICgodHlwZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgICAgICAgICAgdHlwZSA9ICExO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICh0eXBlID0gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSksXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgICAgICAoY3VycmVudC5tZW1vaXplZFN0YXRlLmh5ZHJhdGlvbkVycm9ycyA9IHR5cGUpLFxuICAgICAgICAgICAgICAgICh0eXBlID0gITApO1xuICAgICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NilcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSwgd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIGlmICgwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJlbmRlckxhbmVzID0gbnVsbCAhPT0gbmV3UHJvcHM7XG4gICAgICAgICAgY3VycmVudCA9IG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgI
15852HJlbmRlckxhbmVzICYmXG4gICAgICAgICAgICAoKG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgKHR5cGUgPSBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IG5ld1Byb3BzLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wgJiZcbiAgICAgICAgICAgICAgKHR5cGUgPSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wucG9vbCksXG4gICAgICAgICAgICAobmV4dFJlc291cmNlID0gbnVsbCksXG4gICAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IG5ld1Byb3BzLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgICAgICAgIChuZXh0UmVzb3VyY2UgPSBuZXdQcm9wcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgICAgIG5leHRSZXNvdXJjZSAhPT0gdHlwZSAmJiAobmV3UHJvcHMuZmxhZ3MgfD0gMjA0OCkpO1xuICAgICAgICAgIHJlbmRlckxhbmVzICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkLmZsYWdzIHw9IDgxOTIpO1xuICAgICAgICAgIHNjaGVkdWxlUmV0cnlFZmZlY3Qod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlKTtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgKChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm9cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA2NzEwODg2NCksXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3BQcm92aWRlcih3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHBvcFN1c3BlbnNlTGlzdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gbmV3UHJvcHMpIHJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgICB0eXBlID0gMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KTtcbiAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBuZXdQcm9wcy5yZW5kZXJpbmc7XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5leHRSZXNvdXJjZSlcbiAgICAgICAgICAgIGlmICh0eXBlKSBjdXRPZmZUYWlsSWZOZWVkZWQobmV3UHJvcHMsICExKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MgfHxcbiAgICAgICAgICAgICAgICAobnVsbCAhPT0gY3VycmVudCAmJiAwICE9PSAoY3VycmVudC5mbGFncyAmIDEyOCkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBmb3IgKGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsgbnVsbCAhPT0gY3VycmVudDsgKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbmV4dFJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEyODtcbiAgICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKG5ld1Byb3BzLCAhMSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0UmVzb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeUVmZmVjdCh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSByZW5kZXJMYW5lcztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHJlbmRlckxhbmVzO1xuXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzKHJlbmRlckxhbmVzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzLnNpYmxpbmcpO1xuICAgICAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VMaXN0Q29udGV4dChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50ICZcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLnRyZWVGb3JrQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgICAgbnVsbCAhPT0gbmV3UHJvcHMudGFpbCAmJlxuICAgICAgICAgICAgICAgIG5vdyQxKCkgPiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lICYmXG4gICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAgICh0eXBlID0gITApLFxuICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChuZXdQcm9wcywgITEpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDQxOTQzMDQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgoY3VycmVudCA9IGZpbmRGaXJzdFN1c3BlbmRlZChuZXh0UmVzb3VyY2UpKSwgbnVsbCAhPT0gY3VycmVudClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAgICAgKHR5cGUgPSAhMCksXG4gICAgICAgICAgICAgICAgICAoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudCksXG4gICAgICAgICAgICAgICAgICBzY2hlZHVsZVJldHJ5RWZmZWN0KHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChuZXdQcm9wcywgITApLFxuICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3UHJvcHMudGFpbCAmJlxuICAgICAgICAgICAgICAgICAgICBcImNvbGxhcHNlZFwiICE9PSBuZXdQcm9wcy50YWlsTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBcInZpc2libGVcIiAhPT0gbmV3UHJvcHMudGFpbE1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgIW5leHRSZXNvdXJjZS5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgIWlzSHlkcmF0aW5nKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIHJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgMiAqIG5vdyQxKCkgLSBuZXdQcm9wcy5yZW5kZXJpbmdTdGFydFRpbWUgPlxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSAmJlxuICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAgICAgKHR5cGUgPSAhMCksXG4gICAgICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQobmV3UHJvcHMsICExKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDQxOTQzMDQpKTtcbiAgICAgICAgICAgIG5ld1Byb3BzLmlzQmFja3dhcmRzXG4gICAgICAgICAgICAgID8gKChuZXh0UmVzb3VyY2Uuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXh0UmVzb3VyY2UpKVxuICAgICAgICAgICAgICA6ICgoY3VycmVudCA9IG5ld1Byb3BzLmxhc3QpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgID8gKGN1cnJlbnQuc2libGluZyA9IG5leHRSZXNvdXJjZSlcbiAgICAgICAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFJlc291cmNlKSxcbiAgICAgICAgICAgICAgICAobmV3UHJvcHMubGFzdCA9IG5leHRSZXNvdXJjZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVsbCAhPT0gbmV3UHJvcHMudGFpbCkge1xuICAgICAgICAgICAgY3VycmVudCA9IG5ld1Byb3BzLnRhaWw7XG4gICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgIGZvciAocmVuZGVyTGFuZXMgPSBjdXJyZW50OyBudWxsICE9PSByZW5kZXJMYW5lczsgKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHJlbmRlckxhbmVzLmFsdGVybmF0ZSkge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgPSAhMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXMuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyA9ICEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3UHJvcHMucmVuZGVyaW5nID0gY3VycmVudDtcbiAgICAgICAgICAgIG5ld1Byb3BzLnRhaWwgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgICAgICBuZXdQcm9wcy5yZW5kZXJpbmdTdGFydFRpbWUgPSBub3ckMSgpO1xuICAgICAgICAgICAgY3VycmVudC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IHR5cGVcbiAgICAgICAgICAgICAgPyAobmV4dFJlc291cmNlICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2spIHxcbiAgICAgICAgICAgICAgICBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgICAgICAgICAgOiBuZXh0UmVzb3VyY2UgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbiAgICAgICAgICAgIFwidmlzaWJsZVwiID09PSBuZXdQcm9wcy50YWlsTW9kZSB8fFxuICAgICAgICAgICAgXCJjb2xsYXBzZWRcIiA9PT0gbmV3UHJvcHMudGFpbE1vZGUgfHxcbiAgICAgICAgICAgICFyZW5kZXJMYW5lcyB8fFxuICAgICAgICAgICAgaXNIeWRyYXRpbmdcbiAgICAgICAgICAgICAgPyBwdXNoU3VzcGVuc2VMaXN0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFJlc291cmNlKVxuICAgICAgICAgICAgICA6ICgocmVuZGVyTGFuZXMgPSBuZXh0UmVzb3VyY2UpLFxuICAgICAgICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAgICAgICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvcixcbiAgICAgICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5ICYmIChzaGVsbEJvdW5kYXJ5ID0gd29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMudHJlZUZvcmtDb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBwb3BIaWRkZW5Db250ZXh0KHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChuZXdQcm9wcyA9IG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgICAgICA/IChudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpICE9PSBuZXdQcm9wcyAmJlxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKVxuICAgICAgICAgICAgICA6IG5ld1Byb3BzICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKSxcbiAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICAgID8gMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSAmJlxuICAgICAgICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCkgJiZcbiAgICAgICAgICAgICAgICAoYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgNiAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDgxOTIpKVxuICAgICAgICAgICAgICA6IGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeUVmZmVjdCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMucmV0cnlRdWV1ZSksXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMgPSBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wgJiZcbiAgICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgICAgIChuZXdQcm9wcyA9IG51bGwpLFxuICAgICAgICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCAmJlxuICAgICAgICAgICAgICAobmV3UHJvcHMgP
15852SB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgICAgIG5ld1Byb3BzICE9PSByZW5kZXJMYW5lcyAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMjA0OCksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMgPSBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgKHJlbmRlckxhbmVzID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlKSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUuY2FjaGUgIT09IHJlbmRlckxhbmVzICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4KSxcbiAgICAgICAgICAgIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDMzNTU0NDMyKSxcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgK1xuICAgICAgICAgIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgICAgIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgICAgIDAgIT09IChjdXJyZW50ICYgNjU1MzYpICYmIDAgPT09IChjdXJyZW50ICYgMTI4KVxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcmV0dXJuIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICBpZiAobnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcbiAgICAgICAgICByZXR1cm4gY3VycmVudCAmIDY1NTM2XG4gICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5kZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1
15852ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLmZsYWdzID0gKGN1cnJlbnQgJiAtNjU1MzcpIHwgMTI4KSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcG9wU3VzcGVuc2VMaXN0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgICAgIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAgIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgKChjdXJyZW50LnJlbmRlcmluZyA9IG51bGwpLCAoY3VycmVudC50YWlsID0gbnVsbCkpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICByZXR1cm4gcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MpLCBudWxsO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcG9wSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MpLFxuICAgICAgICAgICAgY3VycmVudCAmIDY1NTM2XG4gICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IChjdXJyZW50ICYgLTY1NTM3KSB8IDEyOCksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmV0dXJuIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpLCBudWxsO1xuICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrKSB7XG4gICAgICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBwb3BQcm92aWRlcihDYWNoZUNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICBudWxsICE9PSBpbnRlcnJ1cHRlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcG9wU3VzcGVuc2VMaXN0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHBvcFByb3ZpZGVyKGludGVycnVwdGVkV29yay50eXBlLCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIHBvcEhpZGRlbkNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUsIGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcG9wUHJvdmlkZXIoQ2FjaGVDb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRQcm9maWxlKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiAoY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvb2tMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgaG9va0ZsYWdzKSB7XG4gICAgICBzaG91bGRQcm9maWxlKGZpbmlzaGVkV29yaylcbiAgICAgICAgPyAoc3RhcnRFZmZlY3RUaW1lcigpLFxuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoaG9va0ZsYWdzLCBmaW5pc2hlZFdvcmspLFxuICAgICAgICAgI
15852HJlY29yZEVmZmVjdER1cmF0aW9uKCkpXG4gICAgICAgIDogY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChob29rRmxhZ3MsIGZpbmlzaGVkV29yayk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvb2tMYXlvdXRVbm1vdW50RWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBob29rRmxhZ3NcbiAgICApIHtcbiAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgaG9va0ZsYWdzLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvclxuICAgICAgICAgICksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gICAgICAgICAgICBob29rRmxhZ3MsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUsXG4gICAgICAgICAgbGFzdEVmZmVjdCA9IG51bGwgIT09IHVwZGF0ZVF1ZXVlID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG4gICAgICAgIGlmIChudWxsICE9PSBsYXN0RWZmZWN0KSB7XG4gICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgIHVwZGF0ZVF1ZXVlID0gZmlyc3RFZmZlY3Q7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAodXBkYXRlUXVldWUudGFnICYgZmxhZ3MpID09PSBmbGFncyAmJlxuICAgICAgICAgICAgICAoKGxhc3RFZmZlY3QgPSB2b2lkIDApLFxuICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9ICEwKSxcbiAgICAgICAgICAgICAgKGxhc3RFZmZlY3QgPSBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY2FsbENyZWF0ZUluREVWLFxuICAgICAgICAgICAgICAgIHVwZGF0ZVF1ZXVlXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9ICExKSxcbiAgICAgICAgICAgICAgdm9pZCAwICE9PSBsYXN0RWZmZWN0ICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGxhc3RFZmZlY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICBob29rTmFtZSA9XG4gICAgICAgICAgICAgICAgMCAhPT0gKHVwZGF0ZVF1ZXVlLnRhZyAmIExheW91dClcbiAgICAgICAgICAgICAgICAgID8gXCJ1c2VMYXlvdXRFZmZlY3RcIlxuICAgICAgICAgICAgICAgICAgOiAwICE9PSAodXBkYXRlUXVldWUudGFnICYgSW5zZXJ0aW9uKVxuICAgICAgICAgICAgICAgICAgICA/IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInVzZUVmZmVjdFwiO1xuICAgICAgICAgICAgICB2Y
15852XIgYWRkZW5kdW0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID1cbiAgICAgICAgICAgICAgICBudWxsID09PSBsYXN0RWZmZWN0XG4gICAgICAgICAgICAgICAgICA/IFwiIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuIHVwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS5cIlxuICAgICAgICAgICAgICAgICAgOiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsYXN0RWZmZWN0LnRoZW5cbiAgICAgICAgICAgICAgICAgICAgPyBcIlxcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBob29rTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgXCIoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuIEluc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIGhvb2tOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICBcIigoKSA9PiB7XFxuICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4gICAgLy8gLi4uXFxuICB9XFxuICBmZXRjaERhdGEoKTtcXG59LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5MZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9ob29rcy1kYXRhLWZldGNoaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIiBZb3UgcmV0dXJuZWQ6IFwiICsgbGFzdEVmZmVjdDtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChuLCBhKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIiVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sIHdoaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzXCIsXG4gICAgICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgICAgIGFcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICAgICAgICBhZGRlbmR1bVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZS5uZXh0O1xuICAgICAgICAgIH0gd2hpbGUgKHVwZGF0ZVF1ZXVlICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gICAgICBmbGFncyxcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3JcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSxcbiAgICAgICAgICBsYXN0RWZmZWN0ID0gbnVsbCAhPT0gdXBkYXRlUXVldWUgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcbiAgICAgICAgaWYgKG51bGwgIT09IGxhc3RFZmZlY3QpIHtcbiAgICAgICAgICB2Y
15852XIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICAgICAgdXBkYXRlUXVldWUgPSBmaXJzdEVmZmVjdDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoKHVwZGF0ZVF1ZXVlLnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgICAgICAgdmFyIGluc3QgPSB1cGRhdGVRdWV1ZS5pbnN0LFxuICAgICAgICAgICAgICAgIGRlc3Ryb3kgPSBpbnN0LmRlc3Ryb3k7XG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gZGVzdHJveSAmJlxuICAgICAgICAgICAgICAgICgoaW5zdC5kZXN0cm95ID0gdm9pZCAwKSxcbiAgICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgICAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gITApLFxuICAgICAgICAgICAgICAgIChsYXN0RWZmZWN0ID0gZmluaXNoZWRXb3JrKSxcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGxhc3RFZmZlY3QsXG4gICAgICAgICAgICAgICAgICBjYWxsRGVzdHJveUluREVWLFxuICAgICAgICAgICAgICAgICAgbGFzdEVmZmVjdCxcbiAgICAgICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgICAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gITEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWUubmV4dDtcbiAgICAgICAgICB9IHdoaWxlICh1cGRhdGVRdWV1ZSAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SG9va1Bhc3NpdmVNb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrLCBob29rRmxhZ3MpIHtcbiAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChob29rRmxhZ3MsIGZpbmlzaGVkV29yayksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGhvb2tGbGFncywgZmluaXNoZWRXb3JrKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SG9va1Bhc3NpdmVVbm1vdW50RWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBob29rRmxhZ3NcbiAgICApIHtcbiAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgaG9va0ZsYWdzLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvclxuICAgICAgICAgICksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gICAgICAgICAgICBob29rRmxhZ3MsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0Q2xhc3NDYWxsYmFja3MoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICBpZiAobnVsbCAhPT0gdXBkYXRlUXVldWUpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUuZGVmYXVsdFByb3BzIHx8XG4gICAgICAgICAgXCJyZWZcIiBpbiBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyB8fFxuICAgICAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgfHxcbiAgICAgICAgICAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuIFRoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIixcbiAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8IFwiaW5zdGFuY2VcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSBhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiLFxuICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgXCJpbnN0YW5jZVwiXG4gICAgICAgICAgICApKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdENhbGxiYWNrcyxcbiAgICAgICAgICAgIHVwZGF0ZVF1ZXVlLFxuICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXMoaW5zdGFuY2UsIHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRDbGFzc1NuYXBzaG90KGZpbmlzaGVkV29yaywgY3VycmVudCkge1xuICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICBmaW5pc2hlZFdvcmsudHlwZS5kZWZhdWx0UHJvcHMgfHxcbiAgICAgICAgXCJyZWZcIiBpbiBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyB8fFxuICAgICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzIHx8XG4gICAgICAgIChjdXJyZW50LnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSBhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8IFwiaW5zdGFuY2VcIlxuICAgICAgICAgICksXG4gICAgICAgIGN1cnJlbnQuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlLiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgXCJpbnN0YW5jZVwiXG4gICAgICAgICAgKSk7XG4gICAgICB0cnkge1xuICAgICAgICB2Y
15852XIgcmVzb2x2ZWRQcmV2UHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICAgICAgICBwcmV2UHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHNuYXBzaG90ID0gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgIGNhbGxHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXMsXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICByZXNvbHZlZFByZXZQcm9wcyxcbiAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgKTtcbiAgICAgICAgcHJldlByb3BzID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG4gICAgICAgIHZvaWQgMCAhPT0gc25hcHNob3QgfHxcbiAgICAgICAgICBwcmV2UHJvcHMuaGFzKGZpbmlzaGVkV29yay50eXBlKSB8fFxuICAgICAgICAgIChwcmV2UHJvcHMuYWRkKGZpbmlzaGVkV29yay50eXBlKSxcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihmaW5pc2hlZFdvcmssIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKTogQSBzbmFwc2hvdCB2YWx1ZSAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLlwiLFxuICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjdXJyZW50Ll9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBpbnN0YW5jZVxuICAgICkge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgY3VycmVudC50eXBlLFxuICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICk7XG4gICAgICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNob3VsZFByb2ZpbGUoY3VycmVudClcbiAgICAgICAgPyAoc3RhcnRFZmZlY3RUaW1lcigpLFxuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudEluREVWLFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRJbkRFVixcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcbiAgICAgIGlmIChudWxsICE9PSByZWYpIHtcbiAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgaW5zdGFuY2VUb1VzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSBpbnN0YW5jZVRvVXNlLnJlZiB8fCBpbnN0YW5jZVRvVXNlLnJlZi5uYW1lICE9PSBuYW1lKVxuICAgICAgICAgICAgICBpbnN0YW5jZVRvVXNlLnJlZiA9IGNyZWF0ZVZpZXdUcmFuc2l0aW9uSW5zdGFuY2UobmFtZSk7XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2VUb1VzZS5yZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlICYmXG4gICAgICAgICAgICAgICgoaW5zdGFuY2VUb1VzZSA9IG5ldyBGcmFnbWVudEluc3RhbmNlKGZpbmlzaGVkV29yaykpLFxuICAgICAgICAgICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgYWRkRnJhZ21lbnRIYW5kbGVUb0ZpYmVyLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlVG9Vc2VcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBpbnN0YW5jZVRvVXNlKSk7XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmVmKVxuICAgICAgICAgIGlmIChzaG91bGRQcm9maWxlKGZpbmlzaGVkV29yaykpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgICAgICAgKGZpbmlzaGVkV29yay5yZWZDbGVhbnVwID0gcmVmKGluc3RhbmNlVG9Vc2UpKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZEVmZmVjdER1cmF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBmaW5pc2hlZFdvcmsucmVmQ2xlYW51cCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiByZWZcbiAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcIlN0cmluZyByZWZzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLlwiKVxuICAgICAgICAgICAgOiByZWYuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50XCIpIHx8XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiBVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS5cIixcbiAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaylcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChyZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoY3VycmVudCwgY29tbWl0QXR0YWNoUmVmLCBjdXJyZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgICAgIHZhciByZWYgPSBjdXJyZW50LnJlZixcbiAgICAgICAgcmVmQ2xlYW51cCA9IGN1cnJlbnQucmVmQ2xlYW51cDtcbiAgICAgIGlmIChudWxsICE9PSByZWYpXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWZDbGVhbnVwKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUHJvZmlsZShjdXJyZW50KSlcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydEVmZmVjdFRpbWVyKCksIHJ1bldpdGhGaWJlckluREVWKGN1cnJlbnQsIHJlZkNsZWFudXApO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHJ1bldpdGhGaWJlckluREVWKGN1cnJlbnQsIHJlZkNsZWFudXApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIChjdXJyZW50LnJlZkNsZWFudXAgPSBudWxsKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50LmFsdGVybmF0ZSksXG4gICAgICAgICAgICAgIG51bGwgIT0gY3VycmVudCAmJiAoY3VycmVudC5yZWZDbGVhbnVwID0gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWYpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRQcm9maWxlKGN1cnJlbnQpKVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgI
15852HN0YXJ0RWZmZWN0VGltZXIoKSwgcnVuV2l0aEZpYmVySW5ERVYoY3VycmVudCwgcmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBydW5XaXRoRmliZXJJbkRFVihjdXJyZW50LCByZWYsIG51bGwpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yJDgpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDgpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdFByb2ZpbGVyKFxuICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgY3VycmVudCxcbiAgICAgIGNvbW1pdFN0YXJ0VGltZSxcbiAgICAgIGVmZmVjdER1cmF0aW9uXG4gICAgKSB7XG4gICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICBvbkNvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vbkNvbW1pdDtcbiAgICAgIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblJlbmRlcjtcbiAgICAgIGN1cnJlbnQgPSBudWxsID09PSBjdXJyZW50ID8gXCJtb3VudFwiIDogXCJ1cGRhdGVcIjtcbiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCAmJiAoY3VycmVudCA9IFwibmVzdGVkLXVwZGF0ZVwiKTtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9maW5pc2hlZFdvcmskbWVtb2l6ZSAmJlxuICAgICAgICBfZmluaXNoZWRXb3JrJG1lbW9pemUoXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sXG4gICAgICAgICAgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sXG4gICAgICAgICAgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSxcbiAgICAgICAgICBjb21taXRTdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG9uQ29tbWl0ICYmXG4gICAgICAgIG9uQ29tbWl0KGlkLCBjdXJyZW50LCBlZmZlY3REdXJhdGlvbiwgY29tbWl0U3RhcnRUaW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0UHJvZmlsZXJQb3N0Q29tbWl0SW1wbChcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb21taXRTdGFydFRpbWUsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb25cbiAgICApIHtcbiAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICBmaW5pc2hlZFdvcmsgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLmlkO1xuICAgICAgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25Qb3N0Q29tbWl0O1xuICAgICAgY3VycmVudCA9IG51bGwgPT09IGN1cnJlbnQgPyBcIm1vdW50XCIgOiBcInVwZGF0ZVwiO1xuICAgICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkICYmIChjdXJyZW50ID0gXCJuZXN0ZWQtdXBkYXRlXCIpO1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2ZpbmlzaGVkV29yayRtZW1vaXplMiAmJlxuICAgICAgICBfZmluaXNoZWRXb3JrJG1lbW9pemUyKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICBjb21taXRTdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2VzKGZpYmVyLCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcykge1xuICAgICAgaWYgKFxuICAgICAgICAoNSA9PT0gZmliZXIudGFnIHx8IDI3ID09PSBmaWJlci50YWcgfHwgNiA9PT0gZmliZXIudGFnKSAmJlxuICAgICAgICBudWxsID09PSBmaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICAgIClcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICBjb21taXROZXdDaGlsZFRvRnJhZ21lbnRJbnN0YW5jZShcbiAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgIHBhcmVudEZyYWdtZW50SW5zdGFuY2VzW2ldXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0RnJhZ21lbnRJbnN0YW5jZUluc2VydGlvbkVmZmVjdHMoZmliZXIpIHtcbiAgICAgIGZvciAodmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjsgbnVsbCAhPT0gcGFyZW50OyApIHtcbiAgICAgICAgaXNGcmFnbWVudEluc3RhbmNlUGFyZW50KHBhcmVudCkgJiZcbiAgICAgICAgICBjb21taXROZXdDaGlsZFRvRnJhZ21lbnRJbnN0YW5jZShmaWJlci5zdGF0ZU5vZGUsIHBhcmVudC5zdGF0ZU5vZGUpO1xuICAgICAgICBpZiAoaXNGcmFnbWVudEluc3RhbmNlSG9zdEJvdW5kYXJ5KHBhcmVudCkpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGZpYmVyKSB7XG4gICAgICBmb3IgKHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgIGlzRnJhZ21lbnRJbnN0YW5jZVBhcmVudChwYXJlbnQpICYmXG4gICAgICAgICAgZGVsZXRlQ2hpbGRGcm9tRnJhZ21lbnRJbnN0YW5jZShmaWJlci5zdGF0ZU5vZGUsIHBhcmVudC5zdGF0ZU5vZGUpO1xuICAgICAgICBpZiAoaXNGcmFnbWVudEluc3RhbmNlSG9zdEJvdW5kYXJ5KHBhcmVudCkpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0ZyYWdtZW50SW5zdGFuY2VIb3N0Qm91bmRhcnkoZmliZXIpIHtcbiAgICAgIHJldHVybiA1ID09PSBmaWJlci50YWcgfHwgMyA9PT0gZmliZXIudGFnIHx8IDI3ID09PSBmaWJlci50YWc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzRnJhZ21lbn
15852RJbnN0YW5jZVBhcmVudChmaWJlcikge1xuICAgICAgcmV0dXJuIGZpYmVyICYmIDcgPT09IGZpYmVyLnRhZyAmJiBudWxsICE9PSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvc3RNb3VudChmaW5pc2hlZFdvcmspIHtcbiAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21taXRNb3VudCxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvc3RVcGRhdGUoZmluaXNoZWRXb3JrLCBuZXdQcm9wcywgb2xkUHJvcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21taXRVcGRhdGUsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZSxcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICAgICAgICBvbGRQcm9wcyxcbiAgICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDUgPT09IGZpYmVyLnRhZyB8fFxuICAgICAgICAzID09PSBmaWJlci50YWcgfHxcbiAgICAgICAgMjYgPT09IGZpYmVyLnRhZyB8fFxuICAgICAgICAoMjcgPT09IGZpYmVyLnRhZyAmJiBpc1NpbmdsZXRvblNjb3BlKGZpYmVyLnR5cGUpKSB8fFxuICAgICAgICA0ID09PSBmaWJlci50YWdcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gICAgICBhOiBmb3IgKDs7KSB7XG4gICAgICAgIGZvciAoOyBudWxsID09PSBmaWJlci5zaWJsaW5nOyApIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gZmliZXIucmV0dXJuIHx8IGlzSG9zdFBhcmVudChmaWJlci5yZXR1cm4pKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBmaWJlciA9IGZpYmVyLnJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaWJlci5zaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBmaWJlciA9IGZpYmVyLnNpYmxpbmc7XG4gICAgICAgICAgNSAhPT0gZmliZXIudGFnICYmIDYgIT09IGZpYmVyLnRhZyAmJiAxOCAhPT0gZmliZXIudGFnO1xuXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICgyNyA9PT0gZmliZXIudGFnICYmIGlzU2luZ2xldG9uU2NvcGUoZmliZXIudHlwZSkpIGNvbnRpbnVlIGE7XG4gICAgICAgICAgaWYgKGZpYmVyLmZsYWdzICYgMikgY29udGludWUgYTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gZmliZXIuY2hpbGQgfHwgNCA9PT0gZmliZXIudGFnKSBjb250aW51ZSBhO1xuICAgICAgICAgIGVsc2UgKGZpYmVyLmNoaWxkLnJldHVybiA9IGZpYmVyKSwgKGZpYmVyID0gZmliZXIuY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGZpYmVyLmZsYWdzICYgMikpIHJldHVybiBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoXG4gICAgICBub2RlLFxuICAgICAgYmVmb3JlLFxuICAgICAgcGFyZW50LFxuICAgICAgcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICApIHtcbiAgICAgIHZhciB0YWcgPSBub2RlLnRhZztcbiAgICAgIGlmICg1ID09PSB0YWcgfHwgNiA9PT0gdGFnKVxuICAgICAgICAodGFnID0gbm9kZS5zdGF0ZU5vZGUpLFxuICAgICAgICAgIGJlZm9yZVxuICAgICAgICAgICAgPyAod2FybkZvclJlYWN0Q2hpbGRyZW5Db25mbGljdChwYXJlbnQpLFxuICAgICAgICAgICAgICAoOSA9PT0gcGFyZW50Lm5vZGVUeXBlXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuYm9keVxuICAgICAgICAgICAgICAgIDogXCJIVE1MXCIgPT09IHBhcmVudC5ub2RlTmFtZVxuICAgICAgICAgICAgICAgICAgPyBwYXJlbnQub3duZXJEb2N1bWVudC5ib2R5XG4gICAgICAgICAgICAgICAgICA6IHBhcmVudFxuICAgICAgICAgICAgICApLmluc2VydEJlZm9yZSh0YWcsIGJlZm9yZSkpXG4gICAgICAgICAgICA6ICh3YXJuRm9yUmVhY3RDaGlsZHJlbkNvbmZsaWN0KHBhcmVudCksXG4gICAgICAgICAgICAgIChiZWZvcmUgPVxuICAgICAgICAgICAgICAgIDkgPT09IHBhcmVudC5ub2RlVHlwZVxuICAgICAgICAgICAgICAgICAgPyBwYXJlbnQuYm9keVxuICAgICAgICAgICAgICAgICAgOiBcIkhUTUxcIiA9PT0gcGFyZW50Lm5vZGVOYW1lXG4gICAgICAgICAgICAgICAgICAgID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICAgICAgICA6IHBhcmVudCksXG4gICAgICAgICAgICAgIGJlZm9yZS5hcHBlbmRDaGlsZCh0YWcpLFxuICAgICAgICAgICAgICAodGFnID0gcGFyZW50Ll9yZWFjdFJvb3RDb250YWluZXIpLFxuICAgICAgICAgICAgICAobnVsbCAhPT0gdGFnICYmIHZvaWQgMCAhPT0gdGFnKSB8fFxuICAgICAgICAgICAgICAgIG51bGwgIT09IGJlZm9yZS5vbmNsaWNrIHx8XG4gICAgICAgICAgICAgICAgKGJlZm9yZS5vbmNsaWNrID0gbm9vcCQxKSksXG4gICAgICAgICAgY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2VzKG5vZGUsIHBhcmVudEZyYWdtZW50SW5zdGFuY2VzKSxcbiAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgNCAhPT0gdGFnICYmXG4gICAgICAgICgyNyA9PT0gdGFnICYmXG4gICAgICAgICAgKGNvbW1pdE5ld0NoaWxkVG9GcmFnbWVudEluc3RhbmNlcyhub2RlLCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcyksXG4gICAgICAgICAgKHBhcmVudEZyYWdtZW50SW5zdGFuY2VzID0gbnVsbCksXG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZShub2RlLnR5cGUpICYmXG4gICAgICAgICAgICAoKHBhcmVudCA9IG5vZGUuc3RhdGVOb2RlKSwgKGJlZm9yZSA9IG51bGwpKSksXG4gICAgICAgIChub2RlID0gbm9kZS5jaGlsZCksXG4gICAgICAgIG51bGwgIT09IG5vZGUpXG4gICAgICApXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGcmFnbWVudEluc3RhbmNlc1xuICAgICAgICAgICksXG4gICAgICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgICAgIG51bGwgIT09IG5vZGU7XG5cbiAgICAgICAgKVxuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoXG4gICAgICAgICAgICBub2Rl
15852LFxuICAgICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICAgICAgICApLFxuICAgICAgICAgICAgKG5vZGUgPSBub2RlLnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoXG4gICAgICBub2RlLFxuICAgICAgYmVmb3JlLFxuICAgICAgcGFyZW50LFxuICAgICAgcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICApIHtcbiAgICAgIHZhciB0YWcgPSBub2RlLnRhZztcbiAgICAgIGlmICg1ID09PSB0YWcgfHwgNiA9PT0gdGFnKVxuICAgICAgICAodGFnID0gbm9kZS5zdGF0ZU5vZGUpLFxuICAgICAgICAgIGJlZm9yZSA/IHBhcmVudC5pbnNlcnRCZWZvcmUodGFnLCBiZWZvcmUpIDogcGFyZW50LmFwcGVuZENoaWxkKHRhZyksXG4gICAgICAgICAgY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2VzKG5vZGUsIHBhcmVudEZyYWdtZW50SW5zdGFuY2VzKSxcbiAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgNCAhPT0gdGFnICYmXG4gICAgICAgICgyNyA9PT0gdGFnICYmXG4gICAgICAgICAgKGNvbW1pdE5ld0NoaWxkVG9GcmFnbWVudEluc3RhbmNlcyhub2RlLCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcyksXG4gICAgICAgICAgKHBhcmVudEZyYWdtZW50SW5zdGFuY2VzID0gbnVsbCksXG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZShub2RlLnR5cGUpICYmIChwYXJlbnQgPSBub2RlLnN0YXRlTm9kZSkpLFxuICAgICAgICAobm9kZSA9IG5vZGUuY2hpbGQpLFxuICAgICAgICBudWxsICE9PSBub2RlKVxuICAgICAgKVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGcmFnbWVudEluc3RhbmNlc1xuICAgICAgICAgICksXG4gICAgICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgICAgIG51bGwgIT09IG5vZGU7XG5cbiAgICAgICAgKVxuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGcmFnbWVudEluc3RhbmNlc1xuICAgICAgICAgICksXG4gICAgICAgICAgICAobm9kZSA9IG5vZGUuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBob3N0UGFyZW50RmliZXIsIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50RmliZXI7XG5cbiAgICAgICkge1xuICAgICAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudEZpYmVyKSkge1xuICAgICAgICAgIGhvc3RQYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcGFyZW50RmliZXIgPSBudWxsO1xuICAgICAgZm9yICh2YXIgcGFyZW50ID0gZmluaXNoZWRXb3JrLnJldHVybjsgbnVsbCAhPT0gcGFyZW50OyApIHtcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRJbnN0YW5jZVBhcmVudChwYXJlbnQpKSB7XG4gICAgICAgICAgdmFyIGZyYWdtZW50SW5zdGFuY2UgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgIG51bGwgPT09IHBhcmVudEZpYmVyXG4gICAgICAgICAgICA/IChwYXJlbnRGaWJlciA9IFtmcmFnbWVudEluc3RhbmNlXSlcbiAgICAgICAgICAgIDogcGFyZW50RmliZXIucHVzaChmcmFnbWVudEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGcmFnbWVudEluc3RhbmNlSG9zdEJvdW5kYXJ5KHBhcmVudCkpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgPT0gaG9zdFBhcmVudEZpYmVyKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICApO1xuICAgICAgc3dpdGNoIChob3N0UGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyID0gaG9zdFBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBwYXJlbnQgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIGhvc3RQYXJlbnRGaWJlcixcbiAgICAgICAgICAgIHBhcmVudEZpYmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHBhcmVudCA9IGhvc3RQYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyLmZsYWdzICYgMzIgJiZcbiAgICAgICAgICAgIChyZXNldFRleHRDb250ZW50KHBhcmVudCksIChob3N0UGFyZW50RmliZXIuZmxhZ3MgJj0gLTMzKSk7XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBob3N0UGFyZW50RmliZXIsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGhvc3RQYXJlbnRGaWJlciA9IGhvc3RQYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBwYXJlbnQgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBob3N0UGFyZW50RmliZXIsXG4gICAgICAgICAgICBwYXJlbnRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRIb3N0U2luZ2xldG9uQWNxdWlzaXRpb24oZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgc2luZ2xldG9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSxcbiAgICAgICAgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBhY3F1aXJlU2luZ2xldG9uSW5zdGFuY2UsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgc2luZ2xldG9uLFxuICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNrRW50ZXJWaWV3VHJhbnNpdGlvbnMocGxhY2VtZW50KSB7XG4gICAgICBpZiAoMzAgPT09IHBsYWNlbWVudC50YWcgfHwgMCAhPT0gKHBsYWNlbWVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikpXG4gICAgICAgIHNob3VsZFN0YXJ0Vmlld1RyYW5zaXRpb24gPSAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZVNjb3BlKCkge1xuICAgICAgdmFyIHByZXZDaGlsZHJlbiA9IHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuO1xuICAgICAgdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgcmV0dXJuIHByZXZDaGlsZHJlbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwbHlWaWV3VHJhbnNpdGlvblRvSG9zdEluc3RhbmNlcyhcbiAgICAgIGZpYmVyLFxuICAgICAgbmFtZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNvbGxlY3RNZWFzdXJlbWVudHMsXG4gICAgICBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnNcbiAgICApIHtcbiAgICAgIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4ID0gMDtcbiAgICAgIChuYW1lID0gYXBwbHlWaWV3VHJhbnNpdGlvblRvSG9zdEluc3RhbmNlc1JlY3Vyc2l2ZShcbiAgICAgICAgZmliZXIuY2hpbGQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY29sbGVjdE1lYXN1cmVtZW50cyxcbiAgICAgICAgc3RvcEF0TmVzdGVkVmlld1RyYW5zaXRpb25zXG4gICAgICApKSAmJlxuICAgICAgICBudWxsICE9IGZpYmVyLl9kZWJ1Z1Rhc2sgJiZcbiAgICAgICAgbnVsbCA9PT0gYW5pbWF0aW5nVGFzayAmJlxuICAgICAgICAoYW5pbWF0aW5nVGFzayA9IGZpYmVyLl9kZWJ1Z1Rhc2spO1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXNSZWN1cnNpdmUoXG4gICAgICBjaGlsZCxcbiAgICAgIG5hbWUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjb2xsZWN0TWVhc3VyZW1lbnRzLFxuICAgICAgc3RvcEF0TmVzdGVkVmlld1RyYW5zaXRpb25zXG4gICAgKSB7XG4gICAgICBmb3IgKHZhciBpblZpZXdwb3J0ID0gITE7IG51bGwgIT09IGNoaWxkOyApIHtcbiAgICAgICAgaWYgKDUgPT09IGNoaWxkLnRhZykge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBjaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IGNvbGxlY3RNZWFzdXJlbWVudHMpIHtcbiAgICAgICAgICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVJbnN0YW5jZShfaW5zdGFuY2UpO1xuICAgICAgICAgICAgY29sbGVjdE1lYXN1cmVtZW50cy5wdXNoKG1lYXN1cmVtZW50KTtcbiAgICAgICAgICAgIG1lYXN1cmVtZW50LnZpZXcgJiYgKGluVmlld3BvcnQgPSAhMCk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBpblZpZXdwb3J0IHx8XG4gICAgICAgICAgICAgIChtZWFzdXJlSW5zdGFuY2UoX2luc3RhbmNlKS52aWV3ICYmIChpblZpZXdwb3J0ID0gITApKTtcbiAgICAgICAgICBzaG91bGRTdGFydFZpZXdUcmFuc2l0aW9uID0gITA7XG4gICAgICAgICAgYXBwbHlWaWV3VHJhbnNpdGlvbk5hbWUoXG4gICAgICAgICAgICBfaW5zdGFuY2UsXG4gICAgICAgICAgICAwID09PSB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeFxuICAgICAgICAgICAgICA/IG5hbWVcbiAgICAgICAgICAgICAgOiBuYW1lICsgXCJfXCIgKyB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCxcbiAgICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHgrKztcbiAgICAgICAgfSBlbHNlIGlmICgyMiAhPT0gY2hpbGQudGFnIHx8IG51bGwgPT09IGNoaWxkLm1lbW9pemVkU3RhdGUpXG4gICAgICAgICAgKDMwID09PSBjaGlsZC50YWcgJiYgc3RvcEF0TmVzdGVkVmlld1RyYW5zaXRpb25zKSB8fFxuICAgICAgICAgICAgKGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgIGNoaWxkLmNoaWxkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgIGNvbGxlY3RNZWFzdXJlbWVudHMsXG4gICAgICAgICAgICAgIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAoaW5WaWV3cG9ydCA9ICEwKSk7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBpblZpZXdwb3J0O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMoXG4gICAgICBjaGlsZCxcbiAgICAgIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICkge1xuICAgICAgZm9yICg7IG51bGwgIT09IGNoaWxkOyApIHtcbiAgICAgICAgaWYgKDUgPT09IGNoaWxkLnRhZylcbiAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25OYW1lKGNoaWxkLnN0YXRlTm9kZSwgY2hpbGQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgIGVsc2UgaWYgKDIyICE9PSBjaGlsZC50YWcgfHwgbnVsbCA9PT0gY2hpbGQubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAoMzAgPT09IGNoaWxkLnRhZyAmJiBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnMpIHx8XG4gICAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMoXG4gICAgICAgICAgICAgIGNoaWxkLmNoaWxkLFxuICAgICAgICAgICAgICBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpIHtcbiAgICAgIGlmICgwICE9PSAocGxhY2VtZW50LnN1YnRyZWVGbGFncyAmIDE4ODc0MzY4KSlcbiAgICAgICAgZm9yIChwbGFjZW1lbnQgPSBwbGFjZW1lbnQuY2hpbGQ7IG51bGwgIT09IHBsYWNlbWVudDsgKSB7XG4gICAgICAgICAgaWYgKDIyICE9PSBwbGFjZW1lbnQudGFnIHx8IG51bGwgPT09IHBsYWNlbWVudC5tZW1vaXplZFN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpLFxuICAgICAgICAgICAgICAzMCA9PT0gcGxhY2VtZW50LnRhZyAmJlxuICAgICAgICAgICAgICAgIDAgIT09IChwbGFjZW1lbnQuZmxhZ3MgJiAxODg3NDM2OCkgJiZcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQuc3RhdGVOb2RlLnBhaXJlZClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2Y
15852XIgcHJvcHMgPSBwbGFjZW1lbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJvcHMubmFtZSB8fCBcImF1dG9cIiA9PT0gcHJvcHMubmFtZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiRm91bmQgYSBwYWlyIHdpdGggYW4gYXV0byBuYW1lLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICAgICAgICAgICAgICBwcm9wcyA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKHByb3BzLmRlZmF1bHQsIHByb3BzLnNoYXJlKTtcbiAgICAgICAgICAgICAgXCJub25lXCIgIT09IHByb3BzICYmXG4gICAgICAgICAgICAgICAgKGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXMoXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMocGxhY2VtZW50LmNoaWxkLCAhMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEVudGVyVmlld1RyYW5zaXRpb25zKHBsYWNlbWVudCwgZ2VzdHVyZSkge1xuICAgICAgaWYgKDMwID09PSBwbGFjZW1lbnQudGFnKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHBsYWNlbWVudC5zdGF0ZU5vZGUsXG4gICAgICAgICAgcHJvcHMgPSBwbGFjZW1lbnQubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICBuYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKHByb3BzLCBzdGF0ZSksXG4gICAgICAgICAgY2xhc3NOYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25DbGFzc05hbWUoXG4gICAgICAgICAgICBwcm9wcy5kZWZhdWx0LFxuICAgICAgICAgICAgc3RhdGUucGFpcmVkID8gcHJvcHMuc2hhcmUgOiBwcm9wcy5lbnRlclxuICAgICAgICAgICk7XG4gICAgICAgIFwibm9uZVwiICE9PSBjbGFzc05hbWVcbiAgICAgICAgICA/IGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXMoXG4gICAgICAgICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgPyAoY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpLFxuICAgICAgICAgICAgICBzdGF0ZS5wYWlyZWQgfHxcbiAgICAgICAgICAgICAgICBnZXN0dXJlIHx8XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KHBsYWNlbWVudCwgcHJvcHMub25FbnRlcikpXG4gICAgICAgICAgICA6IHJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhwbGFjZW1lbnQuY2hpbGQsICExKVxuICAgICAgICAgIDogY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICgwICE9PSAocGxhY2VtZW50LnN1YnRyZWVGbGFncyAmIDMzNTU0NDMyKSlcbiAgICAgICAgZm9yIChwbGFjZW1lbnQgPSBwbGFjZW1lbnQuY2hpbGQ7IG51bGwgIT09IHBsYWNlbWVudDsgKVxuICAgICAgICAgIGNvbW1pdEVudGVyVmlld1RyYW5zaXRpb25zKHBsYWNlbWVudCwgZ2VzdHVyZSksXG4gICAgICAgICAgICAocGxhY2VtZW50ID0gcGxhY2VtZW50LnNpYmxpbmcpO1xuICAgICAgZWxzZSBjb21taXRBcHBlYXJpbmdQYWlyVmlld1RyYW5zaXRpb25zKHBsYWNlbWVudCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdERlbGV0ZWRQYWlyVmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyAmJlxuICAgICAgICAwICE9PSBhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMuc2l6ZVxuICAgICAgKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucztcbiAgICAgICAgaWYgKDAgIT09IChkZWxldGlvbi5zdWJ0cmVlRmxhZ3MgJiAxODg3NDM2OCkpXG4gICAgICAgICAgZm9yIChkZWxldGlvbiA9IGRlbGV0aW9uLmNoaWxkOyBudWxsICE9PSBkZWxldGlvbjsgKSB7XG4gICAgICAgICAgICBpZiAoMjIgIT09IGRlbGV0aW9uLnRhZyB8fCBudWxsID09PSBkZWxldGlvbi5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgIGlmICgzMCA9PT0gZGVsZXRpb24udGFnICYmIDAgIT09IChkZWxldGlvbi5mbGFncyAmIDE4ODc0MzY4KSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IGRlbGV0aW9uLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICBuYW1lID0gcHJvcHMubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBuYW1lICYmIFwiYXV0b1wiICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2Y
15852XIgcGFpciA9IHBhaXJzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuc2hhcmVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgXCJub25lXCIgIT09IGNsYXNzTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChhcHBseVZpZXdUcmFuc2l0aW9uVG9Ib3N0SW5zdGFuY2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICExXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoKGNsYXNzTmFtZSA9IGRlbGV0aW9uLnN0YXRlTm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChwYWlyLnBhaXJlZCA9IGNsYXNzTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFzc05hbWUucGFpcmVkID0gcGFpciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlVmlld1RyYW5zaXRpb25FdmVudChkZWxldGlvbiwgcHJvcHMub25TaGFyZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbi5jaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcGFpcnMuc2l6ZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbW1pdERlbGV0ZWRQYWlyVmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0aW9uID0gZGVsZXRpb24uc2libGluZztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEV4aXRWaWV3VHJhbnNpdGlvbnMoZGVsZXRpb24pIHtcbiAgICAgIGlmICgzMCA9PT0gZGVsZXRpb24udGFnKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGRlbGV0aW9uLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgbmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uTmFtZShwcm9wcywgZGVsZXRpb24uc3RhdGVOb2RlKSxcbiAgICAgICAgICBwYWlyID1cbiAgICAgICAgICAgIG51bGwgIT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgICA/IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucy5nZXQobmFtZSlcbiAgICAgICAgICAgICAgOiB2b2lkIDAsXG4gICAgICAgICAgY2xhc3NOYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25DbGFzc05hbWUoXG4gICAgICAgICAgICBwcm9wcy5kZWZhdWx0LFxuICAgICAgICAgICAgdm9pZCAwICE9PSBwYWlyID8gcHJvcHMuc2hhcmUgOiBwcm9wcy5leGl0XG4gICAgICAgICAgKTtcbiAgICAgICAgXCJub25lXCIgIT09IGNsYXNzTmFtZSAmJlxuICAgICAgICAgIChhcHBseVZpZXdUcmFuc2l0aW9uVG9Ib3N0SW5zdGFuY2VzKFxuICAgICAgICAgICAgZGVsZXRpb24sXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICExXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyB2b2lkIDAgIT09IHBhaXJcbiAgICAgICAgICAgICAgPyAoKGNsYXNzTmFtZSA9IGRlbGV0aW9uLnN0YXRlTm9kZSksXG4gICAgICAgICAgICAgICAgKHBhaXIucGFpcmVkID0gY2xhc3NOYW1lKSxcbiAgICAgICAgICAgICAgICAoY2xhc3NOYW1lLnBhaXJlZCA9IHBhaXIpLFxuICAgICAgICAgICAgICAgIGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucy5kZWxldGUobmFtZSksXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KGRlbGV0aW9uLCBwcm9wcy5vblNoYXJlKSlcbiAgICAgICAgICAgICAgOiBzY2hlZHVsZVZpZXdUcmFuc2l0aW9uRXZlbnQoZGVsZXRpb24sIHByb3BzLm9uRXhpdClcbiAgICAgICAgICAgIDogcmVzdG9yZVZpZXdUcmFuc2l0aW9uT25Ib3N0SW5zdGFuY2VzKGRlbGV0aW9uLmNoaWxkLCAhMSkpO1xuICAgICAgICBudWxsICE9PSBhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMgJiZcbiAgICAgICAgICBjb21taXREZWxldGVkUGFpclZpZXdUcmFuc2l0aW9ucyhkZWxldGlvbik7XG4gICAgICB9IGVsc2UgaWYgKDAgIT09IChkZWxldGlvbi5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikpXG4gICAgICAgIGZvciAoZGVsZXRpb24gPSBkZWxldGlvbi5jaGlsZDsgbnVsbCAhPT0gZGVsZXRpb247IClcbiAgICAgICAgICBjb21taXRFeGl0Vmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKSwgKGRlbGV0aW9uID0gZGVsZXRpb24uc2libGluZyk7XG4gICAgICBlbHNlXG4gICAgICAgIG51bGwgIT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyAmJlxuICAgICAgICAgIGNvbW1pdERlbGV0ZWRQYWlyVmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TmVzdGVkVmlld1RyYW5zaXRpb25zKGNoYW5nZWRQYXJlbnQpIHtcbiAgICAgIGZvciAoY2hhbmdlZFBhcmVudCA9IGNoYW5nZWRQYXJlbnQuY2hpbGQ7IG51bGwgIT09IGNoYW5nZWRQYXJlbnQ7ICkge1xuICAgICAgICBpZiAoMzAgPT09IGNoYW5nZWRQYXJlbnQudGFnKSB7XG4gICAgICAgICAgdmFyIHByb3BzID0gY2hhbmdlZFBhcmVudC5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgbmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uTmFtZShwcm9wcywgY2hhbmdlZFBhcmVudC5zdGF0ZU5vZGUpO1xuICAgICAgICAgI
15852HByb3BzID0gZ2V0Vmlld1RyYW5zaXRpb25DbGFzc05hbWUocHJvcHMuZGVmYXVsdCwgcHJvcHMudXBkYXRlKTtcbiAgICAgICAgICBjaGFuZ2VkUGFyZW50LmZsYWdzICY9IC01O1xuICAgICAgICAgIFwibm9uZVwiICE9PSBwcm9wcyAmJlxuICAgICAgICAgICAgYXBwbHlWaWV3VHJhbnNpdGlvblRvSG9zdEluc3RhbmNlcyhcbiAgICAgICAgICAgICAgY2hhbmdlZFBhcmVudCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgIChjaGFuZ2VkUGFyZW50Lm1lbW9pemVkU3RhdGUgPSBbXSksXG4gICAgICAgICAgICAgICExXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAwICE9PSAoY2hhbmdlZFBhcmVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikgJiZcbiAgICAgICAgICAgIGNvbW1pdE5lc3RlZFZpZXdUcmFuc2l0aW9ucyhjaGFuZ2VkUGFyZW50KTtcbiAgICAgICAgY2hhbmdlZFBhcmVudCA9IGNoYW5nZWRQYXJlbnQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzdG9yZVBhaXJlZFZpZXdUcmFuc2l0aW9ucyhwYXJlbnQpIHtcbiAgICAgIGlmICgwICE9PSAocGFyZW50LnN1YnRyZWVGbGFncyAmIDE4ODc0MzY4KSlcbiAgICAgICAgZm9yIChwYXJlbnQgPSBwYXJlbnQuY2hpbGQ7IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgICAgaWYgKDIyICE9PSBwYXJlbnQudGFnIHx8IG51bGwgPT09IHBhcmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoMzAgPT09IHBhcmVudC50YWcgJiYgMCAhPT0gKHBhcmVudC5mbGFncyAmIDE4ODc0MzY4KSkge1xuICAgICAgICAgICAgICB2Y
15852XIgaW5zdGFuY2UgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZS5wYWlyZWQgJiZcbiAgICAgICAgICAgICAgICAoKGluc3RhbmNlLnBhaXJlZCA9IG51bGwpLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhwYXJlbnQuY2hpbGQsICExKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN0b3JlUGFpcmVkVmlld1RyYW5zaXRpb25zKHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc3RvcmVFbnRlck9yRXhpdFZpZXdUcmFuc2l0aW9ucyhmaWJlcikge1xuICAgICAgaWYgKDMwID09PSBmaWJlci50YWcpXG4gICAgICAgIChmaWJlci5zdGF0ZU5vZGUucGFpcmVkID0gbnVsbCksXG4gICAgICAgICAgcmVzdG9yZVZpZXdUcmFuc2l0aW9uT25Ib3N0SW5zdGFuY2VzKGZpYmVyLmNoaWxkLCAhMSksXG4gICAgICAgICAgcmVzdG9yZVBhaXJlZFZpZXdUcmFuc2l0aW9ucyhmaWJlcik7XG4gICAgICBlbHNlIGlmICgwICE9PSAoZmliZXIuc3VidHJlZUZsYWdzICYgMzM1NTQ0MzIpKVxuICAgICAgICBmb3IgKGZpYmVyID0gZmliZXIuY2hpbGQ7IG51bGwgIT09IGZpYmVyOyApXG4gICAgICAgICAgcmVzdG9yZUVudGVyT3JFeGl0Vmlld1RyYW5zaXRpb25zKGZpYmVyKSwgKGZpYmVyID0gZmliZXIuc2libGluZyk7XG4gICAgICBlbHNlIHJlc3RvcmVQYWlyZWRWaWV3VHJhbnNpdGlvbnMoZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXN0b3JlTmVzdGVkVmlld1RyYW5zaXRpb25zKGNoYW5nZWRQYXJlbnQpIHtcbiAgICAgIGZvciAoY2hhbmdlZFBhcmVudCA9IGNoYW5nZWRQYXJlbnQuY2hpbGQ7IG51bGwgIT09IGNoYW5nZWRQYXJlbnQ7IClcbiAgICAgICAgMzAgPT09IGNoYW5nZWRQYXJlbnQudGFnXG4gICAgICAgICAgPyByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMoY2hhbmdlZFBhcmVudC5jaGlsZCwgITEpXG4gICAgICAgICAgOiAwICE9PSAoY2hhbmdlZFBhcmVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikgJiZcbiAgICAgICAgICAgIHJlc3RvcmVOZXN0ZWRWaWV3VHJhbnNpdGlvbnMoY2hhbmdlZFBhcmVudCksXG4gICAgICAgICAgKGNoYW5nZWRQYXJlbnQgPSBjaGFuZ2VkUGFyZW50LnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtZWFzdXJlVmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VzUmVjdXJzaXZlKFxuICAgICAgcGFyZW50Vmlld1RyYW5zaXRpb24sXG4gICAgICBjaGlsZCxcbiAgICAgIG5ld05hbWUsXG4gICAgICBvbGROYW1lLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcHJldmlvdXNNZWFzdXJlbWVudHMsXG4gICAgICBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnNcbiAgICApIHtcbiAgICAgIGZvciAodmFyIGluVmlld3BvcnQgPSAhMTsgbnVsbCAhPT0gY2hpbGQ7ICkge1xuICAgICAgICBpZiAoNSA9PT0gY2hpbGQudGFnKSB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBjaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbnVsbCAhPT0gcHJldmlvdXNNZWFzdXJlbWVudHMgJiZcbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4IDwgcHJldmlvdXNNZWFzdXJlbWVudHMubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2Y
15852XIgcHJldmlvdXNNZWFzdXJlbWVudCA9XG4gICAgICAgICAgICAgICAgcHJldmlvdXNNZWFzdXJlbWVudHNbdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHhdLFxuICAgICAgICAgICAgICBuZXh0TWVhc3VyZW1lbnQgPSBtZWFzdXJlSW5zdGFuY2UoX2luc3RhbmNlMik7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNNZWFzdXJlbWVudC52aWV3IHx8IG5leHRNZWFzdXJlbWVudC52aWV3KVxuICAgICAgICAgICAgICBpblZpZXdwb3J0ID0gITA7XG4gICAgICAgICAgICB2YXIgSlNDb21waWxlcl90ZW1wO1xuICAgICAgICAgICAgaWYgKChKU0NvbXBpbGVyX3RlbXAgPSAwID09PSAocGFyZW50Vmlld1RyYW5zaXRpb24uZmxhZ3MgJiA0KSkpXG4gICAgICAgICAgICAgIGlmIChuZXh0TWVhc3VyZW1lbnQuY2xpcCkgSlNDb21waWxlcl90ZW1wID0gITA7XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9IHByZXZpb3VzTWVhc3VyZW1lbnQucmVjdDtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UmVjdCA9IG5leHRNZWFzdXJlbWVudC5yZWN0O1xuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAueSAhPT0gbmV3UmVjdC55IHx8XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAueCAhPT0gbmV3UmVjdC54IHx8XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAuaGVpZ2h0ICE9PSBuZXdSZWN0LmhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgSlNDb21waWxlcl90ZW1wLndpZHRoICE9PSBuZXdSZWN0LndpZHRoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgJiYgKHBhcmVudFZpZXdUcmFuc2l0aW9uLmZsYWdzIHw9IDQpO1xuICAgICAgICAgICAgbmV4dE1lYXN1cmVtZW50LmFic1xuICAgICAgICAgICAgICA/IChuZXh0TWVhc3VyZW1lbnQgPSAhcHJldmlvdXNNZWFzdXJlbWVudC5hYnMpXG4gICAgICAgICAgICAgIDogKChwcmV2aW91c01lYXN1cmVtZW50ID0gcHJldmlvdXNNZWFzdXJlbWVudC5yZWN0KSxcbiAgICAgICAgICAgICAgICAobmV4dE1lYXN1cmVtZW50ID0gbmV4dE1lYXN1cmVtZW50LnJlY3QpLFxuICAgICAgICAgICAgICAgIChuZXh0TWVhc3VyZW1lbnQgPVxuICAgICAgICAgICAgICAgICAgcHJldmlvdXNNZWFzdXJlbWVudC5oZWlnaHQgIT09IG5leHRNZWFzdXJlbWVudC5oZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzTWVhc3VyZW1lbnQud2lkdGggIT09IG5leHRNZWFzdXJlbWVudC53aWR0aCkpO1xuICAgICAgICAgICAgbmV4dE1lYXN1cmVtZW50ICYmIChwYXJlbnRWaWV3VHJhbnNpdGlvbi5mbGFncyB8PSAzMik7XG4gICAgICAgICAgfSBlbHNlIHBhcmVudFZpZXdUcmFuc2l0aW9uLmZsYWdzIHw9IDMyO1xuICAgICAgICAgIDAgIT09IChwYXJlbnRWaWV3VHJhbnNpdGlvbi5mbGFncyAmIDQpICYmXG4gICAgICAgICAgICBhcHBseVZpZXdUcmFuc2l0aW9uTmFtZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlMixcbiAgICAgICAgICAgICAgMCA9PT0gdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHhcbiAgICAgICAgICAgICAgICA/IG5ld05hbWVcbiAgICAgICAgICAgICAgICA6IG5ld05hbWUgKyBcIl9cIiArIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4LFxuICAgICAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgKGluVmlld3BvcnQgJiYgMCAhPT0gKHBhcmVudFZpZXdUcmFuc2l0aW9uLmZsYWdzICYgNCkpIHx8XG4gICAgICAgICAgICAobnVsbCA9PT0gdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuID0gW10pLFxuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgX2luc3RhbmNlMixcbiAgICAgICAgICAgICAgMCA9PT0gdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHhcbiAgICAgICAgICAgICAgICA/IG9sZE5hbWVcbiAgICAgICAgICAgICAgICA6IG9sZE5hbWUgKyBcIl9cIiArIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4LFxuICAgICAgICAgICAgICBjaGlsZC5tZW1vaXplZFByb3BzXG4gICAgICAgICAgICApKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCsrO1xuICAgICAgICB9IGVsc2UgaWYgKDIyICE9PSBjaGlsZC50YWcgfHwgbnVsbCA9PT0gY2hpbGQubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAzMCA9PT0gY2hpbGQudGFnICYmIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgPyAocGFyZW50Vmlld1RyYW5zaXRpb24uZmxhZ3MgfD0gY2hpbGQuZmxhZ3MgJiAzMilcbiAgICAgICAgICAgIDogbWVhc3VyZVZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgICAgICBwYXJlbnRWaWV3VHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBjaGlsZC5jaGlsZCxcbiAgICAgICAgICAgICAgICBuZXdOYW1lLFxuICAgICAgICAgICAgICAgIG9sZE5hbWUsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgIHByZXZpb3VzTWVhc3VyZW1lbnRzLFxuICAgICAgICAgICAgICAgIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgICApICYmIChpblZpZXdwb3J0ID0gITApO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5WaWV3cG9ydDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWVhc3VyZU5lc3RlZFZpZXdUcmFuc2l0aW9ucyhjaGFuZ2VkUGFyZW50LCBnZXN0dXJlKSB7XG4gICAgICBmb3IgKGNoYW5nZWRQYXJlbnQgPSBjaGFuZ2VkUGFyZW50LmNoaWxkOyBudWxsICE9PSBjaGFuZ2VkUGFyZW50OyApIHtcbiAgICAgICAgaWYgKDMwID09PSBjaGFuZ2VkUGFyZW50LnRhZykge1xuICAgICAgICAgIHZhciBwcm9wcyA9IGNoYW5nZWRQYXJlbnQubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgI
15852HN0YXRlID0gY2hhbmdlZFBhcmVudC5zdGF0ZU5vZGUsXG4gICAgICAgICAgICBuYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKHByb3BzLCBzdGF0ZSksXG4gICAgICAgICAgICBjbGFzc05hbWUgPSBnZXRWaWV3VHJhbnNpdGlvbkNsYXNzTmFtZShwcm9wcy5kZWZhdWx0LCBwcm9wcy51cGRhdGUpO1xuICAgICAgICAgIGlmIChnZXN0dXJlKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHN0YXRlLmNsb25lcztcbiAgICAgICAgICAgIHZhciBwcmV2aW91c01lYXN1cmVtZW50cyA9XG4gICAgICAgICAgICAgIG51bGwgPT09IHN0YXRlID8gbnVsbCA6IHN0YXRlLm1hcChtZWFzdXJlQ2xvbmVkSW5zdGFuY2UpO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgKHByZXZpb3VzTWVhc3VyZW1lbnRzID0gY2hhbmdlZFBhcmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgICAgKGNoYW5nZWRQYXJlbnQubWVtb2l6ZWRTdGF0ZSA9IG51bGwpO1xuICAgICAgICAgIHN0YXRlID0gY2hhbmdlZFBhcmVudDtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBjaGFuZ2VkUGFyZW50LmNoaWxkLFxuICAgICAgICAgICAgbmV3TmFtZSA9IG5hbWU7XG4gICAgICAgICAgdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHggPSAwO1xuICAgICAgICAgIGNsYXNzTmFtZSA9IG1lYXN1cmVWaWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZXNSZWN1cnNpdmUoXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICBwcmV2aW91c01lYXN1cmVtZW50cyxcbiAgICAgICAgICAgICExXG4gICAgICAgICAgKTtcbiAgICAgICAgICAwICE9PSAoY2hhbmdlZFBhcmVudC5mbGFncyAmIDQpICYmXG4gICAgICAgICAgICBjbGFzc05hbWUgJiZcbiAgICAgICAgICAgIChnZXN0dXJlIHx8XG4gICAgICAgICAgICAgIHNjaGVkdWxlVmlld1RyYW5zaXRpb25FdmVudChjaGFuZ2VkUGFyZW50LCBwcm9wcy5vblVwZGF0ZSkpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAwICE9PSAoY2hhbmdlZFBhcmVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikgJiZcbiAgICAgICAgICAgIG1lYXN1cmVOZXN0ZWRWaWV3VHJhbnNpdGlvbnMoY2hhbmdlZFBhcmVudCwgZ2VzdHVyZSk7XG4gICAgICAgIGNoYW5nZWRQYXJlbnQgPSBjaGFuZ2VkUGFyZW50LnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNrTmFtZWRWaWV3VHJhbnNpdGlvbihmaWJlcikge1xuICAgICAgdmFyIG5hbWUgPSBmaWJlci5tZW1vaXplZFByb3BzLm5hbWU7XG4gICAgICBpZiAobnVsbCAhPSBuYW1lICYmIFwiYXV0b1wiICE9PSBuYW1lKSB7XG4gICAgICAgIHZhciBleGlzdGluZyA9IG1vdW50ZWROYW1lZFZpZXdUcmFuc2l0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGV4aXN0aW5nKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhpc3RpbmcgIT09IGZpYmVyICYmXG4gICAgICAgICAgICBleGlzdGluZyAhPT0gZmliZXIuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICAhZGlkV2FybkFib3V0TmFtZVtuYW1lXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TmFtZVtuYW1lXSA9ICEwO1xuICAgICAgICAgICAgdmFyIHN0cmluZ2lmaWVkTmFtZSA9IEpTT04uc3RyaW5naWZ5KG5hbWUpO1xuICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoZXJlIGFyZSB0d28gPFZpZXdUcmFuc2l0aW9uIG5hbWU9JXM+IGNvbXBvbmVudHMgd2l0aCB0aGUgc2FtZSBuYW1lIG1vdW50ZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIFZpZXcgVHJhbnNpdGlvbnMgdG8gZXJyb3IuIFRyeSB0byB1c2UgYSBtb3JlIHVuaXF1ZSBuYW1lIGUuZy4gYnkgdXNpbmcgYSBuYW1lc3BhY2UgcHJlZml4IGFuZCBhZGRpbmcgdGhlIGlkIG9mIGFuIGl0ZW0gdG8gdGhlIG5hbWUuXCIsXG4gICAgICAgICAgICAgICAgc3RyaW5naWZpZWROYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKGV4aXN0aW5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJUaGUgZXhpc3RpbmcgPFZpZXdUcmFuc2l0aW9uIG5hbWU9JXM+IGR1cGxpY2F0ZSBoYXMgdGhpcyBzdGFjayB0cmFjZS5cIixcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZE5hbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIG1vdW50ZWROYW1lZFZpZXdUcmFuc2l0aW9ucy5zZXQobmFtZSwgZmliZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1bnRyYWNrTmFtZWRWaWV3VHJhbnNpdGlvbihmaWJlcikge1xuICAgICAgdmFyIG5hbWUgPSBmaWJlci5tZW1vaXplZFByb3BzLm5hbWU7XG4gICAgICBpZiAobnVsbCAhPSBuYW1lICYmIFwiYXV0b1wiICE9PSBuYW1lKSB7XG4gICAgICAgIHZhciBleGlzdGluZyA9IG1vdW50ZWROYW1lZFZpZXdUcmFuc2l0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIHZvaWQgMCA9PT0gZXhpc3RpbmcgfHxcbiAgICAgICAgICAoZXhpc3RpbmcgIT09IGZpYmVyICYmIGV4aXN0aW5nICE9PSBmaWJlci5hbHRlcm5hdGUpIHx8XG4gICAgICAgICAgbW91bnRlZE5hbWVkVmlld1RyYW5zaXRpb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNIeWRyYXRpbmdQYXJlbnQoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gMzEgPT09IGZpbmlzaGVkV29yay50YWdcbiAgICAgICAgPyAoKGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiYgbnVsbCA9PT0gZmluaXNoZWRXb3JrKVxuICAgICAgICA6IDEzID09PSBmaW5pc2hlZFdvcmsudGFnXG4gICAgICAgICAgPyAoKGN1cnJlbnQgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICAgKGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5kZWh5ZHJhdGVkICYmXG4gICAgICAgICAgICAgIChudWxsID09PSBmaW5pc2hlZFdvcmsgfHwgbnVsbCA9PT0gZmluaXNoZWRXb3JrLmRlaHlkcmF0ZWQ
15852pKVxuICAgICAgICAgIDogMyA9PT0gZmluaXNoZWRXb3JrLnRhZ1xuICAgICAgICAgICAgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkICYmXG4gICAgICAgICAgICAgIDAgPT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAyNTYpXG4gICAgICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmlyc3RDaGlsZCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgICAgIHJvb3QgPSByb290LmNvbnRhaW5lckluZm87XG4gICAgICBldmVudHNFbmFibGVkID0gX2VuYWJsZWQ7XG4gICAgICByb290ID0gZ2V0QWN0aXZlRWxlbWVudERlZXAocm9vdCk7XG4gICAgICBpZiAoaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHJvb3QpKSB7XG4gICAgICAgIGlmIChcInNlbGVjdGlvblN0YXJ0XCIgaW4gcm9vdClcbiAgICAgICAgICB2YXIgSlNDb21waWxlcl90ZW1wID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHJvb3Quc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHJvb3Quc2VsZWN0aW9uRW5kXG4gICAgICAgICAgfTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gcm9vdC5vd25lckRvY3VtZW50KSAmJlxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5kZWZhdWx0VmlldykgfHxcbiAgICAgICAgICAgICAgd2luZG93O1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9XG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5nZXRTZWxlY3Rpb24gJiYgSlNDb21waWxlcl90ZW1wLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiAwICE9PSBzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcbiAgICAgICAgICAgICAgdmFyIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICAgICAgICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZTtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5ub2RlVHlwZSwgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlJDMpIHtcbiAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IDAsXG4gICAgICAgICAgICAgICAgc3RhcnQgPSAtMSxcbiAgICAgICAgICAgICAgICBlbmQgPSAtMSxcbiAgICAgICAgICAgICAgICBpbmRleFdpdGhpbkFuY2hvciA9IDAsXG4gICAgICAgICAgICAgICAgaW5kZXhXaXRoaW5Gb2N1cyA9IDAsXG4gICAgICAgICAgICAgICAgbm9kZSA9IHJvb3QsXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICAgIGI6IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0OyA7ICkge1xuICAgICAgICAgICAgICAgICAgbm9kZSAhPT0gSlNDb21waWxlcl90ZW1wIHx8XG4gICAgICAgICAgICAgICAgICAgICgwICE9PSBhbmNob3JPZmZzZXQgJiYgMyAhPT0gbm9kZS5ub2RlVHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgIG5vZGUgIT09IGZvY3VzTm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICAoMCAhPT0gc2VsZWN0aW9uICYmIDMgIT09IG5vZGUubm9kZVR5cGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlbmQgPSBsZW5ndGggKyBzZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgMyA9PT0gbm9kZS5ub2RlVHlwZSAmJiAobGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpKSBicmVhaztcbiAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSByb290KSBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9PT0gSlNDb21waWxlcl90ZW1wICYmXG4gICAgICAgICAgICAgICAgICAgICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgICAgICAgICAoc3RhcnQgPSBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgIChlbmQgPSBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IChuZXh0ID0gbm9kZS5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgICAgICAgICAgIC0xID09PSBzdGFydCB8fCAtMSA9PT0gZW5kID8gbnVsbCA6IHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgICAgICAgICAgfSBlbHNlIEpTQ29tcGlsZXJfdGVtcCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBKU0NvbXBpbGVyX3RlbXAgfHwgeyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9IGVsc2UgSlNDb21waWxlcl90ZW1wID0gbnVsbDtcbiAgICAgIHNlbGVjdGlvbkluZm9ybWF0aW9uID0ge1xuICAgICAgICBmb2N1c2VkRWxlbTogcm9vdCxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IEpTQ29tcGlsZXJfdGVtcF
15852xuICAgICAgfTtcbiAgICAgIF9lbmFibGVkID0gITE7XG4gICAgICBjb21taXR0ZWRMYW5lcyA9IChjb21taXR0ZWRMYW5lcyAmIDMzNTU0NDA2NCkgPT09IGNvbW1pdHRlZExhbmVzO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgICBmb3IgKGZpcnN0Q2hpbGQgPSBjb21taXR0ZWRMYW5lcyA/IDkyNzAgOiAxMDI0OyBudWxsICE9PSBuZXh0RWZmZWN0OyApIHtcbiAgICAgICAgcm9vdCA9IG5leHRFZmZlY3Q7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gcm9vdC5kZWxldGlvbnMpLCBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXApXG4gICAgICAgIClcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGFuY2hvck9mZnNldCA8IEpTQ29tcGlsZXJfdGVtcC5sZW5ndGg7XG4gICAgICAgICAgICBhbmNob3JPZmZzZXQrK1xuICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzICYmXG4gICAgICAgICAgICAgIGNvbW1pdEV4aXRWaWV3VHJhbnNpdGlvbnMoSlNDb21waWxlcl90ZW1wW2FuY2hvck9mZnNldF0pO1xuICAgICAgICBpZiAobnVsbCA9PT0gcm9vdC5hbHRlcm5hdGUgJiYgMCAhPT0gKHJvb3QuZmxhZ3MgJiAyKSlcbiAgICAgICAgICBjb21taXR0ZWRMYW5lcyAmJiB0cmFja0VudGVyVmlld1RyYW5zaXRpb25zKHJvb3QpLFxuICAgICAgICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKDIyID09PSByb290LnRhZylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChKU0NvbXBpbGVyX3RlbXAgPSByb290LmFsdGVybmF0ZSksIG51bGwgIT09IHJvb3QubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXAgJiZcbiAgICAgICAgICAgICAgICBudWxsID09PSBKU0NvbXBpbGVyX3RlbXAubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzICYmXG4gICAgICAgICAgICAgICAgY29tbWl0RXhpdFZpZXdUcmFuc2l0aW9ucyhKU0NvbXBpbGVyX3RlbXApO1xuICAgICAgICAgICAgICBjb21taXRC
15852ZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIG51bGwgIT09IEpTQ29tcGlsZXJfdGVtcCAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXAubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzICYmIHRyYWNrRW50ZXJWaWV3VHJhbnNpdGlvbnMocm9vdCk7XG4gICAgICAgICAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZShjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9IHJvb3QuY2hpbGQ7XG4gICAgICAgICAgMCAhPT0gKHJvb3Quc3VidHJlZUZsYWdzICYgZmlyc3RDaGlsZCkgJiYgbnVsbCAhPT0gSlNDb21waWxlcl90ZW1wXG4gICAgICAgICAgICA/ICgoSlNDb21waWxlcl90ZW1wLnJldHVybiA9IHJvb3QpLCAobmV4dEVmZmVjdCA9IEpTQ29tcGlsZXJfdGVtcCkpXG4gICAgICAgICAgICA6IChjb21taXR0ZWRMYW5lcyAmJiBjb21taXROZXN0ZWRWaWV3VHJhbnNpdGlvbnMocm9vdCksXG4gICAgICAgICAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZShjb21taXR0ZWRMYW5lcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoXG4gICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUkanNjb21wJDBcbiAgICApIHtcbiAgICAgIGZvciAoOyBudWxsICE9PSBuZXh0RWZmZWN0OyApIHtcbiAgICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmsgPSBmaWJlcixcbiAgICAgICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUkanNjb21wJDAsXG4gICAgICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUsXG4gICAgICAgICAgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAwICE9PSAoZmxhZ3MgJiAxMDI0KSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIGNvbW1pdENsYXNzU25hcHNob3QoZmluaXNoZWRXb3JrLCBjdXJyZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGlmICgwICE9PSAoZmxhZ3MgJiAxMDI0KSlcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID1cbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksXG4gICAgICAgICAgICAgICAgKGZpbmlzaGVkV29yayA9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZS5ub2RlVHlwZSksXG4gICAgICAgICAgICAgICAgOSA9PT0gZmluaXNoZWRXb3JrKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY2xlYXJDb250YWluZXJTcGFyaW5nbHkoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlKTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoMSA9PT0gZmluaXNoZWRXb3JrKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiSEVBRFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIkhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJCT0RZXCI6XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyU3BhcmluZ2x5KGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAoKGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9IGN1cnJlbnQpLFxuICAgICAgICAgICAgICAoY3VycmVudCA9IGZpbmlzaGVkV29yayksXG4gICAgICAgICAgICAgIChmaW5pc2hlZFdvcmsgPSBnZXRWaWV3VHJhbnNpdGlvbk5hbWUoXG4gICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLnN0YXRlTm9kZVxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHMpLFxuICAgICAgICAgICAgICAoY3VycmVudCA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgXCJub25lXCIgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICBhcHBseVZpZXdUcmFuc2l0aW9uVG9Ib3N0SW5zdGFuY2VzKFxuICAgICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUubWVtb2l6ZWRTdGF0ZSA9IFtdKSxcbiAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKDAgIT09IChmbGFncyAmIDEwMjQpKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgI
15852H1cbiAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gZmliZXIuc2libGluZztcbiAgICAgICAgaWYgKG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSkge1xuICAgICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZS5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICB2YXIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKSxcbiAgICAgICAgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIGNvbW1pdEhvb2tMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgTGF5b3V0IHwgSGFzRWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpZiAoZmxhZ3MgJiA0KVxuICAgICAgICAgICAgaWYgKCgoZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSksIG51bGwgPT09IGN1cnJlbnQpKVxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZS5kZWZhdWx0UHJvcHMgfHxcbiAgICAgICAgICAgICAgICBcInJlZlwiIGluIGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzIHx8XG4gICAgICAgICAgICAgICAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyB8fFxuICAgICAgICAgICAgICAgIChmaW5pc2hlZFJvb3QucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkV4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSBjb21wb25lbnREaWRNb3VudC4gVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSBhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiLFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgXCJpbnN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlIGNvbXBvbmVudERpZE1vdW50LiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCBcImluc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICAgICAgICAgICAgPyAoc3RhcnRFZmZlY3RUaW1lcigpLFxuICAgICAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICByZWNvcmRFZmZlY3REdXJhdGlvbigpKVxuICAgICAgICAgICAgICAgICAgOiBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUuZGVmYXVsdFByb3BzIHx8XG4gICAgICAgICAgICAgICAgXCJyZWZcIiBpbiBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyB8fFxuICAgICAgICAgICAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgfHxcbiAgICAgICAgICAgICAgICAoZmluaXNoZWRSb290LnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgY29tcG9uZW50RGlkVXBkYXRlLiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCBcImluc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkVXBkYXRlLiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCBcImluc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICBzaG91bGRQcm9maWxlKGZpbmlzaGVkV29yaylcbiAgICAgICAgICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkVXBkYXRlSW5ERVYsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgI
15852HJlY29yZEVmZmVjdER1cmF0aW9uKCkpXG4gICAgICAgICAgICAgICAgOiBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkVXBkYXRlSW5ERVYsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBmbGFncyAmIDY0ICYmIGNvbW1pdENsYXNzQ2FsbGJhY2tzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA1MTIgJiYgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjdXJyZW50ID0gcHVzaE5lc3RlZEVmZmVjdER1cmF0aW9ucygpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmbGFncyAmIDY0ICYmXG4gICAgICAgICAgICAoKGZsYWdzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlKSwgbnVsbCAhPT0gZmxhZ3MpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmV2UHJvcHMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGZpbmlzaGVkV29yay5jaGlsZClcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGNvbW1pdENhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgICBwcmV2UHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaW5pc2hlZFJvb3QuZWZmZWN0RHVyYXRpb24gKz0gcG9wTmVzdGVkRWZmZWN0RHVyYXRpb25zKGN1cnJlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgICAgY29tbWl0SG9zdFNpbmdsZXRvbkFjcXVpc2l0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpXG4gICAgICAgICAgICBpZiAoZmxhZ3MgJiA0KSBjb21taXRIb3N0TW91bnQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgNjQpIHtcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkSW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBmbGFncyAmIDUxMiAmJiBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBpZiAoZmxhZ3MgJiA0KSB7XG4gICAgICAgICAgICBmbGFncyA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QuZWZmZWN0RHVyYXRpb24gKz0gYnViYmxlTmVzdGVkRWZmZWN0RHVyYXRpb25zKGZsYWdzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXRQcm9maWxlcixcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICBjb21taXRTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LmVmZmVjdER1cmF0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICB9IGVsc2UgcmVjdXJzaXZlbHlUcmF2ZXJzZUxheW91dEVmZmVjdHMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIGNvbW1pdEFjdGl2aXR5SHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA2NCAmJlxuICAgICAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QuZGVoeWRyYXRlZCksXG4gICAgICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkUm9vdCAmJlxuICAgICAgICAgICAgICAgICgoZmxhZ3MgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQoXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoZmluaXNoZWRSb290LCBmbGFncykpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgZmxhZ3MgPVxuICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICAgIGlmICghZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID1cbiAgICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgICAgY3VycmVudCA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgICAgIHByZXZQcm9wcyA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmbGFncztcbiAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgJiZcbiAgICAgICAgICAgICFwcmV2UHJvcHNcbiAgICAgICAgICAgICAgPyAoKGZsYWdzID0gSW5jbHVkZUhvc3RTaW5nbGV0b25zKSxcbiAgICAgICAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIDg3NzIpICYmXG4gICAgICAgICAgICAgICAgICAoZmxhZ3MgfD0gSW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyksXG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGZsYWdzXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgIGxvZ0NvbXBvbmVudFJlYXBwZWFyZWQoXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldlByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICBmbGFncyAmIDE4ODc0MzY4ICYmIHRyYWNrTmFtZWRWaWV3VHJhbnNpdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDUxMiAmJiBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGZsYWdzICYgNTEyICYmIHNhZmVseUF0dGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoKGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgfHwgMC4wNSA8IGNvbXBvbmVudEVmZmVjdER1cmF0aW9uKSAmJlxuICAgICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9yc1xuICAgICAgICAgICksXG4gICAgICAgIG51bGwgPT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsucmV0dXJuICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybi5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAwLjA1IDwgY29tcG9uZW50RWZmZWN0RW5kVGltZSAtIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgIChpc0h5ZHJhdGluZ1BhcmVudChcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4uYWx0ZXJuYXRlLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVyblxuICAgICAgICAgICkgfHxcbiAgICAgICAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICBcIk1vdW50XCJcbiAgICAgICAgICAgICkpKTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3REdXJhdGlvbihwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gcHJldkVmZmVjdEVycm9ycztcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKHBhcmVudEZpYmVyLCBpc0hpZGRlbikge1xuICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbk9uRmliZXIocGFyZW50RmliZXIsIGlzSGlkZGVuKSxcbiAgICAgICAgICAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW5PbkZpYmVyKGZpYmVyLCBpc0hpZGRlbikge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBpc0hpZGRlblxuICAgICAgICAgICAgICA/IHJ1bldpdGhGaWJlckluREVWKGZpYmVyLCBoaWRlSW5zdGFuY2UsIGluc3RhbmNlKVxuICAgICAgICAgICAgICA6IHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgICAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhpZGVPclVuaGlkZU5lYXJlc3RQb3J0YWxzKGZpYmVyLCBpc0hpZGRlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlJGpzY29tcCQwID0gZmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaXNIaWRkZW5cbiAgICAgICAgICAgICAgPyBydW5XaXRoRmliZXJJbkRFVihmaWJlciwgaGlkZVRleHRJbnN0YW5jZSwgaW5zdGFuY2UkanNjb21wJDApXG4gICAgICAgICAgICAgIDogcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlJGpzY29tcCQwLFxuICAgICAgICAgICAgICAgICAgZmliZXIubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2Y
15852XIgaW5zdGFuY2UkanNjb21wJDEgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBpc0hpZGRlblxuICAgICAgICAgICAgICA/IHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICAgICAgICBoaWRlRGVoeWRyYXRlZEJvdW5kYXJ5LFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UkanNjb21wJDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgIHVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeSxcbiAgICAgICAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgbnVsbCA9PT0gZmliZXIubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmliZXIsIGlzSGlkZGVuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaWJlciwgaXNIaWRkZW4pO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlT3JVbmhpZGVOZWFyZXN0UG9ydGFscyhwYXJlbnRGaWJlciwgaXNIaWRkZW4kanNjb21wJDApIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA2NzEwODg2NClcbiAgICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKSB7XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgdmFyIGZpYmVyID0gcGFyZW50RmliZXIsXG4gICAgICAgICAgICAgIGlzSGlkZGVuID0gaXNIaWRkZW4kanNjb21wJDA7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW5PbkZpYmVyKGZpYmVyLCBpc0hpZGRlbik7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICBudWxsID09PSBmaWJlci5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgICAgICBoaWRlT3JVbmhpZGVOZWFyZXN0UG9ydGFscyhmaWJlciwgaXNIaWRkZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaGlkZU9yVW5oaWRlTmVhcmVzdFBvcnRhbHMoZmliZXIsIGlzSGlkZGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmXG4gICAgICAgICgoZmliZXIuYWx0ZXJuYXRlID0gbnVsbCksIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSkpO1xuICAgICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsO1xuICAgICAgNSA9PT0gZmliZXIudGFnICYmXG4gICAgICAgICgoYWx0ZXJuYXRlID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmIGRldGFjaERlbGV0ZWRJbnN0YW5jZShhbHRlcm5hdGUpKTtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBwYXJlbnRcbiAgICApIHtcbiAgICAgIGZvciAocGFyZW50ID0gcGFyZW50LmNoaWxkOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICBwYXJlbnRcbiAgICAgICAgKSxcbiAgICAgICAgICAocGFyZW50ID0gcGFyZW50LnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKFxuICAgICAgZmluaXNoZWRSb290LFxuICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgIGRlbGV0ZWRGaWJlclxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBpbmplY3RlZEhvb2sgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50XG4gICAgICApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yIHx8XG4gICAgICAgICAgICAoKGhhc0xvZ2dlZEVycm9yID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVvXCIsXG4gICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIHZhciBwcmV2RWZmZWN0U3RhcnQgPSBwdXNoQ29tcG9uZW50RWZmZWN0U3RhcnQoKSxcbiAgICAgICAgcHJldkVmZmVjdER1cmF0aW9uID0gcHVzaENvbXBvbmVudEVmZmVjdER1cmF0aW9uKCksXG4gICAgICAgIHByZXZFZmZlY3RFcnJvcnMgPSBwdXNoQ29tcG9uZW50RWZmZWN0RXJyb3JzKCksXG4gICAgICAgIHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZSA9IHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpO1xuICAgICAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICA/IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlLmNvdW50LS1cbiAgICAgICAgICAgIDogZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJlxuICAgICAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmaW5pc2hlZFJvb3QpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudCxcbiAgICAgICAgICAgIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZShkZWxldGVkRmliZXIudHlwZSkgJiZcbiAgICAgICAgICAgICgoaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgKGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExKSk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgcmVsZWFzZVNpbmdsZXRvbkluc3RhbmNlLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlci50eXBlLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLm1lbW9pemVkUHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciksXG4gICAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICA2ID09PSBkZWxldGVkRmliZXIudGFnICYmXG4gICAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgI
15852HByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGlmIChudWxsICE9PSBob3N0UGFyZW50KVxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcilcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQsXG4gICAgICAgICAgICAgICAgICBkZWxldGVkRmliZXIuc3RhdGVOb2RlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkLFxuICAgICAgICAgICAgICAgICAgaG9zdFBhcmVudCxcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKFxuICAgICAgICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIG51bGwgIT09IGhvc3RQYXJlbnQgJiZcbiAgICAgICAgICAgIChob3N0UGFyZW50SXNDb250YWluZXJcbiAgICAgICAgICAgICAgPyAoKGZpbmlzaGVkUm9vdCA9IGhvc3RQYXJlbnQpLFxuICAgICAgICAgICAgICAgIGNsZWFySHlkcmF0aW9uQm91bmRhcnkoXG4gICAgICAgICAgICAgICAgICA5ID09PSBmaW5pc2hlZFJvb3Qubm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgPyBmaW5pc2hlZFJvb3QuYm9keVxuICAgICAgICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBmaW5pc2hlZFJvb3Qubm9kZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICA/IGZpbmlzaGVkUm9vdC5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oZmluaXNoZWRSb290KSlcbiAgICAgICAgICAgICAgOiBjbGVhckh5ZHJhdGlvbkJvdW5kYXJ5KGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITA7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgSW5zZXJ0aW9uLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvclxuICAgICAgICAgICk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgY29tbWl0SG9va0xheW91dFVubW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgIExheW91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAoc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciksXG4gICAgICAgICAgICAocHJldkhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByZXZIb3N0UGFyZW50LmNvbXBvbmVudFdpbGxVbm1vdW50ICYmXG4gICAgICAgICAgICAgI
15852HNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChcbiAgICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgICAgICBwcmV2SG9zdFBhcmVudFxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPVxuICAgICAgICAgICAgKHByZXZIb3N0UGFyZW50ID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgfHxcbiAgICAgICAgICAgIG51bGwgIT09IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgZGVsZXRlZEZpYmVyLmZsYWdzICYgMTg4NzQzNjggJiZcbiAgICAgICAgICAgIHVudHJhY2tOYW1lZFZpZXdUcmFuc2l0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIChkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlID0gcHJldkVmZmVjdERpZFNwYXduVXBkYXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRBY3Rpdml0eUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICAgICAgaWYgKFxuICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUpLFxuICAgICAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdC5tZW1vaXplZFN0YXRlKSwgbnVsbCAhPT0gZmluaXNoZWRSb290KSlcbiAgICAgICkge1xuICAgICAgICBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QuZGVoeWRyYXRlZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQWN0aXZpdHlJbnN0YW5jZSxcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlKSxcbiAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdC5kZWh5ZHJhdGVkKSwgbnVsbCAhPT0gZmluaXNoZWRSb290KSkpXG4gICAgICApXG4gICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3RcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFJldHJ5Q2FjaGUoZmluaXNoZWRXb3JrKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICB2YXIgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgbnVsbCA9PT0gcmV0cnlDYWNoZSAmJlxuICAgICAgICAgICAgKHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmV0cnlDYWNoZTtcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgKHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuX3JldHJ5Q2FjaGUpLFxuICAgICAgICAgICAgbnVsbCA9PT0gcmV0cnlDYWNoZSAmJlxuICAgICAgICAgICAgICAocmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5fcmV0cnlDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKSksXG4gICAgICAgICAgICByZXRyeUNhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiVW5leHBlY3RlZCBTdXNwZW5zZSBoYW5kbGVyIHRhZyAoXCIgK1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudGFnICtcbiAgICAgICAgICAgICAgXCIpLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmssIHdha2VhYmxlcykge1xuICAgICAgdmFyIHJldHJ5Q2FjaGUgPSBnZXRSZXRyeUNhY2hlKGZpbmlzaGVkV29yayk7XG4gICAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KVxuICAgICAgICAgICAgaWYgKG51bGwgIT09IGluUHJvZ3Jlc3NMYW5lcyAmJiBudWxsICE9PSBpblByb2dyZXNzUm9vdClcbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB2Y
15852XIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpO1xuICAgICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMoXG4gICAgICByb290JGpzY29tcCQwLFxuICAgICAgcGFyZW50RmliZXIsXG4gICAgICBsYW5lc1xuICAgICkge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcbiAgICAgIGlmIChudWxsICE9PSBkZWxldGlvbnMpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSByb290JGpzY29tcCQwLFxuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBwYXJlbnRGaWJlcixcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlciA9IGRlbGV0aW9uc1tpXSxcbiAgICAgICAgICAgIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICAgICAgcGFyZW50ID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgYTogZm9yICg7IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICBpZiAoaXNTaW5nbGV0b25TY29wZShwYXJlbnQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITE7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITA7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChudWxsID09PSBob3N0UGFyZW50KVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITE7XG4gICAgICAgICAgKGRlbGV0ZWRGaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgIDAuMDUgPCBjb21wb25lbnRFZmZlY3RFbmRUaW1lIC0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICAgICAgXCJVbm1vdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcG9wQ29tcG9uZW50RWZmZWN0U3RhcnQocHJldkVmZmVjdFN0YXJ0KTtcbiAgICAgICAgICByb290ID0gZGVsZXRlZEZpYmVyO1xuICAgICAgICAgIHJldHVybkZpYmVyID0gcm9vdC5hbHRlcm5hdGU7XG4gICAgICAgICAgbnVsbCAhPT0gcmV0dXJuRmliZXIgJiYgKHJldHVybkZpYmVyLnJldHVybiA9IG51bGwpO1xuICAgICAgICAgIHJvb3QucmV0dXJuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEzODg2KVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihwYXJlbnRGaWJlciwgcm9vdCRqc2NvbXAkMCwgbGFuZXMpLFxuICAgICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgcHJldkVmZmVjdEVycm9ycyA9IHB1c2hDb21wb25lbnRFZmZlY3RFcnJvcnMoKSxcbiAgICAgICAgcHJldkVmZmVjdERpZFNwYXduVXBkYXRlID0gcHVzaENvbXBvbmVudEVmZmVjdERpZFNwYXduVXBkYXRlKCksXG4gICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLFxuICAgICAgICBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICAoKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgKGN1cnJlbnQgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5ldmVudHMgOiBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGN1cnJlbnQubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgI
15852HZhciBfZXZlbnRQYXlsb2FkcyRpaTIgPSBjdXJyZW50W2lpXTtcbiAgICAgICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyLnJlZi5pbXBsID0gX2V2ZW50UGF5bG9hZHMkaWkyLm5leHRJbXBsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICAoY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgICBJbnNlcnRpb24gfCBIYXNFZmZlY3QsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVyblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspLFxuICAgICAgICAgICAgY29tbWl0SG9va0xheW91dFVubW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgIExheW91dCB8IEhhc0VmZmVjdFxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgICAgIGZsYWdzICYgNjQgJiZcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiAmJlxuICAgICAgICAgICAgKChyb290ID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICAgIG51bGwgIT09IHJvb3QgJiZcbiAgICAgICAgICAgICAgKChsYW5lcyA9IHJvb3QuY2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gbGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKGZsYWdzID0gcm9vdC5zaGFyZWQuaGlkZGVuQ2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgICAocm9vdC5zaGFyZWQuaGlkZGVuQ2FsbGJhY2tzID1cbiAgICAgICAgICAgICAgICAgIG51bGwgPT09IGZsYWdzID8gbGFuZXMgOiBmbGFncy5jb25jYXQobGFuZXMpKSkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBpaSA9IGN1cnJlbnRIb2lzdGFibGVSb290O1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA1MTIgJiZcbiAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKSk7XG4gICAgICAgICAgaWYgKGZsYWdzICYgNClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChmbGFncyA9IG51bGwgIT09IGN1cnJlbnQgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsKSxcbiAgICAgICAgICAgICAgKGxhbmVzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gbGFuZXMpXG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpXG4gICAgICAgICAgICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKVxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gY3JlYXRlSG9pc3RhYmxlSW5zdGFuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgcm9vdC5jb250YWluZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICByb290ID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGlpLm93bmVyRG9jdW1lbnQgfHwgaWk7XG4gICAgICAgICAgICAgICAgICAgICAgYjogc3dpdGNoIChyb290KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGl0bGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZsYWdzLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGl0bGVcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY3VycmVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQgPSBmbGFncy5jcmVhdGVFbGVtZW50KHJvb3QpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmhlYWQuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5xdWVyeVNlbGVjdG9yKFwiaGVhZCA+IHRpdGxlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhjdXJyZW50LCByb290LCBsYW5lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSBmaW5pc2hlZFdvcms7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
15852HJvb3QgPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpaSA9IGdldEh5ZHJhdGFibGVIb2lzdGFibGVDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlua1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJocmVmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuZ2V0KHJvb3QgKyAobGFuZXMuaHJlZiB8fCBcIlwiKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiA8IGlpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMisrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnQgPSBpaVtfZXZlbnRQYXlsb2FkcyRpaTJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IGxhbmVzLmhyZWYgfHwgXCJcIiA9PT0gbGFuZXMuaHJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhbmVzLmhyZWYpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBsYW5lcy5yZWwgPyBudWxsIDogbGFuZXMucmVsKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBsYW5lcy50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsYW5lcy50aXRsZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMuY3Jvc3NPcmlnaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFuZXMuY3Jvc3NPcmlnaW4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpLnNwbGljZShfZXZlbnRQYXlsb2FkcyRpaTIsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZmxhZ3MuY3JlYXRlRWxlbWVudChyb290KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoY3VycmVudCwgcm9vdCwgbGFuZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5oZWFkLmFwcGVuZENoaWxkKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWkgPSBnZXRIeWRyYXRhYmxlSG9pc3RhYmxlQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1ldGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udGVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmdldChyb290ICsgKGxhbmVzLmNvbnRlbnQgfHwgXCJcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgPCBpaS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIrK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjdXJyZW50ID0gaWlbX2V2ZW50UGF5bG9hZHMkaWkyXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZXMuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMuY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCIgKyBsYW5lcy5jb250ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IGxhbmVzLm5hbWUgPyBudWxsIDogbGFuZXMubmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcInByb3BlcnR5XCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMucHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFuZXMucHJvcGVydHkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMuaHR0cEVxdWl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhbmVzLmh0dHBFcXVpdikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcImNoYXJzZXRcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBsYW5lcy5jaGFyU2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhbmVzLmNoYXJTZXQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpLnNwbGljZShfZXZlbnRQYXlsb2FkcyRpaTIsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZmxhZ3MuY3JlYXRlRWxlbWVudChyb290KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoY3VycmVudCwgcm9vdCwgbGFuZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5oZWFkLmFwcGVuZENoaWxkKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
15852HRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXROb2Rlc0ZvclR5cGUgZW5jb3VudGVyZWQgYSB0eXBlIGl0IGRpZCBub3QgZXhwZWN0OiBcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50W2ludGVybmFsSW5zdGFuY2VLZXldID0gZmluaXNoZWRXb3JrO1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IHJvb3Q7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuIHx8XG4gICAgICAgICAgICAgICAgICAgIG1vdW50SG9pc3RhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBhY3F1aXJlUmVzb3VyY2UoXG4gICAgICAgICAgICAgICAgICBpaSxcbiAgICAgICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBmbGFncyAhPT0gbGFuZXNcbiAgICAgICAgICAgICAgICA/IChudWxsID09PSBmbGFnc1xuICAgICAgICAgICAgICAgICAgICA/ICgocm9vdCA9IGN1cnJlbnQuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSByb290IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocm9vdCkpXG4gICAgICAgICAgICAgICAgICAgIDogZmxhZ3MuY291bnQtLSxcbiAgICAgICAgICAgICAgICAgIG51bGwgPT09IGxhbmVzXG4gICAgICAgICAgICAgICAgICAgID8gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuIHx8XG4gICAgICAgICAgICAgICAgICAgICAgbW91bnRIb2lzdGFibGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBpaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiBhY3F1aXJlUmVzb3VyY2UoaWksIGxhbmVzLCBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykpXG4gICAgICAgICAgICAgICAgOiBudWxsID09PSBsYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICAgICAgY29tbWl0SG9zdFVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZW1vaXplZFByb3BzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA1MTIgJiZcbiAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKSk7XG4gICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRIb3N0VXBkYXRlKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBpaSA9IG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuID0gITE7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbiA9IGlpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAzMikge1xuICAgICAgICAgICAgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihmaW5pc2hlZFdvcmssIHJlc2V0VGV4dENvbnRlbnQsIHJvb3QpLFxuICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgI
15852H0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIG51bGwgIT0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgKChyb290ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpLFxuICAgICAgICAgICAgY29tbWl0SG9zdFVwZGF0ZShcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcm9vdFxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgZmxhZ3MgJiAxMDI0ICYmXG4gICAgICAgICAgICAoKG5lZWRzRm9ybVJlc2V0ID0gITApLFxuICAgICAgICAgICAgXCJmb3JtXCIgIT09IGZpbmlzaGVkV29yay50eXBlICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbmV4cGVjdGVkIGhvc3QgY29tcG9uZW50IHR5cGUuIEV4cGVjdGVkIGEgZm9ybS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgaWYgKGZsYWdzICYgNCkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcm9vdCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgbGFuZXMgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcm9vdDtcbiAgICAgICAgICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlLFxuICAgICAgICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICAgIHJvb3RcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpaSA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExO1xuICAgICAgICAgIHRhZ0NhY2hlcyA9IG51bGw7XG4gICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyID0gY3VycmVudEhvaXN0YWJsZVJvb3Q7XG4gICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBnZXRIb2lzdGFibGVSb290KHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBjdXJyZW50SG9pc3RhYmxlUm9vdCA9IF9ldmVudFBheWxvYWRzJGlpMjtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWRcbiAgICAgICAgICApXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIsXG4gICAgICAgICAgICAgICAgcm9vdC5jb250YWluZXJJbmZvXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBuZWVkc0Zvcm1SZXNldCAmJlxuICAgICAgICAgICAgKChuZWVkc0Zvcm1SZXNldCA9ICExKSwgcmVjdXJzaXZlbHlSZXNldEZvcm1zKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gcG9wTmVzdGVkRWZmZWN0RHVyYXRpb25zKGlpKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgZmxhZ3MgPSBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgICBjdXJyZW50ID0gcHVzaE11dGF0aW9uQ29udGV4dCgpO1xuICAgICAgICAgIGlpID0gY3VycmVudEhvaXN0YWJsZVJvb3Q7XG4gICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBnZXRIb2lzdGFibGVSb290KFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gaWk7XG4gICAgICAgICAgdmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgJiZcbiAgICAgICAgICAgIGluVXBkYXRlVmlld1RyYW5zaXRpb24gJiZcbiAgICAgICAgICAgIChyb290Vmlld1RyYW5zaXRpb25BZmZlY3RlZCA9ICEwKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9IGN1cnJlbnQ7XG4gICAgICAgICAgb2Zmc2NyZWVuRGlyZWN0UGFyZW50SXNIaWRkZW4gPSBmbGFncztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBmbGFncyA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz1cbiAgICAgICAgICAgIGJ1YmJsZU5lc3RlZEVmZmVjdER1cmF0aW9ucyhmbGFncyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay51cGRhdGV
15852RdWV1ZSksXG4gICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCByb290KSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLmNoaWxkLmZsYWdzICYgODE5MiAmJlxuICAgICAgICAgICAgKG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSAhPT1cbiAgICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSAmJlxuICAgICAgICAgICAgKGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSBub3ckMSgpKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSksXG4gICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCByb290KSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIGlpID0gbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyID1cbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuLFxuICAgICAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuLFxuICAgICAgICAgICAgX3ByZXZPZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjIgPSBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuIHx8IGlpO1xuICAgICAgICAgIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuID1cbiAgICAgICAgICAgIF9wcmV2T2Zmc2NyZWVuRGlyZWN0UGFyZW50SXNIaWRkZW4yIHx8IGlpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPVxuICAgICAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX2V2ZW50UGF5bG9hZHMkaWkyO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuID0gX3ByZXZPZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjI7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgJiZcbiAgICAgICAgICAgICFpaSAmJlxuICAgICAgICAgICAgIXByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gJiZcbiAgICAgICAgICAgICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJlxuICAgICAgICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgIDAuMDUgPCBjb21wb25lbnRFZmZlY3RFbmRUaW1lIC0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICBsb2dDb21wb25lbnRSZWFwcGVhcmVkKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDgxOTIgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgKHJvb3QuX3Zpc2liaWxpdHkgPSBpaVxuICAgICAgICAgICAgICA/IHJvb3QuX3Zpc2liaWxpdHkgJiB+T2Zmc2NyZWVuVmlzaWJsZVxuICAgICAgICAgICAgICA6IHJvb3QuX3Zpc2liaWxpdHkgfCBPZmZzY3JlZW5WaXNpYmxlKSxcbiAgICAgICAgICAgICFpaSB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiB8fFxuICAgICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gfHxcbiAgICAgICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICAoKHJvb3QgPSBJbmNsdWRlSG9zdFNpbmdsZXRvbnMpLFxuICAgICAgICAgICAgICAobGFuZXMgPSBfZXZlbnRQYXlsb2FkcyRpaTIgfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSxcbiAgICAgICAgICAgICAgKF9ldmVudFBheWxvYWRzJGlpMiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pLFxuICAgICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gaWkgfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSxcbiAgICAgICAgICAgICAgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBsYW5lcyksXG4gICAgICAgICAgICAgI
15852HJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCksXG4gICAgICAgICAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgICAgICAwLjA1IDwgY29tcG9uZW50RWZmZWN0RW5kVGltZSAtIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgICAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgXCJEaXNjb25uZWN0XCJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gY3VycmVudCksXG4gICAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gX2V2ZW50UGF5bG9hZHMkaWkyKSksXG4gICAgICAgICAgICAoIWlpICYmIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuKSB8fFxuICAgICAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlpKSk7XG4gICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICAoKHJvb3QgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgbnVsbCAhPT0gcm9vdCAmJlxuICAgICAgICAgICAgICAoKGxhbmVzID0gcm9vdC5yZXRyeVF1ZXVlKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gbGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKHJvb3QucmV0cnlRdWV1ZSA9IG51bGwpLFxuICAgICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCBsYW5lcykpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSksXG4gICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCByb290KSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgICAgIGZsYWdzID0gcHVzaE11dGF0aW9uQ29udGV4dCgpO1xuICAgICAgICAgIGlpID0gaW5VcGRhdGVWaWV3VHJhbnNpdGlvbjtcbiAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgPSAobGFuZXMgJiAzMzU1NDQwNjQpID09PSBsYW5lcztcbiAgICAgICAgICBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgaW5VcGRhdGVWaWV3VHJhbnNpdGlvbiA9XG4gICAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgJiZcbiAgICAgICAgICAgIFwibm9uZVwiICE9PVxuICAgICAgICAgICAgICBnZXRWaWV3VHJhbnNpdGlvbkNsYXNzTmFtZShcbiAgICAgICAgICAgICAgICBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbi51cGRhdGVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgJiZcbiAgICAgICAgICAgIChmaW5pc2hlZFdvcmsuZmxhZ3MgfD0gNCk7XG4gICAgICAgICAgaW5VcGRhdGVWaWV3VHJhbnNpdGlvbiA9IGlpO1xuICAgICAgICAgIHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gZmxhZ3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBmbGFncyAmIDUxMiAmJlxuICAgICAgICAgICAgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pKSxcbiAgICAgICAgICAgIGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgKGN1cnJlbnQuc3RhdGVOb2RlLl9mcmFnbWVudEZpYmVyID0gZmluaXNoZWRXb3JrKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpLFxuICAgICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgKChjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlIHx8IDAuMDUgPCBjb21wb25lbnRFZmZlY3REdXJhdGlvbikgJiZcbiAgICAgICAgICBsb2dDb21wb25lbnRFZmZlY3QoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnNcbiAgICAgICAgICApLFxuICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybiAmJlxuICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5yZXR1cm4uYWx0ZXJuYXRlICYmXG4gICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAoaXNIeWRyYXRpbmdQYXJlbnQoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmsucmV0dXJuLmFsdGVybmF0ZSxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm5cbiAgICAgICAgICApIHx8XG4gICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICAgICAgXCJNb3VudFwiXG4gICAgICAgICAgICApKSk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlID0gcHJldkVmZmVjdERpZFNwYXduVXBkYXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICBpZiAoZmxhZ3MgJiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmluaXNoZWRXb3JrLCBjb21taXRQbGFjZW1lbnQsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IC0zO1xuICAgICAgfVxuICAgICAgZmxhZ3MgJiA0MDk2ICYmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gLTQwOTcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVJlc2V0Rm9ybXMocGFyZW50RmliZXIpIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiAxMDI0KVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApIHtcbiAgICAgICAgICB2YXIgZmliZXIgPSBwYXJlbnRGaWJlcjtcbiAgICAgICAgICByZWN1cnNpdmVseVJlc2V0Rm9ybXMoZmliZXIpO1xuICAgICAgICAgIDUgPT09IGZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgZmliZXIuZmxhZ3MgJiAxMDI0ICYmXG4gICAgICAgICAgICAoKGZpYmVyID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIChfZW5hYmxlZCA9ICEwKSxcbiAgICAgICAgICAgIGZpYmVyLnJlc2V0KCksXG4gICAgICAgICAgICAoX2VuYWJsZWQgPSAhMSkpO1xuICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIpIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA5MjcwKVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgY29tbWl0QWZ0ZXJNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKHBhcmVudEZpYmVyLCByb290KSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpO1xuICAgICAgZWxzZSBtZWFzdXJlTmVzdGVkVmlld1RyYW5zaXRpb25zKHBhcmVudEZpYmVyLCAhMSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEFmdGVyTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50KSBjb21taXRFbnRlclZpZXdUcmFuc2l0aW9ucyhmaW5pc2hlZFdvcmssICExKTtcbiAgICAgIGVsc2VcbiAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcm9vdFZpZXdUcmFuc2l0aW9uTmFtZUNhbmNlbGVkID0gdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCA9ICExO1xuICAgICAgICAgICAgcHVzaFZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZVNjb3BlKCk7XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIGlmICghdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCAmJiAhcm9vdFZpZXdUcmFuc2l0aW9uQWZmZWN0ZWQpIHtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrID0gdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW47XG4gICAgICAgICAgICAgIGlmIChudWxsICE9PSBmaW5pc2hlZFdvcmspXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaW5pc2hlZFdvcmsubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmtbaV07XG4gICAgICAgICAgICAgICAgICB2Y
15852XIgb2xkTmFtZSA9IGZpbmlzaGVkV29ya1tpICsgMV07XG4gICAgICAgICAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25OYW1lKGN1cnJlbnQsIGZpbmlzaGVkV29ya1tpICsgMl0pO1xuICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICB7IG9wYWNpdHk6IFswLCAwXSwgcG9pbnRlckV2ZW50czogW1wibm9uZVwiLCBcIm5vbmVcIl0gfSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwiZm9yd2FyZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkb0VsZW1lbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiOjp2aWV3LXRyYW5zaXRpb24tZ3JvdXAoXCIgKyBvbGROYW1lICsgXCIpXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsgPSByb290LmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayA9XG4gICAgICAgICAgICAgICAgOSA9PT0gZmluaXNoZWRXb3JrLm5vZGVUeXBlXG4gICAgICAgICAgICAgICAgICA/IGZpbmlzaGVkV29yay5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIDogZmluaXNoZWRXb3JrLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsgJiZcbiAgICAgICAgICAgICAgICBcIlwiID09PSBmaW5pc2hlZFdvcmsuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lICYmXG4gICAgICAgICAgICAgICAgKChmaW5pc2hlZFdvcmsuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gXCJub25lXCIpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5hbmltYXRlKFxuICAgICAgICAgICAgICAgICAgeyBvcGFjaXR5OiBbMCwgMF0sIHBvaW50ZXJFdmVudHM6IFtcIm5vbmVcIiwgXCJub25lXCJdIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBcImZvcndhcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgIHBzZXVkb0VsZW1lbnQ6IFwiOjp2aWV3LXRyYW5zaXRpb24tZ3JvdXAocm9vdClcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgICB7IHdpZHRoOiBbMCwgMF0sIGhlaWdodDogWzAsIDBdIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBcImZvcndhcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgIHBzZXVkb0VsZW1lbnQ6IFwiOjp2aWV3LXRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICByb290Vmlld1RyYW5zaXRpb25OYW1lQ2FuY2VsZWQgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBZnRlck11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaSA9IHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQ7XG4gICAgICAgICAgICB2aWV3VHJhbnNpdGlvbkNvbnRleHRDaGFuZ2VkID0gITE7XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQgJiYgKHJvb3RWaWV3VHJhbnNpdGlvbkFmZmVjdGVkID0gITApO1xuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgICAgID8gY29tbWl0RW50ZXJWaWV3VHJhbnNpdGlvbnMoZmluaXNoZWRXb3JrLCAhMSlcbiAgICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VBZnRlck11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBpID0gdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZDtcbiAgICAgICAgICAgIG9sZE5hbWUgPSBwdXNoVmlld1RyYW5zaXRpb25DYW5jZWxhYmxlU2NvcGUoKTtcbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQgPSAhMTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBZnRlck11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCAmJiAoZmluaXNoZWRXb3JrLmZsYWdzIHw9IDQpO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIHN0YXRlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHJvb3QgPSBnZXRWaWV3VHJhbnNpdGlvbk5hbWUocHJvcHMsIHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKGN1cnJlbnQubWVtb2l6ZWRQcm9wcywgc3RhdGUpO1xuICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKFxuICAgICAgICAgICAgICBwcm9wcy5kZWZh
15852dWx0LFxuICAgICAgICAgICAgICBwcm9wcy51cGRhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcIm5vbmVcIiA9PT0gY2xhc3NOYW1lXG4gICAgICAgICAgICAgID8gKHJvb3QgPSAhMSlcbiAgICAgICAgICAgICAgOiAoKHByb3BzID0gY3VycmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudC5tZW1vaXplZFN0YXRlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuY2hpbGQpLFxuICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCA9IDApLFxuICAgICAgICAgICAgICAgIChyb290ID0gbWVhc3VyZVZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHggIT09XG4gICAgICAgICAgICAgICAgICAobnVsbCA9PT0gcHJvcHMgPyAwIDogcHJvcHMubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgKGZpbmlzaGVkV29yay5mbGFncyB8PSAzMikpO1xuICAgICAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDQpICYmIHJvb3RcbiAgICAgICAgICAgICAgPyAoc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMub25VcGRhdGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbkNhbmNlbGFibGVDaGlsZHJlbiA9IG9sZE5hbWUpKVxuICAgICAgICAgICAgICA6IG51bGwgIT09IG9sZE5hbWUgJiZcbiAgICAgICAgICAgICAgICAob2xkTmFtZS5wdXNoLmFwcGx5KG9sZE5hbWUsIHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAodmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4gPSBvbGROYW1lKSk7XG4gICAgICAgICAgICB2aWV3VHJhbnNpdGlvbkNvbnRleHRDaGFuZ2VkID1cbiAgICAgICAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDMyKSA/ICEwIDogaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhyb290LCBwYXJlbnRGaWJlcikge1xuICAgICAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDg3NzIpXG4gICAgICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7IClcbiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIHBhcmVudEZpYmVyLmFsdGVybmF0ZSwgcGFyZW50RmliZXIpLFxuICAgICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncykge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgcHJldkVmZmVjdEVycm9ycyA9IHB1c2hDb21wb25lbnRFZmZlY3RFcnJvcnMoKSxcbiAgICAgICAgcHJldkVmZmVjdERpZFNwYXduVXBkYXRlID0gcHVzaENvbXBvbmVudEVmZmVjdERpZFNwYXduVXBkYXRlKCk7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGNvbW1pdEhvb2tMYXlvdXRVbm1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICBMYXlvdXRcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCAmJlxuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIChsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyAmIEluY2x1ZGVIb3N0U2luZ2xldG9ucykgIT09XG4gICAgICAgICAgICBOb0xheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzICYmXG4gICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICByZWxlYXNlU2luZ2xldG9uSW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgI
15852HNhZmVseURldGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICg1ICE9PSBmaW5pc2hlZFdvcmsudGFnICYmIDI3ICE9PSBmaW5pc2hlZFdvcmsudGFnKSB8fFxuICAgICAgICAgICAgY29tbWl0RnJhZ21lbnRJbnN0YW5jZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY29tbWl0RnJhZ21lbnRJbnN0YW5jZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gaW5zdGFuY2UgfHxcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHxcbiAgICAgICAgICAgIGluc3RhbmNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIG51bGwgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxODg3NDM2OCAmJlxuICAgICAgICAgICAgdW50cmFja05hbWVkVmlld1RyYW5zaXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgIChjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlIHx8IDAuMDUgPCBjb21wb25lbnRFZmZlY3REdXJhdGlvbikgJiZcbiAgICAgICAgbG9nQ29tcG9uZW50RWZmZWN0KFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnNcbiAgICAgICAgKTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3REdXJhdGlvbihwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gcHJldkVmZmVjdEVycm9ycztcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgcGFyZW50RmliZXIsXG4gICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICkge1xuICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzKHBhcmVudEZpYmVyLCBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyksXG4gICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgIGN1cnJlbnQsXG4gICAgICBmaW5pc2hlZFdvcmssXG4gICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICkge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgcHJldkVmZmVjdEVycm9ycyA9IHB1c2hDb21wb25lbnRFZmZlY3RFcnJvcnMoKSxcbiAgICAgICAgcHJldkVmZmVjdERpZFNwYXduVXBkYXRlID0gcHVzaENvbXBvbmVudEVmZmVjdERpZFNwYXduVXBkYXRlKCksXG4gICAgICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzLFxuICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzID1cbiAgICAgICAgICAobGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3MgJiBJbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzKSAhPT1cbiAgICAgICAgICBOb0xheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzO1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbW1pdEhvb2tMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgTGF5b3V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgI
15852HJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY3VycmVudC5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY3VycmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjdXJyZW50ID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICAgICAgICAgIGlmIChudWxsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGNvbW1pdEhpZGRlbkNhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNjQgJiZcbiAgICAgICAgICAgIGNvbW1pdENsYXNzQ2FsbGJhY2tzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgKGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzICYgSW5jbHVkZUhvc3RTaW5nbGV0b25zKSAhPT1cbiAgICAgICAgICAgIE5vTGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3MgJiZcbiAgICAgICAgICAgIGNvbW1pdEhvc3RTaW5nbGV0b25BY3F1aXNpdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgKDUgIT09IGZpbmlzaGVkV29yay50YWcgJiYgMjcgIT09IGZpbmlzaGVkV29yay50YWcpIHx8XG4gICAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlSW5zZXJ0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJlxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRIb3N0TW91bnQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNvbW1pdEZyYWdtZW50SW5zdGFuY2VJbnNlcnRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gaW5zdGFuY2UgfHxcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiB8fFxuICAgICAgICAgICAgbW91bnRIb2lzdGFibGUoXG4gICAgICAgICAgICAgIGdldEhvaXN0YWJsZVJvb3QoaW5zdGFuY2Uub3duZXJEb2N1bWVudCksXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgICAgY29tbWl0SG9zdE1vdW50KGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgaWYgKGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiYgZmxhZ3MgJiA0KSB7XG4gICAgICAgICAgICBmbGFncyA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cy5lZmZlY3REdXJhdGlvbiArPVxuICAgICAgICAgICAgICBidWJibGVOZXN0ZWRFZmZlY3REdXJhdGlvbnMoZmxhZ3MpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGNvbW1pdFByb2ZpbGVyLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIGNvbW1pdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLmVmZmVjdER1cmF0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgICAgY29tbWl0QWN0aXZpdHlIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGZsYWdzICYgMTg4NzQzNjggJiYgdHJhY2tOYW1lZFZpZXdUcmFuc2l0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgIChjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlIHx8IDAuMDUgPCBjb21wb25lbnRFZmZlY3REdXJhdGlvbikgJiZcbiAgICAgICAgbG9nQ29tcG9uZW50RWZmZWN0KFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnNcbiAgICAgICAgKTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3REdXJhdGlvbihwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gcHJldkVmZmVjdEVycm9ycztcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzXG4gICAgKSB7XG4gICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyA9XG4gICAgICAgIDAgIT09IChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA4NzcyKVxuICAgICAgICAgID8gbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICA6IGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzICYgfkluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHM7XG4gICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgcGFyZW50RmliZXIuYWx0ZXJuYXRlLFxuICAgICAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgICAgIGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzXG4gICAgICAgICksXG4gICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdE9mZnNjcmVlblBhc3NpdmVNb3VudEVmZmVjdHMoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcHJldmlvdXNDYWNoZSA9IG51bGw7XG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgIChwcmV2aW91c0NhY2hlID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKTtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgIChjdXJyZW50ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpO1xuICAgICAgY3VycmVudCAhPT0gcHJldmlvdXNDYWNoZSAmJlxuICAgICAgICAobnVsbCAhPSBjdXJyZW50ICYmIHJldGFpbkNhY2hlKGN1cnJlbnQpLFxuICAgICAgICBudWxsICE9IHByZXZpb3VzQ2FjaGUgJiYgcmVsZWFzZUNhY2hlKHByZXZpb3VzQ2FjaGUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0Q2FjaGVQYXNzaXZlTW91bnRFZmZlY3QoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgICAgKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUuY2FjaGUpO1xuICAgICAgZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGU7XG4gICAgICBmaW5pc2hlZFdvcmsgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgKHJldGFpbkNhY2hlKGZpbmlzaGVkV29yayksIG51bGwgIT0gY3VycmVudCAmJiByZWxlYXNlQ2FjaGUoY3VycmVudCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgIHJvb3QsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICBlbmRUaW1lXG4gICAgKSB7XG4gICAgICB2Y
15852XIgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID1cbiAgICAgICAgKGNvbW1pdHRlZExhbmVzICYgMzM1NTQ0MDY0KSA9PT0gY29tbWl0dGVkTGFuZXM7XG4gICAgICBpZiAoXG4gICAgICAgIHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPyAxMDI2MiA6IDEwMjU2KSB8fFxuICAgICAgICAoMCAhPT0gcGFyZW50RmliZXIuYWN0dWFsRHVyYXRpb24gJiZcbiAgICAgICAgICAobnVsbCA9PT0gcGFyZW50RmliZXIuYWx0ZXJuYXRlIHx8XG4gICAgICAgICAgICBwYXJlbnRGaWJlci5hbHRlcm5hdGUuY2hpbGQgIT09IHBhcmVudEZpYmVyLmNoaWxkKSlcbiAgICAgIClcbiAgICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgICAgIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSBwYXJlbnRGaWJlci5zaWJsaW5nKSxcbiAgICAgICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoXG4gICAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgIG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZVxuICAgICAgICAgICAgICAgID8gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmFjdHVhbFN0YXJ0VGltZVxuICAgICAgICAgICAgICAgIDogZW5kVGltZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlciA9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSk7XG4gICAgICBlbHNlXG4gICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJiByZXN0b3JlTmVzdGVkVmlld1RyYW5zaXRpb25zKHBhcmVudEZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihcbiAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICBlbmRUaW1lXG4gICAgKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKSxcbiAgICAgICAgcHJldkRlZXBFcXVhbGl0eSA9IGFscmVhZHlXYXJuZWRGb3JEZWVwRXF1YWxpdHksXG4gICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9XG4gICAgICAgICAgKGNvbW1pdHRlZExhbmVzICYgMzM1NTQ0MDY0KSA9PT0gY29tbWl0dGVkTGFuZXM7XG4gICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgJiZcbiAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSAmJlxuICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsucmV0dXJuICYmXG4gICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5yZXR1cm4uYWx0ZXJuYXRlICYmXG4gICAgICAgIHJlc3RvcmVFbnRlck9yRXhpdFZpZXdUcmFuc2l0aW9ucyhmaW5pc2hlZFdvcmspO1xuICAgICAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgMCA8IGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUgJiZcbiAgICAgICAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxKSAmJlxuICAgICAgICAgICAgbG9nQ29tcG9uZW50UmVuZGVyKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlLFxuICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdEhvb2tQYXNzaXZlTW91bnRFZmZlY3RzKGZpbmlzaGVkV29yaywgUGFzc2l2ZSB8IEhhc0VmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgMCA8IGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICgwICE9PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgMTI4KVxuICAgICAgICAgICAgICA/IGxvZ0NvbXBvbmVudEVycm9yZWQoXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxKSAmJlxuICAgICAgICAgICAgICAgIGxvZ0NvbXBvbmVudFJlbmRlcihcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgaW5IeWRyYXRlZFN1YnRyZWUsXG4gICAgICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lc1xuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgdmFyIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uID0gcHVzaE5lc3RlZEVmZmVjdER1cmF0aW9ucygpLFxuICAgICAgICAgICAgd2FzSW5IeWRyYXRlZFN1YnRyZWUgPSBpbkh5ZHJhdGVkU3VidHJlZTtcbiAgICAgICAgICBpbkh5ZHJhdGVkU3VidHJlZSA9XG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkICYmXG4gICAgICAgICAgICAwID09PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgMjU2KTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpbkh5ZHJhdGVkU3VidHJlZSA9IHdhc0luSHlkcmF0ZWRTdWJ0cmVlO1xuICAgICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgcm9vdFZpZXdUcmFuc2l0aW9uTmFtZUNhbmNlbGVkICYmXG4gICAgICAgICAgICAoKGNvbW1pdHRlZExhbmVzID0gZmluaXNoZWRSb290LmNvbnRhaW5lckluZm8pLFxuICAgICAgICAgICAgKGNvbW1pdHRlZExhbmVzID1cbiAgICAgICAgICAgICAgOSA9PT0gY29tbWl0dGVkTGFuZXMubm9kZVR5cGVcbiAgICAgICAgICAgICAgICA/IGNvbW1pdHRlZExhbmVzLmJvZHlcbiAgICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBjb21taXR0ZWRMYW5lcy5ub2RlTmFtZVxuICAgICAgICAgICAgICAgICAgPyBjb21taXR0ZWRMYW5lcy5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICAgICAgIDogY29tbWl0dGVkTGFuZXMpLFxuICAgICAgICAgICAgXCJyb290XCIgPT09IGNvbW1pdHRlZExhbmVzLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSAmJlxuICAgICAgICAgICAgICAoY29tbWl0dGVkTGFuZXMuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gXCJcIiksXG4gICAgICAgICAgICAoY29tbWl0dGVkTGFuZXMgPSBjb21taXR0ZWRMYW5lcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksXG4gICAgICAgICAgICBudWxsICE9PSBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICAgICBcIm5vbmVcIiA9PT0gY29tbWl0dGVkTGFuZXMuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lICYmXG4gICAgICAgICAgICAgIChjb21taXR0ZWRMYW5lcy5zdHlsZS52aWV3VHJhbnNpdGlvbk5hbWUgPSBcIlwiKSk7XG4gICAgICAgICAgZmxhZ3MgJiAyMDQ4ICYmXG4gICAgICAgICAgICAoKGNvbW1pdHRlZExhbmVzID0gbnVsbCksXG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICAgIChjb21taXR0ZWRMYW5lcyA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZSksXG4gICAgICAgICAgICAoY29tbWl0dGVkVHJhbnNpdGlvbnMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZS5jYWNoZSksXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyAhPT0gY29tbWl0dGVkTGFuZXMgJiZcbiAgICAgICAgICAgICAgKHJldGFpbkNhY2hlKGNvbW1pdHRlZF
15852RyYW5zaXRpb25zKSxcbiAgICAgICAgICAgICAgbnVsbCAhPSBjb21taXR0ZWRMYW5lcyAmJiByZWxlYXNlQ2FjaGUoY29tbWl0dGVkTGFuZXMpKSk7XG4gICAgICAgICAgZmluaXNoZWRSb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwb3BOZXN0ZWRFZmZlY3REdXJhdGlvbnMoXG4gICAgICAgICAgICBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvblxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgaWYgKGZsYWdzICYgMjA0OCkge1xuICAgICAgICAgICAgZmxhZ3MgPSBwdXNoTmVzdGVkRWZmZWN0RHVyYXRpb25zKCk7XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9XG4gICAgICAgICAgICAgIGJ1YmJsZU5lc3RlZEVmZmVjdER1cmF0aW9ucyhmbGFncyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY29tbWl0UHJvZmlsZXJQb3N0Q29tbWl0SW1wbCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLmFsdGVybmF0ZSxcbiAgICAgICAgICAgICAgICBjb21taXRTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LnBhc3NpdmVFZmZlY3REdXJhdGlvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICBmbGFncyA9IGluSHlkcmF0ZWRTdWJ0cmVlO1xuICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uID1cbiAgICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGVcbiAgICAgICAgICAgICAgPyBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIG51bGwgIT09IHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uICYmXG4gICAgICAgICAgbnVsbCA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlXG4gICAgICAgICAgICA/ICgoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gZmluaXNoZWRXb3JrLmRlbGV0aW9ucyksXG4gICAgICAgICAgICAgIG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgICAwIDwgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAxOCA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlWzBdLnRhZ1xuICAgICAgICAgICAgICAgID8gKChpbkh5ZHJhdGVkU3VidHJlZSA9ICExKSxcbiAgICAgICAgICAgICAgICAgIChwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLmh5ZHJhdGlvbkVycm9ycyksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRFcnJvcmVkKFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChpbkh5ZHJhdGVkU3VidHJlZSA9ICEwKSlcbiAgICAgICAgICAgIDogKGluSHlkcmF0ZWRTdWJ0cmVlID0gITEpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlID0gZmxhZ3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgZmxhZ3MgPSBpbkh5ZHJhdGVkU3VidHJlZTtcbiAgICAgICAgICBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9XG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlXG4gICAgICAgICAgICAgID8gZmluaXNoZWRXb3JrLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBudWxsID09PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiB8fFxuICAgICAgICAgIG51bGwgPT09IHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLmRlaHlkcmF0ZWQgfHxcbiAgICAgICAgICAobnVsbCAhPT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICBudWxsICE9PSBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUuZGV
15852oeWRyYXRlZClcbiAgICAgICAgICAgID8gKGluSHlkcmF0ZWRTdWJ0cmVlID0gITEpXG4gICAgICAgICAgICA6ICgoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gZmluaXNoZWRXb3JrLmRlbGV0aW9ucyksXG4gICAgICAgICAgICAgIG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgICAwIDwgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAxOCA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlWzBdLnRhZ1xuICAgICAgICAgICAgICAgID8gKChpbkh5ZHJhdGVkU3VidHJlZSA9ICExKSxcbiAgICAgICAgICAgICAgICAgIChwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLmh5ZHJhdGlvbkVycm9ycyksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRFcnJvcmVkKFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChpbkh5ZHJhdGVkU3VidHJlZSA9ICEwKSk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVNb3VudEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaW5IeWRyYXRlZFN1YnRyZWUgPSBmbGFncztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICB3YXNJbkh5ZHJhdGVkU3VidHJlZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICA/IChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgJiZcbiAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiAmJlxuICAgICAgICAgICAgICAgIG51bGwgPT09IHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgICByZXN0b3JlRW50ZXJPckV4aXRWaWV3VHJhbnNpdGlvbnMocHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24pLFxuICAgICAgICAgICAgICB3YXNJbkh5ZHJhdGVkU3VidHJlZS5fdmlzaWJpbGl0eSAmXG4gICAgICAgICAgICAgIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkXG4gICAgICAgICAgICAgICAgPyByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZUF0b21pY1Bhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgOiAoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24gJiZcbiAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbi5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgICAgcmVzdG9yZUVudGVyT3JFeGl0Vmlld1RyYW5zaXRpb25zKGZpbmlzaGVkV29yayksXG4gICAgICAgICAgICAgIHdhc0luSHlkcmF0ZWRTdWJ0cmVlLl92aXNpYmlsaXR5ICZcbiAgICAgICAgICAgICAgT2Zmc2NyZWVuUGFzc2l2ZUVmZmVjdHNDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICA/IHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiAoKHdhc0luSHlkcmF0ZWRTdWJ0cmVlLl92aXNpYmlsaXR5IHw9XG4gICAgICAgICAgICAgICAgICAgIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkKSxcbiAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAxMDI1NikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoMCAhPT0gZmluaXNoZWRXb3JrLmFjdHVhbER1cmF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkICE9PSBmaW5pc2hlZFdvcmsuY2hpbGQpKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSA9PT0gTm9Nb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlIHx8XG4gICAgICAgICAgICAgICAgICAgICgoZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSksXG4gICAgICAgICAgICAgICAgICAgIDAgPD0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICAgICAgICAgICAgICAgMC4wNSA8IGVuZFRpbWUgLSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRSZWFwcGVhcmVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgMC4wNSA8XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lIC0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgbG9nQ29tcG9uZW50UmVhcHBlYXJlZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICApKSkpO1xuICAgICAgICAgIGZsYWdzICYgMjA0OCAmJlxuICAgICAgICAgICAgY29tbWl0T2Zmc2NyZWVuUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdENhY2hlUGFzc2l2ZU1vdW50RWZmZWN0KGZpbmlzaGVkV29yay5hbHRlcm5hdGUsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICAoKGZsYWdzID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSksXG4gICAgICAgICAgICBudWxsICE9PSBmbGFncyAmJlxuICAgICAgICAgICAgICAocmVzdG9yZVZpZXdUcmFuc2l0aW9uT25Ib3N0SW5zdGFuY2VzKGZsYWdzLmNoaWxkLCAhMCksXG4gICAgICAgICAgICAgI
15852HJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhmaW5pc2hlZFdvcmsuY2hpbGQsICEwKSkpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZmluaXNoZWRSb290ID1cbiAgICAgICAgICAgICFpbkh5ZHJhdGVkU3VidHJlZSAmJlxuICAgICAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybiAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybi5hbHRlcm5hdGUpXG4gICAgICAgIClcbiAgICAgICAgICAoY29tbWl0dGVkTGFuZXMgPSBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lKSxcbiAgICAgICAgICAgIDAgPD0gY29tbWl0dGVkTGFuZXMgJiZcbiAgICAgICAgICAgICAgMC4wNSA8IGVuZFRpbWUgLSBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIFwiTW91bnRcIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAgICgoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgICAgICBsb2dDb21wb25lbnRFZmZlY3QoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICAgICApLFxuICAgICAgICAgIGZpbmlzaGVkUm9vdCAmJlxuICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICBcIk1vdW50XCJcbiAgICAgICAgICAgICkpO1xuICAgICAgfVxuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0U3RhcnQocHJldkVmZmVjdFN0YXJ0KTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdER1cmF0aW9uKHByZXZFZmZlY3REdXJhdGlvbik7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBwcmV2RWZmZWN0RXJyb3JzO1xuICAgICAgY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSA9IHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZTtcbiAgICAgIGFscmVhZHlXYXJuZWRGb3JEZWVwRXF1YWxpdHkgPSBwcmV2RGVlcEVxdWFsaXR5O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLFxuICAgICAgZW5kVGltZVxuICAgICkge1xuICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyA9XG4gICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgKDAgIT09IChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiAxMDI1NikgfHxcbiAgICAgICAgICAoMCAhPT0gcGFyZW50RmliZXIuYWN0dWFsRHVyYXRpb24gJiZcbiAgICAgICAgICAgIChudWxsID09PSBwYXJlbnRGaWJlci5hbHRlcm5hdGUgfHxcbiAgICAgICAgICAgICAgcGFyZW50RmliZXIuYWx0ZXJuYXRlLmNoaWxkICE9PSBwYXJlbnRGaWJlci5jaGlsZCkpKTtcbiAgICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7ICkge1xuICAgICAgICB2Y
15852XIgbmV4dFNpYmxpbmcgPSBwYXJlbnRGaWJlci5zaWJsaW5nO1xuICAgICAgICByZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgcGFyZW50RmliZXIsXG4gICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyxcbiAgICAgICAgICBudWxsICE9PSBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nLmFjdHVhbFN0YXJ0VGltZSA6IGVuZFRpbWVcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50RmliZXIgPSBuZXh0U2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICBmaW5pc2hlZFdvcmssXG4gICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyxcbiAgICAgIGVuZFRpbWVcbiAgICApIHtcbiAgICAgIHZhciBwcmV2RWZmZWN0U3RhcnQgPSBwdXNoQ29tcG9uZW50RWZmZWN0U3RhcnQoKSxcbiAgICAgICAgcHJldkVmZmVjdER1cmF0aW9uID0gcHVzaENvbXBvbmVudEVmZmVjdER1cmF0aW9uKCksXG4gICAgICAgIHByZXZFZmZlY3RFcnJvcnMgPSBwdXNoQ29tcG9uZW50RWZmZWN0RXJyb3JzKCksXG4gICAgICAgIHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZSA9IHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpLFxuICAgICAgICBwcmV2RGVlcEVxdWFsaXR5ID0gYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eTtcbiAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgMCA8IGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUgJiZcbiAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDEpICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudFJlbmRlcihcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSxcbiAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlLFxuICAgICAgICAgIGNvbW1pdHRlZExhbmVzXG4gICAgICAgICk7XG4gICAgICB2Y
15852XIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLFxuICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29tbWl0SG9va1Bhc3NpdmVNb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrLCBQYXNzaXZlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgID8gX2luc3RhbmNlNC5fdmlzaWJpbGl0eSAmIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkXG4gICAgICAgICAgICAgID8gcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMsXG4gICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiAoKF9pbnN0YW5jZTQuX3Zpc2liaWxpdHkgfD0gT2Zmc2NyZWVuUGFzc2l2ZUVmZmVjdHNDb25uZWN0ZWQpLFxuICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLFxuICAgICAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgICAgZmxhZ3MgJiAyMDQ4ICYmXG4gICAgICAgICAgICBjb21taXRPZmZzY3JlZW5QYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzICYmXG4gICAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdENhY2hlUGFzc2l2ZU1vdW50RWZmZWN0KGZpbmlzaGVkV29yay5hbHRlcm5hdGUsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlID0gcHJldkVmZmVjdERpZFNwYXduVXBkYXRlO1xuICAgICAgYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eSA9IHByZXZEZWVwRXF1YWxpdHk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgY29tbWl0dGVkTGFuZXMkanNjb21wJDAsXG4gICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyRqc2NvbXAkMCxcbiAgICAgIGVuZFRpbWUkanNjb21wJDBcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgMTAyNTYgfHxcbiAgICAgICAgKDAgIT09IHBhcmVudEZpYmVyLmFjdHVhbER1cmF0aW9uICYmXG4gICAgICAgICAgKG51bGwgPT09IHBhcmVudEZpYmVyLmFsdGVybmF0ZSB8fFxuICAgICAgICAgICAgcGFyZW50RmliZXIuYWx0ZXJuYXRlLmNoaWxkICE9PSBwYXJlbnRGaWJlci5jaGlsZCkpXG4gICAgICApXG4gICAgICAgIGZvciAodmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IGNoaWxkOyApIHtcbiAgICAgICAgICBwYXJlbnRGaWJlciA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgdmFyIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzID0gY29tbWl0dGVkTGFuZXMkanNjb21wJDAsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyA9IGNvbW1pdHRlZF
15852RyYW5zaXRpb25zJGpzY29tcCQwLFxuICAgICAgICAgICAgZW5kVGltZSA9XG4gICAgICAgICAgICAgIG51bGwgIT09IHBhcmVudEZpYmVyXG4gICAgICAgICAgICAgICAgPyBwYXJlbnRGaWJlci5hY3R1YWxTdGFydFRpbWVcbiAgICAgICAgICAgICAgICA6IGVuZFRpbWUkanNjb21wJDAsXG4gICAgICAgICAgICBwcmV2RGVlcEVxdWFsaXR5ID0gYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eTtcbiAgICAgICAgICAoY2hpbGQubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAwIDwgY2hpbGQuYWN0dWFsU3RhcnRUaW1lICYmXG4gICAgICAgICAgICAwICE9PSAoY2hpbGQuZmxhZ3MgJiAxKSAmJlxuICAgICAgICAgICAgbG9nQ29tcG9uZW50UmVuZGVyKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgY2hpbGQuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICBpbkh5ZHJhdGVkU3VidHJlZSxcbiAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGZsYWdzID0gY2hpbGQuZmxhZ3M7XG4gICAgICAgICAgc3dpdGNoIChjaGlsZC50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgICAgICBjb21taXRPZmZzY3JlZW5QYXNzaXZlTW91bnRFZmZlY3RzKGNoaWxkLmFsdGVybmF0ZSwgY2hpbGQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgICAgICBjb21taXRDYWNoZVBhc3NpdmVNb3VudEVmZmVjdChjaGlsZC5hbHRlcm5hdGUsIGNoaWxkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQXRvbWljUGFzc2l2ZUVmZmVjdHMoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eSA9IHByZXZEZWVwRXF1YWxpdHk7XG4gICAgICAgICAgY2hpbGQgPSBwYXJlbnRGaWJlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQoXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgc3VzcGVuZGVkU3RhdGVcbiAgICApIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBzdXNwZW5zZXlDb21taXRGbGFnKVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgYWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdE9uRmliZXIoXG4gICAgICAgICAgICBwYXJlbnRGaWJlcixcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgc3VzcGVuZGVkU3RhdGVcbiAgICAgICAgICApLFxuICAgICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXRPbkZpYmVyKFxuICAgICAgZmliZXIsXG4gICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgIHN1c3BlbmRlZFN0YXRlXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZmliZXIuZmxhZ3MgJiBzdXNwZW5zZXlDb21taXRGbGFnICYmXG4gICAgICAgICAgICAobnVsbCAhPT0gZmliZXIubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgICA/IHN1c3BlbmRSZXNvdXJjZShcbiAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgICAgICAgICAgICAgICAgZmliZXIubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiAoKGZpYmVyID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgICAgICAoY29tbWl0dGVkTGFuZXMgJiAzMzU1NDQxMjgpID09PSBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgc3VzcGVuZEluc3RhbmNlKHN1c3BlbmRlZFN0YXRlLCBmaWJlcikpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZmliZXIuZmxhZ3MgJiBzdXNwZW5zZXlDb21taXRGbGFnICYmXG4gICAgICAgICAgICAoKGZpYmVyID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIChjb21taXR0ZWRMYW5lcyAmIDMzNTU0NDEyOCkgPT09IGNvbW1pdHRlZExhbmVzICYmXG4gICAgICAgICAgICAgI
15852HN1c3BlbmRJbnN0YW5jZShzdXNwZW5kZWRTdGF0ZSwgZmliZXIpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdmFyIHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IGN1cnJlbnRIb2lzdGFibGVSb290O1xuICAgICAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gZ2V0SG9pc3RhYmxlUm9vdChcbiAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQoXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgc3VzcGVuZGVkU3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gcHJldmlvdXNIb2lzdGFibGVSb290O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIG51bGwgPT09IGZpYmVyLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICgocHJldmlvdXNIb2lzdGFibGVSb290ID0gZmliZXIuYWx0ZXJuYXRlKSxcbiAgICAgICAgICAgIG51bGwgIT09IHByZXZpb3VzSG9pc3RhYmxlUm9vdCAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gcHJldmlvdXNIb2lzdGFibGVSb290Lm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgICAgPyAoKHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IHN1c3BlbnNleUNvbW1pdEZsYWcpLFxuICAgICAgICAgICAgICAgIChzdXNwZW5zZXlDb21taXRGbGFnID0gMTY3NzcyMTYpLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKHN1c3BlbnNleUNvbW1pdEZsYWcgPSBwcmV2aW91c0hvaXN0YWJsZVJvb3QpKVxuICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIDAgIT09IChmaWJlci5mbGFncyAmIHN1c3BlbnNleUNvbW1pdEZsYWcpICYmXG4gICAgICAgICAgICAoKHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IGZpYmVyLm1lbW9pemVkUHJvcHMubmFtZSksXG4gICAgICAgICAgICBudWxsICE9IHByZXZpb3VzSG9pc3RhYmxlUm9vdCAmJiBcImF1dG9cIiAhPT0gcHJldmlvdXNIb2lzdGFibGVSb290KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgc3RhdGUucGFpcmVkID0gbnVsbDtcbiAgICAgICAgICAgIG51bGwgPT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyAmJlxuICAgICAgICAgICAgICAoYXBwZWFyaW5nVmlld1RyYW5zaXRpb25zID0gbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucy5zZXQocHJldmlvdXNIb2lzdGFibGVSb290LCBzdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlBY2N1bXVsYXRlU3VzcGVuc2V5Q29tbWl0KFxuICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgIHN1c3BlbmRlZFN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGV0YWNoQWx0ZXJuYXRlU2libGluZ3MocGFyZW50RmliZXIpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gcGFyZW50RmliZXIuYWx0ZXJuYXRlO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSBwcmV2aW91c0ZpYmVyICYmXG4gICAgICAgICgocGFyZW50RmliZXIgPSBwcmV2aW91c0ZpYmVyLmNoaWxkKSwgbnVsbCAhPT0gcGFyZW50RmliZXIpXG4gICAgICApIHtcbiAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG4gICAgICAgIGRvXG4gICAgICAgICAgKHByZXZpb3VzRmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlci5zaWJsaW5nID0gbnVsbCksXG4gICAgICAgICAgICAocGFyZW50RmliZXIgPSBwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgd2hpbGUgKG51bGwgIT09IHBhcmVudEZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhwYXJlbnRGaWJlcikge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcbiAgICAgIGlmICgwICE9PSAocGFyZW50RmliZXIuZmxhZ3MgJiAxNikpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IGRlbGV0aW9ucylcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV0sXG4gICAgICAgICAgICAgIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpO1xuICAgICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gICAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKFxuICAgICAgICAgICAgICBjaGlsZFRvRGVsZXRlLFxuICAgICAgICAgICAgICBwYXJlbnRGaWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIChjaGlsZFRvRGVsZXRlLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9
15852kZSAmJlxuICAgICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgbG9nQ29tcG9uZW50VHJpZ2dlcihcbiAgICAgICAgICAgICAgICBjaGlsZFRvRGVsZXRlLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICAgIFwiVW5tb3VudFwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgZGV0YWNoQWx0ZXJuYXRlU2libGluZ3MocGFyZW50RmliZXIpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEwMjU2KVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKHBhcmVudEZpYmVyKSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKTtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZpbmlzaGVkV29yay5mbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdEhvb2tQYXNzaXZlVW5tb3VudEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVybixcbiAgICAgICAgICAgICAgUGFzc2l2ZSB8IEhhc0VmZmVjdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHZhciBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz1cbiAgICAgICAgICAgIHBvcE5lc3RlZEVmZmVjdER1cmF0aW9ucyhwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSBwdXNoTmVzdGVkRWZmZWN0RHVyYXRpb25zKCk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9XG4gICAgICAgICAgICBidWJibGVOZXN0ZWRFZmZlY3REdXJhdGlvbnMocHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLl92aXNpYmlsaXR5ICZcbiAgICAgICAgICAgIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkICYmXG4gICAgICAgICAgKG51bGwgPT09IGZpbmlzaGVkV29yay5yZXR1cm4gfHwgMTMgIT09IGZpbmlzaGVkV29yay5yZXR1cm4udGFnKVxuICAgICAgICAgICAgPyAoKHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLl92aXNpYmlsaXR5ICY9XG4gICAgICAgICAgICAgICAgfk9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkKSxcbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURpc2Nvbm5lY3RQYXNzaXZlRWZmZWN0cyhmaW5pc2hlZFdvcmspLFxuICAgICAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIFwiRGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBwcmV2RWZmZWN0RXJyb3JzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKHBhcmVudEZpYmVyKSB7XG4gICAgICB2Y
15852XIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuICAgICAgaWYgKDAgIT09IChwYXJlbnRGaWJlci5mbGFncyAmIDE2KSkge1xuICAgICAgICBpZiAobnVsbCAhPT0gZGVsZXRpb25zKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXSxcbiAgICAgICAgICAgICAgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCk7XG4gICAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oXG4gICAgICAgICAgICAgIGNoaWxkVG9EZWxldGUsXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgKGNoaWxkVG9EZWxldGUubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAgICAgICAwLjA1IDwgY29tcG9uZW50RWZmZWN0RW5kVGltZSAtIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICAgIGNoaWxkVG9EZWxldGUsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgXCJVbm1vdW50XCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICBkZXRhY2hBbHRlcm5hdGVTaWJsaW5ncyhwYXJlbnRGaWJlcik7XG4gICAgICB9XG4gICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgIGRpc2Nvbm5lY3RQYXNzaXZlRWZmZWN0KHBhcmVudEZpYmVyKSxcbiAgICAgICAgICAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzY29ubmVjdFBhc3NpdmVFZmZlY3QoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKTtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgY29tbWl0SG9va1Bhc3NpdmVVbm1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICBQYXNzaXZlXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBpbnN0YW5jZS5fdmlzaWJpbGl0eSAmIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkICYmXG4gICAgICAgICAgICAoKGluc3RhbmNlLl92aXNpYmlsaXR5ICY9IH5PZmZzY3JlZW5QYXNzaXZlRWZmZWN0c0Nvbm5lY3RlZCksXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNjb25uZWN0UGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBwcmV2RWZmZWN0RXJyb3JzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKFxuICAgICAgZGVsZXRlZFN1YnRyZWVSb290LFxuICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciRqc2NvbXAkMFxuICAgICkge1xuICAgICAgZm9yICg7IG51bGwgIT09IG5leHRFZmZlY3Q7ICkge1xuICAgICAgICB2Y
15852XIgZmliZXIgPSBuZXh0RWZmZWN0LFxuICAgICAgICAgIGN1cnJlbnQgPSBmaWJlcixcbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yID0gbmVhcmVzdE1vdW50ZWRBbmNlc3RvciRqc2NvbXAkMCxcbiAgICAgICAgICBwcmV2RWZmZWN0U3RhcnQgPSBwdXNoQ29tcG9uZW50RWZmZWN0U3RhcnQoKSxcbiAgICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICAgIHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZSA9IHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpO1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnQudGFnKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGNvbW1pdEhvb2tQYXNzaXZlVW5tb3VudEVmZmVjdHMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgIFBhc3NpdmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCAmJlxuICAgICAgICAgICAgICAoKG5lYXJlc3RNb3VudGVkQW5jZXN0b3IgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpLFxuICAgICAgICAgICAgICBudWxsICE9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3IgJiZcbiAgICAgICAgICAgICAgICByZXRhaW5DYWNoZShuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgcmVsZWFzZUNhY2hlKGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgKGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgICAgbG9nQ29tcG9uZW50RWZmZWN0KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9yc1xuICAgICAgICAgICk7XG4gICAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICAgIHBvcENvbXBvbmVudEVmZmVjdER1cmF0aW9uKHByZXZFZmZlY3REdXJhdGlvbik7XG4gICAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICAgIGN1cnJlbnQgPSBmaWJlci5jaGlsZDtcbiAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQpIChjdXJyZW50LnJldHVybiA9IGZpYmVyKSwgKG5leHRFZmZlY3QgPSBjdXJyZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGE6IGZvciAoZmliZXIgPSBkZWxldGVkU3VidHJlZVJvb3Q7IG51bGwgIT09IG5leHRFZmZlY3Q7ICkge1xuICAgICAgICAgICAgY3VycmVudCA9IG5leHRFZmZlY3Q7XG4gICAgICAgICAgICBwcmV2RWZmZWN0U3RhcnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGN1cnJlbnQpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IGZpYmVyKSB7XG4gICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG51bGwgIT09IHByZXZFZmZlY3RTdGFydCkge1xuICAgICAgICAgICAgICBwcmV2RWZmZWN0U3RhcnQucmV0dXJuID0gcHJldkVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gcHJldkVmZmVjdFN0YXJ0O1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dEVmZmVjdCA9IHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uQ29tbWl0Um9vdCgpIHtcbiAgICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgICAgcmV0dXJuIGNvbW1pdEhvb2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAgICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPVxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UXG4gICAgICAgICAgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlRcbiAgICAgICAgICA6IHZvaWQgMDtcbiAgICAgIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCB8fFxuICAgICAgICBudWxsID09PSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSB8fFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0IGFjdCguLi4pXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJlxuICAgICAgICAwICE9PSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgKVxuICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiAtd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXM7XG4gICAgICB2Y
15852XIgdHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICBpZiAobnVsbCAhPT0gdHJhbnNpdGlvbilcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzIHx8ICh0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpKSxcbiAgICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmFkZChmaWJlciksXG4gICAgICAgICAgbnVsbCAhPT0gbGFzdFN1c3BlbmRlZEZpYmVyICYmXG4gICAgICAgICAgICByZXNvbHZlVXBkYXRlUHJpb3JpdHkoKSA9PT0gRGlzY3JldGVFdmVudFByaW9yaXR5ICYmXG4gICAgICAgICAgICAobGFzdFN1c3BlbmRlZEZpYmVyID0gbnVsbCksXG4gICAgICAgICAgcmVxdWVzdFRyYW5zaXRpb25MYW5lKClcbiAgICAgICAgKTtcbiAgICAgIGZpYmVyID0gcmVzb2x2ZVVwZGF0ZVByaW9yaXR5KCk7XG4gICAgICBmaWJlciA9PT0gRGlzY3JldGVFdmVudFByaW9yaXR5ICYmIChsYXN0U3VzcGVuZGVkRmliZXIgPSBudWxsKTtcbiAgICAgIHJldHVybiBmaWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVxdWVzdERlZmVycmVkTGFuZSgpIHtcbiAgICAgIGlmICgwID09PSB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSlcbiAgICAgICAgaWYgKDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDUzNjg3MDkxMikgfHwgaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uRGVmZXJyZWRMYW5lO1xuICAgICAgICAgIG5leHRUcmFuc2l0aW9uRGVmZXJyZWRMYW5lIDw8PSAxO1xuICAgICAgICAgIDAgPT09IChuZXh0VHJhbnNpdGlvbkRlZmVycmVkTGFuZSAmIDM5MzIxNjApICYmXG4gICAgICAgICAgICAobmV4dFRyYW5zaXRpb25EZWZlcnJlZExhbmUgPSAyNjIxNDQpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID0gbGFuZTtcbiAgICAgICAgfSBlbHNlIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID0gNTM2ODcwOTEyO1xuICAgICAgbGFuZSA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgICBudWxsICE9PSBsYW5lICYmIChsYW5lLmZsYWdzIHw9IDMyKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KGZpYmVyLCBjYWxsYmFjaykge1xuICAgICAgaWYgKG51bGwgIT0gY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZmliZXIuc3RhdGVOb2RlLFxuICAgICAgICAgIGluc3RhbmNlID0gc3RhdGUucmVmO1xuICAgICAgICBudWxsID09PSBpbnN0YW5jZSAmJlxuICAgICAgICAgIChpbnN0YW5jZSA9IHN0YXRlLnJlZiA9XG4gICAgICAgICAgICBjcmVhdGVWaWV3VHJhbnNpdGlvbkluc3RhbmNlKFxuICAgICAgICAgICAgICBnZXRWaWV3VHJhbnNpdGlvbk5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgc3RhdGUpXG4gICAgICAgICAgICApKTtcbiAgICAgICAgbnVsbCA9PT0gcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzICYmXG4gICAgICAgICAgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbkV2ZW50cyA9IFtdKTtcbiAgICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzLnB1c2goY2FsbGJhY2suYmluZChudWxsLCBpbnN0YW5jZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgICAgIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFwidXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuXCIpO1xuICAgICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzICYmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gITApO1xuICAgICAgaWYgKFxuICAgICAgICAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkRhdGEgfHxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkFjdGlvbikpIHx8XG4gICAgICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdFxuICAgICAgKVxuICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCAwKSxcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgbWFya1Jvb3RVcGRhdGVkJDEocm9vdCwgbGFuZSk7XG4gICAgICBpZiAoXG4gICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJlxuICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RcbiAgICAgICkge1xuICAgICAgICBpZiAoaXNSZW5kZXJpbmcpXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICByb290ID1cbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykpIHx8XG4gICAgICAgICAgICAgICAgXCJVbmtub3duXCI7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5oYXMocm9vdCkgfHxcbiAgICAgICAgICAgICAgICAoZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChyb290KSxcbiAgICAgICAgICAgICAgICAoZmliZXIgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIlVua25vd25cIiksXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXJcIixcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgI
15852HJvb3RcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyIHx8XG4gICAgICAgICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkNhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuXCJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIChkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9ICEwKSk7XG4gICAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIGlzRGV2VG9vbHNQcmVzZW50ICYmIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSksXG4gICAgICAgICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSxcbiAgICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiZcbiAgICAgICAgICAgICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpID09PSBOb0NvbnRleHQgJiZcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzIHw9IGxhbmUpLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSAmJlxuICAgICAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgICExXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVdvcmtPblJvb3Qocm9vdCwgbGFuZXMsIGZvcmNlU3luYykge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dClcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy5cIik7XG4gICAgICBpZiAoMCAhPT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiYgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgdmFyIHlpZWxkZWRGaWJlciA9IHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHlpZWxkRW5kVGltZSA9IG5vdyQxKCk7XG4gICAgICAgIHN3aXRjaCAoeWllbGRSZWFzb24pIHtcbiAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSW1tZWRpYXRlOlxuICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25EYXRhOlxuICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHlpZWxkU3RhcnRUaW1lO1xuICAgICAgICAgICAgc3VwcG9ydHNVc2VyVGltaW5nICYmXG4gICAgICAgICAgICAgICgoeWllbGRlZEZpYmVyID0geWllbGRlZEZpYmVyLl9kZWJ1Z1Rhc2spXG4gICAgICAgICAgICAgICAgPyB5aWVsZGVkRmliZXIucnVuKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgXCJTdXNwZW5kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgICBcIlN1c3BlbmRlZFwiLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UU19UUkFDSyxcbiAgICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uQWN0aW9uOlxuICAgICAgICAgICAgc3RhcnRUaW1lID0geWllbGRTdGFydFRpbWU7XG4gICAgICAgICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgJiZcbiAgICAgICAgICAgICAgKCh5aWVsZGVkRmliZXIgPSB5aWVsZGVkRmliZXIuX2RlYnVnVGFzaylcbiAgICAgICAgICAgICAgICA/IHlpZWxkZWRGaWJlci5ydW4oXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgICBcIkFjdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICB5aWVsZEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UU19UUkFDSyxcbiAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgICAgXCJwcmltYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICAgIFwiQWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgJiZcbiAgICAgICAgICAgICAgKCh5aWVsZGVkRmliZXIgPSB5aWVsZEVuZFRpbWUgLSB5aWVsZFN0YXJ0VGltZSksXG4gICAgICAgICAgICAgIDMgPiB5aWVsZGVkRmliZXIgfHxcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgIFwiQmxvY2tlZFwiLFxuICAgICAgICAgICAgICAgICAgeWllbGRTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICB5aWVsZEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgNSA+IHlpZWxkZWRGaWJlclxuICAgICAgICAgICAgICAgICAgICA/IFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICAgIDogMTAgPiB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgOiAxMDAgPiB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwcmltYXJ5LWRhcmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImVycm9yXCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhcnRUaW1lID0gKGZvcmNlU3luYyA9XG4gICAgICAgICghZm9yY2VTeW5jICYmXG4gICAgICAgICAgMCA9PT0gKGxhbmVzICYgMTI3KSAmJlxuICAgICAgICAgIDAgPT09IChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSkgfHxcbiAgICAgICAgY2hlY2tJZlJvb3RJc1ByZXJlbmRlcmluZyhyb290LCBsYW5lcykpXG4gICAgICAgID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpXG4gICAgICAgIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMsICEwKTtcbiAgICAgIHZhciByZW5kZXJXYXNDb25jdXJyZW50ID0gZm9yY2VTeW5jO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoc3RhcnRUaW1lID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nICYmXG4gICAgICAgICAgICAhZm9yY2VTeW5jICYmXG4gICAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBsYW5lcywgMCwgITEpO1xuICAgICAgICAgIGxhbmVzID0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb247XG4gICAgICAgICAgeWllbGRTdGFydFRpbWUgPSBub3coKTtcbiAgICAgICAgICB5aWVsZFJlYXNvbiA9IGxhbmVzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHlpZWxkZWRGaWJlciA9IG5vdyQxKCk7XG4gICAgICAgICAgeWllbGRFbmRUaW1lID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ICYmXG4gICAgICAgICAgICAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKHlpZWxkRW5kVGltZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICAgICAgICB5aWVsZEVuZFRpbWUgPSByZW5kZXJTdGFydFRpbWU7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSB5aWVsZGVkRmliZXI7XG4gICAgICAgICAgICAhc3VwcG9ydHNVc2VyVGltaW5nIHx8XG4gICAgICAgICAgICAgIHN0YXJ0VGltZSA8PSB5aWVsZEVuZFRpbWUgfHxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzVXBkYXRlVGFza1xuICAgICAgICAgICAgICAgID8gd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrLnJ1bihcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICAgIFwiVGVhcmVkIFJlbmRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIHlpZWxkRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgICAgXCJUZWFyZWQgUmVuZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgZmluYWxpemVSZW5kZXIobGFuZXMsIHlpZWxkZWRGaWJlcik7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcywgITEpO1xuICAgICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCA9ICExO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydFRpbWUgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ID0gbGFuZXM7XG4gICAgICAgICAgICBpZiAocm9vdC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyAmIHJlbmRlcldhc0NvbmN1cnJlbnQpXG4gICAgICAgICAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSAwO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAoZXJyb3JSZXRyeUxhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiAtNTM2ODcwOTEzKSxcbiAgICAgICAgICAgICAgICAoZXJyb3JSZXRyeUxhbmVzID1cbiAgICAgICAgICAgICAgICAgIDAgIT09IGVycm9yUmV0cnlMYW5lc1xuICAgICAgICAgICAgICAgICAgICA/IGVycm9yUmV0cnlMYW5lc1xuICAgICAgICAgICAgICAgICAgICA6IGVycm9yUmV0cnlMYW5lcyAmIDUzNjg3MDkxMlxuICAgICAgICAgICAgICAgICAgICAgID8gNTM2ODcwOTEyXG4gICAgICAgICAgICAgICAgICAgICAgOiAwKTtcbiAgICAgICAgICAgIGlmICgwICE9PSBlcnJvclJldHJ5TGFuZXMpIHtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKGxhbmVzKTtcbiAgICAgICAgICAgICAgbG9nRXJyb3JlZFJlbmRlclBoYXNlKFxuICAgICAgICAgICAgICAgIHJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIsXG4gICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZpbmFsaXplUmVuZGVyKGxhbmVzLCB5aWVsZGVkRmliZXIpO1xuICAgICAgICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgIHlpZWxkZWRGaWJlciA9IHJvb3Q7XG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gcmVuZGVyV2FzQ29uY3VycmVudDtcbiAgICAgICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycztcbiAgICAgICAgICAgICAgICB2Y
15852XIgd2FzUm9vdERlaHlkcmF0ZWQgPVxuICAgICAgICAgICAgICAgICAgeWllbGRlZEZpYmVyLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG4gICAgICAgICAgICAgICAgd2FzUm9vdERlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgIChwcmVwYXJlRnJlc2hTdGFjayh5aWVsZGVkRmliZXIsIGVycm9yUmV0cnlMYW5lcykuZmxhZ3MgfD1cbiAgICAgICAgICAgICAgICAgICAgMjU2KTtcbiAgICAgICAgICAgICAgICBlcnJvclJldHJ5TGFuZXMgPSByZW5kZXJSb290U3luYyhcbiAgICAgICAgICAgICAgICAgIHlpZWxkZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIGVycm9yUmV0cnlMYW5lcyxcbiAgICAgICAgICAgICAgICAgICExXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBlcnJvclJldHJ5TGFuZXMgIT09IFJvb3RFcnJvcmVkICYmXG4gICAgICAgICAgICAgICAgICBlcnJvclJldHJ5TGFuZXMgIT09IFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEF0dGFjaFBpbmdMaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgICAgICAhd2FzUm9vdERlaHlkcmF0ZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIuZXJyb3JSZWNvdmVyeURpc2FibGVkTGFuZXMgfD0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyB8PSBzdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycztcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gcmVuZGVyV2FzQ29uY3VycmVudDtcbiAgICAgICAgICAgICAgICAgIG51bGwgIT09IHlpZWxkZWRGaWJlciAmJlxuICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IHlpZWxkZWRGaWJlcilcbiAgICAgICAgICAgICAgICAgICAgICA6IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCA9ICExO1xuICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lICE9PSBSb290RXJyb3JlZCkgY29udGludWU7XG4gICAgICAgICAgICAgIGVsc2UgeWllbGRlZEZpYmVyID0gbm93JDEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXJ0VGltZSA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgICAgc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKGxhbmVzKTtcbiAgICAgICAgICAgIGxvZ0Vycm9yZWRSZW5kZXJQaGFzZShcbiAgICAgICAgICAgICAgcmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICB5aWVsZGVkRmliZXIsXG4gICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaW5hbGl6ZVJlbmRlcihsYW5lcywgeWllbGRlZEZpYmVyKTtcbiAgICAgICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIDApO1xuICAgICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgbGFuZXMsIDAsICEwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBmb3JjZVN5bmMgPSByb290O1xuICAgICAgICAgICAgc3dpdGNoIChzdGFydFRpbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICAgICAgICAgICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiKTtcbiAgICAgICAgICAgICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAgICAgICAgICAgIGlmICgobGFuZXMgJiA0MTk0MDQ4KSAhPT0gbGFuZXMgJiYgKGxhbmVzICYgNjI5MTQ1NjApICE9PSBsYW5lcylcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsOlxuICAgICAgICAgICAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICAgICAgICAgICAgbG9nU3VzcGVuZGVkUmVuZGVyUGhhc2UoXG4gICAgICAgICAgICAgICAgICByZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIsXG4gICAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFza1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmluYWxpemVSZW5kZXIobGFuZXMsIHlpZWxkZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lID0gbGFuZXM7XG4gICAgICAgICAgICAgICAgMCAhPT0gKHlpZWxkRW5kVGltZSAmIDEyNylcbiAgICAgICAgICAgICAgICAgID8gKGJsb2NraW5nU3VzcGVuZGVkVGltZSA9IHlpZWxkZWRGaWJlcilcbiAgICAgICAgICAgICAgICAgIDogMCAhPT0gKHlpZWxkRW5kVGltZSAmIDQxOTQwNDgpICYmXG4gICAgICAgICAgICAgICAgICAgICh0cmFuc2l0aW9uU3VzcGVuZGVkVGltZSA9IHlpZWxkZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICAgICAgICAgICAgICBmb3JjZVN5bmMsXG4gICAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgICAgIXdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgICAgICAgICAgY2FzZSBSb290Q29tcGxldGVkOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiVW5rbm93biByb290IGV4aXQgc3RhdHVzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChudWxsICE9PSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSlcbiAgICAgICAgICAgICAgY29tcGxldGVSb290KFxuICAgICAgICAgICAgICAgIGZvcmNlU3luYyxcbiAgICAgICAgICAgICAgICB5aWVsZEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRJbmNsdWRlUmVjdXJzaXZlUmVuZGVyVXBkYXRlLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICByZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgeWllbGRlZEZpYmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChsYW5lcyAmIDYyOTE0NTYwKSA9PT0gbGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKHJlbmRlcldhc0NvbmN1cnJlbnQgPVxuICAgICAgICAgICAgICAgICAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArXG4gICAgICAgICAgICAgICAgICBGQUxMQkFDS19USFJPVFRMRV9NUyAtXG4gICAgICAgICAgICAgICAgICBub3ckMSgpKSxcbiAgICAgICAgICAgICAgICAxMCA8IHJlbmRlcldhc0NvbmN1cnJlbnQpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkKFxuICAgICAgICAgICAgICAgICAgZm9yY2VTeW5jLFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSxcbiAgICAgICAgICAgICAgICAgICF3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICgwICE9PSBnZXROZXh0TGFuZXMoZm9yY2VTeW5jLCAwLCAhMCkpIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0VmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICAgICAgICAgICAgICAgIGZvcmNlU3luYy50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVSb290V2hlblJlYWR5LmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlU3luYyxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RGlkSW5jbHVkZVJlY3Vyc2l2ZVJlbmRlclVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgXCJUaHJvdHRsZWRcIixcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbXBsZXRlUm9vdFdoZW5SZWFkeShcbiAgICAgICAgICAgICAgICBmb3JjZVN5bmMsXG4gICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RGlkSW5jbHVkZVJlY3Vyc2l2ZVJlbmRlclVwZGF0ZSxcbiAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzLFxuICAgICAgICAgICAgICAgI
15852HN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9IHdoaWxlICgxKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGxldGVSb290V2hlblJlYWR5KFxuICAgICAgcm9vdCxcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIHJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgdHJhbnNpdGlvbnMsXG4gICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgICBsYW5lcyxcbiAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgc3VzcGVuZGVkUmV0cnlMYW5lcyxcbiAgICAgIGRpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyxcbiAgICAgIGV4aXRTdGF0dXMsXG4gICAgICBzdXNwZW5kZWRDb21taXRSZWFzb24sXG4gICAgICBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUsXG4gICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgKSB7XG4gICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gICAgICB2YXIgc3VidHJlZUZsYWdzID0gZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyxcbiAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gKGxhbmVzICYgMzM1NTQ0MDY0KSA9PT0gbGFuZXMsXG4gICAgICAgIHN1c3BlbmRlZFN0YXRlID0gbnVsbDtcbiAgICAgIGlmIChcbiAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlIHx8XG4gICAgICAgIHN1YnRyZWVGbGFncyAmIDgxOTIgfHxcbiAgICAgICAgMTY3ODU0MDggPT09IChzdWJ0cmVlRmxhZ3MgJiAxNjc4NTQwOClcbiAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgoc3VzcGVuZGVkU3RhdGUgPSB7XG4gICAgICAgICAgICBzdHlsZXNoZWV0czogbnVsbCxcbiAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgaW1nQ291bnQ6IDAsXG4gICAgICAgICAgICBpbWdCeXRlczogMCxcbiAgICAgICAgICAgIHN1c3BlbnNleUltYWdlczogW10sXG4gICAgICAgICAgICB3YWl0aW5nRm9ySW1hZ2VzOiAhMCxcbiAgICAgICAgICAgIHdhaXRpbmdGb3JWaWV3VHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgICB1bnN1c3BlbmQ6IG5vb3AkMVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIChhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMgPSBudWxsKSxcbiAgICAgICAgICBhY2N1bXVsYXRlU3VzcGVuc2V5Q29tbWl0T25GaWJlcihmaW5pc2hlZFdvcmssIGxhbmVzLCBzdXNwZW5kZWRTdGF0ZSksXG4gICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICAoKHN1YnRyZWVGbGFncyA9IHN1c3BlbmRlZFN0YXRlKSxcbiAgICAgICAgICAgIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSByb290LmNvbnRhaW5lckluZm8pLFxuICAgICAgICAgICAgKGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9IChcbiAgICAgICAgICAgICAgOSA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLm5vZGVUeXBlXG4gICAgICAgICAgICAgICAgPyBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGVcbiAgICAgICAgICAgICAgICA6IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZS5vd25lckRvY3VtZW50XG4gICAgICAgICAgICApLl9fcmVhY3RWaWV3VHJhbnNpdGlvbiksXG4gICAgICAgICAgICBudWxsICE9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgICAoc3VidHJlZUZsYWdzLmNvdW50KyssXG4gICAgICAgICAgICAgIChzdWJ0cmVlRmxhZ3Mud2FpdGluZ0ZvclZpZXdUcmFuc2l0aW9uID0gITApLFxuICAgICAgICAgICAgICAoc3VidHJlZUZsYWdzID0gb25VbnN1c3BlbmQuYmluZChzdWJ0cmVlRmxhZ3MpKSxcbiAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmZpbmlzaGVkLnRoZW4oXG4gICAgICAgICAgICAgICAgc3VidHJlZUZsYWdzLFxuICAgICAgICAgICAgICAgIHN1YnRyZWVGbGFnc1xuICAgICAgICAgICAgICApKSksXG4gICAgICAgICAgKHN1YnRyZWVGbGFncyA9XG4gICAgICAgICAgICAobGFuZXMgJiA2MjkxNDU2MCkgPT09IGxhbmVzXG4gICAgICAgICAgICAgID8gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSAtIG5vdyQxKClcbiAgICAgICAgICAgICAgOiAobGFuZXMgJiA0MTk0MDQ4KSA9PT0gbGFuZXNcbiAgICAgICAgICAgICAgICA/IGdsb2JhbE1vc3RSZWNlbnRUcmFuc2l0aW9uVGltZSAtIG5vdyQxKClcbiAgICAgICAgICAgICAgICA6IDApLFxuICAgICAgICAgIChzdWJ0cmVlRmxhZ3MgPSB3YWl0Rm9yQ29tbWl0VG9CZVJlYWR5KHN1c3BlbmRlZFN0YXRlLCBzdWJ0cmVlRmxhZ3MpKSxcbiAgICAgICAgICBudWxsICE9PSBzdWJ0cmVlRmxhZ3MpXG4gICAgICAgICkge1xuICAgICAgICAgIHBlbmRpbmdFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgICAgICAgICByb290LmNhbmNlbFBlbmRpbmdDb21taXQgPSBzdWJ0cmVlRmxhZ3MoXG4gICAgICAgICAgICBjb21wbGV0ZVJvb3QuYmluZChcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgcmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgICAgICAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgICAgICAgICB1cGRhdGVkTGFuZXMsXG4gICAgICAgICAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICAgICAgICAgIGRpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyxcbiAgICAgICAgICAgICAgZXhpdFN0YXR1cyxcbiAgICAgICAgICAgICAgc3VzcGVuZGVkU3RhdGUsXG4gICAgICAgICAgICAgIHN1c3BlbmRlZFN0YXRlLndhaXRpbmdGb3JWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgID8gXCJXYWl0aW5nIGZvciB0aGUgcHJldmlvdXMgQW5pbWF0aW9uXCJcbiAgICAgICAgICAgICAgICA6IDAgPCBzdXNwZW5kZWRTdGF0ZS5jb3VudFxuICAgICAgICAgICAgICAgICAgPyAwIDwgc3VzcGVuZGVkU3RhdGUuaW1nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgPyBcIlN1c3BlbmRlZCBvbiBDU1MgYW5kIEltYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIDogXCJTdXNwZW5kZWQgb24gQ1NTXCJcbiAgICAgICAgICAgICAgICAgIDogMSA9PT0gc3VzcGVuZGVkU3RhdGUuaW1nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgPyBcIlN1c3BlbmRlZCBvbiBhbiBJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIDogMCA8IHN1c3BlbmRlZFN0YXRlLmltZ0NvdW50XG4gICAgICAgICAgICAgICAgICAgICAgPyBcIlN1c3BlbmRlZCBvbiBJbWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICAgI
15852HJvb3QsXG4gICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgICAgICAgIWRpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBjb21wbGV0ZVJvb3QoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgbGFuZXMsXG4gICAgICAgIHJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICB0cmFuc2l0aW9ucyxcbiAgICAgICAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlLFxuICAgICAgICBzcGF3bmVkTGFuZSxcbiAgICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICBkaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gICAgICAgIGV4aXRTdGF0dXMsXG4gICAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgICBzdXNwZW5kZWRDb21taXRSZWFzb24sXG4gICAgICAgIGNvbXBsZXRlZFJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykge1xuICAgICAgZm9yICh2YXIgbm9kZSA9IGZpbmlzaGVkV29yazsgOyApIHtcbiAgICAgICAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKDAgPT09IHRhZyB8fCAxMSA9PT0gdGFnIHx8IDE1ID09PSB0YWcpICYmXG4gICAgICAgICAgbm9kZS5mbGFncyAmIDE2Mzg0ICYmXG4gICAgICAgICAgKCh0YWcgPSBub2RlLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICBudWxsICE9PSB0YWcgJiYgKCh0YWcgPSB0YWcuc3RvcmVzKSwgbnVsbCAhPT0gdGFnKSlcbiAgICAgICAgKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2Y
15852XIgY2hlY2sgPSB0YWdbaV0sXG4gICAgICAgICAgICAgIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICBjaGVjayA9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFvYmplY3RJcyhnZXRTbmFwc2hvdCgpLCBjaGVjaykpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIHRhZyA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIDE2Mzg0ICYmIG51bGwgIT09IHRhZylcbiAgICAgICAgICAodGFnLnJldHVybiA9IG5vZGUpLCAobm9kZSA9IHRhZyk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIGJyZWFrO1xuICAgICAgICAgIGZvciAoOyBudWxsID09PSBub2RlLnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IG5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHJldHVybiAhMDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICByb290LFxuICAgICAgc3VzcGVuZGVkTGFuZXMsXG4gICAgICBzcGF3bmVkTGFuZSxcbiAgICAgIGRpZEF0dGVtcHRFbnRpcmVUcmVlXG4gICAgKSB7XG4gICAgICBzdXNwZW5kZWRMYW5lcyA9IGdldEVudGFuZ2xlZExhbmVzKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbiAgICAgIHN1c3BlbmRlZExhbmVzICY9IH53b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcztcbiAgICAgIHN1c3BlbmRlZExhbmVzICY9IH53b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcztcbiAgICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gICAgICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lcztcbiAgICAgIGRpZEF0dGVtcHRFbnRpcmVUcmVlICYmIChyb290Lndhcm1MYW5lcyB8PSBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICBkaWRBdHRlbXB0RW50aXJlVHJlZSA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICAgICAgZm9yICh2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lczsgMCA8IGxhbmVzOyApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gMzEgLSBjbHozMihsYW5lcyksXG4gICAgICAgICAgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICAgIGRpZEF0dGVtcHRFbnRpcmVUcmVlW2luZGV4XSA9IC0xO1xuICAgICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICAgIH1cbiAgICAgIDAgIT09IHNwYXduZWRMYW5lICYmXG4gICAgICAgIG1hcmtTcGF3bmVkRGVmZXJyZWRMYW5lKHJvb3QsIHNwYXduZWRMYW5lLCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZsdXNoU3luY1dvcmskMSgpIHtcbiAgICAgIHJldHVybiAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHRcbiAgICAgICAgPyAoZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpLCAhMSlcbiAgICAgICAgOiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1N0YWNrKCkge1xuICAgICAgaWYgKG51bGwgIT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9PT0gTm90U3VzcGVuZGVkKVxuICAgICAgICAgIHZhciBpbnRlcnJ1cHRlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAoaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgICAgICByZXNldEhvb2tzT25VbndpbmQoaW50ZXJydXB0ZWRXb3JrKSxcbiAgICAgICAgICAgICh0aGVuYWJsZVN0YXRlJDEgPSBudWxsKSxcbiAgICAgICAgICAgICh0aGVuYWJsZUluZGV4Q291bnRlciQxID0gMCksXG4gICAgICAgICAgICAoaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBmb3IgKDsgbnVsbCAhPT0gaW50ZXJydXB0ZWRXb3JrOyApXG4gICAgICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGludGVycnVwdGVkV29yay5hbHRlcm5hdGUsIGludGVycnVwdGVkV29yayksXG4gICAgICAgICAgICAoaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybik7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZmluYWxpemVSZW5kZXIobGFuZXMsIGZpbmFsaXphdGlvblRpbWUpIHtcbiAgICAgIDAgIT09IChsYW5lcyAmIDEyNykgJiYgKGJsb2NraW5nQ2xhbXBUaW1lID0gZmluYWxpemF0aW9uVGltZSk7XG4gICAgICAwICE9PSAobGFuZXMgJiA0MTk0MDQ4KSAmJiAodHJhbnNpdGlvbkNsYW1wVGltZSA9IGZpbmFsaXphdGlvblRpbWUpO1xuICAgICAgMCAhPT0gKGxhbmVzICYgNjI5MTQ1NjApICYmIChyZXRyeUNsYW1wVGltZSA9IGZpbmFsaXphdGlvblRpbWUpO1xuICAgICAgMCAhPT0gKGxhbmVzICYgMjA4MDM3NDc4NCkgJiYgKGlkbGVDbGFtcFRpbWUgPSBmaW5hbGl6YXRpb25UaW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHtcbiAgICAgIHN1cHBvcnRzVXNlclRpbWluZyAmJlxuICAgICAgICAoY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgXCJCbG9ja2luZyBUcmFja1wiLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIFwiQmxvY2tpbmdcIixcbiAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICApLFxuICAgICAgICBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICBcIlRyYW5zaXRpb24gVHJhY2tcIixcbiAgICAgICAgICAwLjAwMyxcbiAgICAgICAgICAwLjAwMyxcbiAgICAgICAgICBcIlRyYW5zaXRpb25cIixcbiAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICApLFxuICAgICAgICBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICBcIlN1c3BlbnNlIFRyYWNrXCIsXG4gICAgICAgICAgMC4wMDMsXG4gICAgICAgICAgMC4wMDMsXG4gICAgICAgICAgXCJTdXNwZW5zZVwiLFxuICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICksXG4gICAgICAgIGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgIFwiSWRsZSBUcmFja1wiLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIFwiSWRsZVwiLFxuICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICkpO1xuICAgICAgdmFyIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gcmVuZGVyU3RhcnRUaW1lO1xuICAgICAgcmVuZGVyU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICBpZiAoMCAhPT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiYgMCA8IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lKSB7XG4gICAgICAgI
15852HNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheVxuICAgICAgICApXG4gICAgICAgICAgbG9nU3VzcGVuZGVkUmVuZGVyUGhhc2UoXG4gICAgICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgIHJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrXG4gICAgICAgICAgKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGVuZFRpbWUgPSByZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICBkZWJ1Z1Rhc2sgPSB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2s7XG4gICAgICAgICAgaWYgKHN1cHBvcnRzVXNlclRpbWluZyAmJiAhKGVuZFRpbWUgPD0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUpKSB7XG4gICAgICAgICAgICB2YXIgY29sb3IgPVxuICAgICAgICAgICAgICAgIChsYW5lcyAmIDczODE5NzY1MykgPT09IGxhbmVzXG4gICAgICAgICAgICAgICAgICA/IFwidGVydGlhcnktZGFya1wiXG4gICAgICAgICAgICAgICAgICA6IFwicHJpbWFyeS1kYXJrXCIsXG4gICAgICAgICAgICAgIGxhYmVsID1cbiAgICAgICAgICAgICAgICAobGFuZXMgJiA1MzY4NzA5MTIpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgICAgPyBcIlByZXdhcm1cIlxuICAgICAgICAgICAgICAgICAgOiAobGFuZXMgJiAyMDEzMjY3NDEpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgICAgICA/IFwiSW50ZXJydXB0ZWQgSHlkcmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIkludGVycnVwdGVkIFJlbmRlclwiO1xuICAgICAgICAgICAgZGVidWdUYXNrXG4gICAgICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgY29sb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGl6ZVJlbmRlcih3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcywgcmVuZGVyU3RhcnRUaW1lKTtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrO1xuICAgICAgd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrID0gbnVsbDtcbiAgICAgIGlmICgwICE9PSAobGFuZXMgJiAxMjcpKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayA9IGJsb2NraW5nVXBkYXRlVGFzaztcbiAgICAgICAgZGVidWdUYXNrID1cbiAgICAgICAgICAwIDw9IGJsb2NraW5nVXBkYXRlVGltZSAmJiBibG9ja2luZ1VwZGF0ZVRpbWUgPCBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgPyBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgOiBibG9ja2luZ1VwZGF0ZVRpbWU7XG4gICAgICAgIGVuZFRpbWUgPVxuICAgICAgICAgIDAgPD0gYmxvY2tpbmdFdmVudFRpbWUgJiYgYmxvY2tpbmdFdmVudFRpbWUgPCBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgPyBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgOiBibG9ja2luZ0V2ZW50VGltZTtcbiAgICAgICAgY29sb3IgPVxuICAgICAgICAgIDAgPD0gZW5kVGltZSA/IGVuZFRpbWUgOiAwIDw9IGRlYnVnVGFzayA/IGRlYnVnVGFzayA6IHJlbmRlclN0YXJ0VGltZTtcbiAgICAgICAgMCA8PSBibG9ja2luZ1N1c3BlbmRlZFRpbWVcbiAgICAgICAgICA/IChzZXRDdXJyZW50VHJhY2tGcm9tTGFuZXMoMiksXG4gICAgICAgICAgICBsb2dTdXNwZW5kZWRXaXRoRGVsYXlQaGFzZShcbiAgICAgICAgICAgICAgYmxvY2tpbmdTdXNwZW5kZWRUaW1lLFxuICAgICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogMCAhPT0gKGFuaW1hdGluZ0xhbmVzICYgMTI3KSAmJlxuICAgICAgICAgICAgKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcygyKSxcbiAgICAgICAgICAgIGxvZ0FuaW1hdGluZ1BoYXNlKGJsb2NraW5nQ2xhbXBUaW1lLCBjb2xvciwgYW5pbWF0aW5nVGFzaykpO1xuICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA9IGRlYnVnVGFzaztcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IGVuZFRpbWUsXG4gICAgICAgICAgZXZlbnRUeXBlID0gYmxvY2tpbmdFdmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRJc1JlcGVhdCA9IDAgPCBibG9ja2luZ0V2ZW50UmVwZWF0VGltZSxcbiAgICAgICAgICBpc1NwYXduZWRVcGRhdGUgPSBibG9ja2luZ1VwZGF0ZVR5cGUgPT09IFNQQVdORURfVVBEQVRFLFxuICAgICAgICAgIGlzUGluZ2VkVXBkYXRlID0gYmxvY2tpbmdVcGRhdGVUeXBlID09PSBQSU5HRURfVVBEQVRFO1xuICAgICAgICBkZWJ1Z1Rhc2sgPSByZW5kZXJTdGFydFRpbWU7XG4gICAgICAgIGVuZFRpbWUgPSBibG9ja2luZ1VwZGF0ZVRhc2s7XG4gICAgICAgIGNvbG9yID0gYmxvY2tpbmdVcGRhdGVNZXRob2ROYW1lO1xuICAgICAgICBsYWJlbCA9IGJsb2NraW5nVXBkYXRlQ29tcG9uZW50TmFtZTtcbiAgICAgICAgaWYgKHN1cHBvcnRzVXNlclRpbWluZykge1xuICAgICAgICAgIGN1cnJlbnRUcmFjayA9IFwiQmxvY2tpbmdcIjtcbiAgICAgICAgICAwIDwgcHJldmlvdXNSZW5kZXJTdGFydFRpbWVcbiAgICAgICAgICAgID8gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPiBkZWJ1Z1Rhc2sgJiZcbiAgICAgICAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gZGVidWdUYXNrKVxuICAgICAgICAgICAgOiAocHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPSBkZWJ1Z1Rhc2spO1xuICAgICAgICAgIDAgPCBldmVudFRpbWVcbiAgICAgICAgICAgID8gZXZlbnRUaW1lID4gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgKGV2ZW50VGltZSA9IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lKVxuICAgICAgICAgICAgOiAoZXZlbnRUaW1lID0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUpO1xuICAgICAgICAgIGlmIChudWxsICE9PSBldmVudFR5cGUgJiYgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPiBldmVudFRpbWUpIHtcbiAgICAgICAgICAgI
15852HZhciBjb2xvciRqc2NvbXAkMCA9IGV2ZW50SXNSZXBlYXQgPyBcInNlY29uZGFyeS1saWdodFwiIDogXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgID8gZW5kVGltZS5ydW4oXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICBldmVudElzUmVwZWF0ID8gXCJDb25zZWN1dGl2ZVwiIDogXCJFdmVudDogXCIgKyBldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VGltZSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgZXZlbnRJc1JlcGVhdCA/IFwiQ29uc2VjdXRpdmVcIiA6IFwiRXZlbnQ6IFwiICsgZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgZXZlbnRUaW1lLFxuICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVidWdUYXNrID4gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICgoZXZlbnRUaW1lID0gaXNTcGF3bmVkVXBkYXRlXG4gICAgICAgICAgICAgID8gXCJlcnJvclwiXG4gICAgICAgICAgICAgIDogKGxhbmVzICYgNzM4MTk3NjUzKSA9PT0gbGFuZXNcbiAgICAgICAgICAgICAgICA/IFwidGVydGlhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgIDogXCJwcmltYXJ5LWxpZ2h0XCIpLFxuICAgICAgICAgICAgKGlzU3Bhd25lZFVwZGF0ZSA9IGlzUGluZ2VkVXBkYXRlXG4gICAgICAgICAgICAgID8gXCJQcm9taXNlIFJlc29sdmVkXCJcbiAgICAgICAgICAgICAgOiBpc1NwYXduZWRVcGRhdGVcbiAgICAgICAgICAgICAgICA/IFwiQ2FzY2FkaW5nIFVwZGF0ZVwiXG4gICAgICAgICAgICAgICAgOiA1IDwgZGVidWdUYXNrIC0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgID8gXCJVcGRhdGUgQmxvY2tlZFwiXG4gICAgICAgICAgICAgICAgICA6IFwiVXBkYXRlXCIpLFxuICAgICAgICAgICAgKGlzUGluZ2VkVXBkYXRlID0gW10pLFxuICAgICAgICAgICAgbnVsbCAhPSBsYWJlbCAmJiBpc1BpbmdlZFVwZGF0ZS5wdXNoKFtcIkNvbXBvbmVudCBuYW1lXCIsIGxhYmVsXSksXG4gICAgICAgICAgICBudWxsICE9IGNvbG9yICYmIGlzUGluZ2VkVXBkYXRlLnB1c2goW1wiTWV0aG9kIG5hbWVcIiwgY29sb3JdKSxcbiAgICAgICAgICAgIChwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA9IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmQ6IGRlYnVnVGFzayxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgZGV2dG9vbHM6IHtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGlzUGluZ2VkVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgdHJhY2s6IGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIHRyYWNrR3JvdXA6IExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IGV2ZW50VGltZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgID8gZW5kVGltZS5ydW4oXG4gICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLFxuICAgICAgICAgICAgICAgICAgICBpc1NwYXduZWRVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoaXNTcGF3bmVkVXBkYXRlLCBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSksXG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGlzU3Bhd25lZFVwZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGJsb2NraW5nVXBkYXRlVGltZSA9IC0xLjE7XG4gICAgICAgIGJsb2NraW5nVXBkYXRlVHlwZSA9IDA7XG4gICAgICAgIGJsb2NraW5nVXBkYXRlQ29tcG9uZW50TmFtZSA9IGJsb2NraW5nVXBkYXRlTWV0aG9kTmFtZSA9IG51bGw7XG4gICAgICAgIGJsb2NraW5nU3VzcGVuZGVkVGltZSA9IC0xLjE7XG4gICAgICAgIGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gYmxvY2tpbmdFdmVudFRpbWU7XG4gICAgICAgIGJsb2NraW5nRXZlbnRUaW1lID0gLTEuMTtcbiAgICAgICAgYmxvY2tpbmdDbGFtcFRpbWUgPSBub3coKTtcbiAgICAgIH1cbiAgICAgIDAgIT09IChsYW5lcyAmIDQxOTQwNDgpICYmXG4gICAgICAgICgod29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrID0gdHJhbnNpdGlvblVwZGF0ZVRhc2spLFxuICAgICAgICAoZGVidWdUYXNrID1cbiAgICAgICAgICAwIDw9IHRyYW5zaXRpb25TdGFydFRpbWUgJiYgdHJhbnNpdGlvblN0YXJ0VGltZSA8IHRyYW5zaXRpb25DbGFtcFRpbWVcbiAgICAgICAgICAgID8gdHJhbnNpdGlvbkNsYW1wVGltZVxuICAgICAgICAgICAgOiB0cmFuc2l0aW9uU3RhcnRUaW1lKSxcbiAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID1cbiAgICAgICAgICAwIDw9IHRyYW5zaXRpb25VcGRhdGVUaW1lICYmXG4gICAgICAgICAgdHJhbnNpdGlvblVwZGF0ZVRpbWUgPCB0cmFuc2l0aW9uQ2xhbXBUaW1lXG4gICAgICAgICAgICA/IHRyYW5zaXRpb25DbGFtcFRpbWVcbiAgICAgICAgICAgIDogdHJhbnNpdGlvblVwZGF0ZVRpbWUpLFxuICAgICAgICAoZW5kVGltZSA9XG4gICAgICAgICAgMCA8PSB0cmFuc2l0aW9uRXZlbnRUaW1lICYmIHRyYW5zaXRpb25FdmVudFRpbWUgPCB0cmFuc2l0aW9uQ2xhbXBUaW1lXG4gICAgICAgICAgICA/IHRyYW5zaXRpb25DbGFtcFRpbWVcbiAgICAgICAgICAgIDogdHJhbnNpdGlvbkV2ZW50VGltZSksXG4gICAgICAgIChjb2xvciA9XG4gICAgICAgICAgMCA8PSBlbmRUaW1lXG4gICAgICAgICAgICA/IGVuZFRpbWVcbiAgICAgICAgICAgIDogMCA8PSBwcmV2aW91c1JlbmRlclN0YXJ0VGltZVxuICAgICAgICAgICAgICA/IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgIDogcmVuZGVyU3RhcnRUaW1lKSxcbiAgICAgICAgMCA8PSB0cmFuc2l0aW9uU3VzcGVuZGVkVGltZVxuICAgICAgICAgID8gKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcygyNTYpLFxuICAgICAgICAgICAgbG9nU3VzcGVuZGVkV2l0aERlbGF5UGhhc2UoXG4gICAgICAgICAgICAgI
15852HRyYW5zaXRpb25TdXNwZW5kZWRUaW1lLFxuICAgICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFza1xuICAgICAgICAgICAgKSlcbiAgICAgICAgICA6IDAgIT09IChhbmltYXRpbmdMYW5lcyAmIDQxOTQwNDgpICYmXG4gICAgICAgICAgICAoc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKDI1NiksXG4gICAgICAgICAgICBsb2dBbmltYXRpbmdQaGFzZSh0cmFuc2l0aW9uQ2xhbXBUaW1lLCBjb2xvciwgYW5pbWF0aW5nVGFzaykpLFxuICAgICAgICAoaXNQaW5nZWRVcGRhdGUgPSBlbmRUaW1lKSxcbiAgICAgICAgKGV2ZW50VGltZSA9IHRyYW5zaXRpb25FdmVudFR5cGUpLFxuICAgICAgICAoZXZlbnRUeXBlID0gMCA8IHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUpLFxuICAgICAgICAoZXZlbnRJc1JlcGVhdCA9IHRyYW5zaXRpb25VcGRhdGVUeXBlID09PSBQSU5HRURfVVBEQVRFKSxcbiAgICAgICAgKGNvbG9yID0gcmVuZGVyU3RhcnRUaW1lKSxcbiAgICAgICAgKGVuZFRpbWUgPSB0cmFuc2l0aW9uVXBkYXRlVGFzayksXG4gICAgICAgIChsYWJlbCA9IHRyYW5zaXRpb25VcGRhdGVNZXRob2ROYW1lKSxcbiAgICAgICAgKGlzU3Bhd25lZFVwZGF0ZSA9IHRyYW5zaXRpb25VcGRhdGVDb21wb25lbnROYW1lKSxcbiAgICAgICAgc3VwcG9ydHNVc2VyVGltaW5nICYmXG4gICAgICAgICAgKChjdXJyZW50VHJhY2sgPSBcIlRyYW5zaXRpb25cIiksXG4gICAgICAgICAgMCA8IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICA/IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID4gY29sb3IgJiZcbiAgICAgICAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gY29sb3IpXG4gICAgICAgICAgICA6IChwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA9IGNvbG9yKSxcbiAgICAgICAgICAwIDwgZGVidWdUYXNrXG4gICAgICAgICAgICA/IGRlYnVnVGFzayA+IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgIChkZWJ1Z1Rhc2sgPSBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSlcbiAgICAgICAgICAgIDogKGRlYnVnVGFzayA9IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lKSxcbiAgICAgICAgICAwIDwgaXNQaW5nZWRVcGRhdGVcbiAgICAgICAgICAgID8gaXNQaW5nZWRVcGRhdGUgPiBkZWJ1Z1Rhc2sgJiYgKGlzUGluZ2VkVXBkYXRlID0gZGVidWdUYXNrKVxuICAgICAgICAgICAgOiAoaXNQaW5nZWRVcGRhdGUgPSBkZWJ1Z1Rhc2spLFxuICAgICAgICAgIGRlYnVnVGFzayA+IGlzUGluZ2VkVXBkYXRlICYmXG4gICAgICAgICAgICBudWxsICE9PSBldmVudFRpbWUgJiZcbiAgICAgICAgICAgICgoY29sb3IkanNjb21wJDAgPSBldmVudFR5cGUgPyBcInNlY29uZGFyeS1saWdodFwiIDogXCJ3YXJuaW5nXCIpLFxuICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICA/IGVuZFRpbWUucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID8gXCJDb25zZWN1dGl2ZVwiIDogXCJFdmVudDogXCIgKyBldmVudFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGlzUGluZ2VkVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z1Rhc2ssXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID8gXCJDb25zZWN1dGl2ZVwiIDogXCJFdmVudDogXCIgKyBldmVudFRpbWUsXG4gICAgICAgICAgICAgICAgICBpc1BpbmdlZFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgIGRlYnVnVGFzayxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgY29sb3IkanNjb21wJDBcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA+IGRlYnVnVGFzayAmJlxuICAgICAgICAgICAgKGVuZFRpbWVcbiAgICAgICAgICAgICAgPyBlbmRUaW1lLnJ1bihcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgIFwiQWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnVGFzayxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBcIkFjdGlvblwiLFxuICAgICAgICAgICAgICAgICAgZGVidWdUYXNrLFxuICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICBjb2xvciA+IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lICYmXG4gICAgICAgICAgICAoKGRlYnVnVGFzayA9IGV2ZW50SXNSZXBlYXRcbiAgICAgICAgICAgICAgPyBcIlByb21pc2UgUmVzb2x2ZWRcIlxuICAgICAgICAgICAgICA6IDUgPCBjb2xvciAtIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgPyBcIlVwZGF0ZSBCbG9ja2VkXCJcbiAgICAgICAgICAgICAgICA6IFwiVXBkYXRlXCIpLFxuICAgICAgICAgICAgKGlzUGluZ2VkVXBkYXRlID0gW10pLFxuICAgICAgICAgICAgbnVsbCAhPSBpc1NwYXduZWRVcGRhdGUgJiZcbiAgICAgICAgICAgICAgaXNQaW5nZWRVcGRhdGUucHVzaChbXCJDb21wb25lbnQgbmFtZVwiLCBpc1NwYXduZWRVcGRhdGVdKSxcbiAgICAgICAgICAgIG51bGwgIT0gbGFiZWwgJiYgaXNQaW5nZWRVcGRhdGUucHVzaChbXCJNZXRob2QgbmFtZVwiLCBsYWJlbF0pLFxuICAgICAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0ge1xuICAgICAgICAgICAgICBzdGFydDogcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZDogY29sb3IsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGRldnRvb2xzOiB7XG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBpc1BpbmdlZFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgI
15852HRyYWNrOiBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICB0cmFja0dyb3VwOiBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgID8gZW5kVGltZS5ydW4oXG4gICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLFxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z1Rhc2ssXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoZGVidWdUYXNrLCBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSksXG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGRlYnVnVGFzaykpKSxcbiAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVUaW1lID0gdHJhbnNpdGlvblN0YXJ0VGltZSA9IC0xLjEpLFxuICAgICAgICAodHJhbnNpdGlvblVwZGF0ZVR5cGUgPSAwKSxcbiAgICAgICAgKHRyYW5zaXRpb25TdXNwZW5kZWRUaW1lID0gLTEuMSksXG4gICAgICAgICh0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lID0gdHJhbnNpdGlvbkV2ZW50VGltZSksXG4gICAgICAgICh0cmFuc2l0aW9uRXZlbnRUaW1lID0gLTEuMSksXG4gICAgICAgICh0cmFuc2l0aW9uQ2xhbXBUaW1lID0gbm93KCkpKTtcbiAgICAgIDAgIT09IChsYW5lcyAmIDYyOTE0NTYwKSAmJlxuICAgICAgICAwICE9PSAoYW5pbWF0aW5nTGFuZXMgJiA2MjkxNDU2MCkgJiZcbiAgICAgICAgKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyg0MTk0MzA0KSxcbiAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UocmV0cnlDbGFtcFRpbWUsIHJlbmRlclN0YXJ0VGltZSwgYW5pbWF0aW5nVGFzaykpO1xuICAgICAgMCAhPT0gKGxhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgMCAhPT0gKGFuaW1hdGluZ0xhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcygyNjg0MzU0NTYpLFxuICAgICAgICBsb2dBbmltYXRpbmdQaGFzZShpZGxlQ2xhbXBUaW1lLCByZW5kZXJTdGFydFRpbWUsIGFuaW1hdGluZ1Rhc2spKTtcbiAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgIT09IG5vVGltZW91dCAmJlxuICAgICAgICAoKHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dCksXG4gICAgICAgIGNhbmNlbFRpbWVvdXQocHJldmlvdXNSZW5kZXJTdGFydFRpbWUpKTtcbiAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0O1xuICAgICAgbnVsbCAhPT0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgJiZcbiAgICAgICAgKChyb290LmNhbmNlbFBlbmRpbmdDb21taXQgPSBudWxsKSwgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUoKSk7XG4gICAgICBwZW5kaW5nRWZmZWN0c0xhbmVzID0gMDtcbiAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NTdGFjaygpO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhcbiAgICAgICAgcm9vdC5jdXJyZW50LFxuICAgICAgICBudWxsXG4gICAgICApO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBsYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MgPSAhMTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nID0gY2hlY2tJZlJvb3RJc1ByZXJlbmRlcmluZyhyb290LCBsYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRBdHRhY2hQaW5nTGlzdGVuZXIgPSAhMTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9XG4gICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9XG4gICAgICAgICAgMDtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9XG4gICAgICAgIG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRJbmNsdWRlUmVjdXJzaXZlUmVuZGVyVXBkYXRlID0gITE7XG4gICAgICBlbnRhbmdsZWRSZW5kZXJMYW5lcyA9IGdldEVudGFuZ2xlZExhbmVzKHJvb3QsIGxhbmVzKTtcbiAgICAgIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcbiAgICAgIHJvb3QgPSBnZXRDdXJyZW50VGltZSgpO1xuICAgICAgMWUzIDwgcm9vdCAtIGxhc3RSZXNldFRpbWUgJiZcbiAgICAgICAgKChSZWFjdFNoYXJlZEludGVybmFscy5yZWNlbnRseUNyZWF0ZWRPd25lclN0YWNrcyA9IDApLFxuICAgICAgICAobGFzdFJlc2V0VGltZSA9IHJvb3QpKTtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgICAgIHJldHVybiBwcmV2aW91c1JlbmRlclN0YXJ0VGltZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlVGhyb3cocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuICAgICAgaXNSZW5kZXJpbmcgPSAhMTtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgdGhyb3duVmFsdWUgPT09IFN1c3BlbnNlRXhjZXB0aW9uIHx8XG4gICAgICB0aHJvd25WYWx1ZSA9PT0gU3VzcGVuc2VBY3Rpb25FeGNlcHRpb25cbiAgICAgICAgPyAoKHRocm93blZhbHVlID0gZ2V0U3VzcGVuZGVkVGhlbmFibGUoKSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gU3VzcGVuZGVkT25JbW1lZGlhdGUpKVxuICAgICAgICA6IHRocm93blZhbHVlID09PSBTdXNwZW5zZXlDb21taXRFeGNlcHRpb25cbiAgICAgICAgICA/ICgodGhyb3duVmFsdWUgPSBnZXRTdXNwZW5kZWRUaGVuYWJsZSgpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IFN1c3BlbmRlZE9uSW5zdGFuY2UpKVxuICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID1cbiAgICAgICAgICAgICAgdGhyb3duVmFsdWUgPT09IFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvblxuICAgICAgICAgICAgICAgID8gU3VzcGVuZGVkT25IeWRyYXRpb25cbiAgICAgICAgICAgICAgICA6IG51bGwgIT09IHRocm93blZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB0aHJvd25WYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0aHJvd25WYWx1ZS50aGVuXG4gICAgICAgICAgICAgICAgICA/IFN1c3BlbmRlZE9uRGVwcmVjYXRlZF
15852Rocm93UHJvbWlzZVxuICAgICAgICAgICAgICAgICAgOiBTdXNwZW5kZWRPbkVycm9yKTtcbiAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSB0aHJvd25WYWx1ZTtcbiAgICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgbnVsbCA9PT0gZXJyb3JlZFdvcmtcbiAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkKSxcbiAgICAgICAgICBsb2dVbmNhdWdodEVycm9yKFxuICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHRocm93blZhbHVlLCByb290LmN1cnJlbnQpXG4gICAgICAgICAgKSlcbiAgICAgICAgOiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUgJiZcbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZER1cmF0aW9uKGVycm9yZWRXb3JrKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2hvdWxkUmVtYWluT25QcmV2aW91c1NjcmVlbigpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgIHJldHVybiBudWxsID09PSBoYW5kbGVyXG4gICAgICAgID8gITBcbiAgICAgICAgOiAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA0MTk0MDQ4KSA9PT1cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgPyBudWxsID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICA/ICEwXG4gICAgICAgICAgICA6ICExXG4gICAgICAgICAgOiAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA2MjkxNDU2MCkgPT09XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgfHxcbiAgICAgICAgICAgICAgMCAhPT0gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNTM2ODcwOTEyKVxuICAgICAgICAgICAgPyBoYW5kbGVyID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICAgICAgcmV0dXJuIG51bGwgPT09IHByZXZEaXNwYXRjaGVyID8gQ29udGV4dE9ubHlEaXNwYXRjaGVyIDogcHJldkRpc3BhdGNoZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hBc3luY0Rpc3BhdGNoZXIoKSB7XG4gICAgICB2Y
15852XIgcHJldkFzeW5jRGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkE7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5BID0gRGVmYXVsdEFzeW5jRGlzcGF0Y2hlcjtcbiAgICAgIHJldHVybiBwcmV2QXN5bmNEaXNwYXRjaGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKGZpYmVyKSB7XG4gICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2sgJiZcbiAgICAgICAgKHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayA9XG4gICAgICAgICAgbnVsbCA9PSBmaWJlci5fZGVidWdUYXNrID8gbnVsbCA6IGZpYmVyLl9kZWJ1Z1Rhc2spO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MgfHxcbiAgICAgICAgKCh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDQxOTQwNDgpICE9PVxuICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYmXG4gICAgICAgICAgbnVsbCAhPT0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCkgfHxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nID0gITApO1xuICAgICAgKDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgJiAxMzQyMTc3MjcpICYmXG4gICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyAmIDEzNDIxNzcyNykpIHx8XG4gICAgICAgIG51bGwgPT09IHdvcmtJblByb2dyZXNzUm9vdCB8fFxuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NEZWZlcnJlZExhbmUsXG4gICAgICAgICAgITFcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMsIHNob3VsZFlpZWxkRm9yUHJlcmVuZGVyaW5nKSB7XG4gICAgICB2Y
15852XIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKSxcbiAgICAgICAgcHJldkFzeW5jRGlzcGF0Y2hlciA9IHB1c2hBc3luY0Rpc3BhdGNoZXIoKTtcbiAgICAgIGlmIChcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgICAgIDAgPCBtZW1vaXplZFVwZGF0ZXJzLnNpemUgJiZcbiAgICAgICAgICAgIChyZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKSk7XG4gICAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbDtcbiAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgICAgbGFuZXMgPSAhMTtcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICAgICAgYTogZG9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiAhPT0gTm90U3VzcGVuZGVkICYmXG4gICAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHVuaXRPZldvcmsgPSB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgdGhyb3duVmFsdWUgPSB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlO1xuICAgICAgICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbikge1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSHlkcmF0aW9uOlxuICAgICAgICAgICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NTdGFjaygpO1xuICAgICAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMgPSBSb290U3VzcGVuZGVkQXRUaGVTaGVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSW1tZWRpYXRlOlxuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uRGF0YTpcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkFjdGlvbjpcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkRlcHJlY2F0ZWRUaHJvd1Byb21pc2U6XG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCAmJiAobGFuZXMgPSAhMCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlYXNvbiA9IHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3Aocm9vdCwgdW5pdE9mV29yaywgdGhyb3duVmFsdWUsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgc2hvdWxkWWllbGRGb3JQcmVyZW5kZXJpbmcgJiZcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzID0gUm9vdEluUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAocmVhc29uID0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKHJvb3QsIHVuaXRPZldvcmssIHRocm93blZhbHVlLCByZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzID0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBjYXRjaCAodGhyb3duVmFsdWUkOSkge1xuICAgICAgICAgIGhhbmRsZVRocm93KHJvb3QsIHRocm93blZhbHVlJDkpO1xuICAgICAgICB9XG4gICAgICB3aGlsZSAoMSk7XG4gICAgICBsYW5lcyAmJiByb290LnNoZWxsU3VzcGVuZENvdW50ZXIrKztcbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuQSA9IHByZXZBc3luY0Rpc3BhdGNoZXI7XG4gICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzcyAmJlxuICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGwpLFxuICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwKSxcbiAgICAgICAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpKTtcbiAgICAgIHJldHVybiBtZW1vaXplZFVwZGF0ZXJzO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3M7ICkgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICAgICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCksXG4gICAgICAgI
15852HByZXZBc3luY0Rpc3BhdGNoZXIgPSBwdXNoQXN5bmNEaXNwYXRjaGVyKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXNcbiAgICAgICkge1xuICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgICAgICAwIDwgbWVtb2l6ZWRVcGRhdGVycy5zaXplICYmXG4gICAgICAgICAgICAocmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCkpO1xuICAgICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3ckMSgpICsgUkVOREVSX1RJTUVPVVRfTVM7XG4gICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJc1ByZXJlbmRlcmluZyA9IGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcoXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBsYW5lc1xuICAgICAgICApO1xuICAgICAgYTogZG9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiAhPT0gTm90U3VzcGVuZGVkICYmXG4gICAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICAgIClcbiAgICAgICAgICAgIGI6IHN3aXRjaCAoXG4gICAgICAgICAgICAgICgobGFuZXMgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIChtZW1vaXplZFVwZGF0ZXJzID0gd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25FcnJvcjpcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IE5vdFN1c3BlbmRlZDtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKFxuICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycyxcbiAgICAgICAgICAgICAgICAgIFN1c3BlbmRlZE9uRXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uRGF0YTpcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkFjdGlvbjpcbiAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZVJlc29sdmVkKG1lbW9pemVkVXBkYXRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IE5vdFN1c3BlbmRlZDtcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgcmVwbGF5U3VzcGVuZGVkVW5pdE9mV29yayhsYW5lcyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFuZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gIT09IFN1c3BlbmRlZE9uRGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiAhPT0gU3VzcGVuZGVkT25BY3Rpb24pIHx8XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fFxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPVxuICAgICAgICAgICAgICAgICAgICAgIFN1c3BlbmRlZEFuZFJlYWR5VG9Db250aW51ZSk7XG4gICAgICAgICAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLnRoZW4obGFuZXMsIGxhbmVzKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSW1tZWRpYXRlOlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gU3VzcGVuZGVkQW5kUmVhZHlUb0NvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25JbnN0YW5jZTpcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9XG4gICAgICAgICAgICAgICAgICBTdXNwZW5kZWRPbkluc3RhbmNlQW5kUmVhZHlUb0NvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkQW5kUmVhZHlUb0NvbnRpbnVlOlxuICAgICAgICAgICAgICAgIGlzVGhlbmFibGVSZXNvbHZlZChtZW1vaXplZFVwZGF0ZXJzKVxuICAgICAgICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkKSxcbiAgICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3VzcGVuZGVkVW5pdE9mV29yayhsYW5lcykpXG4gICAgICAgICAgICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSBOb3RTdXNwZW5kZWQpLFxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKFxuICAgICAgICAgICAgICAgICAgICAgI
15852HJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBTdXNwZW5kZWRBbmRSZWFkeVRvQ29udGludWVcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25JbnN0YW5jZUFuZFJlYWR5VG9Db250aW51ZTpcbiAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgICAgICB2YXIgaG9zdEZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwcmVsb2FkUmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGhvc3RGaWJlci5zdGF0ZU5vZGUuY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSBOb3RTdXNwZW5kZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNpYmxpbmcgPSBob3N0RmliZXIuc2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gc2libGluZykgd29ya0luUHJvZ3Jlc3MgPSBzaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybkZpYmVyID0gaG9zdEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVVuaXRPZldvcmsocmV0dXJuRmliZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzcyA9IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIlVuZXhwZWN0ZWQgdHlwZSBvZiBmaWJlciB0cmlnZ2VyZWQgYSBzdXNwZW5zZXkgY29tbWl0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3AoXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLFxuICAgICAgICAgICAgICAgICAgU3VzcGVuZGVkT25JbnN0YW5jZUFuZFJlYWR5VG9Db250aW51ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25EZXByZWNhdGVkVGhyb3dQcm9taXNlOlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3AoXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLFxuICAgICAgICAgICAgICAgICAgU3VzcGVuZGVkT25EZXByZWNhdGVkVGhyb3dQcm9taXNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkh5ZHJhdGlvbjpcbiAgICAgICAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzU3RhY2soKTtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZEF0VGhlU2hlbGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiVW5leHBlY3RlZCBTdXNwZW5kZWRSZWFzb24uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlXG4gICAgICAgICAgICA/IHdvcmtMb29wU3luYygpXG4gICAgICAgICAgICA6IHdvcmtMb29wQ29uY3VycmVudEJ5U2NoZWR1bGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKHRocm93blZhbHVlJDEwKSB7XG4gICAgICAgICAgaGFuZGxlVGhyb3cocm9vdCwgdGhyb3duVmFsdWUkMTApO1xuICAgICAgICB9XG4gICAgICB3aGlsZSAoMSk7XG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkEgPSBwcmV2QXN5bmNEaXNwYXRjaGVyO1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICAgICAgaWYgKG51bGwgIT09IHdvcmtJblByb2dyZXNzKSByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwO1xuICAgICAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpO1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdvcmtMb29wQ29uY3VycmVudEJ5U2NoZWR1bGVyKCkge1xuICAgICAgZm9yICg7IG51bGwgIT09IHdvcmtJblByb2dyZXNzICYmICFzaG91bGRZaWVsZCgpOyApXG4gICAgICAgI
15852HBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAgICAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgICAgICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZVxuICAgICAgICA/IChzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayksXG4gICAgICAgICAgKGN1cnJlbnQgPSBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIHVuaXRPZldvcmssXG4gICAgICAgICAgICBiZWdpbldvcmssXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgdW5pdE9mV29yayxcbiAgICAgICAgICAgIGVudGFuZ2xlZFJlbmRlckxhbmVzXG4gICAgICAgICAgKSksXG4gICAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREdXJhdGlvbih1bml0T2ZXb3JrKSlcbiAgICAgICAgOiAoY3VycmVudCA9IHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgdW5pdE9mV29yayxcbiAgICAgICAgICAgIGJlZ2luV29yayxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLFxuICAgICAgICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXNcbiAgICAgICAgICApKTtcbiAgICAgIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICA/IGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKVxuICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXBsYXlTdXNwZW5kZWRVbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgICAgIHZhciBuZXh0ID0gcnVuV2l0aEZpYmVySW5ERVYodW5pdE9mV29yaywgcmVwbGF5QmVnaW5Xb3JrLCB1bml0T2ZXb3JrKTtcbiAgICAgIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuICAgICAgbnVsbCA9PT0gbmV4dCA/IGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSA6ICh3b3JrSW5Qcm9ncmVzcyA9IG5leHQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXBsYXlCZWdpbldvcmsodW5pdE9mV29yaykge1xuICAgICAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZSxcbiAgICAgICAgaXNQcm9maWxpbmdNb2RlID0gKHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgaXNQcm9maWxpbmdNb2RlICYmIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIHN3aXRjaCAodW5pdE9mV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGN1cnJlbnQgPSByZXBsYXlGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLFxuICAgICAgICAgICAgdW5pdE9mV29yay5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLnR5cGUsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY3VycmVudCA9IHJlcGxheUZ1bmN0aW9uQ29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHVuaXRPZldvcmssXG4gICAgICAgICAgICB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIHVuaXRPZldvcmsudHlwZS5yZW5kZXIsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLnJlZixcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJlc2V0SG9va3NPblVud2luZCh1bml0T2ZXb3JrKTtcbiAgICAgICAgICB2Y
15852XIgZmliZXIgPSB1bml0T2ZXb3JrO1xuICAgICAgICAgIGZpYmVyID09PSBoeWRyYXRpb25QYXJlbnRGaWJlciAmJlxuICAgICAgICAgICAgKGlzSHlkcmF0aW5nXG4gICAgICAgICAgICAgID8gKHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpLFxuICAgICAgICAgICAgICAgIDUgPT09IGZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPSBmaWJlci5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlKSlcbiAgICAgICAgICAgICAgOiAocG9wVG9OZXh0SG9zdFBhcmVudChmaWJlciksIChpc0h5ZHJhdGluZyA9ICEwKSkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKSxcbiAgICAgICAgICAgICh1bml0T2ZXb3JrID0gd29ya0luUHJvZ3Jlc3MgPVxuICAgICAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzKHVuaXRPZldvcmssIGVudGFuZ2xlZFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAoY3VycmVudCA9IGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBlbnRhbmdsZWRSZW5kZXJMYW5lcykpO1xuICAgICAgfVxuICAgICAgaXNQcm9maWxpbmdNb2RlICYmXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRHVyYXRpb24odW5pdE9mV29yayk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dBbmRVbndpbmRXb3JrTG9vcChcbiAgICAgIHJvb3QsXG4gICAgICB1bml0T2ZXb3JrLFxuICAgICAgdGhyb3duVmFsdWUsXG4gICAgICBzdXNwZW5kZWRSZWFzb25cbiAgICApIHtcbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc09uVW53aW5kKHVuaXRPZldvcmspO1xuICAgICAgdGhlbmFibGVTdGF0ZSQxID0gbnVsbDtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwO1xuICAgICAgdmFyIHJldHVybkZpYmVyID0gdW5pdE9mV29yay5yZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhyb3dFeGNlcHRpb24oXG4gICAgICAgICAgICByb290LFxuICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLFxuICAgICAgICAgICAgdGhyb3duVmFsdWUsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgICAgbG9nVW5jYXVnaHRFcnJvcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih0aHJvd25WYWx1ZSwgcm9vdC5jdXJyZW50KVxuICAgICAgICAgICk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IHJldHVybkZpYmVyKSB0aHJvdyAoKHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXIpLCBlcnJvcik7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICBsb2dVbmNhdWdodEVycm9yKFxuICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodGhyb3duVmFsdWUsIHJvb3QuY3VycmVudClcbiAgICAgICAgKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodW5pdE9mV29yay5mbGFncyAmIDMyNzY4KSB7XG4gICAgICAgIGlmIChpc0h5ZHJhdGluZyB8fCBzdXNwZW5kZWRSZWFzb24gPT09IFN1c3BlbmRlZE9uRXJyb3IpIHJvb3QgPSAhMDtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgfHxcbiAgICAgICAgICAwICE9PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA1MzY4NzA5MTIpXG4gICAgICAgIClcbiAgICAgICAgICByb290ID0gITE7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICgod29ya0luUHJvZ3Jlc3NSb290RGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzID0gcm9vdCA9ICEwKSxcbiAgICAgICAgICBzdXNwZW5kZWRSZWFzb24gPT09IFN1c3BlbmRlZE9uRGF0YSB8fFxuICAgICAgICAgICAgc3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkFjdGlvbiB8fFxuICAgICAgICAgICAgc3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkltbWVkaWF0ZSB8fFxuICAgICAgICAgICAgc3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkRlcHJlY2F0ZWRUaHJvd1Byb21pc2UpXG4gICAgICAgIClcbiAgICAgICAgICAoc3VzcGVuZGVkUmVhc29uID0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCksXG4gICAgICAgICAgICBudWxsICE9PSBzdXNwZW5kZWRSZWFzb24gJiZcbiAgICAgICAgICAgICAgMTMgPT09IHN1c3BlbmRlZFJlYXNvbi50YWcgJiZcbiAgICAgICAgICAgICAgKHN1c3BlbmRlZFJlYXNvbi5mbGFncyB8PSAxNjM4NCk7XG4gICAgICAgIHVud2luZFVuaXRPZldvcmsodW5pdE9mV29yaywgcm9vdCk7XG4gICAgICB9IGVsc2UgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAgICAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoMCAhPT0gKGNvbXBsZXRlZFdvcmsuZmxhZ3MgJiAzMjc2OCkpIHtcbiAgICAgICAgICB1bndpbmRVbml0T2ZXb3JrKFxuICAgICAgICAgICAgY29tcGxldGVkV29yayxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgI
15852HZhciBjdXJyZW50ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGU7XG4gICAgICAgIHVuaXRPZldvcmsgPSBjb21wbGV0ZWRXb3JrLnJldHVybjtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBjdXJyZW50ID0gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgY29tcGxldGVkV29yayxcbiAgICAgICAgICBjb21wbGV0ZVdvcmssXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBjb21wbGV0ZWRXb3JrLFxuICAgICAgICAgIGVudGFuZ2xlZFJlbmRlckxhbmVzXG4gICAgICAgICk7XG4gICAgICAgIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkSW5jb21wbGV0ZUR1cmF0aW9uKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gY3VycmVudDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29tcGxldGVkV29yayA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcbiAgICAgICAgaWYgKG51bGwgIT09IGNvbXBsZXRlZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG4gICAgICB9IHdoaWxlIChudWxsICE9PSBjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVud2luZFVuaXRPZldvcmsodW5pdE9mV29yaywgc2tpcFNpYmxpbmdzKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHZhciBuZXh0ID0gdW53aW5kV29yayh1bml0T2ZXb3JrLmFsdGVybmF0ZSwgdW5pdE9mV29yayk7XG4gICAgICAgIGlmIChudWxsICE9PSBuZXh0KSB7XG4gICAgICAgICAgbmV4dC5mbGFncyAmPSAzMjc2NztcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZEluY29tcGxldGVEdXJhdGlvbih1bml0T2ZXb3JrKTtcbiAgICAgICAgICBuZXh0ID0gdW5pdE9mV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBmb3IgKHZhciBjaGlsZCA9IHVuaXRPZldvcmsuY2hpbGQ7IG51bGwgIT09IGNoaWxkOyApXG4gICAgICAgICAgICAobmV4dCArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbiksIChjaGlsZCA9IGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHVuaXRPZldvcmsuYWN0dWFsRHVyYXRpb24gPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIG5leHQgPSB1bml0T2ZXb3JrLnJldHVybjtcbiAgICAgICAgbnVsbCAhPT0gbmV4dCAmJlxuICAgICAgICAgICgobmV4dC5mbGFncyB8PSAzMjc2OCksXG4gICAgICAgICAgKG5leHQuc3VidHJlZUZsYWdzID0gMCksXG4gICAgICAgICAgKG5leHQuZGVsZXRpb25zID0gbnVsbCkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXNraXBTaWJsaW5ncyAmJlxuICAgICAgICAgICgodW5pdE9mV29yayA9IHVuaXRPZldvcmsuc2libGluZyksIG51bGwgIT09IHVuaXRPZldvcmspXG4gICAgICAgICkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gdW5pdE9mV29yaztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSB1bml0T2ZXb3JrID0gbmV4dDtcbiAgICAgIH0gd2hpbGUgKG51bGwgIT09IHVuaXRPZldvcmspO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVJvb3QoXG4gICAgICByb290LFxuICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgbGFuZXMsXG4gICAgICByZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgIHRyYW5zaXRpb25zLFxuICAgICAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlLFxuICAgICAgc3Bhd25lZExhbmUsXG4gICAgICB1cGRhdGVkTGFuZXMsXG4gICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgZGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzLFxuICAgICAgZXhpdFN0YXR1cyxcbiAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgc3VzcGVuZGVkQ29tbWl0UmVhc29uLFxuICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZVxuICAgICkge1xuICAgICAgcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0ID0gbnVsbDtcbiAgICAgIGRvIGZsdXNoUGVuZGluZ0VmZmVjdHMoKTtcbiAgICAgIHdoaWxlIChwZW5kaW5nRWZmZWN0c1N0YXR1cyAhPT0gTk9fUEVORElOR19FRkZFQ1RTKTtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KVxuICAgICAgICB0aHJvdyBFcnJvcihcIlNob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLlwiKTtcbiAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpXG4gICAgICAgIGxvZ0Vycm9yZWRSZW5kZXJQaGFzZShcbiAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZSxcbiAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgaWYgKG51bGwgIT09IHJlY292ZXJhYmxlRXJyb3JzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGRpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyA9XG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsgJiZcbiAgICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAyNTYpKSxcbiAgICAgICAgICAoZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlID0gd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrKSxcbiAgICAgICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgJiZcbiAgICAgICAgICAgICEoY29tcGxldGVkUmVuZGVyRW5kVGltZSA8PSBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0U3RhdHVzID0gW107XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyYWJsZUVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV0udmFsdWU7XG4gICAgICAgICAgICBleGl0U3RhdHVzLnB1c2goW1xuICAgICAgICAgICAgICBcIlJlY292ZXJhYmxlIEVycm9yXCIsXG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBlcnJvciAmJlxuICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGNvbXBsZXRlZFJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgIGVuZDogY29tcGxldGVkUmVuZGVyRW5kVGltZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBkZXZ0b29sczoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcInByaW1hcnktZGFya1wiLFxuICAgICAgICAgICAgICAgI
15852HRyYWNrOiBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgdHJhY2tHcm91cDogTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgdG9vbHRpcFRleHQ6IGRpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICAgICAgICAgPyBcIkh5ZHJhdGlvbiBGYWlsZWRcIlxuICAgICAgICAgICAgICAgICAgOiBcIlJlY292ZXJlZCBhZnRlciBFcnJvclwiLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGV4aXRTdGF0dXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlXG4gICAgICAgICAgICA/IGRpZEluY2x1ZGVSZW5kZXJQaGFzZVVwZGF0ZS5ydW4oXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UubWVhc3VyZS5iaW5kKFxuICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UsXG4gICAgICAgICAgICAgICAgICBcIlJlY292ZXJlZFwiLFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoXCJSZWNvdmVyZWRcIiwgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lKTtcbiAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKFwiUmVjb3ZlcmVkXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgKGRpZEluY2x1ZGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayksXG4gICAgICAgICAgIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZSA8PSBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUgfHxcbiAgICAgICAgICAgICgoZGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzID1cbiAgICAgICAgICAgICAgKGxhbmVzICYgNzM4MTk3NjUzKSA9PT0gbGFuZXMgPyBcInRlcnRpYXJ5LWRhcmtcIiA6IFwicHJpbWFyeS1kYXJrXCIpLFxuICAgICAgICAgICAgKGV4aXRTdGF0dXMgPVxuICAgICAgICAgICAgICAobGFuZXMgJiA1MzY4NzA5MTIpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgID8gXCJQcmVwYXJlZFwiXG4gICAgICAgICAgICAgICAgOiAobGFuZXMgJiAyMDEzMjY3NDEpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgICAgPyBcIkh5ZHJhdGVkXCJcbiAgICAgICAgICAgICAgICAgIDogXCJSZW5kZXJcIiksXG4gICAgICAgICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGVcbiAgICAgICAgICAgICAgPyBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBkaWRTa2lwU3VzcGVuZGVkU2libGluZ3NcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBleGl0U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgZGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICBpZiAobnVsbCAhPT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIDAgPT09IGxhbmVzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiZmluaXNoZWRMYW5lcyBzaG91bGQgbm90IGJlIGVtcHR5IGR1cmluZyBhIGNvbW1pdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudClcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCAmJlxuICAgICAgICAgICgod29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwKSk7XG4gICAgICAgIHBlbmRpbmdGaW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzUm9vdCA9IHJvb3Q7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgICBwZW5kaW5nUmVjb3ZlcmFibGVFcnJvcnMgPSByZWNvdmVyYWJsZUVycm9ycztcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNSZW5kZXJFbmRUaW1lID0gY29tcGxldGVkUmVuZGVyRW5kVGltZTtcbiAgICAgICAgcGVuZGluZ1N1c3BlbmRlZENvbW1pdFJlYXNvbiA9IHN1c3BlbmRlZENvbW1pdFJlYXNvbjtcbiAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPSBJTU1FRElBVEVfQ09NTUlUO1xuICAgICAgICBwZW5kaW5nU3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPSBudWxsO1xuICAgICAgICBjb21taXRSb290KFxuICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgI
15852HNwYXduZWRMYW5lLFxuICAgICAgICAgIHVwZGF0ZWRMYW5lcyxcbiAgICAgICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdFJvb3QoXG4gICAgICByb290LFxuICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgbGFuZXMsXG4gICAgICBzcGF3bmVkTGFuZSxcbiAgICAgIHVwZGF0ZWRMYW5lcyxcbiAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICBzdXNwZW5kZWRTdGF0ZSxcbiAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgICAgIGNvbXBsZXRlZFJlbmRlckVuZFRpbWVcbiAgICApIHtcbiAgICAgIHZhciByZW1haW5pbmdMYW5lcyA9IGZpbmlzaGVkV29yay5sYW5lcyB8IGZpbmlzaGVkV29yay5jaGlsZExhbmVzO1xuICAgICAgcGVuZGluZ0VmZmVjdHNSZW1haW5pbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzO1xuICAgICAgcmVtYWluaW5nTGFuZXMgfD0gY29uY3VycmVudGx5VXBkYXRlZExhbmVzO1xuICAgICAgbWFya1Jvb3RGaW5pc2hlZChcbiAgICAgICAgcm9vdCxcbiAgICAgICAgbGFuZXMsXG4gICAgICAgIHJlbWFpbmluZ0xhbmVzLFxuICAgICAgICBzcGF3bmVkTGFuZSxcbiAgICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzXG4gICAgICApO1xuICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzID0gbnVsbDtcbiAgICAgIChsYW5lcyAmIDMzNTU0NDA2NCkgPT09IGxhbmVzXG4gICAgICAgID8gKChwZW5kaW5nVHJhbnNpdGlvblR5cGVzID0gY2xhaW1RdWV1ZWRUcmFuc2l0aW9uVHlwZXMocm9vdCkpLFxuICAgICAgICAgIChzcGF3bmVkTGFuZSA9IDEwMjYyKSlcbiAgICAgICAgOiAoKHBlbmRpbmdUcmFuc2l0aW9uVHlwZXMgPSBudWxsKSwgKHNwYXduZWRMYW5lID0gMTAyNTYpKTtcbiAgICAgIDAgIT09IGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiB8fFxuICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBzcGF3bmVkTGFuZSkgfHxcbiAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBzcGF3bmVkTGFuZSlcbiAgICAgICAgPyAoKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksXG4gICAgICAgICAgKHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDApLFxuICAgICAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY2hlZHVsZXJFdmVudCA9IHdpbmRvdy5ldmVudDtcbiAgICAgICAgICAgIHBlbmRpbmdEZWxheWVkQ29tbWl0UmVhc29uID09PSBJTU1FRElBVEVfQ09NTUlUICYmXG4gICAgICAgICAgICAgIChwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9IERFTEFZRURfUEFTU0lWRV9DT01NSVQpO1xuICAgICAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSkpXG4gICAgICAgIDogKChyb290LmNhbGxiYWNrTm9kZSA9IG51bGwpLCAocm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gMCkpO1xuICAgICAgY29tbWl0RXJyb3JzID0gbnVsbDtcbiAgICAgIGNvbW1pdFN0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgbnVsbCAhPT0gc3VzcGVuZGVkQ29tbWl0UmVhc29uICYmXG4gICAgICAgIGxvZ1N1c3BlbmRlZENvbW1pdFBoYXNlKFxuICAgICAgICAgIGNvbXBsZXRlZFJlbmRlckVuZFRpbWUsXG4gICAgICAgICAgY29tbWl0U3RhcnRUaW1lLFxuICAgICAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgKTtcbiAgICAgIHNob3VsZFN0YXJ0Vmlld1RyYW5zaXRpb24gPSAhMTtcbiAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbiA9IDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxMzg3OCk7XG4gICAgICBpZiAoMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAxMzg3OCkgfHwgc3VzcGVuZGVkQ29tbWl0UmVhc29uKSB7XG4gICAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgICAgICAgc3Bhd25lZExhbmUgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIChleGVjdXRpb25Db250ZXh0ID0gc3Bhd25lZExhbmUpLFxuICAgICAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lKSxcbiAgICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gc3VzcGVuZGVkQ29tbWl0UmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBQRU5ESU5HX01VVEFUSU9OX1BIQVNFO1xuICAgICAgc2hvdWxkU3RhcnRWaWV3VHJhbnNpdGlvblxuICAgICAgICA/ICgoYW5pbWF0aW5nTGFuZXMgfD0gbGFuZXMpLFxuICAgICAgICAgIChhbmltYXRpbmdUYXNrID0gbnVsbCksXG4gICAgICAgICAgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbiA9IHN0YXJ0Vmlld1RyYW5zaXRpb24oXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZSxcbiAgICAgICAgICAgIHJvb3QuY29udGFpbmVySW5mbyxcbiAgICAgICAgICAgIHBlbmRpbmdUcmFuc2l0aW9uVHlwZXMsXG4gICAgICAgICAgICBmbHVzaE11dGF0aW9uRWZmZWN0cyxcbiAgICAgICAgICAgIGZsdXNoTGF5b3V0RWZmZWN0cyxcbiAgICAgICAgICAgIGZsdXNoQWZ0ZXJNdXRhdGlvbkVmZmVjdHMsXG4gICAgICAgICAgICBmbHVzaFNwYXduZWRXb3JrLFxuICAgICAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cyxcbiAgICAgICAgICAgI
15852HJlcG9ydFZpZXdUcmFuc2l0aW9uRXJyb3IsXG4gICAgICAgICAgICBzdXNwZW5kZWRWaWV3VHJhbnNpdGlvbixcbiAgICAgICAgICAgIGZpbmlzaGVkVmlld1RyYW5zaXRpb24uYmluZChudWxsLCBsYW5lcylcbiAgICAgICAgICApKSlcbiAgICAgICAgOiAoZmx1c2hNdXRhdGlvbkVmZmVjdHMoKSwgZmx1c2hMYXlvdXRFZmZlY3RzKCksIGZsdXNoU3Bhd25lZFdvcmsoKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcG9ydFZpZXdUcmFuc2l0aW9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIGlmIChwZW5kaW5nRWZmZWN0c1N0YXR1cyAhPT0gTk9fUEVORElOR19FRkZFQ1RTKSB7XG4gICAgICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBwZW5kaW5nRWZmZWN0c1Jvb3Qub25SZWNvdmVyYWJsZUVycm9yO1xuICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IoZXJyb3IsIG1ha2VFcnJvckluZm8obnVsbCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdXNwZW5kZWRWaWV3VHJhbnNpdGlvbihyZWFzb24pIHtcbiAgICAgIGNvbW1pdEVuZFRpbWUgPSBub3coKTtcbiAgICAgIGxvZ0NvbW1pdFBoYXNlKFxuICAgICAgICBudWxsID09PSBwZW5kaW5nU3VzcGVuZGVkQ29tbWl0UmVhc29uXG4gICAgICAgICAgPyBwZW5kaW5nRWZmZWN0c1JlbmRlckVuZFRpbWVcbiAgICAgICAgICA6IGNvbW1pdFN0YXJ0VGltZSxcbiAgICAgICAgY29tbWl0RW5kVGltZSxcbiAgICAgICAgY29tbWl0RXJyb3JzLFxuICAgICAgICBwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9PT0gQUJPUlRFRF9WSUVXX1RSQU5TSVRJT05fQ09NTUlULFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICk7XG4gICAgICBwZW5kaW5nU3VzcGVuZGVkQ29tbWl0UmVhc29uID0gcGVuZGluZ1N1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uID1cbiAgICAgICAgcmVhc29uO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5pc2hlZFZpZXdUcmFuc2l0aW9uKGxhbmVzKSB7XG4gICAgICBpZiAoMCAhPT0gKGFuaW1hdGluZ0xhbmVzICYgbGFuZXMpKSB7XG4gICAgICAgIHZhciB0YXNrID0gYW5pbWF0aW5nVGFzaztcbiAgICAgICAgYW5pbWF0aW5nTGFuZXMgJj0gfmxhbmVzO1xuICAgICAgICBhbmltYXRpbmdUYXNrID0gbnVsbDtcbiAgICAgICAgMCAhPT0gKGxhbmVzICYgNDE5NDA0OCkgJiZcbiAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA0MTk0MDQ4KSAmJlxuICAgICAgICAgIDAgPT09IChwZW5kaW5nRWZmZWN0c0xhbmVzICYgNDE5NDA0OCkgJiZcbiAgICAgICAgICAoc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKDI1NiksXG4gICAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UodHJhbnNpdGlvbkNsYW1wVGltZSwgbm93JDEoKSwgdGFzaykpO1xuICAgICAgICAwICE9PSAobGFuZXMgJiA2MjkxNDU2MCkgJiZcbiAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA2MjkxNDU2MCkgJiZcbiAgICAgICAgICAwID09PSAocGVuZGluZ0VmZmVjdHNMYW5lcyAmIDYyOTE0NTYwKSAmJlxuICAgICAgICAgIChzZXRDdXJyZW50VHJhY2tGcm9tTGFuZXMoNDE5NDMwNCksXG4gICAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UocmV0cnlDbGFtcFRpbWUsIG5vdyQxKCksIHRhc2spKTtcbiAgICAgICAgMCAhPT0gKGxhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiAyMDgwMzc0Nzg0KSAmJlxuICAgICAgICAgIDAgPT09IChwZW5kaW5nRWZmZWN0c0xhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgICAoc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKDI2ODQzNTQ1NiksXG4gICAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UoaWRsZUNsYW1wVGltZSwgbm93JDEoKSwgdGFzaykpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaEFmdGVyTXV0YXRpb25FZmZlY3RzKCkge1xuICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfQUZURVJfTVVUQVRJT05fUEhBU0UgJiZcbiAgICAgICAgKChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUyksXG4gICAgICAgIGNvbW1pdEFmdGVyTXV0YXRpb25FZmZlY3RzT25GaWJlcihcbiAgICAgICAgICBwZW5kaW5nRmluaXNoZWRXb3JrLFxuICAgICAgICAgIHBlbmRpbmdFZmZlY3RzUm9vdFxuICAgICAgICApLFxuICAgICAgICAocGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBQRU5ESU5HX1NQQVdORURfV09SSykpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaE11dGF0aW9uRWZmZWN0cygpIHtcbiAgICAgIGlmIChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9PT0gUEVORElOR19NVVRBVElPTl9QSEFTRSkge1xuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUztcbiAgICAgICAgdmFyIHJvb3QgPSBwZW5kaW5nRWZmZWN0c1Jvb3QsXG4gICAgICAgICAgZmluaXNoZWRXb3JrID0gcGVuZGluZ0ZpbmlzaGVkV29yayxcbiAgICAgICAgICBsYW5lcyA9IHBlbmRpbmdFZmZlY3RzTGFuZXMsXG4gICAgICAgICAgcm9vdE11dGF0aW9uSGFzRWZmZWN0ID0gMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDEzODc4KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgMTM4NzgpIHx8XG4gICAgICAgICAgcm9vdE11dGF0aW9uSGFzRWZmZWN0XG4gICAgICAgICkge1xuICAgICAgICAgIHJvb3RNdXRhdGlvbkhhc0VmZmVjdCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IG51bGw7XG4gICAgICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluUHJvZ3Jlc3NMYW5lcyA9IGxhbmVzO1xuICAgICAgICAgICAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICAgICAgICAgICAgaW5VcGRhdGVWaWV3VHJhbnNpdGlvbiA9IHJvb3RWaWV3VHJhbnNpdGlvbkFmZmVjdGVkID0gITE7XG4gICAgICAgICAgICByZXNldENvbXBvbmVudEVmZmVjdFRpbWVycygpO1xuICAgICAgICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICAgIGluUHJvZ3Jlc3NSb290ID0gaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgICAgICAgICAgIGxhbmVzID0gc2VsZWN0aW9uSW5mb3JtYXRpb247XG4gICAgICAgICAgICB2Y
15852XIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcChyb290LmNvbnRhaW5lckluZm8pLFxuICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtID0gbGFuZXMuZm9jdXNlZEVsZW0sXG4gICAgICAgICAgICAgIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBsYW5lcy5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiZcbiAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbSAmJlxuICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLm93bmVyRG9jdW1lbnQgJiZcbiAgICAgICAgICAgICAgY29udGFpbnNOb2RlKFxuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bGwgIT09IHByaW9yU2VsZWN0aW9uUmFuZ2UgJiZcbiAgICAgICAgICAgICAgICBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcHJpb3JTZWxlY3Rpb25SYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICAgIGVuZCA9IHByaW9yU2VsZWN0aW9uUmFuZ2UuZW5kO1xuICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZW5kICYmIChlbmQgPSBzdGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKFwic2VsZWN0aW9uU3RhcnRcIiBpbiBwcmlvckZvY3VzZWRFbGVtKVxuICAgICAgICAgICAgICAgICAgKHByaW9yRm9jdXNlZEVsZW0uc2VsZWN0aW9uU3RhcnQgPSBzdGFydCksXG4gICAgICAgICAgICAgICAgICAgIChwcmlvckZvY3VzZWRFbGVtLnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLnZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhciBkb2MgPSBwcmlvckZvY3VzZWRFbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHdpbiA9IChkb2MgJiYgZG9jLmRlZmF1bHRWaWV3KSB8fCB3aW5kb3c7XG4gICAgICAgICAgICAgICAgICBpZiAod2luLmdldFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2Y
15852XIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHByaW9yRm9jdXNlZEVsZW0udGV4dENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0JGpzY29tcCQwID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvclNlbGVjdGlvblJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQkanNjb21wJDAgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBwcmlvclNlbGVjdGlvblJhbmdlLmVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXJ0JGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4ocHJpb3JTZWxlY3Rpb25SYW5nZS5lbmQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3Rpb24uZXh0ZW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnQkanNjb21wJDAgPiBlbmQkanNjb21wJDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKGN1ckZvY3VzZWRFbGVtID0gZW5kJGpzY29tcCQwKSxcbiAgICAgICAgICAgICAgICAgICAgICAoZW5kJGpzY29tcCQwID0gc3RhcnQkanNjb21wJDApLFxuICAgICAgICAgICAgICAgICAgICAgIChzdGFydCRqc2NvbXAkMCA9IGN1ckZvY3VzZWRFbGVtKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFya2VyICYmXG4gICAgICAgICAgICAgICAgICAgICAgZW5kTWFya2VyICYmXG4gICAgICAgICAgICAgICAgICAgICAgKDEgIT09IHNlbGVjdGlvbi5yYW5nZUNvdW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPT0gc3RhcnRNYXJrZXIubm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPT0gc3RhcnRNYXJrZXIub2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZm9jdXNOb2RlICE9PSBlbmRNYXJrZXIubm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ICE9PSBlbmRNYXJrZXIub2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICB2Y
15852XIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydCRqc2NvbXAkMCA+IGVuZCRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChyYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkb2MgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSBwcmlvckZvY3VzZWRFbGVtO1xuICAgICAgICAgICAgICAgIChzZWxlY3Rpb24gPSBzZWxlY3Rpb24ucGFyZW50Tm9kZSk7XG5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDEgPT09IHNlbGVjdGlvbi5ub2RlVHlwZSAmJlxuICAgICAgICAgICAgICAgICAgZG9jLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHNlbGVjdGlvbi5zY3JvbGxMZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHNlbGVjdGlvbi5zY3JvbGxUb3BcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzICYmXG4gICAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0gPSAwO1xuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0gPCBkb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0rK1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2Y
15852XIgaW5mbyA9IGRvY1twcmlvckZvY3VzZWRFbGVtXTtcbiAgICAgICAgICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgICAgICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9lbmFibGVkID0gISFldmVudHNFbmFibGVkO1xuICAgICAgICAgICAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dCksXG4gICAgICAgICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eSksXG4gICAgICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcm9vdE11dGF0aW9uSGFzRWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrO1xuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IFBFTkRJTkdfTEFZT1VUX1BIQVNFO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaExheW91dEVmZmVjdHMoKSB7XG4gICAgICBpZiAocGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfTEFZT1VUX1BIQVNFKSB7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzU3RhdHVzID0gTk9fUEVORElOR19FRkZFQ1RTO1xuICAgICAgICB2YXIgc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPVxuICAgICAgICAgIHBlbmRpbmdTdXNwZW5kZWRWaWV3VHJhbnNpdGlvblJlYXNvbjtcbiAgICAgICAgaWYgKG51bGwgIT09IHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uKSB7XG4gICAgICAgICAgY29tbWl0U3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IGNvbW1pdEVuZFRpbWUsXG4gICAgICAgICAgICBlbmRUaW1lID0gY29tbWl0U3RhcnRUaW1lO1xuICAgICAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgICAgIGVuZFRpbWUgPD0gc3RhcnRUaW1lIHx8XG4gICAgICAgICAgICAoYW5pbWF0aW5nVGFza1xuICAgICAgICAgICAgICA/IGFuaW1hdGluZ1Rhc2sucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24sXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgICAgXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uLFxuICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICAgIHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uID0gcGVuZGluZ0VmZmVjdHNSb290O1xuICAgICAgICBzdGFydFRpbWUgPSBwZW5kaW5nRmluaXNoZWRXb3JrO1xuICAgICAgICBlbmRUaW1lID0gcGVuZGluZ0VmZmVjdHNMYW5lcztcbiAgICAgICAgdmFyIHJvb3RIYXNMYXlvdXRFZmZlY3QgPSAwICE9PSAoc3RhcnRUaW1lLmZsYWdzICYgODc3Mik7XG4gICAgICAgIGlmICgwICE9PSAoc3RhcnRUaW1lLnN1YnRyZWVGbGFncyAmIDg3NzIpIHx8IHJvb3RIYXNMYXlvdXRFZmZlY3QpIHtcbiAgICAgICAgICByb290SGFzTGF5b3V0RWZmZWN0ID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbDtcbiAgICAgICAgICB2Y
15852XIgX3ByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgdmFyIF9wcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAoaW5Qcm9ncmVzc0xhbmVzID0gZW5kVGltZSksXG4gICAgICAgICAgICAgIChpblByb2dyZXNzUm9vdCA9IHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uKSxcbiAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRFZmZlY3RUaW1lcnMoKSxcbiAgICAgICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihcbiAgICAgICAgICAgICAgICBzdXNwZW5kZWRWaWV3VHJhbnNpdGlvblJlYXNvbixcbiAgICAgICAgICAgICAgICBzdGFydFRpbWUuYWx0ZXJuYXRlLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAoaW5Qcm9ncmVzc1Jvb3QgPSBpblByb2dyZXNzTGFuZXMgPSBudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgPSBfcHJldkV4ZWN1dGlvbkNvbnRleHQpLFxuICAgICAgICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IF9wcmV2aW91c1ByaW9yaXR5KSxcbiAgICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSByb290SGFzTGF5b3V0RWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPSBwZW5kaW5nRWZmZWN0c1JlbmRlckVuZFRpbWU7XG4gICAgICAgIHN0YXJ0VGltZSA9IHBlbmRpbmdTdXNwZW5kZWRDb21taXRSZWFzb247XG4gICAgICAgIGNvbW1pdEVuZFRpbWUgPSBub3coKTtcbiAgICAgICAgbG9nQ29tbWl0UGhhc2UoXG4gICAgICAgICAgbnVsbCA9PT0gc3RhcnRUaW1lID8gc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gOiBjb21taXRTdGFydFRpbWUsXG4gICAgICAgICAgY29tbWl0RW5kVGltZSxcbiAgICAgICAgICBjb21taXRFcnJvcnMsXG4gICAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPT09IEFCT1JURURfVklFV19UUkFOU0lUSU9OX0NPTU1JVCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgKTtcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBQRU5ESU5HX0FGVEVSX01VVEFUSU9OX1BIQVNFO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaFNwYXduZWRXb3JrKCkge1xuICAgICAgaWYgKFxuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9PT0gUEVORElOR19TUEFXTkVEX1dPUksgfHxcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfQUZURVJfTVVUQVRJT05fUEhBU0VcbiAgICAgICkge1xuICAgICAgICBpZiAocGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfU1BBV05FRF9XT1JLKSB7XG4gICAgICAgICAgdmFyIHN0YXJ0Vmlld1RyYW5zaXRpb25TdGFydFRpbWUgPSBjb21taXRFbmRUaW1lO1xuICAgICAgICAgIGNvbW1pdEVuZFRpbWUgPSBub3coKTtcbiAgICAgICAgICB2Y
15852XIgZW5kVGltZSA9IGNvbW1pdEVuZFRpbWUsXG4gICAgICAgICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24gPVxuICAgICAgICAgICAgICBwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9PT0gQUJPUlRFRF9WSUVXX1RSQU5TSVRJT05fQ09NTUlUO1xuICAgICAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgICAgIGVuZFRpbWUgPD0gc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSB8fFxuICAgICAgICAgICAgKGFuaW1hdGluZ1Rhc2tcbiAgICAgICAgICAgICAgPyBhbmltYXRpbmdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgICAgID8gXCJJbnRlcnJ1cHRlZCBWaWV3IFRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJTdGFydGluZyBBbmltYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZFZpZXdUcmFuc2l0aW9uID8gXCJlcnJvclwiIDogXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgICA/IFwiSW50ZXJydXB0ZWQgVmlldyBUcmFuc2l0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlN0YXJ0aW5nIEFuaW1hdGlvblwiLFxuICAgICAgICAgICAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvbiA/IFwiIGVycm9yXCIgOiBcInNlY29uZGFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gIT09IEFCT1JURURfVklFV19UUkFOU0lUSU9OX0NPTU1JVCAmJlxuICAgICAgICAgICAgKHBlbmRpbmdEZWxheWVkQ29tbWl0UmVhc29uID0gQU5JTUFUSU9OX1NUQVJURURfQ09NTUlUKTtcbiAgICAgICAgfVxuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUztcbiAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSA9IHBlbmRpbmdWaWV3VHJhbnNpdGlvbjtcbiAgICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uID0gbnVsbDtcbiAgICAgICAgcmVxdWVzdFBhaW50KCk7XG4gICAgICAgIGVuZFRpbWUgPSBwZW5kaW5nRWZmZWN0c1Jvb3Q7XG4gICAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSBwZW5kaW5nRmluaXNoZWRXb3JrO1xuICAgICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24gPSBwZW5kaW5nRWZmZWN0c0xhbmVzO1xuICAgICAgICB2Y
15852XIgcmVjb3ZlcmFibGVFcnJvcnMgPSBwZW5kaW5nUmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgcGFzc2l2ZVN1YnRyZWVNYXNrID1cbiAgICAgICAgICAgIChhYm9ydGVkVmlld1RyYW5zaXRpb24gJiAzMzU1NDQwNjQpID09PSBhYm9ydGVkVmlld1RyYW5zaXRpb25cbiAgICAgICAgICAgICAgPyAxMDI2MlxuICAgICAgICAgICAgICA6IDEwMjU2O1xuICAgICAgICAocGFzc2l2ZVN1YnRyZWVNYXNrID1cbiAgICAgICAgICAwICE9PSBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24gfHxcbiAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIHBhc3NpdmVTdWJ0cmVlTWFzaykgfHxcbiAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgcGFzc2l2ZVN1YnRyZWVNYXNrKSlcbiAgICAgICAgICA/IChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IFBFTkRJTkdfUEFTU0lWRV9QSEFTRSlcbiAgICAgICAgICA6ICgocGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBOT19QRU5ESU5HX0VGRkVDVFMpLFxuICAgICAgICAgICAgKHBlbmRpbmdGaW5pc2hlZFdvcmsgPSBwZW5kaW5nRWZmZWN0c1Jvb3QgPSBudWxsKSxcbiAgICAgICAgICAgIHJlbGVhc2VSb290UG9vbGVkQ2FjaGUoZW5kVGltZSwgZW5kVGltZS5wZW5kaW5nTGFuZXMpLFxuICAgICAgICAgICAgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDApLFxuICAgICAgICAgICAgKHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsKSk7XG4gICAgICAgIHZhciByZW1haW5pbmdMYW5lcyA9IGVuZFRpbWUucGVuZGluZ0xhbmVzO1xuICAgICAgICAwID09PSByZW1haW5pbmdMYW5lcyAmJiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsKTtcbiAgICAgICAgcGFzc2l2ZVN1YnRyZWVNYXNrIHx8IGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihlbmRUaW1lKTtcbiAgICAgICAgcmVtYWluaW5nTGFuZXMgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShhYm9ydGVkVmlld1RyYW5zaXRpb24pO1xuICAgICAgICBmaW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0ZWRIb29rICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290XG4gICAgICAgIClcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGRpZEVycm9yID0gMTI4ID09PSAoZmluaXNoZWRXb3JrLmN1cnJlbnQuZmxhZ3MgJiAxMjgpO1xuICAgICAgICAgICAgc3dpdGNoIChyZW1haW5pbmdMYW5lcykge1xuICAgICAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgICAgICB2Y
15852XIgc2NoZWR1bGVyUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHkkMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5JDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QoXG4gICAgICAgICAgICAgIHJlbmRlcmVySUQsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHksXG4gICAgICAgICAgICAgIGRpZEVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgfHxcbiAgICAgICAgICAgICAgKChoYXNMb2dnZWRFcnJvciA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW9cIixcbiAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgfVxuICAgICAgICBpc0RldlRvb2xzUHJlc2VudCAmJiBlbmRUaW1lLm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgb25Db21taXRSb290KCk7XG4gICAgICAgIGlmIChudWxsICE9PSByZWNvdmVyYWJsZUVycm9ycykge1xuICAgICAgICAgIGRpZEVycm9yID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gICAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGVuZFRpbWUub25SZWNvdmVyYWJsZUVycm9yO1xuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrID0gMDtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoO1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbZmluaXNoZWRXb3JrXSxcbiAgICAgICAgICAgICAgICBlcnJvckluZm8gPSBtYWtlRXJyb3JJbmZvKHJlY292ZXJhYmxlRXJyb3Iuc3RhY2spO1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICByZWNvdmVyYWJsZUVycm9yLnNvdXJjZSxcbiAgICAgICAgICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgcmVjb3ZlcmFibGVFcnJvci52YWx1ZSxcbiAgICAgICAgICAgICAgICBlcnJvckluZm9cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBkaWRFcnJvciksXG4gICAgICAgICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gc2NoZWR1bGVyUHJpb3JpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBwZW5kaW5nVmlld1RyYW5zaXRpb25FdmVudHM7XG4gICAgICAgIHJlY292ZXJhYmxlRXJyb3IgPSBwZW5kaW5nVHJhbnNpdGlvblR5cGVzO1xuICAgICAgICBwZW5kaW5nVHJhbnNpdGlvblR5cGVzID0gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG51bGwgIT09IG9uUmVjb3ZlcmFibGVFcnJvciAmJlxuICAgICAgICAgICgocGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzID0gbnVsbCksXG4gICAgICAgICAgbnVsbCA9PT0gcmVjb3ZlcmFibGVFcnJvciAmJiAocmVjb3ZlcmFibGVFcnJvciA9IFtdKSxcbiAgICAgICAgICBudWxsICE9PSBzdGFydFZpZXdUcmFuc2l0aW9uU3RhcnRUaW1lKVxuICAgICAgICApXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGVycm9ySW5mbyA9IDA7XG4gICAgICAgICAgICBlcnJvckluZm8gPCBvblJlY292ZXJhYmxlRXJyb3IubGVuZ3RoO1xuICAgICAgICAgICAgZXJyb3JJbmZvKytcbiAgICAgICAgICApXG4gICAgICAgICAgICAocmVjb3ZlcmFibGVFcnJvcnMgPSAoMCwgb25SZWNvdmVyYWJsZUVycm9yW2Vycm9ySW5mb10pKFxuICAgICAgICAgICAgICByZWNvdmVyYWJsZUVycm9yXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgdm9pZCAwICE9PSByZWNvdmVyYWJsZUVycm9ycyAmJlxuICAgICAgICAgICAgICAgIHN0YXJ0Vmlld1RyYW5zaXRpb25TdGFydFRpbWUuZmluaXNoZWQuZmluYWxseShcbiAgICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlRXJyb3JzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgMCAhPT0gKHBlbmRpbmdFZmZlY3RzTGFuZXMgJiAzKSAmJiBmbHVzaFBlbmRpbmdFZmZlY3RzKCk7XG4gICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChlbmRUaW1lKTtcbiAgICAgICAgcmVtYWluaW5nTGFuZXMgPSBlbmRUaW1lLnBlbmRpbmdMYW5lcztcbiAgICAgICAgMCAhPT0gKGFib3J0ZWRWaWV3VHJhbnNpdGlvbiAmIDI2MTkzMCkgJiYgMCAhPT0gKHJlbWFpbmluZ0xhbmVzICYgNDIpXG4gICAgICAgICAgPyAoKG5lc3RlZFVwZGF0ZVNjaG
15852VkdWxlZCA9ICEwKSxcbiAgICAgICAgICAgIGVuZFRpbWUgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlc1xuICAgICAgICAgICAgICA/IG5lc3RlZFVwZGF0ZUNvdW50KytcbiAgICAgICAgICAgICAgOiAoKG5lc3RlZFVwZGF0ZUNvdW50ID0gMCksIChyb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBlbmRUaW1lKSkpXG4gICAgICAgICAgOiAoKG5lc3RlZFVwZGF0ZUNvdW50ID0gMCksIChyb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsKSk7XG4gICAgICAgIHBhc3NpdmVTdWJ0cmVlTWFzayB8fFxuICAgICAgICAgIGZpbmFsaXplUmVuZGVyKGFib3J0ZWRWaWV3VHJhbnNpdGlvbiwgY29tbWl0RW5kVGltZSk7XG4gICAgICAgIGZsdXNoU3luY1dvcmtBY3Jvc3NSb290c19pbXBsKDAsICExKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZUVycm9ySW5mbyhjb21wb25lbnRTdGFjaykge1xuICAgICAgY29tcG9uZW50U3RhY2sgPSB7IGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjayB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbXBvbmVudFN0YWNrLCBcImRpZ2VzdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnWW91IGFyZSBhY2Nlc3NpbmcgXCJkaWdlc3RcIiBmcm9tIHRoZSBlcnJvckluZm8gb2JqZWN0IHBhc3NlZCB0byBvblJlY292ZXJhYmxlRXJyb3IuIFRoaXMgcHJvcGVydHkgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkIGFzIHBhcnQgb2YgZXJyb3JJbmZvIGJ1dCBjYW4gYmUgYWNjZXNzZWQgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgRXJyb3IgaW5zdGFuY2UgaXRzZWxmLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wb25lbnRTdGFjaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsZWFzZVJvb3RQb29sZWRDYWNoZShyb290LCByZW1haW5pbmdMYW5lcykge1xuICAgICAgMCA9PT0gKHJvb3QucG9vbGVkQ2FjaGVMYW5lcyAmPSByZW1haW5pbmdMYW5lcykgJiZcbiAgICAgICAgKChyZW1haW5pbmdMYW5lcyA9IHJvb3QucG9vbGVkQ2FjaGUpLFxuICAgICAgICBudWxsICE9IHJlbWFpbmluZ0xhbmVzICYmXG4gICAgICAgICAgKChyb290LnBvb2xlZENhY2hlID0gbnVsbCksIHJlbGVhc2VDYWNoZShyZW1haW5pbmdMYW5lcykpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmx1c2hQZW5kaW5nRWZmZWN0cygpIHtcbiAgICAgIG51bGwgIT09IHBlbmRpbmdWaWV3VHJhbnNpdGlvbiAmJlxuICAgICAgICAocGVuZGluZ1ZpZXdUcmFuc2l0aW9uLnNraXBUcmFuc2l0aW9uKCksXG4gICAgICAgIGRpZFdhcm5BYm91dEludGVycnVwdGVkVmlld1RyYW5zaXRpb25zIHx8XG4gICAgICAgICAgKChkaWRXYXJuQWJvdXRJbnRlcnJ1cHRlZFZpZXdUcmFuc2l0aW9ucyA9ICEwKSxcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIkEgZmx1c2hTeW5jIHVwZGF0ZSBjYW5jZWxsZWQgYSBWaWV3IFRyYW5zaXRpb24gYmVjYXVzZSBpdCB3YXMgY2FsbGVkIHdoaWxlIHRoZSBWaWV3IFRyYW5zaXRpb24gd2FzIHN0aWxsIHByZXBhcmluZy4gVG8gcHJlc2VydmUgdGhlIHN5bmNocm9ub3VzIHNlbWFudGljcywgUmVhY3QgaGFkIHRvIHNraXAgdGhlIFZpZXcgVHJhbnNpdGlvbi4gSWYgeW91IGNhbiwgdHJ5IHRvIGF2b2lkIGZsdXNoU3luYygpIGluIGEgc2NlbmFyaW8gdGhhdCdzIGxpa2VseSB0byBpbnRlcmZlcmUuXCJcbiAgICAgICAgICApKSxcbiAgICAgICAgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbiA9IG51bGwpLFxuICAgICAgICAocGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPSBBQk9SVEVEX1ZJRVdfVFJBTlNJVElPTl9DT01NSVQpKTtcbiAgICAgIGZsdXNoTXV0YXRpb25FZmZlY3RzKCk7XG4gICAgICBmbHVzaExheW91dEVmZmVjdHMoKTtcbiAgICAgIGZsdXNoU3Bhd25lZFdvcmsoKTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gICAgICBpZiAocGVuZGluZ0VmZmVjdHNTdGF0dXMgIT09IFBFTkRJTkdfUEFTU0lWRV9QSEFTRSkgcmV0dXJuICExO1xuICAgICAgdmFyIHJvb3QgPSBwZW5kaW5nRWZmZWN0c1Jvb3QsXG4gICAgICAgIHJlbWFpbmluZ0xhbmVzID0gcGVuZGluZ0VmZmVjdHNSZW1haW5pbmdMYW5lcztcbiAgICAgIHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXMgPSAwO1xuICAgICAgdmFyIHJlbmRlclByaW9yaXR5ID0gbGFuZXNUb0V2ZW50UHJpb3JpdHkocGVuZGluZ0VmZmVjdHNMYW5lcyksXG4gICAgICAgIHByaW9yaXR5ID1cbiAgICAgICAgICAwID09PSBEZWZhdWx0RXZlbnRQcmlvcml0eSB8fCBEZWZhdWx0RXZlbnRQcmlvcml0eSA+IHJlbmRlclByaW9yaXR5XG4gICAgICAgICAgICA/IERlZmF1bHRFdmVudFByaW9yaXR5XG4gICAgICAgICAgICA6IHJlbmRlclByaW9yaXR5O1xuICAgICAgcmVuZGVyUHJpb3JpdHkgPSBSZWFjdFNoYXJlZEludGVybmFscy5UO1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByaW9yaXR5O1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbDtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gICAgICAgIHByaW9yaXR5ID0gcGVuZGluZ0VmZmVjdHNSb290O1xuICAgICAgICB2Y
15852XIgbGFuZXMgPSBwZW5kaW5nRWZmZWN0c0xhbmVzO1xuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUztcbiAgICAgICAgcGVuZGluZ0ZpbmlzaGVkV29yayA9IHBlbmRpbmdFZmZlY3RzUm9vdCA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzTGFuZXMgPSAwO1xuICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KVxuICAgICAgICAgIHRocm93IEVycm9yKFwiQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy5cIik7XG4gICAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9ICEwO1xuICAgICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gITE7XG4gICAgICAgIHZhciBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gMDtcbiAgICAgICAgY29tbWl0RXJyb3JzID0gbnVsbDtcbiAgICAgICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gICAgICAgIGlmIChwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9PT0gQU5JTUFUSU9OX1NUQVJURURfQ09NTUlUKVxuICAgICAgICAgIGxvZ0FuaW1hdGluZ1BoYXNlKFxuICAgICAgICAgICAgY29tbWl0RW5kVGltZSxcbiAgICAgICAgICAgIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICBhbmltYXRpbmdUYXNrXG4gICAgICAgICAgKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IGNvbW1pdEVuZFRpbWUsXG4gICAgICAgICAgICBlbmRUaW1lID0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGRlbGF5ZWRVbnRpbFBhaW50ID1cbiAgICAgICAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPT09IERFTEFZRURfUEFTU0lWRV9DT01NSVQ7XG4gICAgICAgICAgIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgICAgICAgPyB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2sucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgZGVsYXllZFVudGlsUGFpbnQgPyBcIldhaXRpbmcgZm9yIFBhaW50XCIgOiBcIldhaXRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBcInNlY29uZGFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgZGVsYXllZFVudGlsUGFpbnQgPyBcIldhaXRpbmcgZm9yIFBhaW50XCIgOiBcIldhaXRpbmdcIixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIFwic2Vjb25kYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydFRpbWUgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSBwcmlvcml0eS5jdXJyZW50O1xuICAgICAgICByZXNldENvbXBvbmVudEVmZmVjdFRpbWVycygpO1xuICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIGZpbmlzaGVkV29yayRqc2NvbXAkMCA9IHByaW9yaXR5LmN1cnJlbnQ7XG4gICAgICAgIGZpbmlzaGVkV29yayA9IHBlbmRpbmdFZmZlY3RzUmVuZGVyRW5kVGltZTtcbiAgICAgICAgcmVzZXRDb21wb25lbnRFZmZlY3RUaW1lcnMoKTtcbiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihcbiAgICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgICBmaW5pc2hlZFdvcmskanNjb21wJDAsXG4gICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgdHJhbnNpdGlvbnMsXG4gICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICk7XG4gICAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihwcmlvcml0eSk7XG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBzdGFydFRpbWU7XG4gICAgICAgIHZhciBwYXNzaXZlRWZmZWN0c0VuZFRpbWUgPSBub3ckMSgpO1xuICAgICAgICBmaW5pc2hlZFdvcmskanNjb21wJDAgPSBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lO1xuICAgICAgICBmaW5pc2hlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2s7XG4gICAgICAgIG51bGwgIT09IGNvbW1pdEVycm9yc1xuICAgICAgICAgID8gbG9nQ29tbWl0RXJyb3JlZChcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrJGpzY29tcCQwLFxuICAgICAgICAgICAgICBwYXNzaXZlRWZmZWN0c0VuZFRpbWUsXG4gICAgICAgICAgICAgIGNvbW1pdEVycm9ycyxcbiAgICAgICAgICAgICAgITAsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgICAgcGFzc2l2ZUVmZmVjdHNFbmRUaW1lIDw9IGZpbmlzaGVkV29yayRqc2NvbXAkMCB8fFxuICAgICAgICAgICAgKGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgICA/IGZpbmlzaGVkV29yay5ydW4oXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLF
15852xuICAgICAgICAgICAgICAgICAgICBcIlJlbWFpbmluZyBFZmZlY3RzXCIsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayRqc2NvbXAkMCxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZUVmZmVjdHNFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBcIlJlbWFpbmluZyBFZmZlY3RzXCIsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmskanNjb21wJDAsXG4gICAgICAgICAgICAgICAgICBwYXNzaXZlRWZmZWN0c0VuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIFwic2Vjb25kYXJ5LWRhcmtcIlxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICBmaW5hbGl6ZVJlbmRlcihsYW5lcywgcGFzc2l2ZUVmZmVjdHNFbmRUaW1lKTtcbiAgICAgICAgZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpO1xuICAgICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzXG4gICAgICAgICAgPyBwcmlvcml0eSA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlc1xuICAgICAgICAgICAgPyBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrK1xuICAgICAgICAgICAgOiAoKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDApLFxuICAgICAgICAgICAgICAocm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHByaW9yaXR5KSlcbiAgICAgICAgICA6IChuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwKTtcbiAgICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9ICExO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0ZWRIb29rICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdFxuICAgICAgICApXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcHJpb3JpdHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgfHxcbiAgICAgICAgICAgICAgKChoYXNMb2dnZWRFcnJvciA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW9cIixcbiAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgfVxuICAgICAgICB2Y
15852XIgc3RhdGVOb2RlID0gcHJpb3JpdHkuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcmVuZGVyUHJpb3JpdHkpLFxuICAgICAgICAgIHJlbGVhc2VSb290UG9vbGVkQ2FjaGUocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICAgICAgc291cmNlRmliZXIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciwgc291cmNlRmliZXIpO1xuICAgICAgcmVjb3JkRWZmZWN0RXJyb3Ioc291cmNlRmliZXIpO1xuICAgICAgc291cmNlRmliZXIgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLnN0YXRlTm9kZSwgc291cmNlRmliZXIsIDIpO1xuICAgICAgcm9vdEZpYmVyID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHNvdXJjZUZpYmVyLCAyKTtcbiAgICAgIG51bGwgIT09IHJvb3RGaWJlciAmJlxuICAgICAgICAobWFya1Jvb3RVcGRhdGVkJDEocm9vdEZpYmVyLCAyKSwgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3RGaWJlcikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgIHNvdXJjZUZpYmVyLFxuICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgIGVycm9yXG4gICAgKSB7XG4gICAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSAhMTtcbiAgICAgIGlmICgzID09PSBzb3VyY2VGaWJlci50YWcpXG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGZvciAoOyBudWxsICE9PSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yOyApIHtcbiAgICAgICAgICBpZiAoMyA9PT0gbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci50YWcpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KFxuICAgICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgICBzb3VyY2VGaWJlcixcbiAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgxID09PSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLnRhZykge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgICAgICAgICB0eXBlb2YgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciB8fFxuICAgICAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggJiZcbiAgICAgICAgICAgICAgICAobnVsbCA9PT0gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgfHxcbiAgICAgICAgICAgICAgICAgICFsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzb3VyY2VGaWJlciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gICAgICAgICAgICAgIHJlY29yZEVmZmVjdEVycm9yKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKDIpO1xuICAgICAgICAgICAgICBpbnN0YW5jZSA9IGVucXVldWVVcGRhdGUobmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IsIDIpO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZSAmJlxuICAgICAgICAgICAgICAgIChpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZShcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgICAgICAgc291cmNlRmliZXJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcmtSb290VXBkYXRlZCQxKGluc3RhbmNlLCAyKSxcbiAgICAgICAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQoaW5zdGFuY2UpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yID0gbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciBpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gUG90ZW50aWFsIGNhdXNlcyBpbmNsdWRlIGRlbGV0aW5nIHRoZSBzYW1lIGZpYmVyIG1vcmUgdGhhbiBvbmNlLCBjb21taXR0aW5nIGFuIGFscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbkVycm9yIG1lc3NhZ2U6XFxuXFxuJXNcIixcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gICAgICB2Y
15852XIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gICAgICBpZiAobnVsbCA9PT0gcGluZ0NhY2hlKSB7XG4gICAgICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xuICAgICAgICB2YXIgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICAgICAgfSBlbHNlXG4gICAgICAgICh0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKSksXG4gICAgICAgICAgdm9pZCAwID09PSB0aHJlYWRJRHMgJiZcbiAgICAgICAgICAgICgodGhyZWFkSURzID0gbmV3IFNldCgpKSwgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKSk7XG4gICAgICB0aHJlYWRJRHMuaGFzKGxhbmVzKSB8fFxuICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdERpZEF0dGFjaFBpbmdMaXN0ZW5lciA9ICEwKSxcbiAgICAgICAgdGhyZWFkSURzLmFkZChsYW5lcyksXG4gICAgICAgIChwaW5nQ2FjaGUgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcykpLFxuICAgICAgICBpc0RldlRvb2xzUHJlc2VudCAmJiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSxcbiAgICAgICAgd2FrZWFibGUudGhlbihwaW5nQ2FjaGUsIHBpbmdDYWNoZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgICAgIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgICAgIG51bGwgIT09IHBpbmdDYWNoZSAmJiBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgICAgIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xuICAgICAgcm9vdC53YXJtTGFuZXMgJj0gfnBpbmdlZExhbmVzO1xuICAgICAgMCAhPT0gKHBpbmdlZExhbmVzICYgMTI3KVxuICAgICAgICA/IDAgPiBibG9ja2luZ1VwZGF0ZVRpbWUgJiZcbiAgICAgICAgICAoKGJsb2NraW5nQ2xhbXBUaW1lID0gYmxvY2tpbmdVcGRhdGVUaW1lID0gbm93KCkpLFxuICAgICAgICAgIChibG9ja2luZ1VwZGF0ZVRhc2sgPSBjcmVhdGVUYXNrKFwiUHJvbWlzZSBSZXNvbHZlZFwiKSksXG4gICAgICAgICAgKGJsb2NraW5nVXBkYXRlVHlwZSA9IFBJTkdFRF9VUERBVEUpKVxuICAgICAgICA6IDAgIT09IChwaW5nZWRMYW5lcyAmIDQxOTQwNDgpICYmXG4gICAgICAgICAgMCA+IHRyYW5zaXRpb25VcGRhdGVUaW1lICYmXG4gICAgICAgICAgKCh0cmFuc2l0aW9uQ2xhbXBUaW1lID0gdHJhbnNpdGlvblVwZGF0ZVRpbWUgPSBub3coKSksXG4gICAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVUYXNrID0gY3JlYXRlVGFzayhcIlByb21pc2UgUmVzb2x2ZWRcIikpLFxuICAgICAgICAgICh0cmFuc2l0aW9uVXBkYXRlVHlwZSA9IFBJTkdFRF9VUERBVEUpKTtcbiAgICAgIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiZcbiAgICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkEgc3VzcGVuZGVkIHJlc291cmNlIGZpbmlzaGVkIGxvYWRpbmcgaW5zaWRlIGEgdGVzdCwgYnV0IHRoZSBldmVudCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG5hY3QoKCkgPT4ge1xcbiAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG59KTtcXG4vKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcblRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgaW4gdGhlIGJyb3dzZXIuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0XCJcbiAgICAgICAgKTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJlxuICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiBwaW5nZWRMYW5lcykgPT09IHBpbmdlZExhbmVzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5IHx8XG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNjI5MTQ1NjApID09PVxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICBub3ckMSgpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKVxuICAgICAgICAgID8gKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0XG4gICAgICAgICAgICA/IHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIDApXG4gICAgICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyB8PSBwaW5nZWRMYW5lcylcbiAgICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyB8PSBwaW5nZWRMYW5lcyksXG4gICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzID0gMCkpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gICAgICAwID09PSByZXRyeUxhbmUgJiYgKHJldHJ5TGFuZSA9IGNsYWltTmV4dFJldHJ5TGFuZSgpKTtcbiAgICAgIGJvdW5kYXJ5RmliZXIgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgIG51bGwgIT09IGJvdW5kYXJ5RmliZXIgJiZcbiAgICAgICAgKG1hcmtSb290VXBkYXRlZCQxKGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSksXG4gICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChib3VuZGFyeUZpYmVyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoYm91bmRhcnlGaWJlcikge1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgICAgI
15852HJldHJ5TGFuZSA9IDA7XG4gICAgICBudWxsICE9PSBzdXNwZW5zZVN0YXRlICYmIChyZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSk7XG4gICAgICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgICAgIHZhciByZXRyeUxhbmUgPSAwO1xuICAgICAgc3dpdGNoIChib3VuZGFyeUZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHZhciByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgbnVsbCAhPT0gc3VzcGVuc2VTdGF0ZSAmJiAocmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGUuX3JldHJ5Q2FjaGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlBpbmdlZCB1bmtub3duIHN1c3BlbnNlIGJvdW5kYXJ5IHR5cGUuIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgbnVsbCAhPT0gcmV0cnlDYWNoZSAmJiByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gICAgICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZUFuZERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihcbiAgICAgIHJvb3QkanNjb21wJDAsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGlzSW5TdHJpY3RNb2RlXG4gICAgKSB7XG4gICAgICBpZiAoMCAhPT0gKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEzNDIyNTkyMCkpXG4gICAgICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7ICkge1xuICAgICAgICAgIHZhciByb290ID0gcm9vdCRqc2NvbXAkMCxcbiAgICAgICAgICAgIGZpYmVyID0gcGFyZW50RmliZXIsXG4gICAgICAgICAgICBpc1N0cmljdE1vZGVGaWJlciA9IGZpYmVyLnR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG4gICAgICAgICAgaXNTdHJpY3RNb2RlRmliZXIgPSBpc0luU3RyaWN0TW9kZSB8fCBpc1N0cmljdE1vZGVGaWJlcjtcbiAgICAgICAgICAyMiAhPT0gZmliZXIudGFnXG4gICAgICAgICAgICA/IGZpYmVyLmZsYWdzICYgMTM0MjE3NzI4XG4gICAgICAgICAgICAgID8gaXNTdHJpY3RNb2RlRmliZXIgJiZcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgZG91YmxlSW52b2tlRWZmZWN0c09uRmliZXIsXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgZmliZXJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZUFuZERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihcbiAgICAgICAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgIGlzU3RyaWN0TW9kZUZpYmVyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsID09PSBmaWJlci5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgIChpc1N0cmljdE1vZGVGaWJlciAmJiBmaWJlci5mbGFncyAmIDEzNDIyNTkyMFxuICAgICAgICAgICAgICAgID8gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgICBkb3VibGVJbnZva2VFZmZlY3RzT25GaWJlcixcbiAgICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgICAgZmliZXJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IGZpYmVyLnN1YnRyZWVGbGFncyAmIDEzNDIxNzcyOCAmJlxuICAgICAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQW5kRG91YmxlSW52b2tlRWZmZWN0c0luREVWLFxuICAgICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgICAgaXNTdHJpY3RNb2RlRmliZXJcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkb3VibGVJbnZva2VFZmZlY3RzT25GaWJlcihyb290LCBmaWJlcikge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhmaWJlciwgTm9MYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyksXG4gICAgICAgICAgZGlzY29ubmVjdFBhc3NpdmVFZmZlY3QoZmliZXIpLFxuICAgICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIE5vTGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKHJvb3QsIGZpYmVyLCAwLCBudWxsLCAhMSwgMCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290KSB7XG4gICAgICB2Y
15852XIgZG91YmxlSW52b2tlRWZmZWN0cyA9ICEwO1xuICAgICAgcm9vdC5jdXJyZW50Lm1vZGUgJiAoU3RyaWN0TGVnYWN5TW9kZSB8IFN0cmljdEVmZmVjdHNNb2RlKSB8fFxuICAgICAgICAoZG91YmxlSW52b2tlRWZmZWN0cyA9ICExKTtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBbmREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHJvb3QuY3VycmVudCxcbiAgICAgICAgZG91YmxlSW52b2tlRWZmZWN0c1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgMyA9PT0gdGFnIHx8XG4gICAgICAgICAgMSA9PT0gdGFnIHx8XG4gICAgICAgICAgMCA9PT0gdGFnIHx8XG4gICAgICAgICAgMTEgPT09IHRhZyB8fFxuICAgICAgICAgIDE0ID09PSB0YWcgfHxcbiAgICAgICAgICAxNSA9PT0gdGFnXG4gICAgICAgICkge1xuICAgICAgICAgIHRhZyA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8IFwiUmVhY3RDb21wb25lbnRcIjtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCkge1xuICAgICAgICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKHRhZykpIHJldHVybjtcbiAgICAgICAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKHRhZyk7XG4gICAgICAgICAgfSBlbHNlIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFt0YWddKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihmaWJlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCBhc3luY2hyb25vdXNseSB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gdXNlRWZmZWN0IGluc3RlYWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICAgICAgaXNEZXZUb29sc1ByZXNlbnQgJiZcbiAgICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxpbmdGaWJlcikge1xuICAgICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWU7XG4gICAgICByZXR1cm4gbnVsbCAhPT0gYWN0UXVldWVcbiAgICAgICAgPyAoYWN0UXVldWUucHVzaChjYWxsYmFjayksIGZha2VBY3RDYWxsYmFja05vZGUkMSlcbiAgICAgICAgOiBzY2hlZHVsZUNhbGxiYWNrJDMocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAgICAgIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiZcbiAgICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJBbiB1cGRhdGUgdG8gJXMgaW5zaWRlIGEgdGVzdCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG5hY3QoKCkgPT4ge1xcbiAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG59KTtcXG4vKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcblRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgaW4gdGhlIGJyb3dzZXIuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0XCIsXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCkge1xuICAgICAgcm9vdCAhPT0gbGFzdFNjaGVkdWxlZFJvb3QgJiZcbiAgICAgICAgbnVsbCA9PT0gcm9vdC5uZXh0ICYmXG4gICAgICAgIChudWxsID09PSBsYXN0U2NoZWR1bGVkUm9vdFxuICAgICAgICAgID8gKGZpcnN0U2NoZWR1bGVkUm9vdCA9IGxhc3RTY2hlZHVsZWRSb290ID0gcm9vdClcbiAgICAgICAgICA6IChsYXN0U2NoZWR1bGVkUm9vdCA9IGxhc3RTY2hlZHVsZWRSb290Lm5leHQgPSByb290KSk7XG4gICAgICBtaWdodEhhdmVQZW5kaW5nU3luY1dvcmsgPSAhMDtcbiAgICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlXG4gICAgICAgID8gZGlkU2NoZWR1bGVNaWNyb3Rhc2tfYWN0IHx8XG4gICAgICAgICAgKChkaWRTY2hlZHVsZU1pY3JvdGFza19hY3QgPSAhMCksIHNjaGVkdWxlSW1tZWRpYXRlUm9vdFNjaGVkdWxlVGFzaygpKVxuICAgICAgICA6IGRpZFNjaGVkdWxlTWljcm90YXNrIHx8XG4gICAgICAgICAgKChkaWRTY2hlZHVsZU1pY3JvdGFzayA9ICEwKSwgc2NoZWR1bGVJbW1lZGlhdGVSb290U2NoZWR1bGVUYXNrKCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaFN5bmNXb3JrQWNyb3NzUm9vdHNfaW1wbChzeW5jVHJhbnNpdGlvbkxhbmVzLCBvbmx5TGVnYWN5KSB7XG4gICAgICBpZiAoIWlzRmx1c2hpbmdXb3JrICYmIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yaykge1xuICAgICAgICBpc0ZsdXNoaW5nV29yayA9ICEwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGRpZFBlcmZvcm1Tb21lV29yayA9ICExO1xuICAgICAgICAgIGZvciAodmFyIHJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7IG51bGwgIT09IHJvb3Q7ICkge1xuICAgICAgICAgICAgaWYgKCFvbmx5TGVnYWN5KVxuICAgICAgICAgICAgICBpZiAoMCAhPT0gc3luY1RyYW5zaXRpb25MYW5lcykge1xuICAgICAgICAgICAgICAgI
15852HZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcGVuZGluZ0xhbmVzKSB2YXIgbmV4dExhbmVzID0gMDtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgICAgICAgICAgICAgICAgIG5leHRMYW5lcyA9XG4gICAgICAgICAgICAgICAgICAgICgxIDw8ICgzMSAtIGNsejMyKDQyIHwgc3luY1RyYW5zaXRpb25MYW5lcykgKyAxKSkgLSAxO1xuICAgICAgICAgICAgICAgICAgbmV4dExhbmVzICY9IHBlbmRpbmdMYW5lcyAmIH4oc3VzcGVuZGVkTGFuZXMgJiB+cGluZ2VkTGFuZXMpO1xuICAgICAgICAgICAgICAgICAgbmV4dExhbmVzID1cbiAgICAgICAgICAgICAgICAgICAgbmV4dExhbmVzICYgMjAxMzI2NzQxXG4gICAgICAgICAgICAgICAgICAgICAgPyAobmV4dExhbmVzICYgMjAxMzI2NzQxKSB8IDFcbiAgICAgICAgICAgICAgICAgICAgICA6IG5leHRMYW5lc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0TGFuZXMgfCAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDAgIT09IG5leHRMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgKChkaWRQZXJmb3JtU29tZVdvcmsgPSAhMCksXG4gICAgICAgICAgICAgICAgICBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCwgbmV4dExhbmVzKSk7XG4gICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIChuZXh0TGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAgICAgICAobmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKFxuICAgICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyBuZXh0TGFuZXMgOiAwLFxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSByb290LmNhbmNlbFBlbmRpbmdDb21taXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dFxuICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAwID09PSAobmV4dExhbmVzICYgMykgfHxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tJZlJvb3RJc1ByZXJlbmRlcmluZyhyb290LCBuZXh0TGFuZXMpIHx8XG4gICAgICAgICAgICAgICAgICAgICgoZGlkUGVyZm9ybVNvbWVXb3JrID0gITApLFxuICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCwgbmV4dExhbmVzKSk7XG4gICAgICAgICAgICByb290ID0gcm9vdC5uZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoZGlkUGVyZm9ybVNvbWVXb3JrKTtcbiAgICAgICAgaXNGbHVzaGluZ1dvcmsgPSAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1Jvb3RTY2hlZHVsZUluSW1tZWRpYXRlVGFzaygpIHtcbiAgICAgIHNjaGVkdWxlckV2ZW50ID0gd2luZG93LmV2ZW50O1xuICAgICAgcHJvY2Vzc1Jvb3RTY2hlZHVsZUluTWljcm90YXNrKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSb290U2NoZWR1bGVJbk1pY3JvdGFzaygpIHtcbiAgICAgIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yayA9XG4gICAgICAgIGRpZFNjaGVkdWxlTWljcm90YXNrX2FjdCA9XG4gICAgICAgIGRpZFNjaGVkdWxlTWljcm90YXNrID1cbiAgICAgICAgICAhMTtcbiAgICAgIHZhciBzeW5jVHJhbnNpdGlvbkxhbmVzID0gMDtcbiAgICAgIDAgIT09IGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lICYmXG4gICAgICAgIHNob3VsZEF0dGVtcHRFYWdlclRyYW5zaXRpb24oKSAmJlxuICAgICAgICAoc3luY1RyYW5zaXRpb25MYW5lcyA9IGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lKTtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IG5vdyQxKCksIHByZXYgPSBudWxsLCByb290ID0gZmlyc3RTY2hlZHVsZWRSb290O1xuICAgICAgICBudWxsICE9PSByb290O1xuXG4gICAgICApIHtcbiAgICAgICAgdmFyIG5leHQgPSByb290Lm5leHQsXG4gICAgICAgICAgbmV4dExhbmVzID0gc2NoZWR1bGVUYXNrRm9yUm9vdER1cmluZ01pY3JvdGFzayhyb290LCBjdXJyZW50VGltZSk7XG4gICAgICAgIGlmICgwID09PSBuZXh0TGFuZXMpXG4gICAgICAgICAgKHJvb3QubmV4dCA9IG51bGwpLFxuICAgICAgICAgICAgbnVsbCA9PT0gcHJldiA/IChmaXJzdFNjaGVkdWxlZFJvb3QgPSBuZXh0KSA6IChwcmV2Lm5leHQgPSBuZXh0KSxcbiAgICAgICAgICAgIG51bGwgPT09IG5leHQgJiYgKGxhc3RTY2hlZHVsZWRSb290ID0gcHJldik7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICgocHJldiA9IHJvb3QpLCAwICE9PSBzeW5jVHJhbnNpdGlvbkxhbmVzIHx8IDAgIT09IChuZXh0TGFuZXMgJiAzKSlcbiAgICAgICAgKVxuICAgICAgICAgIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yayA9ICEwO1xuICAgICAgICByb290ID0gbmV4dDtcbiAgICAgIH1cbiAgICAgIChwZW5kaW5nRWZmZWN0c1N0YXR1cyAhPT0gTk9fUEVORElOR19FRkZFQ1RTICYmXG4gICAgICAgIHBlbmRpbmdFZmZlY3RzU3RhdHVzICE9PSBQRU5ESU5HX1BBU1NJVkVfUEhBU0UpIHx8XG4gICAgICAgIGZsdXNoU3luY1dvcmtBY3Jvc3NSb290c19pbXBsKHN5bmNUcmFuc2l0aW9uTGFuZXMsICExKTtcbiAgICAgIDAgIT09IGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lICYmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IDApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZVRhc2tGb3JSb290RHVyaW5nTWljcm90YXNrKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzLFxuICAgICAgICAgIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcyxcbiAgICAgICAgICBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcyxcbiAgICAgICAgICBsYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgLTYyOTE0NTYxO1xuICAgICAgICAwIDwgbGFuZXM7XG5cbiAgICAgICkge1xuICAgICAgICB2YXIgaW5kZXggPSAzMSAtIGNsejMyKGxhbmVzKSxcbiAgICAgICAgICBsYW5lID0gMSA8PCBpbmRleCxcbiAgICAgICAgICBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG4gICAgICAgIGlmICgtMSA9PT0gZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICBpZiAoMCA9PT0gKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgfHwgMCAhPT0gKGxhbmUgJiBwaW5nZWRMYW5lcykpXG4gICAgICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSBlbHNlIGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lICYmIChyb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lKTtcbiAgICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgICB9XG4gICAgICBjdXJyZW50VGltZSA9IHdvcmtJblByb2dyZXNzUm9vdDtcbiAgICAgIHN1c3BlbmRlZExhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXM7XG4gICAgICBzdXNwZW5kZWRMYW5lcyA9IGdldE5leHRMYW5lcyhcbiAgICAgICAgcm9vdCxcbiAgICAgICAgcm9vdCA9PT0gY3VycmVudFRpbWUgPyBzdXNwZW5kZWRMYW5lcyA6IDAsXG4gICAgICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdCB8fCByb290LnRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dFxuICAgICAgKTtcbiAgICAgIHBpbmdlZExhbmVzID0gcm9vdC5jYWxsYmFja05vZGU7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IHN1c3BlbmRlZExhbmVzIHx8XG4gICAgICAgIChyb290ID09PSBjdXJyZW50VGltZSAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9PT0gU3VzcGVuZGVkT25EYXRhIHx8XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9PT0gU3VzcGVuZGVkT25BY3Rpb24pKSB8fFxuICAgICAgICBudWxsICE9PSByb290LmNhbmNlbFBlbmRpbmdDb21taXRcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBudWxsICE9PSBwaW5nZWRMYW5lcyAmJiBjYW5jZWxDYWxsYmFjayhwaW5nZWRMYW5lcyksXG4gICAgICAgICAgKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksXG4gICAgICAgICAgKHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDApXG4gICAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IChzdXNwZW5kZWRMYW5lcyAmIDMpIHx8XG4gICAgICAgIGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcocm9vdCwgc3VzcGVuZGVkTGFuZXMpXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFRpbWUgPSBzdXNwZW5kZWRMYW5lcyAmIC1zdXNwZW5kZWRMYW5lcztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRUaW1lICE9PSByb290LmNhbGxiYWNrUHJpb3JpdHkgfHxcbiAgICAgICAgICAobnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgICAgIHBpbmdlZExhbmVzICE9PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKVxuICAgICAgICApXG4gICAgICAgICAgY2FuY2VsQ2FsbGJhY2socGluZ2VkTGFuZXMpO1xuICAgICAgICBlbHNlIHJldHVybiBjdXJyZW50VGltZTtcbiAgICAgICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShzdXNwZW5kZWRMYW5lcykpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzdXNwZW5kZWRMYW5lcyA9IE5vcm1hbFByaW9yaXR5JDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBOb3JtYWxQcmlvcml0eSQxO1xuICAgICAgICB9XG4gICAgICAgIHBpbmdlZExhbmVzID0gcGVyZm9ybVdvcmtPblJvb3RWaWFTY2hlZHVsZXJUYXNrLmJpbmQobnVsbCwgcm9vdCk7XG4gICAgICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlXG4gICAgICAgICAgPyAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUucHVzaChwaW5nZWRMYW5lcyksXG4gICAgICAgICAgICAoc3VzcGVuZGVkTGFuZXMgPSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSlcbiAgICAgICAgICA6IChzdXNwZW5kZWRMYW5lcyA9IHNjaGVkdWxlQ2FsbGJhY2skMyhzdXNwZW5kZWRMYW5lcywgcGluZ2VkTGFuZXMpKTtcbiAgICAgICAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gY3VycmVudFRpbWU7XG4gICAgICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gc3VzcGVuZGVkTGFuZXM7XG4gICAgICAgIHJldHVybiBjdXJyZW50VGltZTtcbiAgICAgIH1cbiAgICAgIG51bGwgIT09IHBpbmdlZExhbmVzICYmIGNhbmNlbENhbGxiYWNrKHBpbmdlZExhbmVzKTtcbiAgICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDI7XG4gICAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgICByZXR1cm4gMjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVdvcmtPblJvb3RWaWFTY2hlZHVsZXJUYXNrKHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAgICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9ICExO1xuICAgICAgc2NoZWR1bGVyRXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICBpZiAoXG4gICAgICAgI
15852HBlbmRpbmdFZmZlY3RzU3RhdHVzICE9PSBOT19QRU5ESU5HX0VGRkVDVFMgJiZcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgIT09IFBFTkRJTkdfUEFTU0lWRV9QSEFTRVxuICAgICAgKVxuICAgICAgICByZXR1cm4gKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksIChyb290LmNhbGxiYWNrUHJpb3JpdHkgPSAwKSwgbnVsbDtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlO1xuICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPT09IElNTUVESUFURV9DT01NSVQgJiZcbiAgICAgICAgKHBlbmRpbmdEZWxheWVkQ29tbWl0UmVhc29uID0gREVMQVlFRF9QQVNTSVZFX0NPTU1JVCk7XG4gICAgICBpZiAoZmx1c2hQZW5kaW5nRWZmZWN0cygpICYmIHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMkanNjb21wJDAgPVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwID0gZ2V0TmV4dExhbmVzKFxuICAgICAgICByb290LFxuICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RcbiAgICAgICAgICA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwXG4gICAgICAgICAgOiAwLFxuICAgICAgICBudWxsICE9PSByb290LmNhbmNlbFBlbmRpbmdDb21taXQgfHwgcm9vdC50aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXRcbiAgICAgICk7XG4gICAgICBpZiAoMCA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMkanNjb21wJDApIHJldHVybiBudWxsO1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3QoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwLFxuICAgICAgICBkaWRUaW1lb3V0XG4gICAgICApO1xuICAgICAgc2NoZWR1bGVUYXNrRm9yUm9vdER1cmluZ01pY3JvdGFzayhyb290LCBub3ckMSgpKTtcbiAgICAgIHJldHVybiBudWxsICE9IHJvb3QuY2FsbGJhY2tOb2RlICYmXG4gICAgICAgIHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZVxuICAgICAgICA/IHBlcmZvcm1Xb3JrT25Sb290VmlhU2NoZWR1bGVyVGFzay5iaW5kKG51bGwsIHJvb3QpXG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QsIGxhbmVzKSB7XG4gICAgICBpZiAoZmx1c2hQZW5kaW5nRWZmZWN0cygpKSByZXR1cm4gbnVsbDtcbiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IG5lc3RlZFVwZGF0ZVNjaGVkdWxlZDtcbiAgICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9ICExO1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3Qocm9vdCwgbGFuZXMsICEwKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKSB7XG4gICAgICBjYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUgJiZcbiAgICAgICAgbnVsbCAhPT0gY2FsbGJhY2tOb2RlICYmXG4gICAgICAgIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVJbW1lZGlhdGVSb290U2NoZWR1bGVUYXNrKCkge1xuICAgICAgbnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvY2Vzc1Jvb3RTY2hlZHVsZUluTWljcm90YXNrKCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHRcbiAgICAgICAgICA/IHNjaGVkdWxlQ2FsbGJhY2skMyhcbiAgICAgICAgICAgICAgSW1tZWRpYXRlUHJpb3JpdHksXG4gICAgICAgICAgICAgIHByb2Nlc3NSb290U2NoZWR1bGVJbkltbWVkaWF0ZVRhc2tcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHByb2Nlc3NSb290U2NoZWR1bGVJbk1pY3JvdGFzaygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcXVlc3RUcmFuc2l0aW9uTGFuZSgpIHtcbiAgICAgIGlmICgwID09PSBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSkge1xuICAgICAgICB2Y
15852XIgYWN0aW9uU2NvcGVMYW5lID0gY3VycmVudEVudGFuZ2xlZExhbmU7XG4gICAgICAgIDAgPT09IGFjdGlvblNjb3BlTGFuZSAmJlxuICAgICAgICAgICgoYWN0aW9uU2NvcGVMYW5lID0gbmV4dFRyYW5zaXRpb25VcGRhdGVMYW5lKSxcbiAgICAgICAgICAobmV4dFRyYW5zaXRpb25VcGRhdGVMYW5lIDw8PSAxKSxcbiAgICAgICAgICAwID09PSAobmV4dFRyYW5zaXRpb25VcGRhdGVMYW5lICYgMjYxODg4KSAmJlxuICAgICAgICAgICAgKG5leHRUcmFuc2l0aW9uVXBkYXRlTGFuZSA9IDI1NikpO1xuICAgICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGFjdGlvblNjb3BlTGFuZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29lcmNlRm9ybUFjdGlvblByb3AoYWN0aW9uUHJvcCkge1xuICAgICAgaWYgKFxuICAgICAgICBudWxsID09IGFjdGlvblByb3AgfHxcbiAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIGFjdGlvblByb3AgfHxcbiAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiBhY3Rpb25Qcm9wXG4gICAgICApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvblByb3ApIHJldHVybiBhY3Rpb25Qcm9wO1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihhY3Rpb25Qcm9wLCBcImFjdGlvblwiKTtcbiAgICAgIHJldHVybiBzYW5pdGl6ZVVSTChhY3Rpb25Qcm9wKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKFxuICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgIG1heWJlVGFyZ2V0SW5zdCxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJzdWJtaXRcIiA9PT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgIG1heWJlVGFyZ2V0SW5zdCAmJlxuICAgICAgICBtYXliZVRhcmdldEluc3Quc3RhdGVOb2RlID09PSBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgKSB7XG4gICAgICAgIHZhciBhY3Rpb24gPSBjb2VyY2VGb3JtQWN0aW9uUHJvcChcbiAgICAgICAgICAgIChuYXRpdmVFdmVudFRhcmdldFtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsKS5hY3Rpb25cbiAgICAgICAgICApLFxuICAgICAgICAgIHN1Ym1pdHRlciA9IG5hdGl2ZUV2ZW50LnN1Ym1pdHRlcjtcbiAgICAgICAgc3VibWl0dGVyICYmXG4gICAgICAgICAgKChkb21FdmVudE5hbWUgPSAoZG9tRXZlbnROYW1lID0gc3VibWl0dGVyW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGwpXG4gICAgICAgICAgICA/IGNvZXJjZUZvcm1BY3Rpb25Qcm9wKGRvbUV2ZW50TmFtZS5mb3JtQWN0aW9uKVxuICAgICAgICAgICAgOiBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybUFjdGlvblwiKSksXG4gICAgICAgICAgbnVsbCAhPT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgICAgICAoKGFjdGlvbiA9IGRvbUV2ZW50TmFtZSksIChzdWJtaXR0ZXIgPSBudWxsKSkpO1xuICAgICAgICB2Y
15852XIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoXG4gICAgICAgICAgXCJhY3Rpb25cIixcbiAgICAgICAgICBcImFjdGlvblwiLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgKTtcbiAgICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgbGlzdGVuZXJzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICBsaXN0ZW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG5hdGl2ZUV2ZW50VGFyZ2V0LCBzdWJtaXR0ZXIpLFxuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmc6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG5hdGl2ZUV2ZW50VGFyZ2V0Lm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShwZW5kaW5nU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBzdGFydEhvc3RUcmFuc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIG1heWJlVGFyZ2V0SW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgIChldmVudC5wcmV2ZW50RGVmYXVsdCgpLFxuICAgICAgICAgICAgICAgICAgICAoZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobmF0aXZlRXZlbnRUYXJnZXQsIHN1Ym1pdHRlcikpLFxuICAgICAgICAgICAgICAgICAgICAocGVuZGluZ1N0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmc6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbmF0aXZlRXZlbnRUYXJnZXQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKHBlbmRpbmdTdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SG9zdFRyYW5zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgbWF5YmVUYXJnZXRJbnN0LFxuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGFcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICAgICAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ZW5lcihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRHbG9iYWxFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICAgICAgZXZlbnRTeXN0ZW1GbGFncyA9IDAgIT09IChldmVudFN5c3RlbUZsYWdzICYgNCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldO1xuICAgICAgICBhOiB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzSW5zdGFuY2UgPSB2b2lkIDAsXG4gICAgICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQ7XG4gICAgICAgICAgX2Rpc3BhdGNoUXVldWUkaSA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgICAgICAgIGlmIChldmVudFN5c3RlbUZsYWdzKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgdmFyIGkkanNjb21wJDAgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgIDAgPD0gaSRqc2NvbXAkMDtcbiAgICAgICAgICAgICAgaSRqc2NvbXAkMC0tXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gX2Rpc3BhdGNoUXVldWUkaVtpJGpzY29tcCQwXSxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgID8gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlRGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogZXhlY3V0ZURpc3Bh
15852dGNoKGV2ZW50LCBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSwgY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICBpJGpzY29tcCQwID0gMDtcbiAgICAgICAgICAgICAgaSRqc2NvbXAkMCA8IF9kaXNwYXRjaFF1ZXVlJGkubGVuZ3RoO1xuICAgICAgICAgICAgICBpJGpzY29tcCQwKytcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaFF1ZXVlJGlbaSRqc2NvbXAkMF07XG4gICAgICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgID8gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlRGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSwgY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpIHx8XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyxcbiAgICAgICAgICBkb21FdmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIHZhciBsaXN0ZW5lclNldCA9IHRhcmdldEVsZW1lbnRbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgICAgIHZvaWQgMCA9PT0gbGlzdGVuZXJTZXQgJiZcbiAgICAgICAgKGxpc3RlbmVyU2V0ID0gdGFyZ2V0RWxlbWVudFtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldID0gbmV3IFNldCgpKTtcbiAgICAgIHZhciBsaXN0ZW5lclNldEtleSA9IGRvbUV2ZW50TmFtZSArIFwiX19idWJibGVcIjtcbiAgICAgIGxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkgfHxcbiAgICAgICAgKGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgMiwgITEpLFxuICAgICAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICAgICAgbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmXG4gICAgICAgICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLFxuICAgICAgICAgIGRvbUV2ZW50TmFtZVxuICAgICAgICApO1xuICAgICAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciAmJiAoZXZlbnRTeXN0ZW1GbGFncyB8PSA0KTtcbiAgICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gITA7XG4gICAgICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgICBcInNlbGVjdGlvbmNoYW5nZVwiICE9PSBkb21FdmVudE5hbWUgJiZcbiAgICAgICAgICAgIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgfHxcbiAgICAgICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsICExLCByb290Q29udGFpbmVyRWxlbWVudCksXG4gICAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgITAsIHJvb3RDb250YWluZXJFbGVtZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9XG4gICAgICAgICAgOSA9PT0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGVcbiAgICAgICAgICAgID8gcm9vdENvbnRhaW5lckVsZW1lbnRcbiAgICAgICAgICAgIDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbnVsbCA9PT0gb3duZXJEb2N1bWVudCB8fFxuICAgICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSB8fFxuICAgICAgICAgICgob3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gITApLFxuICAgICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgITEsIG93bmVyRG9jdW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIoXG4gICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICBkb21FdmVudE5hbWUsXG4gICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgICkge1xuICAgICAgc3dpdGNoIChnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgdmFyIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgfVxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyA9IGxpc3RlbmVyV3JhcHBlci5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgKTtcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IHZvaWQgMDtcbiAgICAgICFwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCB8fFxuICAgICAgICAoXCJ0b3VjaHN0YXJ0XCIgIT09IGRvbUV2ZW50TmFtZSAmJlxuICAgICAgICAgIFwidG91Y2htb3ZlXCIgIT09IGRvbUV2ZW50TmFtZSAmJlxuICAgICAgICAgIFwid2hlZWxcIiAhPT0gZG9tRXZlbnROYW1lKSB8fFxuICAgICAgICAobGlzdGVuZXJXcmFwcGVyID0gITApO1xuICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgICAgICA/IHZvaWQgMCAhPT0gbGlzdGVuZXJXcmFwcGVyXG4gICAgICAgICAgPyB0YXJnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHtcbiAgICAgICAgICAgICAgY2FwdHVyZTogITAsXG4gICAgICAgICAgICAgIHBhc3NpdmU6IGxpc3RlbmVyV3JhcHBlclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHRhcmdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgITApXG4gICAgICAgIDogdm9pZCAwICE9PSBsaXN0ZW5lcldyYXBwZXJcbiAgICAgICAgICA/IHRhcmdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywge1xuICAgICAgICAgICAgICBwYXNzaXZlOiBsaXN0ZW5lcldyYXBwZXJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB0YXJnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgdGFyZ2V0SW5zdCRqc2NvbXAkMCxcbiAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICkge1xuICAgICAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3QkanNjb21wJDA7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IChldmVudFN5c3RlbUZsYWdzICYgMSkgJiZcbiAgICAgICAgMCA9PT0gKGV2ZW50U3lzdGVtRmxhZ3MgJiAyKSAmJlxuICAgICAgICBudWxsICE9PSB0YXJnZXRJbnN0JGpzY29tcCQwXG4gICAgICApXG4gICAgICAgIGE6IGZvciAoOzspIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gdGFyZ2V0SW5zdCRqc2NvbXAkMCkgcmV0dXJuO1xuICAgICAgICAgIHZhciBub2RlVGFnID0gdGFyZ2V0SW5zdCRqc2NvbXAkMC50YWc7XG4gICAgICAgICAgaWYgKDMgPT09IG5vZGVUYWcgfHwgNCA9PT0gbm9kZVRhZykge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRhcmdldEluc3QkanNjb21wJDAuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIpIGJyZWFrO1xuICAgICAgICAgICAgaWYgKDQgPT09IG5vZGVUYWcpXG4gICAgICAgICAgICAgIGZvciAobm9kZVRhZyA9IHRhcmdldEluc3QkanNjb21wJDAucmV0dXJuOyBudWxsICE9PSBub2RlVGFnOyApIHtcbiAgICAgICAgICAgICAgICB2Y
15852XIgZ3JhbmRUYWcgPSBub2RlVGFnLnRhZztcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoMyA9PT0gZ3JhbmRUYWcgfHwgNCA9PT0gZ3JhbmRUYWcpICYmXG4gICAgICAgICAgICAgICAgICBub2RlVGFnLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSB0YXJnZXRDb250YWluZXJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbm9kZVRhZyA9IG5vZGVUYWcucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDsgbnVsbCAhPT0gY29udGFpbmVyOyApIHtcbiAgICAgICAgICAgICAgbm9kZVRhZyA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSBub2RlVGFnKSByZXR1cm47XG4gICAgICAgICAgICAgIGdyYW5kVGFnID0gbm9kZVRhZy50YWc7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICA1ID09PSBncmFuZFRhZyB8fFxuICAgICAgICAgICAgICAgIDYgPT09IGdyYW5kVGFnIHx8XG4gICAgICAgICAgICAgICAgMjYgPT09IGdyYW5kVGFnIHx8XG4gICAgICAgICAgICAgICAgMjcgPT09IGdyYW5kVGFnXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRhcmdldEluc3QkanNjb21wJDAgPSBhbmNlc3Rvckluc3QgPSBub2RlVGFnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhcmdldEluc3QkanNjb21wJDAgPSB0YXJnZXRJbnN0JGpzY29tcCQwLnJldHVybjtcbiAgICAgICAgfVxuICAgICAgYmF0Y2hlZFVwZGF0ZXMkMShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0YXJnZXRJbnN0ID0gYW5jZXN0b3JJbnN0LFxuICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpLFxuICAgICAgICAgIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgICAgICAgYToge1xuICAgICAgICAgIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAodm9pZCAwICE9PSByZWFjdE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudCxcbiAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG4gICAgICAgICAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwia2V5cHJlc3NcIjpcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkpIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJrZXl1cFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJmb2N1c2luXCI6XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBcImZvY3VzXCI7XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBcImJsdXJcIjtcbiAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiYmVmb3JlYmx1clwiOlxuICAgICAgICAgICAgICBjYXNlIFwiYWZ0ZXJibHVyXCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImNsaWNrXCI6XG4gICAgICAgICAgICAgICAgaWYgKDIgPT09IG5hdGl2ZUV2ZW50LmJ1dHRvbikgYnJlYWsgYTtcbiAgICAgICAgICAgICAgY2FzZSBcImF1eGNsaWNrXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJkYmxjbGlja1wiOlxuICAgICAgICAgICAgICBjYXNlIFwibW91c2Vkb3duXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJtb3VzZW1vdmVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm1vdXNldXBcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImNvbnRleHRtZW51XCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdlbmRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZHJhZ2V4aXRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdsZWF2ZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZHJhZ292ZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdzdGFydFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZHJvcFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInRvdWNoY2FuY2VsXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOlxuICAgICAgICAgICAgICBjYXNlIFwidG91Y2htb3ZlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJ0b3VjaHN0YXJ0XCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgICAgICAgICAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInNjcm9sbFwiOlxuICAgICAgICAgICAgICBjYXNlIFwic2Nyb2xsZW5kXCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbn
15852RDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcIndoZWVsXCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImNvcHlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImN1dFwiOlxuICAgICAgICAgICAgICBjYXNlIFwicGFzdGVcIjpcbiAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBvaW50ZXJjYW5jZWxcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBvaW50ZXJkb3duXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJwb2ludGVybW92ZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICAgICAgICBjYXNlIFwicG9pbnRlcm92ZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBvaW50ZXJ1cFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInN1Ym1pdFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1N1Ym1pdEV2ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwidG9nZ2xlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJiZWZvcmV0b2dnbGVcIjpcbiAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb2dnbGVFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpbkNhcHR1cmVQaGFzZSA9IDAgIT09IChldmVudFN5c3RlbUZsYWdzICYgNCksXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID1cbiAgICAgICAgICAgICAgICAhaW5DYXB0dXJlUGhhc2UgJiZcbiAgICAgICAgICAgICAgICAoXCJzY3JvbGxcIiA9PT0gZG9tRXZlbnROYW1lIHx8IFwic2Nyb2xsZW5kXCIgPT09IGRvbUV2ZW50TmFtZSksXG4gICAgICAgICAgICAgIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2VcbiAgICAgICAgICAgICAgICA/IG51bGwgIT09IHJlYWN0TmFtZVxuICAgICAgICAgICAgICAgICAgPyByZWFjdE5hbWUgKyBcIkNhcHR1cmVcIlxuICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgOiByZWFjdE5hbWU7XG4gICAgICAgICAgICBpbkNhcHR1cmVQaGFzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGFyZ2V0SW5zdCwgbGFzdEhvc3RDb21wb25lbnQ7XG4gICAgICAgICAgICAgIG51bGwgIT09IGluc3RhbmNlO1xuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgX2luc3RhbmNlMiA9IF9pbnN0YW5jZTIudGFnO1xuICAgICAgICAgICAgICAoNSAhPT0gX2luc3RhbmNlMiAmJiAyNiAhPT0gX2luc3RhbmNlMiAmJiAyNyAhPT0gX2luc3RhbmNlMikgfHxcbiAgICAgICAgICAgICAgICBudWxsID09PSBsYXN0SG9zdENvbXBvbmVudCB8fFxuICAgICAgICAgICAgICAgIG51bGwgPT09IHJlYWN0RXZlbnROYW1lIHx8XG4gICAgICAgICAgICAgICAgKChfaW5zdGFuY2UyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKSksXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBfaW5zdGFuY2UyICYmXG4gICAgICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZTIsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdEhvc3RDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkgYnJlYWs7XG4gICAgICAgICAgICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgMCA8IGluQ2FwdHVyZVBoYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAoKHJlYWN0TmFtZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoXG4gICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHJlYWN0TmFtZSxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnM6IGluQ2FwdHVyZVBoYXNlXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKDAgPT09IChldmVudFN5c3RlbUZsYWdzICYgNykpIHtcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPVxuICAgICAgICAgICAgICBcIm1vdXNlb3ZlclwiID09PSBkb21FdmVudE5hbWUgfHwgXCJwb2ludGVyb3ZlclwiID09PSBkb21FdmVudE5hbWU7XG4gICAgICAgICAgICByZWFjdE5hbWUgPVxuICAgICAgICAgICAgICBcIm1vdXNlb3V0XCIgPT09IGRvbUV2ZW50TmFtZSB8fCBcInBvaW50ZXJvdXRcIiA9PT0gZG9tRXZlbnROYW1lO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgJiZcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQgIT09IGN1cnJlbnRSZXBsYXlpbmdFdmVudCAmJlxuICAgICAgICAgICAgICAocmVhY3R
15852FdmVudFR5cGUgPVxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpICYmXG4gICAgICAgICAgICAgIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWFjdEV2ZW50VHlwZSkgfHxcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGlmIChyZWFjdE5hbWUgfHwgU3ludGhldGljRXZlbnRDdG9yKSB7XG4gICAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlID1cbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICA/IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICA6IChTeW50aGV0aWNFdmVudEN0b3IgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IFN5bnRoZXRpY0V2ZW50Q3Rvci5kZWZhdWx0VmlldyB8fFxuICAgICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3Rvci5wYXJlbnRXaW5kb3dcbiAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3c7XG4gICAgICAgICAgICAgIGlmIChyZWFjdE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoKFN5bnRoZXRpY0V2ZW50Q3RvciA9XG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgIChyZWFjdE5hbWUgPSB0YXJnZXRJbnN0KSxcbiAgICAgICAgICAgICAgICAgIChTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudEN0b3JcbiAgICAgICAgICAgICAgICAgICAgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShTeW50aGV0aWNFdmVudEN0b3IpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBTeW50aGV0aWNFdmVudEN0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKChhY2N1bXVsYXRlVGFyZ2V0T25seSA9XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihTeW50aGV0aWNFdmVudEN0b3IpKSxcbiAgICAgICAgICAgICAgICAgICAgKGluQ2FwdHVyZVBoYXNlID0gU3ludGhldGljRXZlbnRDdG9yLnRhZyksXG4gICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciAhPT0gYWNjdW11bGF0ZVRhcmdldE9ubHkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoNSAhPT0gaW5DYXB0dXJlUGhhc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIDI3ICE9PSBpbkNhcHR1cmVQaGFzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgNiAhPT0gaW5DYXB0dXJlUGhhc2UpKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2UgKHJlYWN0TmFtZSA9IG51bGwpLCAoU3ludGhldGljRXZlbnRDdG9yID0gdGFyZ2V0SW5zdCk7XG4gICAgICAgICAgICAgIGlmIChyZWFjdE5hbWUgIT09IFN5bnRoZXRpY0V2ZW50Q3Rvcikge1xuICAgICAgICAgICAgICAgIGluQ2FwdHVyZVBoYXNlID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgICAgICAgICBfaW5zdGFuY2UyID0gXCJvbk1vdXNlTGVhdmVcIjtcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50TmFtZSA9IFwib25Nb3VzZUVudGVyXCI7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBcIm1vdXNlXCI7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgXCJwb2ludGVyb3V0XCIgPT09IGRvbUV2ZW50TmFtZSB8fFxuICAgICAgICAgICAgICAgICAgXCJwb2ludGVyb3ZlclwiID09PSBkb21FdmVudE5hbWVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAoaW5DYXB0dXJlUGhhc2UgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICAoX2luc3RhbmNlMiA9IFwib25Qb2ludGVyTGVhdmVcIiksXG4gICAgICAgICAgICAgICAgICAgIChyZWFjdEV2ZW50TmFtZSA9IFwib25Qb2ludGVyRW50ZXJcIiksXG4gICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZSA9IFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlVGFyZ2V0T25seSA9XG4gICAgICAgICAgICAgICAgICBudWxsID09IHJlYWN0TmFtZVxuICAgICAgICAgICAgICAgICAgICA/IHJlYWN0RXZlbnRUeXBlXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShyZWFjdE5hbWUpO1xuICAgICAgICAgICAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID1cbiAgICAgICAgICAgICAgICAgIG51bGwgPT0gU3ludGhldGljRXZlbnRDdG9yXG4gICAgICAgICAgICAgICAgICAgID8gcmVhY3RFdmVudFR5cGVcbiAgICAgICAgICAgICAgICAgICAgOiBnZXROb2RlRnJvbUluc3RhbmNlKFN5bnRoZXRpY0V2ZW50Q3Rvcik7XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBuZXcgaW5DYXB0dXJlUGhhc2UoXG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UyLFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgKyBcImxlYXZlXCIsXG4gICAgICAgICAgICAgICAgICByZWFjdE5hbWUsXG4gICAgICAgICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZS50YXJnZXQgPSBhY2N1bXVsYXRlVGFyZ2V0T25seTtcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZS5yZWxhdGVkVGFyZ2V0ID0gbGFzdEhvc3RDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgX2luc3RhbmNlMiA9IG51bGw7XG4gICAgICAgICAgICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpID09PSB0YXJnZXRJbnN0ICYmXG4gICAgICAgICAgICAgICAgICAoKGluQ2FwdHVyZVBoYXNlID0gbmV3IGluQ2FwdHVyZVBoYXNlKFxuICAgICAgICAgICAgICAgICAgICByZWFjdEV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgKyBcImVudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvcixcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgIChpbkNhcHR1cmVQaGFzZS50YXJnZXQgPSBsYXN0SG9zdENvbXBvbmVudCksXG4gICAgICAgICAgICAgICAgICAoaW5DYXB0dXJlUGhhc2UucmVsYXRlZF
15852RhcmdldCA9IGFjY3VtdWxhdGVUYXJnZXRPbmx5KSxcbiAgICAgICAgICAgICAgICAgIChfaW5zdGFuY2UyID0gaW5DYXB0dXJlUGhhc2UpKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlVGFyZ2V0T25seSA9IF9pbnN0YW5jZTI7XG4gICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UgPVxuICAgICAgICAgICAgICAgICAgcmVhY3ROYW1lICYmIFN5bnRoZXRpY0V2ZW50Q3RvclxuICAgICAgICAgICAgICAgICAgICA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcmVhY3ROYW1lICYmXG4gICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZSxcbiAgICAgICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gU3ludGhldGljRXZlbnRDdG9yICYmXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBhY2N1bXVsYXRlVGFyZ2V0T25seSAmJlxuICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZVRhcmdldE9ubHksXG4gICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvcixcbiAgICAgICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UsXG4gICAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgIHJlYWN0TmFtZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID1cbiAgICAgICAgICAgICAgcmVhY3ROYW1lLm5vZGVOYW1lICYmIHJlYWN0TmFtZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcInNlbGVjdFwiID09PSBTeW50aGV0aWNFdmVudEN0b3IgfHxcbiAgICAgICAgICAgICAgKFwiaW5wdXRcIiA9PT0gU3ludGhldGljRXZlbnRDdG9yICYmIFwiZmlsZVwiID09PSByZWFjdE5hbWUudHlwZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgdmFyIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHJlYWN0TmFtZSkpXG4gICAgICAgICAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpXG4gICAgICAgICAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAoU3ludGhldGljRXZlbnRDdG9yID0gcmVhY3ROYW1lLm5vZGVOYW1lKSxcbiAgICAgICAgICAgICAgICAhU3ludGhldGljRXZlbnRDdG9yIHx8XG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiICE9PSBTeW50aGV0aWNFdmVudEN0b3IudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgICAgIChcImNoZWNrYm94XCIgIT09IHJlYWN0TmFtZS50eXBlICYmIFwicmFkaW9cIiAhPT0gcmVhY3ROYW1lLnR5cGUpXG4gICAgICAgICAgICAgICAgICA/IHRhcmdldEluc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50KHRhcmdldEluc3QuZWxlbWVudFR5cGUpICYmXG4gICAgICAgICAgICAgICAgICAgIChnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudClcbiAgICAgICAgICAgICAgICAgIDogKGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyAmJlxuICAgICAgICAgICAgICAoZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgICAgIGdldFRhcmdldEluc3RGdW5jLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVFdmVudEZ1bmMgJiZcbiAgICAgICAgICAgICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lLCB0YXJnZXRJbnN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gdGFyZ2V0SW5zdFxuICAgICAgICAgICAgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpXG4gICAgICAgICAgICA6IHdpbmRvdztcbiAgICAgICAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzVGV4dElucHV0RWxlbWVudChoYW5kbGVFdmVudEZ1bmMpIHx8XG4gICAgICAgICAgICAgICAgXCJ0cnVlXCIgPT09IGhhbmRsZUV2ZW50RnVuYy5jb250ZW50RWRpdGFibGVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIChhY3RpdmVFbGVtZW50ID0gaGFuZGxlRXZlbnRGdW5jKSxcbiAgICAgICAgICAgICAgICAgIChhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3QpLFxuICAgICAgICAgICAgICAgICAgKGxhc3RTZWxlY3Rpb24gPSBudWxsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGlvbiA9IGFjdGl2ZUVsZW1lbnRJbnN0ID0gYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1vdXNlZG93blwiOlxuICAgICAgICAgICAgICBtb3VzZURvd24gPSAhMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY29udGV4dG1lbnVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZXVwXCI6XG4gICAgICAgICAgICBjYXNlIFwiZHJhZ2VuZFwiOlxuICAgICAgICAgICAgICBtb3VzZURvd24gPSAhMTtcbiAgICAgICAgICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjpcbiAgICAgICAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwia2V5ZG93blwiOlxuICAgICAgICAgICAgY2FzZSBcImtleXVwXCI6XG4gICAgICAgICAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGZhbGxiYWNrRGF0YTtcbiAgICAgICAgICBpZiAoY2FuVXNlQ29tcG9zaXRpb25
15852FdmVudClcbiAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29tcG9zaXRpb25zdGFydFwiOlxuICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50VHlwZSA9IFwib25Db21wb3NpdGlvblN0YXJ0XCI7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOlxuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gXCJvbkNvbXBvc2l0aW9uRW5kXCI7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gXCJvbkNvbXBvc2l0aW9uVXBkYXRlXCI7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpc0NvbXBvc2luZ1xuICAgICAgICAgICAgICA/IGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSAmJlxuICAgICAgICAgICAgICAgIChldmVudFR5cGUgPSBcIm9uQ29tcG9zaXRpb25FbmRcIilcbiAgICAgICAgICAgICAgOiBcImtleWRvd25cIiA9PT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERSAmJlxuICAgICAgICAgICAgICAgIChldmVudFR5cGUgPSBcIm9uQ29tcG9zaXRpb25TdGFydFwiKTtcbiAgICAgICAgICBldmVudFR5cGUgJiZcbiAgICAgICAgICAgICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJlxuICAgICAgICAgICAgICBcImtvXCIgIT09IG5hdGl2ZUV2ZW50LmxvY2FsZSAmJlxuICAgICAgICAgICAgICAoaXNDb21wb3NpbmcgfHwgXCJvbkNvbXBvc2l0aW9uU3RhcnRcIiAhPT0gZXZlbnRUeXBlXG4gICAgICAgICAgICAgICAgPyBcIm9uQ29tcG9zaXRpb25FbmRcIiA9PT0gZXZlbnRUeXBlICYmXG4gICAgICAgICAgICAgICAgICBpc0NvbXBvc2luZyAmJlxuICAgICAgICAgICAgICAgICAgKGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKSlcbiAgICAgICAgICAgICAgICA6ICgocm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0KSxcbiAgICAgICAgICAgICAgICAgIChzdGFydFRleHQgPSBcInZhbHVlXCIgaW4gcm9vdCA/IHJvb3QudmFsdWUgOiByb290LnRleHRDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgIChpc0NvbXBvc2luZyA9ICEwKSkpLFxuICAgICAgICAgICAgKGhhbmRsZUV2ZW50RnVuYyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhcbiAgICAgICAgICAgICAgdGFyZ2V0SW5zdCxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIDAgPCBoYW5kbGVFdmVudEZ1bmMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICgoZXZlbnRUeXBlID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzOiBoYW5kbGVFdmVudEZ1bmNcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGZhbGxiYWNrRGF0YVxuICAgICAgICAgICAgICAgID8gKGV2ZW50VHlwZS5kYXRhID0gZmFsbGJhY2tEYXRhKVxuICAgICAgICAgICAgICAgIDogKChmYWxsYmFja0RhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBmYWxsYmFja0RhdGEgJiYgKGV2ZW50VHlwZS5kYXRhID0gZmFsbGJhY2tEYXRhKSkpKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZmFsbGJhY2tEYXRhID0gY2FuVXNlVGV4dElucHV0RXZlbnRcbiAgICAgICAgICAgICAgPyBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpXG4gICAgICAgICAgICAgIDogZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKVxuICAgICAgICAgIClcbiAgICAgICAgICAgIChldmVudFR5cGUgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoXG4gICAgICAgICAgICAgIHRhcmdldEluc3QsXG4gICAgICAgICAgICAgIFwib25CZWZvcmVJbnB1dFwiXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgMCA8IGV2ZW50VHlwZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoKGhhbmRsZUV2ZW50RnVuYyA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KFxuICAgICAgICAgICAgICAgICAgXCJvbkJlZm9yZUlucHV0XCIsXG4gICAgICAgICAgICAgICAgICBcImJlZm9yZWlucHV0XCIsXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICBldmVudDogaGFuZGxlRXZlbnRGdW5jLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzOiBldmVudFR5cGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAoaGFuZGxlRXZlbnRGdW5jLmRhdGEgPSBmYWxsYmFja0RhdGEpKTtcbiAgICAgICAgICBleHRyYWN0RXZlbnRzJDEoXG4gICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgdGFyZ2V0SW5zdCxcbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgI
15852HByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICAgICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSArIFwiQ2FwdHVyZVwiLCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbnVsbCAhPT0gdGFyZ2V0RmliZXI7XG5cbiAgICAgICkge1xuICAgICAgICB2YXIgX2luc3RhbmNlMyA9IHRhcmdldEZpYmVyLFxuICAgICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlO1xuICAgICAgICBfaW5zdGFuY2UzID0gX2luc3RhbmNlMy50YWc7XG4gICAgICAgICg1ICE9PSBfaW5zdGFuY2UzICYmIDI2ICE9PSBfaW5zdGFuY2UzICYmIDI3ICE9PSBfaW5zdGFuY2UzKSB8fFxuICAgICAgICAgIG51bGwgPT09IHN0YXRlTm9kZSB8fFxuICAgICAgICAgICgoX2luc3RhbmNlMyA9IGdldExpc3RlbmVyKHRhcmdldEZpYmVyLCBjYXB0dXJlTmFtZSkpLFxuICAgICAgICAgIG51bGwgIT0gX2luc3RhbmNlMyAmJlxuICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoXG4gICAgICAgICAgICAgIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIodGFyZ2V0RmliZXIsIF9pbnN0YW5jZTMsIHN0YXRlTm9kZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKF9pbnN0YW5jZTMgPSBnZXRMaXN0ZW5lcih0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSksXG4gICAgICAgICAgbnVsbCAhPSBfaW5zdGFuY2UzICYmXG4gICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgICAgY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcih0YXJnZXRGaWJlciwgX2luc3RhbmNlMywgc3RhdGVOb2RlKVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIGlmICgzID09PSB0YXJnZXRGaWJlci50YWcpIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgICAgIHRhcmdldEZpYmVyID0gdGFyZ2V0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICAgICAgaWYgKG51bGwgPT09IGluc3QpIHJldHVybiBudWxsO1xuICAgICAgZG8gaW5zdCA9IGluc3QucmV0dXJuO1xuICAgICAgd2hpbGUgKGluc3QgJiYgNSAhPT0gaW5zdC50YWcgJiYgMjcgIT09IGluc3QudGFnKTtcbiAgICAgIHJldHVybiBpbnN0ID8gaW5zdCA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoXG4gICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgZXZlbnQsXG4gICAgICB0YXJnZXQsXG4gICAgICBjb21tb24sXG4gICAgICBpbkNhcHR1cmVQaGFzZVxuICAgICkge1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lLCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbnVsbCAhPT0gdGFyZ2V0ICYmIHRhcmdldCAhPT0gY29tbW9uO1xuXG4gICAgICApIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSB0YXJnZXQsXG4gICAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlNC5zdGF0ZU5vZGU7XG4gICAgICAgIF9pbnN0YW5jZTQgPSBfaW5zdGFuY2U0LnRhZztcbiAgICAgICAgaWYgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikgYnJlYWs7XG4gICAgICAgICg1ICE9PSBfaW5zdGFuY2U0ICYmIDI2ICE9PSBfaW5zdGFuY2U0ICYmIDI3ICE9PSBfaW5zdGFuY2U0KSB8fFxuICAgICAgICAgIG51bGwgPT09IHN0YXRlTm9kZSB8fFxuICAgICAgICAgICgoYWx0ZXJuYXRlID0gc3RhdGVOb2RlKSxcbiAgICAgICAgICBpbkNhcHR1cmVQaGFzZVxuICAgICAgICAgICAgPyAoKHN0YXRlTm9kZSA9IGdldExpc3RlbmVyKHRhcmdldCwgcmVnaXN0cmF0aW9uTmFtZSkpLFxuICAgICAgICAgICAgICBudWxsICE9IHN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KFxuICAgICAgICAgICAgICAgICAgY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcih0YXJnZXQsIHN0YXRlTm9kZSwgYWx0ZXJuYXRlKVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICA6IGluQ2FwdHVyZVBoYXNlIHx8XG4gICAgICAgICAgICAgICgoc3RhdGVOb2RlID0gZ2V0TGlzdGVuZXIodGFyZ2V0LCByZWdpc3RyYXRpb25OYW1lKSksXG4gICAgICAgICAgICAgIG51bGwgIT0gc3RhdGVOb2RlICYmXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKHRhcmdldCwgc3RhdGVOb2RlLCBhbHRlcm5hdGUpXG4gICAgICAgICAgICAgICAgKSkpO1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucmV0dXJuO1xuICAgICAgfVxuICAgICAgMCAhPT0gbGlzdGVuZXJzLmxlbmd0aCAmJlxuICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goeyBldmVudDogZXZlbnQsIGxpc3RlbmVyczogbGlzdGVuZXJzIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHR5cGUsIHByb3BzKSB7XG4gICAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcyk7XG4gICAgICAoXCJpbnB1dFwiICE9PSB0eXBlICYmIFwidGV4dGFyZWFcIiAhPT0gdHlwZSAmJiBcInNlbGVjdFwiICE9PSB0eXBlKSB8fFxuICAgICAgICBudWxsID09IHByb3BzIHx8XG4gICAgICAgIG51bGwgIT09IHByb3BzLnZhbHVlIHx8XG4gICAgICAgIGRpZFdhcm5WYWx1ZU51bGwgfHxcbiAgICAgICAgKChkaWRXYXJuVmFsdWVOdWxsID0gITApLFxuICAgICAgICBcInNlbGVjdFwiID09PSB0eXBlICYmIHByb3BzLm11bHRpcGxlXG4gICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcImB2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuXCIsXG4gICAgICAgICAgICAgI
15852HR5cGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiBDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuXCIsXG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICkpO1xuICAgICAgdmFyIGV2ZW50UmVnaXN0cnkgPSB7XG4gICAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNcbiAgICAgIH07XG4gICAgICBpc0N1c3RvbUVsZW1lbnQodHlwZSkgfHxcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHByb3BzLmlzIHx8XG4gICAgICAgIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG4gICAgICBwcm9wcy5jb250ZW50RWRpdGFibGUgJiZcbiAgICAgICAgIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJlxuICAgICAgICBudWxsICE9IHByb3BzLmNoaWxkcmVuICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5IFJlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mIHRob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyBwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBzZXJ2ZXJWYWx1ZSxcbiAgICAgIGNsaWVudFZhbHVlLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIHNlcnZlclZhbHVlICE9PSBjbGllbnRWYWx1ZSAmJlxuICAgICAgICAoKGNsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKSksXG4gICAgICAgIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSkgIT09IGNsaWVudFZhbHVlICYmXG4gICAgICAgICAgKHNlcnZlckRpZmZlcmVuY2VzW3Byb3BOYW1lXSA9IHNlcnZlclZhbHVlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhc1ZpZXdUcmFuc2l0aW9uKGh0bWxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIGh0bWxFbGVtZW50LmdldEF0dHJpYnV0ZShcInZ0LXNoYXJlXCIpIHx8XG4gICAgICAgIGh0bWxFbGVtZW50LmdldEF0dHJpYnV0ZShcInZ0LWV4aXRcIikgfHxcbiAgICAgICAgaHRtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidnQtZW50ZXJcIikgfHxcbiAgICAgICAgaHRtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidnQtdXBkYXRlXCIpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0V4cGVjdGVkVmlld1RyYW5zaXRpb25OYW1lKGh0bWxFbGVtZW50KSB7XG4gICAgICBpZiAoIWhhc1ZpZXdUcmFuc2l0aW9uKGh0bWxFbGVtZW50KSkgcmV0dXJuICExO1xuICAgICAgdmFyIGV4cGVjdGVkVnROYW1lID0gaHRtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidnQtbmFtZVwiKTtcbiAgICAgIGh0bWxFbGVtZW50ID0gaHRtbEVsZW1lbnQuc3R5bGVbXCJ2aWV3LXRyYW5zaXRpb24tbmFtZVwiXTtcbiAgICAgIHJldHVybiBleHBlY3RlZFZ0TmFtZVxuICAgICAgICA/IGV4cGVjdGVkVnROYW1lID09PSBodG1sRWxlbWVudFxuICAgICAgICA6IGh0bWxFbGVtZW50LnN0YXJ0c1dpdGgoXCJfVF9cIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoXG4gICAgICBkb21FbGVtZW50LFxuICAgICAgYXR0cmlidXRlTmFtZXMsXG4gICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICkge1xuICAgICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgICAgICBcInN0eWxlXCIgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgICA/IFwiXCIgIT09IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmXG4gICAgICAgICAgICAoKGF0dHJpYnV0ZU5hbWUgPSBkb21FbGVtZW50LnN0eWxlKSxcbiAgICAgICAgICAgICgoKDEgPT09IGF0dHJpYnV0ZU5hbWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgIFwidmlldy10cmFuc2l0aW9uLW5hbWVcIiA9PT0gYXR0cmlidXRlTmFtZVswXSkgfHxcbiAgICAgICAgICAgICAgKDIgPT09IGF0dHJpYnV0ZU5hbWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgXCJ2aWV3LXRyYW5zaXRpb24tY2xhc3NcIiA9PT0gYXR0cmlidXRlTmFtZVswXSAmJlxuICAgICAgICAgICAgICAgIFwidmlldy10cmFuc2l0aW9uLW5hbWVcIiA9PT0gYXR0cmlidXRlTmFtZVsxXSkpICYmXG4gICAgICAgICAgICAgIGlzRXhwZWN0ZWRWaWV3VHJhbnNpdGlvbk5hbWUoZG9tRWxlbWVudCkpIHx8XG4gICAgICAgICAgICAgIChzZXJ2ZXJEaWZmZXJlbmNlcy5zdHlsZSA9XG4gICAgICAgICAgICAgICAgZ2V0U3R5bGVzT2JqZWN0RnJvbUVsZW1lbnQoZG9tRWxlbWVudCkpKVxuICAgICAgICAgIDogKHNlcnZlckRpZmZlcmVuY2VzW2dldFByb3BOYW1lRnJvbUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSldID1cbiAgICAgICAgICAgICAgZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgICAgITEgPT09IGxpc3RlbmVyXG4gICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbklmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCBwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC5cIixcbiAgICAgICAgICAgI
15852HJlZ2lzdHJhdGlvbk5hbWUsXG4gICAgICAgICAgICByZWdpc3RyYXRpb25OYW1lLFxuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZVxuICAgICAgICAgIClcbiAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLlwiLFxuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZSxcbiAgICAgICAgICAgIHR5cGVvZiBsaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUhUTUwocGFyZW50LCBodG1sKSB7XG4gICAgICBwYXJlbnQgPVxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRIX05BTUVTUEFDRSB8fFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFXG4gICAgICAgICAgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgIHBhcmVudC5uYW1lc3BhY2VVUkksXG4gICAgICAgICAgICAgIHBhcmVudC50YWdOYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKTtcbiAgICAgIHBhcmVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIHBhcmVudC5pbm5lckhUTUw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShtYXJrdXApIHtcbiAgICAgIHdpbGxDb2VyY2lvblRocm93KG1hcmt1cCkgJiZcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgIHR5cGVOYW1lKG1hcmt1cClcbiAgICAgICAgKSxcbiAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKG1hcmt1cCkpO1xuICAgICAgcmV0dXJuIChcInN0cmluZ1wiID09PSB0eXBlb2YgbWFya3VwID8gbWFya3VwIDogXCJcIiArIG1hcmt1cClcbiAgICAgICAgLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCBcIlxcblwiKVxuICAgICAgICAucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsIFwiXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCkge1xuICAgICAgY2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCkgPT09IGNsaWVudFRleHRcbiAgICAgICAgPyAhMFxuICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywga2V5LCB2YWx1ZSwgcHJvcHMsIHByZXZWYWx1ZSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB2YWx1ZSlcbiAgICAgICAgICAgIHZhbGlkYXRlVGV4dE5lc3RpbmcodmFsdWUsIHRhZywgITEpLFxuICAgICAgICAgICAgICBcImJvZHlcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICAgICAgKFwidGV4dGFyZWFcIiA9PT0gdGFnICYmIFwiXCIgPT09IHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgICBlbHNlIGlmIChcIm51bWJlclwiID09PSB0eXBlb2YgdmFsdWUgfHwgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIHZhbHVlKVxuICAgICAgICAgICAgdmFsaWRhdGVUZXh0TmVzdGluZyhcIlwiICsgdmFsdWUsIHRhZywgITEpLFxuICAgICAgICAgICAgICBcImJvZHlcIiAhPT0gdGFnICYmIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIgKyB2YWx1ZSk7XG4gICAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjbGFzc05hbWVcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwiY2xhc3NcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGFiSW5kZXhcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwidGFiaW5kZXhcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGlyXCI6XG4gICAgICAgIGNhc2UgXCJyb2xlXCI6XG4gICAgICAgIGNhc2UgXCJ2aWV3Qm94XCI6XG4gICAgICAgIGNhc2UgXCJ3aWR0aFwiOlxuICAgICAgICBjYXNlIFwiaGVpZ2h0XCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JLbm93bkF0dHJpYnV0ZShkb21FbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgdmFsdWUsIHByZXZWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiZGF0YVwiOlxuICAgICAgICAgIGlmIChcIm9iamVjdFwiICE9PSB0YWcpIHtcbiAgICAgICAgICAgIHNldFZhbHVlRm9yS25vd25BdHRyaWJ1dGUoZG9tRWxlbWVudCwgXCJkYXRhXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNyY1wiOlxuICAgICAgICBjYXNlIFwiaHJlZlwiOlxuICAgICAgICAgIGlmIChcIlwiID09PSB2YWx1ZSAmJiAoXCJhXCIgIT09IHRhZyB8fCBcImhyZWZcIiAhPT0ga2V5KSkge1xuICAgICAgICAgICAgXCJzcmNcIiA9PT0ga2V5XG4gICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdBbiBlbXB0eSBzdHJpbmcgKFwiXCIpIHdhcyBwYXNzZWQgdG8gdGhlICVzIGF0dHJpYnV0ZS4gVGhpcyBtYXkgY2F1c2UgdGhlIGJyb3dzZXIgdG8gZG93bmxvYWQgdGhlIHdob2xlI
15852HBhZ2UgYWdhaW4gb3ZlciB0aGUgbmV0d29yay4gVG8gZml4IHRoaXMsIGVpdGhlciBkbyBub3QgcmVuZGVyIHRoZSBlbGVtZW50IGF0IGFsbCBvciBwYXNzIG51bGwgdG8gJXMgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcuJyxcbiAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgJ0FuIGVtcHR5IHN0cmluZyAoXCJcIikgd2FzIHBhc3NlZCB0byB0aGUgJXMgYXR0cmlidXRlLiBUbyBmaXggdGhpcywgZWl0aGVyIGRvIG5vdCByZW5kZXIgdGhlIGVsZW1lbnQgYXQgYWxsIG9yIHBhc3MgbnVsbCB0byAlcyBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4nLFxuICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbnVsbCA9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgIFwic3ltYm9sXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBrZXkpO1xuICAgICAgICAgIHZhbHVlID0gc2FuaXRpemVVUkwodmFsdWUpO1xuICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYWN0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJmb3JtQWN0aW9uXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgICAgKFwiZm9ybVwiID09PSB0YWdcbiAgICAgICAgICAgICAgPyBcImZvcm1BY3Rpb25cIiA9PT0ga2V5XG4gICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIllvdSBjYW4gb25seSBwYXNzIHRoZSBmb3JtQWN0aW9uIHByb3AgdG8gPGlucHV0PiBvciA8YnV0dG9uPi4gVXNlIHRoZSBhY3Rpb24gcHJvcCBvbiA8Zm9ybT4uXCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAoKG51bGwgPT0gcHJvcHMuZW5jVHlwZSAmJiBudWxsID09IHByb3BzLm1ldGhvZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgZGlkV2FybkZvcm1BY3Rpb25NZXRob2QgfHxcbiAgICAgICAgICAgICAgICAgICAgKChkaWRXYXJuRm9ybUFjdGlvbk1ldGhvZCA9ICEwKSxcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCBzcGVjaWZ5IGEgZW5jVHlwZSBvciBtZXRob2QgZm9yIGEgZm9ybSB0aGF0IHNwZWNpZmllcyBhIGZ1bmN0aW9uIGFzIHRoZSBhY3Rpb24uIFJlYWN0IHByb3ZpZGVzIHRob3NlIGF1dG9tYXRpY2FsbHkuIFRoZXkgd2lsbCBnZXQgb3ZlcnJpZGRlbi5cIlxuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgIG51bGwgPT0gcHJvcHMudGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uVGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICgoZGlkV2FybkZvcm1BY3Rpb25UYXJnZXQgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBhIHRhcmdldCBmb3IgYSBmb3JtIHRoYXQgc3BlY2lmaWVzIGEgZnVuY3Rpb24gYXMgdGhlIGFjdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIHdpbmRvdy5cIlxuICAgICAgICAgICAgICAgICAgICApKSlcbiAgICAgICAgICAgICAgOiBcImlucHV0XCIgPT09IHRhZyB8fCBcImJ1dHRvblwiID09PSB0YWdcbiAgICAgICAgICAgICAgICA/IFwiYWN0aW9uXCIgPT09IGtleVxuICAgICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGNhbiBvbmx5IHBhc3MgdGhlIGFjdGlvbiBwcm9wIHRvIDxmb3JtPi4gVXNlIHRoZSBmb3JtQWN0aW9uIHByb3Agb24gPGlucHV0PiBvciA8YnV0dG9uPi5cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IFwiaW5wdXRcIiAhPT0gdGFnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgXCJzdWJtaXRcIiA9PT0gcHJvcHMudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIFwiaW1hZ2VcIiA9PT0gcHJvcHMudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uVHlwZVxuICAgICAgICAgICAgICAgICAgICA/IFwiYnV0dG9uXCIgIT09IHRhZyB8fFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT0gcHJvcHMudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIFwic3VibWl0XCIgPT09IHByb3BzLnR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBkaWRXYXJuRm9ybUFjdGlvblR5cGVcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBwcm9wcy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uTmFtZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRpZFdhcm5Gb3JtQWN0aW9uTmFtZSA9ICEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IHNwZWNpZnkgYSBcIm5hbWVcIiBwcm9wIGZvciBhIGJ1dHRvbiB0aGF0IHNwZWNpZmllcyBhIGZ1bmN0aW9uIGFzIGEgZm9ybUFjdGlvbi4gUmVhY3QgbmVlZHMgaXQgdG8gZW5jb2RlIHdoaWNoIGFjdGlvbiBzaG91bGQgYmUgaW52b2tlZC4gSXQgd2lsbCBnZXQgb3ZlcnJpZGRlbi4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gcHJvcHMuZm9ybUVuY1R5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBwcm9wcy5mb3JtTWV0aG9kKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRXYXJuRm9ybUFjdGlvbk1ldGhvZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRpZFdhcm5Gb3JtQWN0aW9uTWV0aG9kID0gITApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IHNwZWNpZnkgYSBmb3JtRW5jVHlwZSBvciBmb3JtTWV0aG9kIGZvciBhIGJ1dHRvbiB0aGF0IHNwZWNpZmllcyBhIGZ1bmN0aW9uIGFzIGEgZm9ybUFjdGlvbi4gUmVhY3QgcHJvdmlkZXMgdGhvc2UgYXV0b21hdGljYWxseS4gVGhleSB3aWxsIGdldCBvdmVycmlkZGVuLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBwcm9wcy5mb3JtVGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uVGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgoZGlkV2Fyb
15852kZvcm1BY3Rpb25UYXJnZXQgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBhIGZvcm1UYXJnZXQgZm9yIGEgYnV0dG9uIHRoYXQgc3BlY2lmaWVzIGEgZnVuY3Rpb24gYXMgYSBmb3JtQWN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgd2luZG93LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICAgICAgICAgIDogKChkaWRXYXJuRm9ybUFjdGlvblR5cGUgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQSBidXR0b24gY2FuIG9ubHkgc3BlY2lmeSBhIGZvcm1BY3Rpb24gYWxvbmcgd2l0aCB0eXBlPVwic3VibWl0XCIgb3Igbm8gdHlwZS4nXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICA6ICgoZGlkV2FybkZvcm1BY3Rpb25UeXBlID0gITApLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnQW4gaW5wdXQgY2FuIG9ubHkgc3BlY2lmeSBhIGZvcm1BY3Rpb24gYWxvbmcgd2l0aCB0eXBlPVwic3VibWl0XCIgb3IgdHlwZT1cImltYWdlXCIuJ1xuICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgOiBcImFjdGlvblwiID09PSBrZXlcbiAgICAgICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIllvdSBjYW4gb25seSBwYXNzIHRoZSBhY3Rpb24gcHJvcCB0byA8Zm9ybT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGNhbiBvbmx5IHBhc3MgdGhlIGZvcm1BY3Rpb24gcHJvcCB0byA8aW5wdXQ+IG9yIDxidXR0b24+LlwiXG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgXCJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignQSBSZWFjdCBmb3JtIHdhcyB1bmV4cGVjdGVkbHkgc3VibWl0dGVkLiBJZiB5b3UgY2FsbGVkIGZvcm0uc3VibWl0KCkgbWFudWFsbHksIGNvbnNpZGVyIHVzaW5nIGZvcm0ucmVxdWVzdFN1Ym1pdCgpIGluc3RlYWQuIElmIHlvdVxcXFwncmUgdHJ5aW5nIHRvIHVzZSBldmVudC5zdG9wUHJvcGFnYXRpb24oKSBpbiBhIHN1Ym1pdCBldmVudCBoYW5kbGVyLCBjb25zaWRlciBhbHNvIGNhbGxpbmcgZXZlbnQucHJldmVudERlZmF1bHQoKS4nKVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcmV2VmFsdWUgJiZcbiAgICAgICAgICAgICAgKFwiZm9ybUFjdGlvblwiID09PSBrZXlcbiAgICAgICAgICAgICAgICA/IChcImlucHV0XCIgIT09IHRhZyAmJlxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgXCJuYW1lXCIsIHByb3BzLm5hbWUsIHByb3BzLCBudWxsKSxcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgXCJmb3JtRW5jVHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5mb3JtRW5jVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIFwiZm9ybU1ldGhvZFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5mb3JtTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgXCJmb3JtVGFyZ2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmZvcm1UYXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgIDogKHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgXCJlbmNUeXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmVuY1R5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIFwibWV0aG9kXCIsIHByb3BzLm1ldGhvZCwgcHJvcHMsIG51bGwpLFxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICBcInRhcmdldFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApKSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbnVsbCA9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICAgICAgICBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGtleSk7XG4gICAgICAgICAgdmFsdWUgPSBzYW5pdGl6ZVVSTCh2YWx1ZSk7XG4gICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvbkNsaWNrXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgI
15852Hdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKSxcbiAgICAgICAgICAgIChkb21FbGVtZW50Lm9uY2xpY2sgPSBub29wJDEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbEVuZFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsZW5kXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgIGlmIChudWxsICE9IHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlIHx8ICEoXCJfX2h0bWxcIiBpbiB2YWx1ZSkpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGtleSA9IHZhbHVlLl9faHRtbDtcbiAgICAgICAgICAgIGlmIChudWxsICE9IGtleSkge1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAobnVsbCAhPSBwcmV2VmFsdWUgPyBwcmV2VmFsdWUuX19odG1sIDogdm9pZCAwKSAhPT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgKGRvbUVsZW1lbnQuaW5uZXJIVE1MID0ga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgIGRvbUVsZW1lbnQubXVsdGlwbGUgPVxuICAgICAgICAgICAgdmFsdWUgJiYgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdmFsdWUgJiYgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibXV0ZWRcIjpcbiAgICAgICAgICBkb21FbGVtZW50Lm11dGVkID1cbiAgICAgICAgICAgIHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiOlxuICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICAgICAgY2FzZSBcInJlZlwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXV0b0ZvY3VzXCI6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bGlua0hyZWZcIjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBudWxsID09IHZhbHVlIHx8XG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInhsaW5rOmhyZWZcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwga2V5KTtcbiAgICAgICAgICBrZXkgPSBzYW5pdGl6ZVVSTCh2YWx1ZSk7XG4gICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyh4bGlua05hbWVzcGFjZSwgXCJ4bGluazpocmVmXCIsIGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjb250ZW50RWRpdGFibGVcIjpcbiAgICAgICAgY2FzZSBcInNwZWxsQ2hlY2tcIjpcbiAgICAgICAgY2FzZSBcImRyYWdnYWJsZVwiOlxuICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgY2FzZSBcImF1dG9SZXZlcnNlXCI6XG4gICAgICAgIGNhc2UgXCJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXCI6XG4gICAgICAgIGNhc2UgXCJmb2N1c2FibGVcIjpcbiAgICAgICAgY2FzZSBcInByZXNlcnZlQWxwaGFcIjpcbiAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgICBcInN5bWJvbFwiICE9PSB0eXBlb2YgdmFsdWVcbiAgICAgICAgICAgID8gKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGtleSksXG4gICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKVxuICAgICAgICAgICAgOiBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5lcnRcIjpcbiAgICAgICAgICBcIlwiICE9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgZGlkV2Fyb
15852kZvck5ld0Jvb2xlYW5Qcm9wc1dpdGhFbXB0eVZhbHVlW2tleV0gfHxcbiAgICAgICAgICAgICgoZGlkV2FybkZvck5ld0Jvb2xlYW5Qcm9wc1dpdGhFbXB0eVZhbHVlW2tleV0gPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiBUaGlzIHdpbGwgdHJlYXQgdGhlIGF0dHJpYnV0ZSBhcyBpZiBpdCB3ZXJlIGZhbHNlLiBFaXRoZXIgcGFzcyBgZmFsc2VgIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nLCBvciBwYXNzIGB0cnVlYCBpZiB5b3UgdXNlZCBhbiBlbXB0eSBzdHJpbmcgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBSZWFjdCB0byBpbmRpY2F0ZSB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLlwiLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICkpO1xuICAgICAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgICAgIGNhc2UgXCJhc3luY1wiOlxuICAgICAgICBjYXNlIFwiYXV0b1BsYXlcIjpcbiAgICAgICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgICAgIGNhc2UgXCJjcmVkZW50aWFsbGVzc1wiOlxuICAgICAgICBjYXNlIFwiZGVmYXVsdFwiOlxuICAgICAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICAgICAgY2FzZSBcImRpc2FibGVkXCI6XG4gICAgICAgIGNhc2UgXCJkaXNhYmxlUGljdHVyZUluUGljdHVyZVwiOlxuICAgICAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgICAgIGNhc2UgXCJmb3JtTm9WYWxpZGF0ZVwiOlxuICAgICAgICBjYXNlIFwiaGlkZGVuXCI6XG4gICAgICAgIGNhc2UgXCJsb29wXCI6XG4gICAgICAgIGNhc2UgXCJub01vZHVsZVwiOlxuICAgICAgICBjYXNlIFwibm9WYWxpZGF0ZVwiOlxuICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICBjYXNlIFwicGxheXNJbmxpbmVcIjpcbiAgICAgICAgY2FzZSBcInJlYWRPbmx5XCI6XG4gICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICBjYXNlIFwicmV2ZXJzZWRcIjpcbiAgICAgICAgY2FzZSBcInNjb3BlZFwiOlxuICAgICAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICAgICAgY2FzZSBcIml0ZW1TY29wZVwiOlxuICAgICAgICAgIHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgICAgICA6IGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJkb3dubG9hZFwiOlxuICAgICAgICAgICEwID09PSB2YWx1ZVxuICAgICAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgICAgICA6ICExICE9PSB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgICA/IChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBrZXkpLFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKVxuICAgICAgICAgICAgICA6IGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjb2xzXCI6XG4gICAgICAgIGNhc2UgXCJyb3dzXCI6XG4gICAgICAgIGNhc2UgXCJzaXplXCI6XG4gICAgICAgIGNhc2UgXCJzcGFuXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgIWlzTmFOKHZhbHVlKSAmJlxuICAgICAgICAgIDEgPD0gdmFsdWVcbiAgICAgICAgICAgID8gKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGtleSksXG4gICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKVxuICAgICAgICAgICAgOiBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicm93U3BhblwiOlxuICAgICAgICBjYXNlIFwic3RhcnRcIjpcbiAgICAgICAgICBudWxsID09IHZhbHVlIHx8XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICBpc05hTih2YWx1ZSlcbiAgICAgICAgICAgID8gZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KVxuICAgICAgICAgICAgOiAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwga2V5KSxcbiAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicG9wb3ZlclwiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJiZWZvcmV0b2dnbGVcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInRvZ2dsZVwiLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBzZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBcInBvcG92ZXJcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieGxpbmtBY3R1YXRlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazphY3R1YXRlXCIsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bGlua0FyY3JvbGVcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgeGxpbmtOYW1lc3BhY2UsXG4gICAgICAgICAgICBcInhsaW5rOmFyY3JvbGVcIixcbiAgICAgICAgICAgI
15852HZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhsaW5rUm9sZVwiOlxuICAgICAgICAgIHNldFZhbHVlRm9yTmFtZXNwYWNlZEF0dHJpYnV0ZShcbiAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICB4bGlua05hbWVzcGFjZSxcbiAgICAgICAgICAgIFwieGxpbms6cm9sZVwiLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieGxpbmtTaG93XCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazpzaG93XCIsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bGlua1RpdGxlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazp0aXRsZVwiLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieGxpbmtUeXBlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazp0eXBlXCIsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bWxCYXNlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhtbE5hbWVzcGFjZSxcbiAgICAgICAgICAgIFwieG1sOmJhc2VcIixcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhtbExhbmdcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgeG1sTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bWw6bGFuZ1wiLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieG1sU3BhY2VcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgeG1sTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bWw6c3BhY2VcIixcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImlzXCI6XG4gICAgICAgICAgbnVsbCAhPSBwcmV2VmFsdWUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgdXBkYXRlIHRoZSBcImlzXCIgcHJvcCBhZnRlciBpdCBoYXMgYmVlbiBpbml0aWFsaXplZC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHNldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwiaXNcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5uZXJUZXh0XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0Q29udGVudFwiOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcInBvcG92ZXJUYXJnZXRcIjpcbiAgICAgICAgICBkaWRXYXJuUG9wb3ZlclRhcmdldE9iamVjdCB8fFxuICAgICAgICAgICAgbnVsbCA9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICAgICAgICAoKGRpZFdhcm5Qb3BvdmVyVGFyZ2V0T2JqZWN0ID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJUaGUgYHBvcG92ZXJUYXJnZXRgIHByb3AgZXhwZWN0cyB0aGUgSUQgb2YgYW4gRWxlbWVudCBhcyBhIHN0cmluZy4gUmVjZWl2ZWQgJXMgaW5zdGVhZC5cIixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoMiA8IGtleS5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoXCJvXCIgIT09IGtleVswXSAmJiBcIk9cIiAhPT0ga2V5WzBdKSB8fFxuICAgICAgICAgICAgKFwiblwiICE9PSBrZXlbMV0gJiYgXCJOXCIgIT09IGtleVsxXSlcbiAgICAgICAgICApXG4gICAgICAgICAgICAoa2V5ID0gZ2V0QXR0cmlidXRlQWxpYXMoa2V5KSksXG4gICAgICAgICAgICAgIHNldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIGtleSwgdmFsdWUpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmXG4gICAgICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICBkb21FbGVtZW50LFxuICAgICAgdGFnLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBwcm9wcyxcbiAgICAgIHByZXZWYWx1ZVxuICAgICkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgdmFsdWUsIHByZXZWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgIT09IHR5cGVvZiB2YWx1ZSB8fCAhKFwiX19odG1sXCIgaW4gdmFsdWUpKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcImBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0LmRldi9saW5rL2Rhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBrZXkgPSB2YWx1ZS
158525fX2h0bWw7XG4gICAgICAgICAgICBpZiAobnVsbCAhPSBrZXkpIHtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJvcHMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkNhbiBvbmx5IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgKG51bGwgIT0gcHJldlZhbHVlID8gcHJldlZhbHVlLl9faHRtbCA6IHZvaWQgMCkgIT09IGtleSAmJlxuICAgICAgICAgICAgICAgIChkb21FbGVtZW50LmlubmVySFRNTCA9IGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHZhbHVlKSBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCB2YWx1ZSk7XG4gICAgICAgICAgZWxzZSBpZiAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHZhbHVlIHx8IFwiYmlnaW50XCIgPT09IHR5cGVvZiB2YWx1ZSlcbiAgICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIgKyB2YWx1ZSk7XG4gICAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbEVuZFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsZW5kXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvbkNsaWNrXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKSxcbiAgICAgICAgICAgIChkb21FbGVtZW50Lm9uY2xpY2sgPSBub29wJDEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIjpcbiAgICAgICAgY2FzZSBcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiOlxuICAgICAgICBjYXNlIFwiaW5uZXJIVE1MXCI6XG4gICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbm5lclRleHRcIjpcbiAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcIm9cIiA9PT0ga2V5WzBdICYmXG4gICAgICAgICAgICAgICAgXCJuXCIgPT09IGtleVsxXSAmJlxuICAgICAgICAgICAgICAgICgocHJvcHMgPSBrZXkuZW5kc1dpdGgoXCJDYXB0dXJlXCIpKSxcbiAgICAgICAgICAgICAgICAocHJldlZhbHVlID0ga2V5LnNsaWNlKDIsIHByb3BzID8ga2V5Lmxlbmd0aCAtIDcgOiB2b2lkIDApKSxcbiAgICAgICAgICAgICAgICAodGFnID0gZG9tRWxlbWVudFtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICAodGFnID0gbnVsbCAhPSB0YWcgPyB0YWdba2V5XSA6IG51bGwpLFxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHRhZyAmJlxuICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHByZXZWYWx1ZSwgdGFnLCBwcm9wcyksXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHRhZyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdGFnICYmXG4gICAgICAgICAgICAgICAgICAoa2V5IGluIGRvbUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyAoZG9tRWxlbWVudFtrZXldID0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgOiBkb21FbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KSk7XG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHByZXZWYWx1ZSwgdmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICAgIGtleSBpbiBkb21FbGVtZW50XG4gICAgICAgICAgICAgICAgPyAoZG9tRWxlbWVudFtrZXldID0gdmFsdWUpXG4gICAgICAgICAgICAgICAgOiAhMCA9PT0gdmFsdWVcbiAgICAgICAgICAgICAgICAgID8gZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBcIlwiKVxuICAgICAgICAgICAgICAgICAgOiBzZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gICAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcHJvcHMpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICBjYXNlIFwic3BhblwiOlxuICAgICAgICBjYXNlIFwic3ZnXCI6XG4gICAgICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIGNhc2UgXCJnXCI6XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJsb2FkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIHZhciBoYXNTcmMgPSAhMSxcbiAgICAgICAgICAgIGhhc1NyY1NldCA9ICExLFxuICAgICAgICAgICAgcHJvcEtleTtcbiAgICAgICAgICBmb3IgKHByb3BLZXkgaW4gcHJvcHMpXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wVmFsdWUpXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wS2V5KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3JjXCI6XG4gICAgICAgICAgICAgICAgICAgIGhhc1NyYyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJzcmNTZXRcIjpcbiAgICAgICAgICAgICAgICAgICAgaGFzU3JjU2V0ID0gITA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBwcm9wS2V5LCBwcm9wVmFsdWUsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgaGFzU3JjU2V0ICYmXG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgXCJzcmNTZXRcIiwgcHJvcHMuc3JjU2V0LCBwcm9wcywgbnVsbCk7XG4gICAgICAgICAgaGFzU3JjICYmIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBcInNyY1wiLCBwcm9wcy5zcmMsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJpbnB1dFwiLCBwcm9wcyk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IChwcm9wS2V5ID0gcHJvcFZhbHVlID0gaGFzU3JjU2V0ID0gbnVsbCksXG4gICAgICAgICAgICBjaGVja2VkID0gbnVsbCxcbiAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkID0gbnVsbDtcbiAgICAgICAgICBmb3IgKGhhc1NyYyBpbiBwcm9wcylcbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShoYXNTcmMpKSB7XG4gICAgICAgICAgICAgIHZhciBfcHJvcFZhbHVlID0gcHJvcHNbaGFzU3JjXTtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT0gX3Byb3BWYWx1ZSlcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhc1NyYykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIm5hbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgaGFzU3JjU2V0ID0gX3Byb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwidHlwZVwiOlxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSBfcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBfcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0Q2hlY2tlZFwiOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZCA9IF9wcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXkgPSBfcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gX3Byb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBfcHJvcFZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIlxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGhhc1NyYywgX3Byb3BWYWx1ZSwgcHJvcHMsIG51bGwpO1xuICAgICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0ZUlucHV0UHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgICAgIGluaXRJbnB1dChcbiAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgY2hlY2tlZCxcbiAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgcHJvcFZhbHVlLFxuICAgICAgICAgICAgaGFzU3JjU2V0LFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJzZWxlY3RcIiwgcHJvcHMpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGhhc1NyYyA9IHByb3BWYWx1ZSA9IHByb3BLZXkgPSBudWxsO1xuICAgICAgICAgIGZvciAoaGFzU3JjU2V0IGluIHByb3BzKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShoYXNTcmNTZXQpICYmXG4gICAgICAgICAgICAgICgoZGVmYXVsdFZhbHVlID0gcHJvcHNbaGFzU3JjU2V0XSksIG51bGwgIT0gZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKGhhc1NyY1NldCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgICAgICAgICAgaGFzU3JjID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIGhhc1NyY1NldCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRlU2VsZWN0UHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgICAgIHRhZyA9IHByb3BLZXk7XG4gICAgICAgICAgcHJvcHMgPSBwcm9wVmFsdWU7XG4gICAgICAgICAgZG9tRWxlbWVudC5tdWx0aXBsZSA9ICEhaGFzU3JjO1xuICAgICAgICAgIG51bGwgIT0gdGFnXG4gICAgICAgICAgICA/IHVwZGF0ZU9wdGlvbnMoZG9tRWxlbWVudCwgISFoYXNTcmMsIHRhZywgITEpXG4gICAgICAgICAgICA6IG51bGwgIT0gcHJvcHMgJiYgdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIWhhc1NyYywgcHJvcHMsICEwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJ0ZXh0YXJlYVwiLCBwcm9wcyk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgcHJvcEtleSA9IGhhc1NyY1NldCA9IGhhc1NyYyA9IG51bGw7XG4gICAgICAgICAgZm9yIChwcm9wVmFsdWUgaW4gcHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHByb3BzLmhhc093blByb3BlcnR5KHByb3BWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgKChkZWZhdWx0VmFsdWUgPSBwcm9wc1twcm9wVmFsdWVdKSwgbnVsbCAhPSBkZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHN3aXRjaCAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBoYXNTcmMgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBoYXNTcmNTZXQgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi5cIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgdmFsaWRhdGVUZXh0YXJlYVByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgICAgICBpbml0VGV4dGFyZWEoZG9tRWxlbWVudCwgaGFzU3JjLCBoYXNTcmNTZXQsIHByb3BLZXkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcIm9wdGlvblwiOlxuICAgICAgICAgI
15852HZhbGlkYXRlT3B0aW9uUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgICAgIGZvciAoY2hlY2tlZCBpbiBwcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkoY2hlY2tlZCkgJiZcbiAgICAgICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tjaGVja2VkXSksIG51bGwgIT0gaGFzU3JjKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2VsZWN0ZWQgPVxuICAgICAgICAgICAgICAgICAgICBoYXNTcmMgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgaGFzU3JjICYmXG4gICAgICAgICAgICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBoYXNTcmM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGNoZWNrZWQsIGhhc1NyYywgcHJvcHMsIG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiZGlhbG9nXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImJlZm9yZXRvZ2dsZVwiLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwidG9nZ2xlXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJjYW5jZWxcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImNsb3NlXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaWZyYW1lXCI6XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwibG9hZFwiLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInZpZGVvXCI6XG4gICAgICAgIGNhc2UgXCJhdWRpb1wiOlxuICAgICAgICAgIGZvciAoaGFzU3JjID0gMDsgaGFzU3JjIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaGFzU3JjKyspXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1toYXNTcmNdLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJsb2FkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGV0YWlsc1wiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJ0b2dnbGVcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbWJlZFwiOlxuICAgICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpLFxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImxvYWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgIGNhc2UgXCJhcmVhXCI6XG4gICAgICAgIGNhc2UgXCJiYXNlXCI6XG4gICAgICAgIGNhc2UgXCJiclwiOlxuICAgICAgICBjYXNlIFwiY29sXCI6XG4gICAgICAgIGNhc2UgXCJoclwiOlxuICAgICAgICBjYXNlIFwia2V5Z2VuXCI6XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgIGNhc2UgXCJwYXJhbVwiOlxuICAgICAgICBjYXNlIFwidHJhY2tcIjpcbiAgICAgICAgY2FzZSBcIndiclwiOlxuICAgICAgICBjYXNlIFwibWVudWl0ZW1cIjpcbiAgICAgICAgICBmb3IgKGRlZmF1bHRDaGVja2VkIGluIHByb3BzKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShkZWZhdWx0Q2hlY2tlZCkgJiZcbiAgICAgICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tkZWZhdWx0Q2hlY2tlZF0pLCBudWxsICE9IGhhc1NyYylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChkZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGRlZmF1bHRDaGVja2VkLCBoYXNTcmMsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgICAgIGZvciAoX3Byb3BWYWx1ZSBpbiBwcm9wcylcbiAgICAgICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkoX3Byb3BWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAoKGhhc1NyYyA9IHByb3BzW19wcm9wVmFsdWVdKSxcbiAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGhhc1NyYyAmJlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcE9uQ3VzdG9tRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICBfcHJvcFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBoYXNTcmMsXG4gICAgICAgICAgICAgICAgICAgI
15852HByb3BzLFxuICAgICAgICAgICAgICAgICAgICB2b2lkIDBcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoZGVmYXVsdFZhbHVlIGluIHByb3BzKVxuICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShkZWZhdWx0VmFsdWUpICYmXG4gICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tkZWZhdWx0VmFsdWVdKSxcbiAgICAgICAgICBudWxsICE9IGhhc1NyYyAmJlxuICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGRlZmF1bHRWYWx1ZSwgaGFzU3JjLCBwcm9wcywgbnVsbCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UHJvcHMpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICBjYXNlIFwic3BhblwiOlxuICAgICAgICBjYXNlIFwic3ZnXCI6XG4gICAgICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIGNhc2UgXCJnXCI6XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICB2YXIgbmFtZSA9IG51bGwsXG4gICAgICAgICAgICB0eXBlID0gbnVsbCxcbiAgICAgICAgICAgIHZhbHVlID0gbnVsbCxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGwsXG4gICAgICAgICAgICBsYXN0RGVmYXVsdFZhbHVlID0gbnVsbCxcbiAgICAgICAgICAgIGNoZWNrZWQgPSBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQgPSBudWxsO1xuICAgICAgICAgIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wc1twcm9wS2V5XTtcbiAgICAgICAgICAgIGlmIChsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgJiYgbnVsbCAhPSBsYXN0UHJvcClcbiAgICAgICAgICAgICAgc3dpdGNoIChwcm9wS2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgIGxhc3RQcm9wXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgX3Byb3BLZXk4IGluIG5leHRQcm9wcykge1xuICAgICAgICAgICAgdmFyIHByb3BLZXkgPSBuZXh0UHJvcHNbX3Byb3BLZXk4XTtcbiAgICAgICAgICAgIGxhc3RQcm9wID0gbGFzdFByb3BzW19wcm9wS2V5OF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcEtleTgpICYmXG4gICAgICAgICAgICAgIChudWxsICE9IHByb3BLZXkgfHwgbnVsbCAhPSBsYXN0UHJvcClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChfcHJvcEtleTgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidHlwZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgdHlwZSA9IHByb3BLZXk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgbmFtZSA9IHByb3BLZXk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tlZFwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHByb3BLZXk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdENoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkgIT09IGxhc3RQcm9wICYmICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkID0gcHJvcEtleTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wS2V5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcEtleTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJv
15852cEtleSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBwcm9wS2V5ICE9PSBsYXN0UHJvcCAmJlxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJvcFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhZyA9XG4gICAgICAgICAgICBcImNoZWNrYm94XCIgPT09IGxhc3RQcm9wcy50eXBlIHx8IFwicmFkaW9cIiA9PT0gbGFzdFByb3BzLnR5cGVcbiAgICAgICAgICAgICAgPyBudWxsICE9IGxhc3RQcm9wcy5jaGVja2VkXG4gICAgICAgICAgICAgIDogbnVsbCAhPSBsYXN0UHJvcHMudmFsdWU7XG4gICAgICAgICAgbmV4dFByb3BzID1cbiAgICAgICAgICAgIFwiY2hlY2tib3hcIiA9PT0gbmV4dFByb3BzLnR5cGUgfHwgXCJyYWRpb1wiID09PSBuZXh0UHJvcHMudHlwZVxuICAgICAgICAgICAgICA/IG51bGwgIT0gbmV4dFByb3BzLmNoZWNrZWRcbiAgICAgICAgICAgICAgOiBudWxsICE9IG5leHRQcm9wcy52YWx1ZTtcbiAgICAgICAgICB0YWcgfHxcbiAgICAgICAgICAgICFuZXh0UHJvcHMgfHxcbiAgICAgICAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgfHxcbiAgICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCB0byBiZSBjb250cm9sbGVkLiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvIGEgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gITApKTtcbiAgICAgICAgICAhdGFnIHx8XG4gICAgICAgICAgICBuZXh0UHJvcHMgfHxcbiAgICAgICAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgfHxcbiAgICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gdW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCBlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0LmRldi9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50c1wiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSAhMCkpO1xuICAgICAgICAgIHVwZGF0ZUlucHV0KFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIGNoZWNrZWQsXG4gICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICBwcm9wS2V5ID0gdmFsdWUgPSBkZWZhdWx0VmFsdWUgPSBfcHJvcEtleTggPSBudWxsO1xuICAgICAgICAgIGZvciAodHlwZSBpbiBsYXN0UHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgobGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wc1t0eXBlXSksXG4gICAgICAgICAgICAgIGxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSAmJiBudWxsICE9IGxhc3REZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm11bHRpcGxlXCI6XG4gICAgICAgICAgICAgICAgICBwcm9wS2V5ID0gbGFzdERlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHR5cGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0RGVmYXVsdFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKG5hbWUgaW4gbmV4dFByb3BzKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoKHR5cGUgPSBuZXh0UHJvcHNbbmFtZV0pLFxuICAgICAgICAgICAgICAobGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wc1tuYW1lXSksXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJlxuICAgICAgICAgICAgICAgIChudWxsICE9IHR5cGUgfHwgbnVsbCAhPSBsYXN0RGVmYXVsdFZhbHVlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICB0eX
15852BlICE9PSBsYXN0RGVmYXVsdFZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICB0eXBlICE9PSBsYXN0RGVmYXVsdFZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibXVsdGlwbGVcIjpcbiAgICAgICAgICAgICAgICAgIHR5cGUgIT09IGxhc3REZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApLFxuICAgICAgICAgICAgICAgICAgICAodmFsdWUgPSB0eXBlKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdHlwZSAhPT0gbGFzdERlZmF1bHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFByb3BzID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIHRhZyA9IHZhbHVlO1xuICAgICAgICAgIGxhc3RQcm9wcyA9IHByb3BLZXk7XG4gICAgICAgICAgbnVsbCAhPSBfcHJvcEtleThcbiAgICAgICAgICAgID8gdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIXRhZywgX3Byb3BLZXk4LCAhMSlcbiAgICAgICAgICAgIDogISFsYXN0UHJvcHMgIT09ICEhdGFnICYmXG4gICAgICAgICAgICAgIChudWxsICE9IG5leHRQcm9wc1xuICAgICAgICAgICAgICAgID8gdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIXRhZywgbmV4dFByb3BzLCAhMClcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU9wdGlvbnMoZG9tRWxlbWVudCwgISF0YWcsIHRhZyA/IFtdIDogXCJcIiwgITEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgIHByb3BLZXkgPSBfcHJvcEtleTggPSBudWxsO1xuICAgICAgICAgIGZvciAoZGVmYXVsdFZhbHVlIGluIGxhc3RQcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChuYW1lID0gbGFzdFByb3BzW2RlZmF1bHRWYWx1ZV0pLFxuICAgICAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT0gbmFtZSAmJlxuICAgICAgICAgICAgICAgICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdFZhbHVlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBkZWZhdWx0VmFsdWUsIG51bGwsIG5leHRQcm9wcywgbmFtZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhbHVlIGluIG5leHRQcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChuYW1lID0gbmV4dFByb3BzW3ZhbHVlXSksXG4gICAgICAgICAgICAgICh0eXBlID0gbGFzdFByb3BzW3ZhbHVlXSksXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgKG51bGwgIT0gbmFtZSB8fCBudWxsICE9IHR5cGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCB2YWx1ZSwgbmFtZSwgbmV4dFByb3BzLCB0eXBlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZVRleHRhcmVhKGRvbUVsZW1lbnQsIF9wcm9wS2V5OCwgcHJvcEtleSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwib3B0aW9uXCI6XG4gICAgICAgICAgZm9yICh2YXIgX3Byb3BLZXkxMyBpbiBsYXN0UHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgoX3Byb3BLZXk4ID0gbGFzdFByb3BzW19wcm9wS2V5MTNdKSxcbiAgICAgICAgICAgICAgbGFzdFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTMpICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBfcHJvcEtleTggJiZcbiAgICAgICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTMpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKF9wcm9wS2V5MTMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2VsZWN0ZWQgPSAhMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5MTMsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgX3Byb3BLZXk4XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsYXN0RGVmYXVsdFZhbHVlIGluIG5leHRQcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChfcHJvcEtleTggPSBuZXh0UHJvcHNbbGFzdERlZmF1bHRWYWx1ZV0pLFxuICAgICAgICAgICAgICAocHJvcEtleSA9IGxhc3RQcm9wc1tsYXN0RGVmYXVsdFZhbHVlXSksXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShsYXN0RGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIF9wcm9wS2V5OCAhPT0gcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgIChudWxsICE9IF9wcm9wS2V5OCB8fCBudWxsICE9IHByb3BLZXkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKGxhc3REZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCAhPT0gcHJvcEtleSAmJiAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICAgICAgICAgICAgICBkb21FbGVtZW50LnNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICAgICAgX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9wcm9wS2V5OCAmJlxuICAgICAgICAgICAgICAgICAgICBcInN5bWJvbFwiICE9PSB0eXBlb2YgX3Byb3BLZXk4O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgI
15852HNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgX3Byb3BLZXk4LFxuICAgICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgY2FzZSBcImFyZWFcIjpcbiAgICAgICAgY2FzZSBcImJhc2VcIjpcbiAgICAgICAgY2FzZSBcImJyXCI6XG4gICAgICAgIGNhc2UgXCJjb2xcIjpcbiAgICAgICAgY2FzZSBcImVtYmVkXCI6XG4gICAgICAgIGNhc2UgXCJoclwiOlxuICAgICAgICBjYXNlIFwia2V5Z2VuXCI6XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgIGNhc2UgXCJwYXJhbVwiOlxuICAgICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgIGNhc2UgXCJ0cmFja1wiOlxuICAgICAgICBjYXNlIFwid2JyXCI6XG4gICAgICAgIGNhc2UgXCJtZW51aXRlbVwiOlxuICAgICAgICAgIGZvciAodmFyIF9wcm9wS2V5MTUgaW4gbGFzdFByb3BzKVxuICAgICAgICAgICAgKF9wcm9wS2V5OCA9IGxhc3RQcm9wc1tfcHJvcEtleTE1XSksXG4gICAgICAgICAgICAgIGxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcEtleTE1KSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT0gX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAgICAgIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcEtleTE1KSAmJlxuICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgX3Byb3BLZXkxNSxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICBfcHJvcEtleThcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIGZvciAoY2hlY2tlZCBpbiBuZXh0UHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgoX3Byb3BLZXk4ID0gbmV4dFByb3BzW2NoZWNrZWRdKSxcbiAgICAgICAgICAgICAgKHByb3BLZXkgPSBsYXN0UHJvcHNbY2hlY2tlZF0pLFxuICAgICAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkoY2hlY2tlZCkgJiZcbiAgICAgICAgICAgICAgICBfcHJvcEtleTggIT09IHByb3BLZXkgJiZcbiAgICAgICAgICAgICAgICAobnVsbCAhPSBfcHJvcEtleTggfHwgbnVsbCAhPSBwcm9wS2V5KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBfcHJvcEtleTgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICBfcHJvcEtleTgsXG4gICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9wcm9wS2V5MTcgaW4gbGFzdFByb3BzKVxuICAgICAgICAgICAgICAoX3Byb3BLZXk4ID0gbGFzdFByb3BzW19wcm9wS2V5MTddKSxcbiAgICAgICAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoX3Byb3BLZXkxNykgJiZcbiAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTcpICYmXG4gICAgICAgICAgICAgICAgICBzZXRQcm9wT25DdXN0b21FbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5MTcsXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBfcHJvcEtleThcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGRlZmF1bHRDaGVja2VkIGluIG5leHRQcm9wcylcbiAgICAgICAgICAgICAgKF9wcm9wS2V5OCA9IG5leHRQcm9wc1tkZWZhdWx0Q2hlY2tlZF0pLFxuICAgICAgICAgICAgICAgIChwcm9wS2V5ID0gbGFzdFByb3BzW2RlZmF1bHRDaGVja2VkXSksXG4gICAgICAgICAgICAgICAgIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShkZWZhdWx0Q2hlY2tlZCkgfHxcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCA9PT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAgICAgKHZvaWQgMCA9PT0gX3Byb3BLZXk4ICYmIHZvaWQgMCA9PT0gcHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICAgIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgI
15852HRhZyxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQsXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCxcbiAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wS2V5MTkgaW4gbGFzdFByb3BzKVxuICAgICAgICAoX3Byb3BLZXk4ID0gbGFzdFByb3BzW19wcm9wS2V5MTldKSxcbiAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoX3Byb3BLZXkxOSkgJiZcbiAgICAgICAgICAgIG51bGwgIT0gX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTkpICYmXG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgX3Byb3BLZXkxOSwgbnVsbCwgbmV4dFByb3BzLCBfcHJvcEtleTgpO1xuICAgICAgZm9yIChsYXN0UHJvcCBpbiBuZXh0UHJvcHMpXG4gICAgICAgIChfcHJvcEtleTggPSBuZXh0UHJvcHNbbGFzdFByb3BdKSxcbiAgICAgICAgICAocHJvcEtleSA9IGxhc3RQcm9wc1tsYXN0UHJvcF0pLFxuICAgICAgICAgICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkobGFzdFByb3ApIHx8XG4gICAgICAgICAgICBfcHJvcEtleTggPT09IHByb3BLZXkgfHxcbiAgICAgICAgICAgIChudWxsID09IF9wcm9wS2V5OCAmJiBudWxsID09IHByb3BLZXkpIHx8XG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgbGFzdFByb3AsIF9wcm9wS2V5OCwgbmV4dFByb3BzLCBwcm9wS2V5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0UHJvcE5hbWVGcm9tQXR0cmlidXRlTmFtZShhdHRyTmFtZSkge1xuICAgICAgc3dpdGNoIChhdHRyTmFtZSkge1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICByZXR1cm4gXCJjbGFzc05hbWVcIjtcbiAgICAgICAgY2FzZSBcImZvclwiOlxuICAgICAgICAgIHJldHVybiBcImh0bWxGb3JcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYXR0ck5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFN0eWxlc09iamVjdEZyb21FbGVtZW50KGRvbUVsZW1lbnQpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBzZXJ2ZXJWYWx1ZUluT2JqZWN0Rm9ybSA9IHt9LCBzdHlsZSA9IGRvbUVsZW1lbnQuc3R5bGUsIGkgPSAwO1xuICAgICAgICBpIDwgc3R5bGUubGVuZ3RoO1xuICAgICAgICBpKytcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgc3R5bGVOYW1lID0gc3R5bGVbaV07XG4gICAgICAgIChcInZpZXctdHJhbnNpdGlvbi1uYW1lXCIgPT09IHN0eWxlTmFtZSAmJlxuICAgICAgICAgIGlzRXhwZWN0ZWRWaWV3VHJhbnNpdGlvbk5hbWUoZG9tRWxlbWVudCkpIHx8XG4gICAgICAgICAgKHNlcnZlclZhbHVlSW5PYmplY3RGb3JtW3N0eWxlTmFtZV0gPVxuICAgICAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXJ2ZXJWYWx1ZUluT2JqZWN0Rm9ybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlmZkh5ZHJhdGVkU3R5bGVzKGRvbUVsZW1lbnQsIHZhbHVlJGpzY29tcCQwLCBzZXJ2ZXJEaWZmZXJlbmNlcykge1xuICAgICAgaWYgKG51bGwgIT0gdmFsdWUkanNjb21wJDAgJiYgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlJGpzY29tcCQwKVxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCBub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gdXNpbmcgSlNYLlwiXG4gICAgICAgICk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNsaWVudFZhbHVlO1xuICAgICAgICB2YXIgZGVsaW1pdGVyID0gKGNsaWVudFZhbHVlID0gXCJcIiksXG4gICAgICAgICAgc3R5bGVOYW1lO1xuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiB2YWx1ZSRqc2NvbXAkMClcbiAgICAgICAgICBpZiAodmFsdWUkanNjb21wJDAuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWUkanNjb21wJDBbc3R5bGVOYW1lXTtcbiAgICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICBcIlwiICE9PSB2YWx1ZSAmJlxuICAgICAgICAgICAgICAoMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKVxuICAgICAgICAgICAgICAgID8gKGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgc3R5bGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgIChjbGllbnRWYWx1ZSArPVxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgKyBzdHlsZU5hbWUgKyBcIjpcIiArIChcIlwiICsgdmFsdWUpLnRyaW0oKSkpXG4gICAgICAgICAgICAgICAgOiBcIm51bWJlclwiICE9PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgMCA9PT0gdmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdW5pdGxlc3NOdW1iZXJzLmhhcyhzdHlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICA/IChjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHN0eWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIChjbGllbnRWYWx1ZSArPVxuICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciArXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGVOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCBcIi0kMVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKG1zUGF0dGVybiQxLCBcIi1tcy1cIikgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAoXCJcIiArIHZhbHVlKS50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgOiAoY2xpZW50VmFsdWUgKz1cbiAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgXCItJDFcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShtc1BhdHRlcm4kMSwgXCItbXMtXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgK1xuICAgICAgICAgICAgICAgICAgICAgIFwicHhcIiksXG4gICAgICAgICAgICAgIChkZWxpbWl0ZXIgPSBcIjtcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2xpZW50VmFsdWUgPSBjbGllbnRWYWx1ZSB8fCBudWxsO1xuICAgICAgICB2YWx1ZSRqc2NvbXAkMCA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgIHZhbHVlJGpzY29tcCQwICE9PSBjbGllbnRWYWx1ZSAmJlxuICAgICAgICAgICgoY2xpZW50VmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VmFsdWUpKSxcbiAgICAgICAgICAodmFsdWUkanNjb21wJDAgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUodmFsdWUkanNjb21wJDApKSxcbiAgICAgICAgICB2YWx1ZSRqc2NvbXAkMCA9PT0gY2xpZW50VmFsdWUgfHxcbiAgICAgICAgICAgIChcIjtcIiA9PT0gdmFsdWUkanNjb21wJDBbdmFsdWUkanNjb21wJDAubGVuZ3RoIC0gMV0gJiZcbiAgICAgICAgICAgICAgaGFzVmlld1RyYW5zaXRpb24oZG9tRWxlbWVudCkpIHx8XG4gICAgICAgICAgICAoc2VydmVyRGlmZmVyZW5jZXMuc3R5bGUgPSBnZXRTdHlsZXNPYmplY3RGcm9tRWxlbWVudChkb21FbGVtZW50KSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgZG9tRWxlbWVudCxcbiAgICAgIHByb3BLZXksXG4gICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICkge1xuICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGRvbUVsZW1lbnQgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGlmIChudWxsID09PSBkb21FbGVtZW50KVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgI
15852HJldHVybjtcbiAgICAgICAgfVxuICAgICAgZWxzZSBpZiAobnVsbCAhPSB2YWx1ZSlcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wS2V5KSxcbiAgICAgICAgICAgICAgZG9tRWxlbWVudCA9PT0gXCJcIiArIHZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlQm9vbGVhbkF0dHJpYnV0ZShcbiAgICAgIGRvbUVsZW1lbnQsXG4gICAgICBwcm9wS2V5LFxuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBkb21FbGVtZW50ID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBpZiAobnVsbCA9PT0gZG9tRWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICB9IGVsc2VcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlQm9vbGVhbmlzaEF0dHJpYnV0ZShcbiAgICAgIGRvbUVsZW1lbnQsXG4gICAgICBwcm9wS2V5LFxuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBkb21FbGVtZW50ID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBpZiAobnVsbCA9PT0gZG9tRWxlbWVudClcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBlbHNlIGlmIChudWxsICE9IHZhbHVlKVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICAgICAgZG9tRWxlbWVudCA9PT0gXCJcIiArIHZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlTnVtZXJpY0F0dHJpYnV0ZShcbiAgICAgIGRvbUVsZW1lbnQsXG4gICAgICBwcm9wS2V5LFxuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBkb21FbGVtZW50ID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBpZiAobnVsbCA9PT0gZG9tRWxlbWVudClcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZWxzZSBpZiAobnVsbCAhPSB2YWx1ZSlcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFpc05hTih2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BLZXkpLFxuICAgICAgICAgICAgICBkb21FbGVtZW50ID09PSBcIlwiICsgdmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIGRvbUVsZW1lbnQsIHZhbHVlLCBzZXJ2ZXJEaWZmZXJlbmNlcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGh5ZHJhdGVTYW5pdGl6ZWRBdHRyaWJ1dGUoXG4gICAgICBkb21FbGVtZW50LFxuICAgICAgcHJvcEtleSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgKSB7XG4gICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgaWYgKG51bGwgPT09IGRvbUVsZW1lbnQpXG4gICAgICAgI
15852HN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBlbHNlIGlmIChudWxsICE9IHZhbHVlKVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BLZXkpLFxuICAgICAgICAgICAgICAoYXR0cmlidXRlTmFtZSA9IHNhbml0aXplVVJMKFwiXCIgKyB2YWx1ZSkpLFxuICAgICAgICAgICAgICBkb21FbGVtZW50ID09PSBhdHRyaWJ1dGVOYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMsIGhvc3RDb250ZXh0KSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgc2VydmVyRGlmZmVyZW5jZXMgPSB7fSxcbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMgPSBuZXcgU2V0KCksXG4gICAgICAgICAgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcyxcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICAgICAgICBpKytcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGVzW2ldLm5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJzZWxlY3RlZFwiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInZ0LW5hbWVcIjpcbiAgICAgICAgICBjYXNlIFwidnQtdXBkYXRlXCI6XG4gICAgICAgICAgY2FzZSBcInZ0LWVudGVyXCI6XG4gICAgICAgICAgY2FzZSBcInZ0LWV4aXRcIjpcbiAgICAgICAgICBjYXNlIFwidnQtc2hhcmVcIjpcbiAgICAgICAgICBjYXNlIFwidnQtcGFyZW50LWVudGVyXCI6XG4gICAgICAgICAgY2FzZSBcInZ0LXBhcmVudC1leGl0XCI6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICAgICAgICB9XG4gICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpXG4gICAgICAgIGZvciAodmFyIHByb3BLZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgaWYgKG51bGwgIT0gdmFsdWUpXG4gICAgICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKVxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICBlbHNlIGlmICghMCAhPT0gcHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcEtleSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgdmFsdWUgJiYgXCJudW1iZXJcIiAhPT0gdHlwZW9mIHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2hpbGRyZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQudGV4dENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdENoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gdmFsdWUuX19odG1sIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgdmFsdWUpKSxcbiAgICAgICAgICAgICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgZGlmZkh5ZHJhdGVkU3R5bGVzKGRvbUVsZW1lbnQsIHZhbHVlLCBzZXJ2ZXJEaWZmZXJlbmNlcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldFBhcmVudFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldFRvcFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldExlZnRcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJvZmZzZXRXaWR0aFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldEhlaWdodFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcImlzQ29udGVudEVkaXRhYmxlXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwib3V0ZXJUZXh0XCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwib3V0ZXJIVE1MXCI6XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIkFzc2lnbm1lbnQgdG8gcmVhZC1vbmx5IHByb3BlcnR5IHdpbGwgcmVzdWx0IGluIGEgbm8tb3A6IGAlc2BcIixcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImNsYXNzTmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiY2xhc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZU9uQ3VzdG9tQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgI
15852HZhbHVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzTmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBob3N0Q29udGV4dC5jb250ZXh0ID09PSBIb3N0Q29udGV4dE5hbWVzcGFjZU5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJzdmdcIiAhPT0gdGFnICYmXG4gICAgICAgICAgICAgICAgICAgIFwibWF0aFwiICE9PSB0YWdcbiAgICAgICAgICAgICAgICAgICAgICA/IGV4dHJhQXR0cmlidXRlcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICAgICAgICAgIDogZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShwcm9wS2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICAoYXR0cmlidXRlcyA9IGdldFZhbHVlRm9yQXR0cmlidXRlT25DdXN0b21Db21wb25lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBlbHNlXG4gICAgICAgIGZvciAodmFsdWUgaW4gcHJvcHMpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmXG4gICAgICAgICAgICAoKHByb3BLZXkgPSBwcm9wc1t2YWx1ZV0pLCBudWxsICE9IHByb3BLZXkpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKVxuICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBwcm9wS2V5ICYmXG4gICAgICAgICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHZhbHVlLCBwcm9wS2V5KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCEwICE9PSBwcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpXG4gICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgICAgICBcIm51bWJlclwiICE9PSB0eXBlb2YgcHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgIFwiY2hpbGRyZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LnRleHRDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImlubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgcHJvcEtleSA9IHByb3BLZXkgPyBwcm9wS2V5Ll9faHRtbCA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIG51bGwgIT0gcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgICAgICAoKHByb3BLZXkgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIHByb3BLZXkpKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyAhPT0gcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzZXJ2ZXJEaWZmZXJlbmNlc1t2YWx1ZV0gPSB7IF9faHRtbDogYXR0cmlidXRlcyB9KSk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2xhc3NOYW1lXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRhYkluZGV4XCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ0YWJpbmRleFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgI
15852HNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGRpZmZIeWRyYXRlZFN0eWxlcyhkb21FbGVtZW50LCBwcm9wS2V5LCBzZXJ2ZXJEaWZmZXJlbmNlcyk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibXVsdGlwbGVcIjpcbiAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5tdWx0aXBsZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibXV0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5tdXRlZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYXV0b0ZvY3VzXCI6XG4gICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiYXV0b2ZvY3VzXCIpO1xuICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hdXRvZm9jdXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRhdGFcIjpcbiAgICAgICAgICAgICAgICAgIGlmIChcIm9iamVjdFwiICE9PSB0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGFcIik7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcInNyY1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJocmVmXCI6XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgXCJcIiAhPT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgIChcImFcIiA9PT0gdGFnICYmIFwiaHJlZlwiID09PSB2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoXCJvYmplY3RcIiA9PT0gdGFnICYmIFwiZGF0YVwiID09PSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIFwic3JjXCIgPT09IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQW4gZW1wdHkgc3RyaW5nIChcIlwiKSB3YXMgcGFzc2VkIHRvIHRoZSAlcyBhdHRyaWJ1dGUuIFRoaXMgbWF5IGNhdXNlIHRoZSBicm93c2VyIHRvIGRvd25sb2FkIHRoZSB3aG9sZSBwYWdlIGFnYWluIG92ZXIgdGhlIG5ldHdvcmsuIFRvIGZpeCB0aGlzLCBlaXRoZXIgZG8gbm90IHJlbmRlciB0aGUgZWxlbWVudCBhdCBhbGwgb3IgcGFzcyBudWxsIHRvICVzIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIDogY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FuIGVtcHR5IHN0cmluZyAoXCJcIikgd2FzIHBhc3NlZCB0byB0aGUgJXMgYXR0cmlidXRlLiBUbyBmaXggdGhpcywgZWl0aGVyIGRvIG5vdCByZW5kZXIgdGhlIGVsZW1lbnQgYXQgYWxsIG9yIHBhc3MgbnVsbCB0byAlcyBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZVNhbml0aXplZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcImFjdGlvblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJmb3JtQWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZSh2YWx1ZS
1585250b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgXCJmb3JtQWN0aW9uXCIgPT09IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPyAoZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShcIm5hbWVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiZm9ybWVuY3R5cGVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiZm9ybW1ldGhvZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoXCJmb3JtdGFyZ2V0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgIDogKGV4dHJhQXR0cmlidXRlcy5kZWxldGUoXCJlbmN0eXBlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShcIm1ldGhvZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoXCJ0YXJnZXRcIikpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcyA9PT0gRVhQRUNURURfRk9STV9BQ1RJT05fVVJMKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUodmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVTYW5pdGl6ZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rSHJlZlwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZVNhbml0aXplZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6aHJlZlwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRFZGl0YWJsZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUJvb2xlYW5pc2hBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRlZGl0YWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNwZWxsQ2hlY2tcIjpcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVCb29sZWFuaXNoQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJzcGVsbGNoZWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZHJhZ2dhYmxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImF1dG9SZXZlcnNlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZm9jdXNhYmxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInByZXNlcnZlQWxwaGFcIjpcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVCb29sZWFuaXNoQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImFzeW5jXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImF1dG9QbGF5XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImNyZWRlbnRpYWxsZXNzXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImZvcm1Ob1ZhbGlkYXRlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJsb29wXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIm5vTW9kdWxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIm5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJwbGF5c0lubGluZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWFkT25seVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZXZlcnNlZFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzY29wZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiaXRlbVNjb3BlXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQm9vbGVhbkF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgI
15852HZhbHVlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2FwdHVyZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJkb3dubG9hZFwiOlxuICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBpID0gZG9tRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSAoYXR0cmlidXRlcyA9IHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMCA9IHNlcnZlckRpZmZlcmVuY2VzO1xuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpID0gaS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBpKVxuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCExID09PSBwcm9wS2V5KSBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVsbCAhPSBwcm9wS2V5KVxuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCA9PT0gcHJvcEtleSAmJiBcIlwiID09PSBpKSBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihwcm9wS2V5LCBhdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09PSBcIlwiICsgcHJvcEtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb2xzXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInJvd3NcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2l6ZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzcGFuXCI6XG4gICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBkb21FbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMCA9IHNlcnZlckRpZmZlcmVuY2VzO1xuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpID0gaS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBpKVxuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihwcm9wS2V5KSB8fCAxID4gcHJvcEtleSkgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bGwgIT0gcHJvcEtleSlcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNOYU4ocHJvcEtleSkgfHwgMSA+IHByb3BLZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24ocHJvcEtleSwgYX
15852R0cmlidXRlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9PT0gXCJcIiArIHByb3BLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwicm93U3BhblwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZU51bWVyaWNBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBcInJvd3NwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZU51bWVyaWNBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4SGVpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4LWhlaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rQWN0dWF0ZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6YWN0dWF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rQXJjcm9sZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6YXJjcm9sZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rUm9sZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6cm9sZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rU2hvd1wiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6c2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rVGl0bGVcIjpcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBcInhsaW5rOnRpdGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwieGxpbmtUeXBlXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4bGluazp0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgI
15852HByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwieG1sQmFzZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieG1sOmJhc2VcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4bWxMYW5nXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4bWw6bGFuZ1wiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhtbFNwYWNlXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4bWw6c3BhY2VcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpbmVydFwiOlxuICAgICAgICAgICAgICAgICAgXCJcIiAhPT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAgICAgICBkaWRXYXJuRm9yTmV3Qm9vbGVhblByb3BzV2l0aEVtcHR5VmFsdWVbdmFsdWVdIHx8XG4gICAgICAgICAgICAgICAgICAgICgoZGlkV2FybkZvck5ld0Jvb2xlYW5Qcm9wc1dpdGhFbXB0eVZhbHVlW3ZhbHVlXSA9ICEwKSxcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIlJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiBUaGlzIHdpbGwgdHJlYXQgdGhlIGF0dHJpYnV0ZSBhcyBpZiBpdCB3ZXJlIGZhbHNlLiBFaXRoZXIgcGFzcyBgZmFsc2VgIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nLCBvciBwYXNzIGB0cnVlYCBpZiB5b3UgdXNlZCBhbiBlbXB0eSBzdHJpbmcgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBSZWFjdCB0byBpbmRpY2F0ZSB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUJvb2xlYW5BdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICEoMiA8IHZhbHVlLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKFwib1wiICE9PSB2YWx1ZVswXSAmJiBcIk9cIiAhPT0gdmFsdWVbMF0pIHx8XG4gICAgICAgICAgICAgICAgICAgIChcIm5cIiAhPT0gdmFsdWVbMV0gJiYgXCJOXCIgIT09IHZhbHVlWzFdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBnZXRBdHRyaWJ1dGVBbGlhcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgaG9zdENvbnRleHQuY29udGV4dCA9PT0gSG9zdENvbnRleHROYW1lc3BhY2VOb25lICYmXG4gICAgICAgICAgICAgICAgICAgIFwic3ZnXCIgIT09IHRhZyAmJlxuICAgICAgICAgICAgICAgICAgICBcIm1hdGhcIiAhPT0gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgPyBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICAgICAgICAgICA6ICgoYXR0cmlidXRlTmFtZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZU5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbYXR0cmlidXRlTmFtZV0gfHwgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gYXR0cmlidXRlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lICE9PSB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF0dHJpYnV0ZXMgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShpKSk7XG4gICAgICAgICAgICAgICAgICAgIGE6IGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAoKGF0dHJpYnV0ZU5hbWUgPSBkb21FbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAoc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDAgPSBpKSxcbiAgICAgICAgICAgICAgICAgICAgICAoaSA9IHByb3BLZXkpLFxuICAgICAgICAgICAgICAgICAgICAgIGlzQXR0cmlidXRlTmFtZVNhZmUoc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDApKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZS5oYXNBdHRyaWJ1dGUoc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDApXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZU5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5vbmNlXCIgPT09IHNlcnZlckRpZmZlcmVuY2VzJGpzY29tcCQwLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0dHJpYnV0ZU5hbWUubm9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF0dHJpYnV0ZU5hbWUuZ2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9IGF0dHJpYnV0ZU5hbWUgPT09IFwiXCIgKyBpID8gaSA6IGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhdHRyaWJ1dGVOYW1lID0gc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDUpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS1cIiAhPT0gYXR0cmlidXRlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtXCIgIT09IGF0dHJpYnV0ZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgMCA8IGV4dHJhQXR0cmlidXRlcy5zaXplICYmXG4gICAgICAgICEwICE9PSBwcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgJiZcbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhkb21FbGVtZW50LCBleHRyYUF0dHJpYnV0ZXMsIHNlcnZlckRpZmZlcmVuY2VzKTtcbiAgICAgIHJldHVybiAwID09PSBPYmplY3Qua2V5cyhzZXJ2ZXJEaWZmZXJlbmNlcykubGVuZ3RoXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHNlcnZlckRpZmZlcmVuY2VzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wTmFtZXNMaXN0Sm9pbihsaXN0LCBjb21iaW5hdG9yKSB7XG4gICAgICBzd2l0Y2ggKGxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBsaXN0WzBdO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIGxpc3RbMF0gKyBcIiBcIiArIGNvbWJpbmF0b3IgKyBcIiBcIiArIGxpc3RbMV07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGxpc3Quc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICBcIiwgXCIgK1xuICAgICAgICAgICAgY29tYmluYXRvciArXG4gICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICBsaXN0W2xpc3QubGVuZ3RoIC0gMV1cbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpa2VseVN0YXRpY1Jlc291cmNlKGluaXRpYXRvclR5cGUpIHtcbiAgICAgIHN3aXRjaCAoaW5pdGlhdG9yVHlwZSkge1xuICAgICAgICBjYXNlIFwiY3NzXCI6XG4gICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcImZvbnRcIjpcbiAgICAgICAgY2FzZSBcImltZ1wiOlxuICAgICAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZXN0aW1hdGVCYW5kd2lkdGgoKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSkge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBjb3VudCA9IDAsXG4gICAgICAgICAgICBiaXRzID0gMCxcbiAgICAgICAgICAgIHJlc291cmNlRW50cmllcyA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoXCJyZXNvdXJjZVwiKSxcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGkgPCByZXNvdXJjZUVudHJpZXMubGVuZ3RoO1xuICAgICAgICAgIGkrK1xuICAgICAgICApIHtcbiAgICAgICAgICB2Y
15852XIgZW50cnkgPSByZXNvdXJjZUVudHJpZXNbaV0sXG4gICAgICAgICAgICB0cmFuc2ZlclNpemUgPSBlbnRyeS50cmFuc2ZlclNpemUsXG4gICAgICAgICAgICBpbml0aWF0b3JUeXBlID0gZW50cnkuaW5pdGlhdG9yVHlwZSxcbiAgICAgICAgICAgIGR1cmF0aW9uID0gZW50cnkuZHVyYXRpb247XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHJhbnNmZXJTaXplICYmXG4gICAgICAgICAgICBkdXJhdGlvbiAmJlxuICAgICAgICAgICAgaXNMaWtlbHlTdGF0aWNSZXNvdXJjZShpbml0aWF0b3JUeXBlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaW5pdGlhdG9yVHlwZSA9IDA7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IGVudHJ5LnJlc3BvbnNlRW5kO1xuICAgICAgICAgICAgZm9yIChpICs9IDE7IGkgPCByZXNvdXJjZUVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIG92ZXJsYXBFbnRyeSA9IHJlc291cmNlRW50cmllc1tpXSxcbiAgICAgICAgICAgICAgICBvdmVybGFwU3RhcnRUaW1lID0gb3ZlcmxhcEVudHJ5LnN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgaWYgKG92ZXJsYXBTdGFydFRpbWUgPiBkdXJhdGlvbikgYnJlYWs7XG4gICAgICAgICAgICAgIHZhciBvdmVybGFwVHJhbnNmZXJTaXplID0gb3ZlcmxhcEVudHJ5LnRyYW5zZmVyU2l6ZSxcbiAgICAgICAgICAgICAgICBvdmVybGFwSW5pdGlhdG9yVHlwZSA9IG92ZXJsYXBFbnRyeS5pbml0aWF0b3JUeXBlO1xuICAgICAgICAgICAgICBvdmVybGFwVHJhbnNmZXJTaXplICYmXG4gICAgICAgICAgICAgICAgaXNMaWtlbHlTdGF0aWNSZXNvdXJjZShvdmVybGFwSW5pdGlhdG9yVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAoKG92ZXJsYXBFbnRyeSA9IG92ZXJsYXBFbnRyeS5yZXNwb25zZUVuZCksXG4gICAgICAgICAgICAgICAgKGluaXRpYXRvclR5cGUgKz1cbiAgICAgICAgICAgICAgICAgIG92ZXJsYXBUcmFuc2ZlclNpemUgKlxuICAgICAgICAgICAgICAgICAgKG92ZXJsYXBFbnRyeSA8IGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICA6IChkdXJhdGlvbiAtIG92ZXJsYXBTdGFydFRpbWUpIC9cbiAgICAgICAgICAgICAgICAgICAgICAob3ZlcmxhcEVudHJ5IC0gb3ZlcmxhcFN0YXJ0VGltZSkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICBiaXRzICs9XG4gICAgICAgICAgICAgICg4ICogKHRyYW5zZmVyU2l6ZSArIGluaXRpYXRvclR5cGUpKSAvIChlbnRyeS5kdXJhdGlvbiAvIDFlMyk7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgaWYgKDEwIDwgY291bnQpIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoMCA8IGNvdW50KSByZXR1cm4gYml0cyAvIGNvdW50IC8gMWU2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdmlnYXRvci5jb25uZWN0aW9uICYmXG4gICAgICAgICgoY291bnQgPSBuYXZpZ2F0b3IuY29ubmVjdGlvbi5kb3dubGluayksIFwibnVtYmVyXCIgPT09IHR5cGVvZiBjb3VudClcbiAgICAgICAgPyBjb3VudFxuICAgICAgICA6IDU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIDkgPT09IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlXG4gICAgICAgID8gcm9vdENvbnRhaW5lckVsZW1lbnRcbiAgICAgICAgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRPd25Ib3N0Q29udGV4dChuYW1lc3BhY2VVUkkpIHtcbiAgICAgIHN3aXRjaCAobmFtZXNwYWNlVVJJKSB7XG4gICAgICAgIGNhc2UgU1ZHX05BTUVTUEFDRTpcbiAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VTdmc7XG4gICAgICAgIGNhc2UgTUFUSF9OQU1FU1BBQ0U6XG4gICAgICAgICAgcmV0dXJuIEhvc3RDb250ZXh0TmFtZXNwYWNlTWF0aDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VOb25lO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0UHJvZChwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgICAgIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZSlcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInN2Z1wiOlxuICAgICAgICAgICAgcmV0dXJuIEhvc3RDb250ZXh0TmFtZXNwYWNlU3ZnO1xuICAgICAgICAgIGNhc2UgXCJtYXRoXCI6XG4gICAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VNYXRoO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VOb25lO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50TmFtZXNwYWNlID09PSBIb3N0Q29udGV4dE5hbWVzcGFjZVN2ZyAmJlxuICAgICAgICBcImZvcmVpZ25PYmplY3RcIiA9PT0gdHlwZVxuICAgICAgICA/IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZVxuICAgICAgICA6IHBhcmVudE5hbWVzcGFjZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlSG9pc3RhYmxlSW5zdGFuY2UoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICByb290Q29udGFpbmVySW5zdGFuY2UsXG4gICAgICBpbnRlcm5hbEluc3RhbmNlSGFuZGxlXG4gICAgKSB7XG4gICAgICByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoXG4gICAgICAgIHJvb3RDb250YWluZXJJbnN0YW5jZVxuICAgICAgKS5jcmVhdGVFbGVtZW50KHR5cGUpO1xuICAgICAgcm9vdENvbnRhaW5lckluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaW50ZXJuYWxJbnN0YW5jZUhhbmRsZTtcbiAgICAgIHJvb3RDb250YWluZXJJbnN0YW5jZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xuICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMocm9vdENvbnRhaW5lckluc3RhbmNlLCB0eXBlLCBwcm9wcyk7XG4gICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1NjcmlwdERhdGFCbG9jayhwcm9wcykge1xuICAgICAgcHJvcHMgP
15852SBwcm9wcy50eXBlO1xuICAgICAgaWYgKFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcyB8fCBcIlwiID09PSBwcm9wcykgcmV0dXJuICExO1xuICAgICAgcHJvcHMgPSBwcm9wcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBcIm1vZHVsZVwiID09PSBwcm9wcyB8fFxuICAgICAgICBcImltcG9ydG1hcFwiID09PSBwcm9wcyB8fFxuICAgICAgICBcInNwZWN1bGF0aW9ucnVsZXNcIiA9PT0gcHJvcHNcbiAgICAgIClcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgc3dpdGNoIChwcm9wcykge1xuICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCI6XG4gICAgICAgIGNhc2UgXCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRleHQvZWNtYXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0L2phdmFzY3JpcHQxLjBcIjpcbiAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdDEuMVwiOlxuICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0MS4yXCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0L2phdmFzY3JpcHQxLjNcIjpcbiAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdDEuNFwiOlxuICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0MS41XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0L2pzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRleHQvbGl2ZXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwidGV4dC94LWVjbWFzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRleHQveC1qYXZhc2NyaXB0XCI6XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJ0ZXh0YXJlYVwiID09PSB0eXBlIHx8XG4gICAgICAgIFwibm9zY3JpcHRcIiA9PT0gdHlwZSB8fFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIHByb3BzLmNoaWxkcmVuIHx8XG4gICAgICAgIFwiYmlnaW50XCIgPT09IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiB8fFxuICAgICAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmXG4gICAgICAgICAgbnVsbCAhPT0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgJiZcbiAgICAgICAgICBudWxsICE9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbClcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNob3VsZEF0dGVtcHRFYWdlclRyYW5zaXRpb24oKSB7XG4gICAgICB2Y
15852XIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICBpZiAoZXZlbnQgJiYgXCJwb3BzdGF0ZVwiID09PSBldmVudC50eXBlKSB7XG4gICAgICAgIGlmIChldmVudCA9PT0gY3VycmVudFBvcHN0YXRlVHJhbnNpdGlvbkV2ZW50KSByZXR1cm4gITE7XG4gICAgICAgIGN1cnJlbnRQb3BzdGF0ZVRyYW5zaXRpb25FdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgICBjdXJyZW50UG9wc3RhdGVUcmFuc2l0aW9uRXZlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlRXZlbnRUeXBlKCkge1xuICAgICAgdmFyIGV2ZW50ID0gd2luZG93LmV2ZW50O1xuICAgICAgcmV0dXJuIGV2ZW50ICYmIGV2ZW50ICE9PSBzY2hlZHVsZXJFdmVudCA/IGV2ZW50LnR5cGUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICByZXR1cm4gZXZlbnQgJiYgZXZlbnQgIT09IHNjaGVkdWxlckV2ZW50ID8gZXZlbnQudGltZVN0YW1wIDogLTEuMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgIG5ld1Byb3BzLmF1dG9Gb2N1cyAmJiBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICBuZXdQcm9wcy5zcmNcbiAgICAgICAgICAgID8gKGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjKVxuICAgICAgICAgICAgOiBuZXdQcm9wcy5zcmNTZXQgJiYgKGRvbUVsZW1lbnQuc3Jjc2V0ID0gbmV3UHJvcHMuc3JjU2V0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRJbnN0YW5jZSgpIHt9XG4gICAgZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xuICAgICAgZG9tRWxlbWVudFtpbnRlcm5hbFByb3BzS2V5XSA9IG5ld1Byb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JSZWFjdENoaWxkcmVuQ29uZmxpY3QoY29udGFpbmVyKSB7XG4gICAgICBpZiAoIWNvbnRhaW5lci5fX3JlYWN0V2FybmVkQWJvdXRDaGlsZHJlbkNvbmZsaWN0KSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGNvbnRhaW5lcltpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPT0gcHJvcHMpIHtcbiAgICAgICAgICB2Y
15852XIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIgJiZcbiAgICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgICAgICA/ICgoY29udGFpbmVyLl9fcmVhY3RXYXJuZWRBYm91dENoaWxkcmVuQ29uZmxpY3QgPSAhMCksXG4gICAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIGEgcmVmIG9uIGEgUmVhY3QgZWxlbWVudCBhcyBhIGNvbnRhaW5lciB0byBgY3JlYXRlUm9vdGAgb3IgYGNyZWF0ZVBvcnRhbGAgaWYgdGhhdCBlbGVtZW50IGFsc28gc2V0cyBcImNoaWxkcmVuXCIgdGV4dCBjb250ZW50IHVzaW5nIFJlYWN0LiBJdCBzaG91bGQgYmUgYSBsZWFmIHdpdGggbm8gY2hpbGRyZW4uIE90aGVyd2lzZSBpdFxcJ3MgYW1iaWd1b3VzIHdoaWNoIGNoaWxkcmVuIHNob3VsZCBiZSB1c2VkLidcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIDogbnVsbCAhPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJlxuICAgICAgICAgICAgICAgICgoY29udGFpbmVyLl9fcmVhY3RXYXJuZWRBYm91dENoaWxkcmVuQ29uZmxpY3QgPSAhMCksXG4gICAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIGEgcmVmIG9uIGEgUmVhY3QgZWxlbWVudCBhcyBhIGNvbnRhaW5lciB0byBgY3JlYXRlUm9vdGAgb3IgYGNyZWF0ZVBvcnRhbGAgaWYgdGhhdCBlbGVtZW50IGFsc28gc2V0cyBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIgdXNpbmcgUmVhY3QuIEl0IHNob3VsZCBiZSBhIGxlYWYgd2l0aCBubyBjaGlsZHJlbi4gT3RoZXJ3aXNlIGl0XFwncyBhbWJpZ3VvdXMgd2hpY2ggY2hpbGRyZW4gc2hvdWxkIGJlIHVzZWQuJ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzU2luZ2xldG9uU2NvcGUodHlwZSkge1xuICAgICAgcmV0dXJuIFwiaGVhZFwiID09PSB0eXBlO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgICAgICg5ID09PSBjb250YWluZXIubm9kZVR5cGVcbiAgICAgICAgPyBjb250YWluZXIuYm9keVxuICAgICAgICA6IFwiSFRNTFwiID09PSBjb250YWluZXIubm9kZU5hbWVcbiAgICAgICAgICA/IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICA6IGNvbnRhaW5lclxuICAgICAgKS5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFySHlkcmF0aW9uQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIGh5ZHJhdGlvbkluc3RhbmNlKSB7XG4gICAgICB2Y
15852XIgbm9kZSA9IGh5ZHJhdGlvbkluc3RhbmNlLFxuICAgICAgICBkZXB0aCA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICBpZiAobmV4dE5vZGUgJiYgOCA9PT0gbmV4dE5vZGUubm9kZVR5cGUpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKChub2RlID0gbmV4dE5vZGUuZGF0YSksXG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9FTkRfREFUQSB8fCBub2RlID09PSBBQ1RJVklUWV9FTkRfREFUQSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICgwID09PSBkZXB0aCkge1xuICAgICAgICAgICAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7XG4gICAgICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oaHlkcmF0aW9uSW5zdGFuY2UpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGUgPT09IFNVU1BFTlNFX1FVRVVFRF9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBub2RlID09PSBBQ1RJVklUWV9TVEFSVF9EQVRBXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICBlbHNlIGlmIChub2RlID09PSBQUkVBTUJMRV9DT05UUklCVVRJT05fSFRNTClcbiAgICAgICAgICAgIGNsZWFyU2luZ2xldG9uUHJlYW1ibGVDb250cmlidXRpb24oXG4gICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGVsc2UgaWYgKG5vZGUgPT09IFBSRUFNQkxFX0NPTlRSSUJVVElPTl9IRUFEKSB7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50SW5zdGFuY2Uub3duZXJEb2N1bWVudC5oZWFkO1xuICAgICAgICAgICAgY2xlYXJTaW5nbGV0b25QcmVhbWJsZUNvbnRyaWJ1dGlvbihub2RlKTtcbiAgICAgICAgICAgIGZvciAodmFyIG5vZGUkanNjb21wJDAgPSBub2RlLmZpcnN0Q2hpbGQ7IG5vZGUkanNjb21wJDA7ICkge1xuICAgICAgICAgICAgICB2Y
15852XIgbmV4dE5vZGUkanNjb21wJDAgPSBub2RlJGpzY29tcCQwLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZSRqc2NvbXAkMC5ub2RlTmFtZTtcbiAgICAgICAgICAgICAgbm9kZSRqc2NvbXAkMFtpbnRlcm5hbEhvaXN0YWJsZU1hcmtlcl0gfHxcbiAgICAgICAgICAgICAgICBcIlNDUklQVFwiID09PSBub2RlTmFtZSB8fFxuICAgICAgICAgICAgICAgIFwiU1RZTEVcIiA9PT0gbm9kZU5hbWUgfHxcbiAgICAgICAgICAgICAgICAoXCJMSU5LXCIgPT09IG5vZGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gbm9kZSRqc2NvbXAkMC5yZWwudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUkanNjb21wJDApO1xuICAgICAgICAgICAgICBub2RlJGpzY29tcCQwID0gbmV4dE5vZGUkanNjb21wJDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBub2RlID09PSBQUkVBTUJMRV9DT05UUklCVVRJT05fQk9EWSAmJlxuICAgICAgICAgICAgICBjbGVhclNpbmdsZXRvblByZWFtYmxlQ29udHJpYnV0aW9uKFxuICAgICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlLm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICApO1xuICAgICAgICBub2RlID0gbmV4dE5vZGU7XG4gICAgICB9IHdoaWxlIChub2RlKTtcbiAgICAgIHJldHJ5SWZCbG9ja2VkT24oaHlkcmF0aW9uSW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlT3JVbmhpZGVEZWh5ZHJhdGVkQm91bmRhcnkoc3VzcGVuc2VJbnN0YW5jZSwgaXNIaWRkZW4pIHtcbiAgICAgIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTtcbiAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSAwO1xuICAgICAgZG8ge1xuICAgICAgICB2Y
15852XIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAxID09PSBub2RlLm5vZGVUeXBlXG4gICAgICAgICAgPyBpc0hpZGRlblxuICAgICAgICAgICAgPyAoKG5vZGUuX3N0YXNoZWREaXNwbGF5ID0gbm9kZS5zdHlsZS5kaXNwbGF5KSxcbiAgICAgICAgICAgICAgKG5vZGUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSlcbiAgICAgICAgICAgIDogKChub2RlLnN0eWxlLmRpc3BsYXkgPSBub2RlLl9zdGFzaGVkRGlzcGxheSB8fCBcIlwiKSxcbiAgICAgICAgICAgICAgXCJcIiA9PT0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIikpXG4gICAgICAgICAgOiAzID09PSBub2RlLm5vZGVUeXBlICYmXG4gICAgICAgICAgICAoaXNIaWRkZW5cbiAgICAgICAgICAgICAgPyAoKG5vZGUuX3N0YXNoZWRUZXh0ID0gbm9kZS5ub2RlVmFsdWUpLCAobm9kZS5ub2RlVmFsdWUgPSBcIlwiKSlcbiAgICAgICAgICAgICAgOiAobm9kZS5ub2RlVmFsdWUgPSBub2RlLl9zdGFzaGVkVGV4dCB8fCBcIlwiKSk7XG4gICAgICAgIGlmIChuZXh0Tm9kZSAmJiA4ID09PSBuZXh0Tm9kZS5ub2RlVHlwZSlcbiAgICAgICAgICBpZiAoKChub2RlID0gbmV4dE5vZGUuZGF0YSksIG5vZGUgPT09IFNVU1BFTlNFX0VORF9EQVRBKSlcbiAgICAgICAgICAgIGlmICgwID09PSBzdXNwZW5zZUluc3RhbmNlKSBicmVhaztcbiAgICAgICAgICAgIGVsc2Ugc3VzcGVuc2VJbnN0YW5jZS0tO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIChub2RlICE9PSBTVVNQRU5TRV9TVEFSVF9EQVRBICYmXG4gICAgICAgICAgICAgIG5vZGUgIT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBub2RlICE9PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBub2RlICE9PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB8fFxuICAgICAgICAgICAgICBzdXNwZW5zZUluc3RhbmNlKys7XG4gICAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgICAgIH0gd2hpbGUgKG5vZGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlRGVoeWRyYXRlZEJvdW5kYXJ5KHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICAgIGhpZGVPclVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeShzdXNwZW5zZUluc3RhbmNlLCAhMCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5zdHlsZTtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLnNldFByb3BlcnR5XG4gICAgICAgID8gaW5zdGFuY2Uuc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsIFwibm9uZVwiLCBcImltcG9ydGFudFwiKVxuICAgICAgICA6IChpbnN0YW5jZS5kaXNwbGF5ID0gXCJub25lXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICAgICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeShkZWh5ZHJhdGVkSW5zdGFuY2UpIHtcbiAgICAgIGhpZGVPclVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeShkZWh5ZHJhdGVkSW5zdGFuY2UsICExKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gICAgICBwcm9wcyA9IHByb3BzW1NUWUxFXTtcbiAgICAgIHByb3BzID1cbiAgICAgICAgdm9pZCAwICE9PSBwcm9wcyAmJiBudWxsICE9PSBwcm9wcyAmJiBwcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc3BsYXlcIilcbiAgICAgICAgICA/IHByb3BzLmRpc3BsYXlcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID1cbiAgICAgICAgbnVsbCA9PSBwcm9wcyB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHByb3BzID8gXCJcIiA6IChcIlwiICsgcHJvcHMpLnRyaW0oKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICAgICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JCbG9ja0luc2lkZUlubGluZShpbnN0YW5jZSkge1xuICAgICAgZm9yICh2YXIgbmV4dE5vZGUgPSBpbnN0YW5jZS5maXJzdENoaWxkOyBudWxsICE9IG5leHROb2RlOyApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIDEgPT09IG5leHROb2RlLm5vZGVUeXBlICYmXG4gICAgICAgICAgXCJibG9ja1wiID09PSBnZXRDb21wdXRlZFN0eWxlKG5leHROb2RlKS5kaXNwbGF5XG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBmaWJlciA9XG4gICAgICAgICAgICBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHROb2RlKSB8fCBnZXRJbnN0YW5jZUZyb21Ob2RlKGluc3RhbmNlKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgZnVuY3Rpb24gKHBhcmVudFRhZywgY2hpbGRUYWcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIllvdSdyZSBhYm91dCB0byBzdGFydCBhIDxWaWV3VHJhbnNpdGlvbj4gYXJvdW5kIGEgZGlzcGxheTogaW5saW5lIGVsZW1lbnQgPCVzPiwgd2hpY2ggaXRzZWxmIGhhcyBhIGRpc3BsYXk6IGJsb2NrIGVsZW1lbnQgPCVzPiBpbnNpZGUgaXQuIFRoaXMgbWlnaHQgdHJpZ2dlciBhIGJ1ZyBpbiBTYWZhcmkgd2hpY2ggY2F1c2VzIHRoZSBWaWV3IFRyYW5zaXRpb24gdG8gYmUgc2tpcHBlZCB3aXRoIGEgZHVwbGljYXRlIG5hbWUgZXJyb3IuXFxuaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDkyM1wiLFxuICAgICAgICAgICAgICAgIHBhcmVudFRhZy50b0xvY2FsZUxvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIGNoaWxkVGFnLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0YW5jZS50YWdOYW1lLFxuICAgICAgICAgICAgbmV4dE5vZGUudGFnTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgI
15852H1cbiAgICAgICAgaWYgKG51bGwgIT0gbmV4dE5vZGUuZmlyc3RDaGlsZCkgbmV4dE5vZGUgPSBuZXh0Tm9kZS5maXJzdENoaWxkO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAobmV4dE5vZGUgPT09IGluc3RhbmNlKSBicmVhaztcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgO1xuICAgICAgICAgICAgbnVsbCA9PSBuZXh0Tm9kZS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgbnVsbCAhPSBuZXh0Tm9kZS5wYXJlbnROb2RlICYmXG4gICAgICAgICAgICBuZXh0Tm9kZS5wYXJlbnROb2RlICE9PSBpbnN0YW5jZTtcblxuICAgICAgICAgIClcbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFwcGx5Vmlld1RyYW5zaXRpb25OYW1lKGluc3RhbmNlLCBuYW1lLCBjbGFzc05hbWUpIHtcbiAgICAgIG5hbWUgPVxuICAgICAgICBDU1MuZXNjYXBlKG5hbWUpICE9PSBuYW1lID8gXCJyLVwiICsgYnRvYShuYW1lKS5yZXBsYWNlKC89L2csIFwiXCIpIDogbmFtZTtcbiAgICAgIGluc3RhbmNlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IG5hbWU7XG4gICAgICBudWxsICE9IGNsYXNzTmFtZSAmJiAoaW5zdGFuY2Uuc3R5bGUudmlld1RyYW5zaXRpb25DbGFzcyA9IGNsYXNzTmFtZSk7XG4gICAgICBjbGFzc05hbWUgPSBnZXRDb21wdXRlZFN0eWxlKGluc3RhbmNlKTtcbiAgICAgIGlmIChcImlubGluZVwiID09PSBjbGFzc05hbWUuZGlzcGxheSkge1xuICAgICAgICBuYW1lID0gaW5zdGFuY2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgaWYgKDEgPT09IG5hbWUubGVuZ3RoKSB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZvciAodmFyIGkgPSAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gMCk7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2Y
15852XIgcmVjdCA9IG5hbWVbaV07XG4gICAgICAgICAgICAwIDwgcmVjdC53aWR0aCAmJiAwIDwgcmVjdC5oZWlnaHQgJiYgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0Kys7XG4gICAgICAgICAgfVxuICAgICAgICAxID09PSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgICAgICA/ICgoaW5zdGFuY2UgPSBpbnN0YW5jZS5zdHlsZSksXG4gICAgICAgICAgICAoaW5zdGFuY2UuZGlzcGxheSA9IDEgPT09IG5hbWUubGVuZ3RoID8gXCJpbmxpbmUtYmxvY2tcIiA6IFwiYmxvY2tcIiksXG4gICAgICAgICAgICAoaW5zdGFuY2UubWFyZ2luVG9wID0gXCItXCIgKyBjbGFzc05hbWUucGFkZGluZ1RvcCksXG4gICAgICAgICAgICAoaW5zdGFuY2UubWFyZ2luQm90dG9tID0gXCItXCIgKyBjbGFzc05hbWUucGFkZGluZ0JvdHRvbSkpXG4gICAgICAgICAgOiB3YXJuRm9yQmxvY2tJbnNpZGVJbmxpbmUoaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZXN0b3JlVmlld1RyYW5zaXRpb25OYW1lKGluc3RhbmNlLCBwcm9wcykge1xuICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5zdHlsZTtcbiAgICAgIHByb3BzID0gcHJvcHNbU1RZTEVdO1xuICAgICAgdmFyIHZpZXdUcmFuc2l0aW9uTmFtZSA9XG4gICAgICAgIG51bGwgIT0gcHJvcHNcbiAgICAgICAgICA/IHByb3BzLmhhc093blByb3BlcnR5KFwidmlld1RyYW5zaXRpb25OYW1lXCIpXG4gICAgICAgICAgICA/IHByb3BzLnZpZXdUcmFuc2l0aW9uTmFtZVxuICAgICAgICAgICAgOiBwcm9wcy5oYXNPd25Qcm9wZXJ0eShcInZpZXctdHJhbnNpdGlvbi1uYW1lXCIpXG4gICAgICAgICAgICAgID8gcHJvcHNbXCJ2aWV3LXRyYW5zaXRpb24tbmFtZVwiXVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpbnN0YW5jZS52aWV3VHJhbnNpdGlvbk5hbWUgPVxuICAgICAgICBudWxsID09IHZpZXdUcmFuc2l0aW9uTmFtZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHZpZXdUcmFuc2l0aW9uTmFtZVxuICAgICAgICAgID8gXCJcIlxuICAgICAgICAgIDogKFwiXCIgKyB2aWV3VHJhbnNpdGlvbk5hbWUpLnRyaW0oKTtcbiAgICAgIHZpZXdUcmFuc2l0aW9uTmFtZSA9XG4gICAgICAgIG51bGwgIT0gcHJvcHNcbiAgICAgICAgICA/IHByb3BzLmhhc093blByb3BlcnR5KFwidmlld1RyYW5zaXRpb25DbGFzc1wiKVxuICAgICAgICAgICAgPyBwcm9wcy52aWV3VHJhbnNpdGlvbkNsYXNzXG4gICAgICAgICAgICA6IHByb3BzLmhhc093blByb3BlcnR5KFwidmlldy10cmFuc2l0aW9uLWNsYXNzXCIpXG4gICAgICAgICAgICAgID8gcHJvcHNbXCJ2aWV3LXRyYW5zaXRpb24tY2xhc3NcIl1cbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaW5zdGFuY2Uudmlld1RyYW5zaXRpb25DbGFzcyA9XG4gICAgICAgIG51bGwgPT0gdmlld1RyYW5zaXRpb25OYW1lIHx8IFwiYm9vbGVhblwiID09PSB0eXBlb2Ygdmlld1RyYW5zaXRpb25OYW1lXG4gICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgOiAoXCJcIiArIHZpZXdUcmFuc2l0aW9uTmFtZSkudHJpbSgpO1xuICAgICAgXCJpbmxpbmUtYmxvY2tcIiA9PT0gaW5zdGFuY2UuZGlzcGxheSAmJlxuICAgICAgICAobnVsbCA9PSBwcm9wc1xuICAgICAgICAgID8gKGluc3RhbmNlLmRpc3BsYXkgPSBpbnN0YW5jZS5tYXJnaW4gPSBcIlwiKVxuICAgICAgICAgIDogKCh2aWV3VHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5kaXNwbGF5KSxcbiAgICAgICAgICAgIChpbnN0YW5jZS5kaXNwbGF5ID1cbiAgICAgICAgICAgICAgbnVsbCA9PSB2aWV3VHJhbnNpdGlvbk5hbWUgfHxcbiAgICAgICAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2aWV3VHJhbnNpdGlvbk5hbWVcbiAgICAgICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgICAgICA6IHZpZXdUcmFuc2l0aW9uTmFtZSksXG4gICAgICAgICAgICAodmlld1RyYW5zaXRpb25OYW1lID0gcHJvcHMubWFyZ2luKSxcbiAgICAgICAgICAgIG51bGwgIT0gdmlld1RyYW5zaXRpb25OYW1lXG4gICAgICAgICAgICAgID8gKGluc3RhbmNlLm1hcmdpbiA9IHZpZXdUcmFuc2l0aW9uTmFtZSlcbiAgICAgICAgICAgICAgOiAoKHZpZXdUcmFuc2l0aW9uTmFtZSA9IHByb3BzLmhhc093blByb3BlcnR5KFwibWFyZ2luVG9wXCIpXG4gICAgICAgICAgICAgICAgICA/IHByb3BzLm1hcmdpblRvcFxuICAgICAgICAgICAgICAgICAgOiBwcm9wc1tcIm1hcmdpbi10b3BcIl0pLFxuICAgICAgICAgICAgICAgIChpbnN0YW5jZS5tYXJnaW5Ub3AgPVxuICAgICAgICAgICAgICAgICAgbnVsbCA9PSB2aWV3VHJhbnNpdGlvbk5hbWUgfHxcbiAgICAgICAgICAgICAgICAgIFwiYm9vbGVhblwiID09PSB0eXBlb2Ygdmlld1RyYW5zaXRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgICAgICA6IHZpZXdUcmFuc2l0aW9uTmFtZSksXG4gICAgICAgICAgICAgICAgKHByb3BzID0gcHJvcHMuaGFzT3duUHJvcGVydHkoXCJtYXJnaW5Cb3R0b21cIilcbiAgICAgICAgICAgICAgICAgID8gcHJvcHMubWFyZ2luQm90dG9tXG4gICAgICAgICAgICAgICAgICA6IHByb3BzW1wibWFyZ2luLWJvdHRvbVwiXSksXG4gICAgICAgICAgICAgICAgKGluc3RhbmNlLm1hcmdpbkJvdHRvbSA9XG4gICAgICAgICAgICAgICAgICBudWxsID09IHByb3BzIHx8IFwiYm9vbGVhblwiID09PSB0eXBlb2YgcHJvcHMgPyBcIlwiIDogcHJvcHMpKSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVNZWFzdXJlbWVudChyZWN0LCBjb21wdXRlZFN0eWxlLCBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVjdDogcmVjdCxcbiAgICAgICAgYWJzOlxuICAgICAgICAgIFwiYWJzb2x1dGVcIiA9PT0gY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiB8fFxuICAgICAgICAgIFwiZml4ZWRcIiA9PT0gY29tcHV0ZWRTdHlsZS5wb3NpdGlvbixcbiAgICAgICAgY2xpcDpcbiAgICAgICAgICBcIm5vbmVcIiAhPT0gY29tcHV0ZWRTdHlsZS5jbGlwUGF0aCB8fFxuICAgICAgICAgIFwidmlzaWJsZVwiICE9PSBjb21wdXRlZFN0eWxlLm92ZXJmbG93IHx8XG4gICAgICAgICAgXCJub25lXCIgIT09IGNvbXB1dGVkU3R5bGUuZmlsdGVyIHx8XG4gICAgICAgICAgXCJub25lXCIgIT09IGNvbXB1dGVkU3R5bGUubWFzayB8fFxuICAgICAgICAgIFwibm9uZVwiICE9PSBjb21wdXRlZFN0eWxlLm1hc2sgfHxcbiAgICAgICAgICBcIjBweFwiICE9PSBjb21wdXRlZFN0eWxlLmJvcmRlclJhZGl1cyxcbiAgICAgICAgdmlldzpcbiAgICAgICAgICAwIDw9IHJlY3QuYm90dG9tICYmXG4gICAgICAgICAgMCA8PSByZWN0LnJpZ2h0ICYmXG4gICAgICAgICAgcmVjdC50b3AgPD0gZWxlbWVudC5pbm5lckhlaWdodCAmJlxuICAgICAgICAgI
15852HJlY3QubGVmdCA8PSBlbGVtZW50LmlubmVyV2lkdGhcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1lYXN1cmVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgICAgdmFyIHJlY3QgPSBpbnN0YW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5zdGFuY2UpO1xuICAgICAgcmV0dXJuIGNyZWF0ZU1lYXN1cmVtZW50KHJlY3QsIGNvbXB1dGVkU3R5bGUsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWVhc3VyZUNsb25lZEluc3RhbmNlKGluc3RhbmNlKSB7XG4gICAgICB2YXIgbWVhc3VyZWRSZWN0ID0gaW5zdGFuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtZWFzdXJlZFJlY3QgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgbWVhc3VyZWRSZWN0LnggKyAyZTQsXG4gICAgICAgIG1lYXN1cmVkUmVjdC55ICsgMmU0LFxuICAgICAgICBtZWFzdXJlZFJlY3Qud2lkdGgsXG4gICAgICAgIG1lYXN1cmVkUmVjdC5oZWlnaHRcbiAgICAgICk7XG4gICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5zdGFuY2UpO1xuICAgICAgcmV0dXJuIGNyZWF0ZU1lYXN1cmVtZW50KG1lYXN1cmVkUmVjdCwgY29tcHV0ZWRTdHlsZSwgaW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjdXN0b21pemVWaWV3VHJhbnNpdGlvbkVycm9yKGVycm9yLCBpZ25vcmVBYm9ydCkge1xuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJiBudWxsICE9PSBlcnJvcilcbiAgICAgICAgc3dpdGNoIChlcnJvci5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcIlRpbWVvdXRFcnJvclwiOlxuICAgICAgICAgICAgcmV0dXJuIEVycm9yKFxuICAgICAgICAgICAgICBcIkEgVmlld1RyYW5zaXRpb24gdGltZWQgb3V0IGJlY2F1c2UgYSBOYXZpZ2F0aW9uIHN0YWxsZWQuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIE5hdmlnYXRpb24gaXMgYmxvY2tlZCBvbiBSZWFjdCBpdHNlbGYuIFN1Y2ggYXMgaWYgaXQncyByZXNvbHZlZCBpbnNpZGUgdXNlRWZmZWN0LiBUaGlzIGNhbiBiZSBzb2x2ZWQgYnkgbW92aW5nIHRoZSByZXNvbHV0aW9uIHRvIHVzZUxheW91dEVmZmVjdC5cIixcbiAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIFwiQWJvcnRFcnJvclwiOlxuICAgICAgICAgICAgcmV0dXJuIGlnbm9yZUFib3J0XG4gICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICA6IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJBIFZpZXdUcmFuc2l0aW9uIHdhcyBhYm9ydGVkIGVhcmx5LiBUaGlzIG1pZ2h0IGJlIGJlY2F1c2UgeW91IGhhdmUgb3RoZXIgVmlldyBUcmFuc2l0aW9uIGxpYnJhcmllcyBvbiB0aGUgcGFnZSBhbmQgb25seSBvbmUgY2FuIHJ1biBhdCBhIHRpbWUuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IFJlYWN0J3MgYnVpbHQtaW4gPFZpZXdUcmFuc2l0aW9uPiB0byBjb29yZGluYXRlLlwiLFxuICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBcIkludmFsaWRTdGF0ZUVycm9yXCI6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFwiVmlldyB0cmFuc2l0aW9uIHdhcyBza2lwcGVkIGJlY2F1c2UgZG9jdW1lbnQgdmlzaWJpbGl0eSBzdGF0ZSBpcyBoaWRkZW4uXCIgPT09XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fFxuICAgICAgICAgICAgICBcIlNraXBwaW5nIHZpZXcgdHJhbnNpdGlvbiBiZWNhdXNlIGRvY3VtZW50IHZpc2liaWxpdHkgc3RhdGUgaGFzIGJlY29tZSBoaWRkZW4uXCIgPT09XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fFxuICAgICAgICAgICAgICBcIlNraXBwaW5nIHZpZXcgdHJhbnNpdGlvbiBiZWNhdXNlIHZpZXdwb3J0IHNpemUgY2hhbmdlZC5cIiA9PT1cbiAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICAgIFwiVHJhbnNpdGlvbiB3YXMgYWJvcnRlZCBiZWNhdXNlIG9mIGludmFsaWQgc3RhdGVcIiA9PT1cbiAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcmNlTGF5b3V0KG93bmVyRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBvd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhaXRGb3JJbWFnZVRvTG9hZChyZXNvbHZlKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHJlc29sdmUpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgcmVzb2x2ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0Vmlld1RyYW5zaXRpb24oXG4gICAgICBzdXNwZW5kZWRTdGF0ZSxcbiAgICAgIHJvb3RDb250YWluZXIsXG4gICAgICB0cmFuc2l0aW9uVHlwZXMsXG4gICAgICBtdXRhdGlvbkNhbGxiYWNrLFxuICAgICAgbGF5b3V0Q2FsbGJhY2ssXG4gICAgICBhZnRlck11dGF0aW9uQ2FsbGJhY2ssXG4gICAgICBzcGF3bmVkV29ya0NhbGxiYWNrLFxuICAgICAgcGFzc2l2ZUNhbGxiYWNrLFxuICAgICAgZXJyb3JDYWxsYmFjayxcbiAgICAgIGJsb2NrZWRDYWxsYmFjayxcbiAgICAgIGZpbmlzaGVkQW5pbWF0aW9uXG4gICAgKSB7XG4gICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9XG4gICAgICAgIDkgPT09IHJvb3RDb250YWluZXIubm9kZVR5cGVcbiAgICAgICAgICA/IHJvb3RDb250YWluZXJcbiAgICAgICAgICA6IHJvb3RDb250YWluZXIub3duZXJEb2N1bWVudDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uID0gb3duZXJEb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKHtcbiAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvd25lcldpbmRvdyA9IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsXG4gICAgICAgICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uID1cbiAgICAgICAgICAgICAgICBvd25lcldpbmRvdy5uYXZpZ2F0aW9uICYmIG93bmVyV2luZG93Lm5hdmlnYXRpb24udHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgcHJldmlvdXNGb250TG9hZGluZ1N0YXR1cyA9IG93bmVyRG9jdW1lbnQuZm9udHMuc3RhdHVzO1xuICAgICAgICAgICAgbXV0YXRpb25DYWxsYmFjaygpO1xuICAgICAgICAgICAgdmFyIGJsb2NraW5nUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIFwibG9hZGVkXCIgPT09IHByZXZpb3VzRm9udExvYWRpbmdTdGF0dXMgJiZcbiAgICAgICAgICAgICAgKGZvcmNlTGF5b3V0KG93bmVyRG9jdW1lbnQpLFxuICAgICAgICAgICAgICBcImxvYWRpbmdcIiA9PT0gb3duZXJEb2N1bWVudC5mb250cy5zdGF0dXMgJiZcbiAgICAgICAgICAgICAgICBibG9ja2luZ1Byb21pc2VzLnB1c2gob3duZXJEb2N1bWVudC5mb250cy5yZWFkeSkpO1xuICAgICAgICAgICAgcHJldmlvdXNGb250TG9hZGluZ1N0YXR1cyA9IGJsb2NraW5nUHJvbWlzZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHN1c3BlbmRlZFN0YXRlKVxuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIHZhciBzdXNwZW5zZXlJbWFnZXMgPSBzdXNwZW5kZWRTdGF0ZS5zdXNwZW5zZXlJbWFnZXMsXG4gICAgICAgICAgICAgICAgICBpbWdCeXRlcyA9IDAsXG4gICAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpIDwgc3VzcGVuc2V5SW1hZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpKytcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbnNleUltYWdlID0gc3VzcGVuc2V5SW1hZ2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghc3VzcGVuc2V5SW1hZ2UuY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gc3VzcGVuc2V5SW1hZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIDAgPCByZWN0LmJvdHRvbSAmJlxuICAgICAgICAgICAgICAgICAgICAwIDwgcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCA8IG93bmVyV2luZG93LmlubmVySGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCA8IG93bmVyV2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpbWdCeXRlcyArPSBlc3RpbWF0ZUltYWdlQnl0ZXMoc3VzcGVuc2V5SW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nQnl0ZXMgPiBlc3RpbWF0ZWRCeXRlc1dpdGhpbkxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgYmxvY2tpbmdQcm9taXNlcy5sZW5ndGggPSBwcmV2aW91c0ZvbnRMb2FkaW5nU3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1c3BlbnNleUltYWdlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgd2FpdEZvckltYWdlVG9Mb2FkLmJpbmQoc3VzcGVuc2V5SW1hZ2UpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NraW5nUHJvbWlzZXMucHVzaChzdXNwZW5zZXlJbWFnZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoMCA8IGJsb2NraW5nUHJvbWlzZXMubGVuZ3RoKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGJsb2NrZWRDYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgIDAgPCBwcmV2aW91c0ZvbnRMb2FkaW5nU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgID8gYmxvY2tpbmdQcm9taXNlcy5sZW5ndGggPiBwcmV2aW91c0ZvbnRMb2FkaW5nU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIldhaXRpbmcgb24gRm9udHMgYW5kIEltYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcIldhaXRpbmcgb24gRm9udHNcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiV2FpdGluZyBvbiBJbWFnZXNcIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKG93bmVyV2luZG93ID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGJsb2NraW5nUHJvbWlzZXMpLFxuICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICBTVVNQRU5TRVlfRk9OVF9BTkRfSU1BR0VfVElNRU9VVFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdKS50aGVuKGxheW91dENhbGxiYWNrLCBsYXlvdXRDYWxsYmFjaykpLFxuICAgICAgICAgICAgICAgIChwZW5kaW5nTmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgPyBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uLmZpbmlzaGVkLFxuICAgICAgICAgICAgICAgICAgICAgIG93bmVyV2luZG93XG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICA6IG93bmVyV2luZG93XG4gICAgICAgICAgICAgICAgKS50aGVuKGFmdGVyTXV0YXRpb25DYWxsYmFjaywgYWZ0ZXJNdXRhdGlvbkNhbGxiYWNrKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgbGF5b3V0Q2FsbGJhY2soKTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbilcbiAgICAgICAgICAgICAgcmV0dXJuIHBlbmRpbmdOYXZpZ2F0aW9uLmZpbmlzaGVkLnRoZW4oXG4gICAgICAgICAgICAgICAgYWZ0ZXJNdXRhdGlvbkNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGFmdGVyTXV0YXRpb25DYWxsYmFja1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYWZ0ZXJNdXRhdGlvbkNhbGxiYWNrKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eX
15852BlczogdHJhbnNpdGlvblR5cGVzXG4gICAgICAgIH0pO1xuICAgICAgICBvd25lckRvY3VtZW50Ll9fcmVhY3RWaWV3VHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG4gICAgICAgIHZhciB2aWV3VHJhbnNpdGlvbkFuaW1hdGlvbnMgPSBbXTtcbiAgICAgICAgdHJhbnNpdGlvbi5yZWFkeS50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIHZhciBhbmltYXRpb25zID0gb3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QW5pbWF0aW9ucyh7XG4gICAgICAgICAgICAgICAgICBzdWJ0cmVlOiAhMFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgICBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhciBhbmltYXRpb24gPSBhbmltYXRpb25zW2ldLFxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGFuaW1hdGlvbi5lZmZlY3QsXG4gICAgICAgICAgICAgICAgcHNldWRvRWxlbWVudCA9IGVmZmVjdC5wc2V1ZG9FbGVtZW50O1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBwc2V1ZG9FbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgcHNldWRvRWxlbWVudC5zdGFydHNXaXRoKFwiOjp2aWV3LXRyYW5zaXRpb25cIilcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmlld1RyYW5zaXRpb25BbmltYXRpb25zLnB1c2goYW5pbWF0aW9uKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBlZmZlY3QuZ2V0S2V5ZnJhbWVzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSAocHNldWRvRWxlbWVudCA9IHZvaWQgMCksXG4gICAgICAgICAgICAgICAgICAgIHVuY2hhbmdlZERpbWVuc2lvbnMgPSAhMCxcbiAgICAgICAgICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgICAgICAgICBqIDwgYW5pbWF0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIGtleWZyYW1lID0gYW5pbWF0aW9uW2pdLFxuICAgICAgICAgICAgICAgICAgICB3ID0ga2V5ZnJhbWUud2lkdGg7XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBwc2V1ZG9FbGVtZW50KSBwc2V1ZG9FbGVtZW50ID0gdztcbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBzZXVkb0VsZW1lbnQgIT09IHcpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkRGltZW5zaW9ucyA9ICExO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHcgPSBrZXlmcmFtZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBoZWlnaHQpIGhlaWdodCA9IHc7XG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQgIT09IHcpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkRGltZW5zaW9ucyA9ICExO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBrZXlmcmFtZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBrZXlmcmFtZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICBcIm5vbmVcIiA9PT0ga2V5ZnJhbWUudHJhbnNmb3JtICYmIGRlbGV0ZSBrZXlmcmFtZS50cmFuc2Zvcm07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY2hhbmdlZERpbWVuc2lvbnMgJiZcbiAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gcHNldWRvRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBoZWlnaHQgJiZcbiAgICAgICAgICAgICAgICAgIChlZmZlY3Quc2V0S2V5ZnJhbWVzKGFuaW1hdGlvbiksXG4gICAgICAgICAgICAgICAgICAodW5jaGFuZ2VkRGltZW5zaW9ucyA9IGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC5wc2V1ZG9FbGVtZW50XG4gICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgIHVuY2hhbmdlZERpbWVuc2lvbnMud2lkdGggIT09IHBzZXVkb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkRGltZW5zaW9ucy5oZWlnaHQgIT09IGhlaWdodCkgJiZcbiAgICAgICAgICAgICAgICAgICgodW5jaGFuZ2VkRGltZW5zaW9ucyA9IGFuaW1hdGlvblswXSksXG4gICAgICAgICAgICAgICAgICAodW5jaGFuZ2VkRGltZW5zaW9ucy53aWR0aCA9IHBzZXVkb0VsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgKHVuY2hhbmdlZERpbWVuc2lvbnMuaGVpZ2h0ID0gaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICh1bmNoYW5nZWREaW1lbnNpb25zID0gYW5pbWF0aW9uW2FuaW1hdGlvbi5sZW5ndGggLSAxXSksXG4gICAgICAgICAgICAgICAgICAodW5jaGFuZ2VkRGltZW5zaW9ucy53aWR0aCA9IHBzZXVkb0VsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgKHVuY2hhbmdlZERpbWVuc2lvbnMuaGVpZ2h0ID0gaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRLZXlmcmFtZXMoYW5pbWF0aW9uKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwYXduZWRXb3JrQ2FsbGJhY2soKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudC5fX3JlYWN0Vmlld1RyYW5zaXRpb24gPT09IHRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgKG93bmVyRG9jdW1lbnQuX19yZWFjdFZpZXdUcmFuc2l0aW9uID0gbnVsbCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAoZXJyb3IgPSBjdXN0b21pemVWaWV3VHJhbnNpdGlvbkVycm9yKGVycm9yLCAhMSkpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmIGVycm9yQ2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgbXV0YXRpb25DYWxsYmFjaygpLFxuICAgICAgICAgICAgICAgIGxheW91dENhbGxiYWNrKCksXG4gICAgICAgICAgICAgICAgc3B
15852hd25lZFdvcmtDYWxsYmFjaygpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkQW5pbWF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0cmFuc2l0aW9uLmZpbmlzaGVkLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlld1RyYW5zaXRpb25BbmltYXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25BbmltYXRpb25zW2ldLmNhbmNlbCgpO1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQuX19yZWFjdFZpZXdUcmFuc2l0aW9uID09PSB0cmFuc2l0aW9uICYmXG4gICAgICAgICAgICAob3duZXJEb2N1bWVudC5fX3JlYWN0Vmlld1RyYW5zaXRpb24gPSBudWxsKTtcbiAgICAgICAgICBmaW5pc2hlZEFuaW1hdGlvbigpO1xuICAgICAgICAgIHBhc3NpdmVDYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbXV0YXRpb25DYWxsYmFjaygpLFxuICAgICAgICAgIGxheW91dENhbGxiYWNrKCksXG4gICAgICAgICAgZmluaXNoZWRBbmltYXRpb24oKSxcbiAgICAgICAgICBzcGF3bmVkV29ya0NhbGxiYWNrKCksXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBWaWV3VHJhbnNpdGlvblBzZXVkb0VsZW1lbnQocHNldWRvLCBuYW1lKSB7XG4gICAgICB0aGlzLl9zY29wZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHRoaXMuX3NlbGVjdG9yID0gXCI6OnZpZXctdHJhbnNpdGlvbi1cIiArIHBzZXVkbyArIFwiKFwiICsgbmFtZSArIFwiKVwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVWaWV3VHJhbnNpdGlvbkluc3RhbmNlKG5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGdyb3VwOiBuZXcgVmlld1RyYW5zaXRpb25Qc2V1ZG9FbGVtZW50KFwiZ3JvdXBcIiwgbmFtZSksXG4gICAgICAgIGltYWdlUGFpcjogbmV3IFZpZXdUcmFuc2l0aW9uUHNldWRvRWxlbWVudChcImltYWdlLXBhaXJcIiwgbmFtZSksXG4gICAgICAgIG9sZDogbmV3IFZpZXdUcmFuc2l0aW9uUHNldWRvRWxlbWVudChcIm9sZFwiLCBuYW1lKSxcbiAgICAgICAgbmV3OiBuZXcgVmlld1RyYW5zaXRpb25Qc2V1ZG9FbGVtZW50KFwibmV3XCIsIG5hbWUpXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBGcmFnbWVudEluc3RhbmNlKGZyYWdtZW50RmliZXIpIHtcbiAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXIgPSBmcmFnbWVudEZpYmVyO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyVG9DaGlsZChcbiAgICAgIGNoaWxkLFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkKS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0eXBlLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21DaGlsZChcbiAgICAgIGNoaWxkLFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkKS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICB0eXBlLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QXR0YWNoT3B0aW9ucyhvcHRzKSB7XG4gICAgICByZXR1cm4gbnVsbCAhPSBvcHRzICYmXG4gICAgICAgIFwiYm9vbGVhblwiICE9PSB0eXBlb2Ygb3B0cyAmJlxuICAgICAgICAoITAgPT09IG9wdHMub25jZSB8fCBvcHRzLnNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKVxuICAgICAgICA/IHsgY2FwdHVyZTogb3B0cy5jYXB0dXJlLCBwYXNzaXZlOiBvcHRzLnBhc3NpdmUgfVxuICAgICAgICA6IG9wdHM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3RlbmVyT3B0aW9ucyhvcHRzKSB7XG4gICAgICByZXR1cm4gbnVsbCA9PSBvcHRzXG4gICAgICAgID8gXCJjPTBcIlxuICAgICAgICA6IFwiYm9vbGVhblwiID09PSB0eXBlb2Ygb3B0c1xuICAgICAgICAgID8gXCJjPVwiICsgKG9wdHMgPyBcIjFcIiA6IFwiMFwiKVxuICAgICAgICAgIDogXCJjPVwiICsgKG9wdHMuY2FwdHVyZSA/IFwiMVwiIDogXCIwXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbmRleE9mRXZlbnRMaXN0ZW5lcihcbiAgICAgIGV2ZW50TGlzdGVuZXJzLFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgaWYgKDAgPT09IGV2ZW50TGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIC0xO1xuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZSA9IG5vcm1hbGl6ZUxpc3RlbmVyT3B0aW9ucyhvcHRpb25zT3JVc2VDYXB0dXJlKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBldmVudExpc3RlbmVyc1tpXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW0udHlwZSA9PT0gdHlwZSAmJlxuICAgICAgICAgIGl0ZW0ubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgbm9ybWFsaXplTGlzdGVuZXJPcHRpb25zKGl0ZW0ub3B0aW9uc09yVXNlQ2FwdHVyZSkgPT09XG4gICAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9jdXNPbkZpYmVySWZGb2N1c2FibGUoZmliZXIsIGZvY3VzT3B0aW9ucykge1xuICAgICAgaWYgKDYgPT09IGZpYmVyLnRhZykgcmV0dXJuICExO1xuICAgICAgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoZmliZXIpO1xuICAgICAgcmV0dXJuIHNldEZvY3VzSWZGb2N1c2FibGUoZmliZXIsIGZvY3VzT3B0aW9ucyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbGxlY3RDaGlsZHJlbihjaGlsZCwgY29sbGVjdGlvbikge1xuICAgICAgY29sbGVjdGlvbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmx1ckFjdGl2ZUVsZW1lbnRXaXRoaW5GcmFnbWVudChjaGlsZCwgYWN0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgcmV0dXJuICExO1xuICAgICAgY2hpbGQgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGQpO1xuICAgICAgcmV0dXJuIGNoaWxkID09PSBhY3RpdmVFbGVtZW50IHx8IGNoaWxkLmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpXG4gICAgICAgID8gKGFjdGl2ZUVsZW1lbnQuYmx1cigpLCAhMClcbiAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb2JzZXJ2ZUNoaWxkKGNoaWxkLCBvYnNlcnZlcikge1xuICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgcmV0dXJuICExO1xuICAgICAgY2hpbGQgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGQpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShjaGlsZCk7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVub2JzZXJ2ZUNoaWxkKGNoaWxkLCBvYnNlcnZlcikge1xuICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgcmV0dXJuICExO1xuICAgICAgY2hpbGQgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGQpO1xuICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGNoaWxkKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVQZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlKFxuICAgICAgZnJhZ21lbn
15852RJbnN0YW5jZSxcbiAgICAgIG9ic2VydmVyLFxuICAgICAgaW5zdGFuY2VcbiAgICApIHtcbiAgICAgIHBlbmRpbmdJbnRlcnNlY3Rpb25Vbm9ic2VydmVzLnB1c2goe1xuICAgICAgICBmcmFnbWVudEluc3RhbmNlOiBmcmFnbWVudEluc3RhbmNlLFxuICAgICAgICBvYnNlcnZlcjogb2JzZXJ2ZXIsXG4gICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgfSk7XG4gICAgICBpbnRlcnNlY3Rpb25Vbm9ic2VydmVTY2hlZHVsZWQgfHxcbiAgICAgICAgKChpbnRlcnNlY3Rpb25Vbm9ic2VydmVTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgIHJlcXVlc3RQb3N0UGFpbnRDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW50ZXJzZWN0aW9uVW5vYnNlcnZlU2NoZWR1bGVkID0gITE7XG4gICAgICAgICAgdmFyIHBlbmRpbmcgPSBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcztcbiAgICAgICAgICBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBwZW5kaW5nW2ldO1xuICAgICAgICAgICAgaXRlbS5vYnNlcnZlci51bm9ic2VydmUoaXRlbS5pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbGxlY3RDbGllbnRSZWN0cyhjaGlsZCwgcmVjdHMpIHtcbiAgICAgIGlmICg2ID09PSBjaGlsZC50YWcpIHtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgIHZhciByYW5nZSA9IGNoaWxkLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGNoaWxkKTtcbiAgICAgICAgcmVjdHMucHVzaC5hcHBseShyZWN0cywgcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgKGNoaWxkID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkKSksXG4gICAgICAgICAgcmVjdHMucHVzaC5hcHBseShyZWN0cywgY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKSk7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRG9jdW1lbnRQb3NpdGlvbldpdGhGaWJlclRyZWUoXG4gICAgICBkb2
15852N1bWVudFBvc2l0aW9uLFxuICAgICAgZnJhZ21lbnRGaWJlcixcbiAgICAgIHByZWNlZGluZ0JvdW5kYXJ5RmliZXIsXG4gICAgICBmb2xsb3dpbmdCb3VuZGFyeUZpYmVyLFxuICAgICAgb3RoZXJOb2RlXG4gICAgKSB7XG4gICAgICB2YXIgb3RoZXJGaWJlciA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG90aGVyTm9kZSk7XG4gICAgICBpZiAoZG9jdW1lbnRQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSB7XG4gICAgICAgIGlmICgocHJlY2VkaW5nQm91bmRhcnlGaWJlciA9ICEhb3RoZXJGaWJlcikpXG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgZm9yICg7IG51bGwgIT09IG90aGVyRmliZXI7ICkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgNyA9PT0gb3RoZXJGaWJlci50YWcgJiZcbiAgICAgICAgICAgICAgICAob3RoZXJGaWJlciA9PT0gZnJhZ21lbnRGaWJlciB8fFxuICAgICAgICAgICAgICAgICAgb3RoZXJGaWJlci5hbHRlcm5hdGUgPT09IGZyYWdtZW50RmliZXIpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByZWNlZGluZ0JvdW5kYXJ5RmliZXIgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG90aGVyRmliZXIgPSBvdGhlckZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZWNlZGluZ0JvdW5kYXJ5RmliZXIgPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVjZWRpbmdCb3VuZGFyeUZpYmVyO1xuICAgICAgfVxuICAgICAgaWYgKGRvY3VtZW50UG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TKSB7XG4gICAgICAgIGlmIChudWxsID09PSBvdGhlckZpYmVyKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAob3RoZXJGaWJlciA9IG90aGVyTm9kZS5vd25lckRvY3VtZW50KSxcbiAgICAgICAgICAgIG90aGVyTm9kZSA9PT0gb3RoZXJGaWJlciB8fFxuICAgICAgICAgICAgICBvdGhlck5vZGUgPT09IG90aGVyRmliZXIuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgIG90aGVyTm9kZSA9PT0gb3RoZXJGaWJlci5ib2R5XG4gICAgICAgICAgKTtcbiAgICAgICAgYToge1xuICAgICAgICAgIG90aGVyRmliZXIgPSBmcmFnbWVudEZpYmVyO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBmcmFnbWVudEZpYmVyID1cbiAgICAgICAgICAgICAgZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoZnJhZ21lbnRGaWJlcik7XG4gICAgICAgICAgICBudWxsICE9PSBvdGhlckZpYmVyO1xuXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKDUgIT09IG90aGVyRmliZXIudGFnICYmXG4gICAgICAgICAgICAgICAgICAzICE9PSBvdGhlckZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgICAgICAgMjcgIT09IG90aGVyRmliZXIudGFnKSB8fFxuICAgICAgICAgICAgICAgIChvdGhlckZpYmVyICE9PSBmcmFnbWVudEZpYmVyICYmXG4gICAgICAgICAgICAgICAgICBvdGhlckZpYmVyLmFsdGVybmF0ZSAhPT0gZnJhZ21lbnRGaWJlcilcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG90aGVyRmliZXIgPSAhMDtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG90aGVyRmliZXIgPSBvdGhlckZpYmVyLnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3RoZXJGaWJlciA9ICExO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdGhlckZpYmVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50UG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICAgICA/ICgoZnJhZ21lbnRGaWJlciA9ICEhb3RoZXJGaWJlcikgJiZcbiAgICAgICAgICAgICEoZnJhZ21lbnRGaWJlciA9IG90aGVyRmliZXIgPT09IHByZWNlZGluZ0JvdW5kYXJ5RmliZXIpICYmXG4gICAgICAgICAgICAoKGZyYWdtZW50RmliZXIgPSBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihcbiAgICAgICAgICAgICAgcHJlY2VkaW5nQm91bmRhcnlGaWJlcixcbiAgICAgICAgICAgICAgb3RoZXJGaWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyZW50Rm9yRnJhZ21lbnRBbmNlc3RvcnNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgbnVsbCA9PT0gZnJhZ21lbnRGaWJlclxuICAgICAgICAgICAgICA/IChmcmFnbWVudEZpYmVyID0gITEpXG4gICAgICAgICAgICAgIDogKHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICAgICAgICBmcmFnbWVudEZpYmVyLFxuICAgICAgICAgICAgICAgICAgITAsXG4gICAgICAgICAgICAgICAgICBpc0ZpYmVyUHJlY2VkaW5nQ2hlY2ssXG4gICAgICAgICAgICAgICAgICBvdGhlckZpYmVyLFxuICAgICAgICAgICAgICAgICAgcHJlY2VkaW5nQm91bmRhcnlGaWJlclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKG90aGVyRmliZXIgPSBzZWFyY2hUYXJnZXQpLFxuICAgICAgICAgICAgICAgIChzZWFyY2hUYXJnZXQgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAoZnJhZ21lbnRGaWJlciA9IG51bGwgIT09IG90aGVyRmliZXIpKSksXG4gICAgICAgICAgZnJhZ21lbnRGaWJlcilcbiAgICAgICAgOiBkb2N1bWVudFBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkdcbiAgICAgICAgICA/ICgoZnJhZ21lbnRGaWJlciA9ICEhb3RoZXJGaWJlcikgJiZcbiAgICAgICAgICAgICAgIShmcmFnbWVudEZpYmVyID0gb3RoZXJGaWJlciA9PT0gZm9sbG93aW5nQm91bmRhcnlGaWJlcikgJiZcbiAgICAgICAgICAgICAgKChmcmFnbWVudEZpYmVyID0gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoXG4gICAgICAgICAgICAgICAgZm9sbG93aW5nQm91bmRhcnlGaWJlcixcbiAgICAgICAgICAgICAgICBvdGhlckZpYmVyLFxuICAgICAgICAgICAgICAgIGdldFBhcmVudEZvckZyYWdtZW50QW5jZXN0b3JzXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBudWxsID09PSBmcmFnbWVudEZpYmVyXG4gICAgICAgICAgICAgICAgPyAoZnJhZ21lbn
15852RGaWJlciA9ICExKVxuICAgICAgICAgICAgICAgIDogKHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50RmliZXIsXG4gICAgICAgICAgICAgICAgICAgICEwLFxuICAgICAgICAgICAgICAgICAgICBpc0ZpYmVyRm9sbG93aW5nQ2hlY2ssXG4gICAgICAgICAgICAgICAgICAgIG90aGVyRmliZXIsXG4gICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZ0JvdW5kYXJ5RmliZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAob3RoZXJGaWJlciA9IHNlYXJjaFRhcmdldCksXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQm91bmRhcnkgPSBzZWFyY2hUYXJnZXQgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgIChmcmFnbWVudEZpYmVyID0gbnVsbCAhPT0gb3RoZXJGaWJlcikpKSxcbiAgICAgICAgICAgIGZyYWdtZW50RmliZXIpXG4gICAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2Nyb2xsVGV4dE5vZGVJbnRvVmlldyh0ZXh0Tm9kZSwgcmVzb2x2ZWRBbGlnblRvVG9wKSB7XG4gICAgICB2YXIgcmFuZ2UgPSB0ZXh0Tm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHModGV4dE5vZGUpO1xuICAgICAgdGV4dE5vZGUgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyhcbiAgICAgICAgd2luZG93LnNjcm9sbFggKyB0ZXh0Tm9kZS5sZWZ0LFxuICAgICAgICByZXNvbHZlZEFsaWduVG9Ub3BcbiAgICAgICAgICA/IHdpbmRvdy5zY3JvbGxZICsgdGV4dE5vZGUudG9wXG4gICAgICAgICAgOiB3aW5kb3cuc2Nyb2xsWSArIHRleHROb2RlLmJvdHRvbSAtIHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkRnJhZ21lbnRIYW5kbGVUb0ZpYmVyKGNoaWxkLCBmcmFnbWVudEluc3RhbmNlKSB7XG4gICAgICBjaGlsZCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZCk7XG4gICAgICBhZGRGcmFnbWVudEhhbmRsZVRvSW5zdGFuY2UoY2hpbGQsIGZyYWdtZW50SW5zdGFuY2UpO1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRGcmFnbWVudEhhbmRsZVRvSW5zdGFuY2UoaW5zdGFuY2UsIGZyYWdtZW50SW5zdGFuY2UpIHtcbiAgICAgIG51bGwgPT0gaW5zdGFuY2UucmVhY3RGcmFnbWVudHMgJiYgKGluc3RhbmNlLnJlYWN0RnJhZ21lbnRzID0gbmV3IFNldCgpKTtcbiAgICAgIGluc3RhbmNlLnJlYWN0RnJhZ21lbnRzLmFkZChmcmFnbWVudEluc3RhbmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2UoY2hpbGRJbnN0YW5jZSwgZnJhZ21lbnRJbnN0YW5jZSkge1xuICAgICAgdmFyIGV2ZW50TGlzdGVuZXJzID0gZnJhZ21lbnRJbnN0YW5jZS5fZXZlbnRMaXN0ZW5lcnM7XG4gICAgICBpZiAobnVsbCAhPT0gZXZlbnRMaXN0ZW5lcnMpXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIGkkanNjb21wJDAgPSAwO1xuICAgICAgICAgIGkkanNjb21wJDAgPCBldmVudExpc3RlbmVycy5sZW5ndGg7XG4gICAgICAgICAgaSRqc2NvbXAkMCsrXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBfZXZlbnRMaXN0ZW5lcnMkaTIgPSBldmVudExpc3RlbmVyc1tpJGpzY29tcCQwXTtcbiAgICAgICAgICBjaGlsZEluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaTIudHlwZSxcbiAgICAgICAgICAgIF9ldmVudExpc3RlbmVycyRpMi5hdHRhY2hlZExpc3RlbmVyLFxuICAgICAgICAgICAgZ2V0QXR0YWNoT3B0aW9ucyhfZXZlbnRMaXN0ZW5lcnMkaTIub3B0aW9uc09yVXNlQ2FwdHVyZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAzICE9PSBjaGlsZEluc3RhbmNlLm5vZGVUeXBlICYmXG4gICAgICAgICgoZXZlbnRMaXN0ZW5lcnMgPSBmcmFnbWVudEluc3RhbmNlLl9vYnNlcnZlcnMpLFxuICAgICAgICBudWxsICE9PSBldmVudExpc3RlbmVycyAmJlxuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICB2Y
15852XIgd3JpdGVJZHggPSAwLCBpID0gMDtcbiAgICAgICAgICAgICAgaSA8IHBlbmRpbmdJbnRlcnNlY3Rpb25Vbm9ic2VydmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlc1tpXTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBlbmRpbmcuZnJhZ21lbnRJbnN0YW5jZSAhPT0gZnJhZ21lbnRJbnN0YW5jZSB8fFxuICAgICAgICAgICAgICAgIHBlbmRpbmcub2JzZXJ2ZXIgIT09IG9ic2VydmVyIHx8XG4gICAgICAgICAgICAgICAgcGVuZGluZy5pbnN0YW5jZSAhPT0gY2hpbGRJbnN0YW5jZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXNbd3JpdGVJZHgrK10gPSBwZW5kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXMubGVuZ3RoID0gd3JpdGVJZHg7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGNoaWxkSW5zdGFuY2UpO1xuICAgICAgICAgIH0pLFxuICAgICAgICBhZGRGcmFnbWVudEhhbmRsZVRvSW5zdGFuY2UoY2hpbGRJbnN0YW5jZSwgZnJhZ21lbnRJbnN0YW5jZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWxldGVDaGlsZEZyb21GcmFnbWVudEluc3RhbmNlKGNoaWxkSW5zdGFuY2UsIGZyYWdtZW50SW5zdGFuY2UpIHtcbiAgICAgIHZhciBldmVudExpc3RlbmVycyA9IGZyYWdtZW50SW5zdGFuY2UuX2V2ZW50TGlzdGVuZXJzO1xuICAgICAgaWYgKG51bGwgIT09IGV2ZW50TGlzdGVuZXJzKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9ldmVudExpc3RlbmVycyRpMyA9IGV2ZW50TGlzdGVuZXJzW2ldO1xuICAgICAgICAgIGNoaWxkSW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIF9ldmVudExpc3RlbmVycyRpMy50eXBlLFxuICAgICAgICAgICAgX2V2ZW50TGlzdGVuZXJzJGkzLmF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgICBnZXRBdHRhY2hPcHRpb25zKF9ldmVudExpc3RlbmVycyRpMy5vcHRpb25zT3JVc2VDYXB0dXJlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIDMgIT09IGNoaWxkSW5zdGFuY2Uubm9kZVR5cGUgJiZcbiAgICAgICAgKChldmVudExpc3RlbmVycyA9IGZyYWdtZW50SW5zdGFuY2UuX29ic2VydmVycyksXG4gICAgICAgIG51bGwgIT09IGV2ZW50TGlzdGVuZXJzICYmXG4gICAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvYnNlcnZlci5yb290TWFyZ2luXG4gICAgICAgICAgICAgID8gc2NoZWR1bGVQZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlKFxuICAgICAgICAgICAgICAgICAgZnJhZ21lbnRJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLFxuICAgICAgICAgICAgICAgICAgY2hpbGRJbnN0YW5jZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvYnNlcnZlci51bm9ic2VydmUoY2hpbGRJbnN0YW5jZSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIG51bGwgIT0gY2hpbGRJbnN0YW5jZS5yZWFjdEZyYWdtZW50cyAmJlxuICAgICAgICAgIGNoaWxkSW5zdGFuY2UucmVhY3RGcmFnbWVudHMuZGVsZXRlKGZyYWdtZW50SW5zdGFuY2UpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xlYXJDb250YWluZXJTcGFyaW5nbHkoY29udGFpbmVyKSB7XG4gICAgICB2Y
15852XIgbmV4dE5vZGUgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIG5leHROb2RlICYmIDEwID09PSBuZXh0Tm9kZS5ub2RlVHlwZSAmJiAobmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZyk7XG4gICAgICBmb3IgKDsgbmV4dE5vZGU7ICkge1xuICAgICAgICB2YXIgbm9kZSA9IG5leHROb2RlO1xuICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICBzd2l0Y2ggKG5vZGUubm9kZU5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiSFRNTFwiOlxuICAgICAgICAgIGNhc2UgXCJIRUFEXCI6XG4gICAgICAgICAgY2FzZSBcIkJPRFlcIjpcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyU3BhcmluZ2x5KG5vZGUpO1xuICAgICAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIlNDUklQVFwiOlxuICAgICAgICAgIGNhc2UgXCJTVFlMRVwiOlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIkxJTktcIjpcbiAgICAgICAgICAgIGlmIChcInN0eWxlc2hlZXRcIiA9PT0gbm9kZS5yZWwudG9Mb3dlckNhc2UoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpblJvb3RPclNpbmdsZXRvbikge1xuICAgICAgZm9yICg7IDEgPT09IGluc3RhbmNlLm5vZGVUeXBlOyApIHtcbiAgICAgICAgdmFyIGFueVByb3BzID0gcHJvcHM7XG4gICAgICAgIGlmIChpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaW5Sb290T3JTaW5nbGV0b24gJiZcbiAgICAgICAgICAgIChcIklOUFVUXCIgIT09IGluc3RhbmNlLm5vZGVOYW1lIHx8IFwiaGlkZGVuXCIgIT09IGluc3RhbmNlLnR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoIWluUm9vdE9yU2luZ2xldG9uKVxuICAgICAgICAgIGlmIChcImlucHV0XCIgPT09IHR5cGUgJiYgXCJoaWRkZW5cIiA9PT0gaW5zdGFuY2UudHlwZSkge1xuICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihhbnlQcm9wcy5uYW1lLCBcIm5hbWVcIik7XG4gICAgICAgICAgICB2Y
15852XIgbmFtZSA9IG51bGwgPT0gYW55UHJvcHMubmFtZSA/IG51bGwgOiBcIlwiICsgYW55UHJvcHMubmFtZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJoaWRkZW5cIiA9PT0gYW55UHJvcHMudHlwZSAmJlxuICAgICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09PSBuYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICBlbHNlIGlmICghaW5zdGFuY2VbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdKVxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcIm1ldGFcIjpcbiAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKSkgYnJlYWs7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgICAgIG5hbWUgPSBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIik7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gbmFtZSAmJlxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmhhc0F0dHJpYnV0ZShcImRhdGEtcHJlY2VkZW5jZVwiKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG5hbWUgIT09IGFueVByb3BzLnJlbCB8fFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcImhyZWZcIikgIT09XG4gICAgICAgICAgICAgICAgICAobnVsbCA9PSBhbnlQcm9wcy5ocmVmIHx8IFwiXCIgPT09IGFueVByb3BzLmhyZWZcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogYW55UHJvcHMuaHJlZikgfHxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJjcm9zc29yaWdpblwiKSAhPT1cbiAgICAgICAgICAgICAgICAgIChudWxsID09IGFueVByb3BzLmNyb3NzT3JpZ2luXG4gICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IGFueVByb3BzLmNyb3NzT3JpZ2luKSB8fFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpICE9PVxuICAgICAgICAgICAgICAgICAgKG51bGwgPT0gYW55UHJvcHMudGl0bGUgPyBudWxsIDogYW55UHJvcHMudGl0bGUpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJkYXRhLXByZWNlZGVuY2VcIikpIGJyZWFrO1xuICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgICAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICAgICAgICAgIG5hbWUgPSBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobmFtZSAhPT0gKG51bGwgPT0gYW55UHJvcHMuc3JjID8gbnVsbCA6IGFueVByb3BzLnNyYykgfHxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09XG4gICAgICAgICAgICAgICAgICAgIChudWxsID09IGFueVByb3BzLnR5cGUgPyBudWxsIDogYW55UHJvcHMudHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIpICE9PVxuICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBhbnlQcm9wcy5jcm9zc09yaWdpblxuICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgIDogYW55UHJvcHMuY3Jvc3NPcmlnaW4pKSAmJlxuICAgICAgICAgICAgICAgIG5hbWUgJiZcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJhc3luY1wiKSAmJlxuICAgICAgICAgICAgICAgICFpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xuICAgICAgICBpZiAobnVsbCA9PT0gaW5zdGFuY2UpIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQsIGluUm9vdE9yU2luZ2xldG9uKSB7XG4gICAgICBpZiAoXCJcIiA9PT0gdGV4dCkgcmV0dXJuIG51bGw7XG4gICAgICBmb3IgKDsgMyAhPT0gaW5zdGFuY2Uubm9kZVR5cGU7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKDEgIT09IGluc3RhbmNlLm5vZGVUeXBlIHx8XG4gICAgICAgICAgICBcIklOUFVUXCIgIT09IGluc3RhbmNlLm5vZGVOYW1lIHx8XG4gICAgICAgICAgICBcImhpZGRlblwiICE9PSBpbnN0YW5jZS50eXBlKSAmJlxuICAgICAgICAgICFpblJvb3RPclNpbmdsZXRvblxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xuICAgICAgICBpZiAobnVsbCA9PT0gaW5zdGFuY2UpIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5IeWRyYXRlSHlkcmF0aW9uQm91bmRhcnkoaW5zdGFuY2UsIGluUm9vdE9yU2luZ2xldG9uKSB7XG4gICAgICBmb3IgKDsgOCAhPT0gaW5zdGFuY2Uubm9kZVR5cGU7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKDEgIT09IGluc3RhbmNlLm5vZGVUeXBlIHx8XG4gICAgICAgICAgICBcIklOUFVUXCIgIT09IGluc3RhbmNlLm5vZGVOYW1lIHx8XG4gICAgICAgICAgICBcImhpZGRlblwiICE9PSBpbnN0YW5jZS50eXBlKSAmJlxuICAgICAgICAgIC
15852FpblJvb3RPclNpbmdsZXRvblxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xuICAgICAgICBpZiAobnVsbCA9PT0gaW5zdGFuY2UpIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUVVFVUVEX1NUQVJUX0RBVEFcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8XG4gICAgICAgIChpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgJiZcbiAgICAgICAgICBpbnN0YW5jZS5vd25lckRvY3VtZW50LnJlYWR5U3RhdGUgIT09IERPQ1VNRU5UX1JFQURZX1NUQVRFX0xPQURJTkcpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaW5zdGFuY2Uub3duZXJEb2N1bWVudDtcbiAgICAgIGlmIChpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSlcbiAgICAgICAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbiAgICAgIGVsc2UgaWYgKFxuICAgICAgICBpbnN0YW5jZS5kYXRhICE9PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgb3duZXJEb2N1bWVudC5yZWFkeVN0YXRlICE9PSBET0NVTUVOVF9SRUFEWV9TVEFURV9MT0FESU5HXG4gICAgICApXG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBsaXN0ZW5lcik7XG4gICAgICAgIH07XG4gICAgICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgbGlzdGVuZXIpO1xuICAgICAgICBpbnN0YW5jZS5fcmVhY3RSZXRyeSA9IGxpc3RlbmVyO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZShub2RlKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPSBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgICAgICB2Y
15852XIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICBpZiAoMSA9PT0gbm9kZVR5cGUgfHwgMyA9PT0gbm9kZVR5cGUpIGJyZWFrO1xuICAgICAgICBpZiAoOCA9PT0gbm9kZVR5cGUpIHtcbiAgICAgICAgICBub2RlVHlwZSA9IG5vZGUuZGF0YTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBub2RlVHlwZSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fFxuICAgICAgICAgICAgbm9kZVR5cGUgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGVUeXBlID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGVUeXBlID09PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSB8fFxuICAgICAgICAgICAgbm9kZVR5cGUgPT09IEFDVElWSVRZX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGVUeXBlID09PSBGT1JNX1NUQVRFX0lTX01BVENISU5HIHx8XG4gICAgICAgICAgICBub2RlVHlwZSA9PT0gRk9STV9TVEFURV9JU19OT1RfTUFUQ0hJTkdcbiAgICAgICAgICApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IFNVU1BFTlNFX0VORF9EQVRBIHx8IG5vZGVUeXBlID09PSBBQ1RJVklUWV9FTkRfREFUQSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVIeWRyYXRhYmxlSW5zdGFuY2VGb3JEZXZXYXJuaW5ncyhpbnN0YW5jZSkge1xuICAgICAgaWYgKDEgPT09IGluc3RhbmNlLm5vZGVUeXBlKSB7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIEpTQ29tcGlsZXJfdGVtcF9jb25zdCA9IGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyA9IHt9LFxuICAgICAgICAgICAgYXR0cmlidXRlcyA9IGluc3RhbmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBpIDwgYXR0cmlidXRlcy5sZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1tnZXRQcm9wTmFtZUZyb21BdHRyaWJ1dGVOYW1lKGF0dHIubmFtZSldID1cbiAgICAgICAgICAgIFwic3R5bGVcIiA9PT0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgPyBnZXRTdHlsZXNPYmplY3RGcm9tRWxlbWVudChpbnN0YW5jZSlcbiAgICAgICAgICAgICAgOiBhdHRyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHR5cGU6IEpTQ29tcGlsZXJfdGVtcF9jb25zdCwgcHJvcHM6IHNlcnZlckRpZmZlcmVuY2VzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gOCA9PT0gaW5zdGFuY2Uubm9kZVR5cGVcbiAgICAgICAgPyBpbnN0YW5jZS5kYXRhID09PSBBQ1RJVklUWV9TVEFSVF9EQVRBXG4gICAgICAgICAgPyB7IHR5cGU6IFwiQWN0aXZpdHlcIiwgcHJvcHM6IHt9IH1cbiAgICAgICAgICA6IHsgdHlwZTogXCJTdXNwZW5zZVwiLCBwcm9wczoge30gfVxuICAgICAgICA6IGluc3RhbmNlLm5vZGVWYWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dEZvckRldldhcm5pbmdzKHRleHRJbnN0YW5jZSwgdGV4dCwgcGFyZW50UHJvcHMpIHtcbiAgICAgIHJldHVybiBudWxsID09PSBwYXJlbnRQcm9wcyB8fFxuICAgICAgICAhMCAhPT0gcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddXG4gICAgICAgID8gKHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPT09IHRleHRcbiAgICAgICAgICAgID8gKHRleHRJbnN0YW5jZSA9IG51bGwpXG4gICAgICAgICAgICA6ICgodGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSh0ZXh0KSksXG4gICAgICAgICAgICAgICh0ZXh0SW5zdGFuY2UgPVxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgIDogdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSkpLFxuICAgICAgICAgIHRleHRJbnN0YW5jZSlcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJIeWRyYXRpb25Cb3VuZGFyeShcbiAgICAgIGh5ZHJhdGlvbkluc3RhbmNlXG4gICAgKSB7XG4gICAgICBoeWRyYXRpb25JbnN0YW5jZSA9IGh5ZHJhdGlvbkluc3RhbmNlLm5leHRTaWJsaW5nO1xuICAgICAgZm9yICh2YXIgZGVwdGggPSAwOyBoeWRyYXRpb25JbnN0YW5jZTsgKSB7XG4gICAgICAgIGlmICg4ID09PSBoeWRyYXRpb25JbnN0YW5jZS5ub2RlVHlwZSkge1xuICAgICAgICAgIHZhciBkYXRhID0gaHlkcmF0aW9uSW5zdGFuY2UuZGF0YTtcbiAgICAgICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEgfHwgZGF0YSA9PT0gQUNUSVZJVFlfRU5EX0RBVEEpIHtcbiAgICAgICAgICAgIGlmICgwID09PSBkZXB0aClcbiAgICAgICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKGh5ZHJhdGlvbkluc3RhbmNlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAoZGF0YSAhPT0gU1VTUEVOU0VfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBkYXRhICE9PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBICYmXG4gICAgICAgICAgICAgIGRhdGEgIT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBkYXRhICE9PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBkYXRhICE9PSBBQ1RJVklUWV9TVEFSVF9EQVRBKSB8fFxuICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGlvbkluc3RhbmNlID0gaHlkcmF0aW9uSW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0UGFyZW50SHlkcmF0aW9uQm91bmRhcnkodGFyZ2V0SW5zdGFuY2UpIHtcbiAgICAgIHRhcmdldEluc3RhbmNlID0gdGFyZ2V0SW5zdGFuY2UucHJldmlvdXNTaWJsaW5nO1xuICAgICAgZm9yICh2YXIgZGVwdGggPSAwOyB0YXJnZXRJbnN0YW5jZTsgKSB7XG4gICAgICAgIGlmICg4ID09PSB0YXJnZXRJbnN0YW5jZS5ub2RlVHlwZSkge1xuICAgICAgICAgI
15852HZhciBkYXRhID0gdGFyZ2V0SW5zdGFuY2UuZGF0YTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIGRhdGEgPT09IFNVU1BFTlNFX1FVRVVFRF9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBkYXRhID09PSBBQ1RJVklUWV9TVEFSVF9EQVRBXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gZGVwdGgpIHJldHVybiB0YXJnZXRJbnN0YW5jZTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAoZGF0YSAhPT0gU1VTUEVOU0VfRU5EX0RBVEEgJiYgZGF0YSAhPT0gQUNUSVZJVFlfRU5EX0RBVEEpIHx8XG4gICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0SW5zdGFuY2UgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gICAgICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkQWN0aXZpdHlJbnN0YW5jZShhY3Rpdml0eUluc3RhbmNlKSB7XG4gICAgICByZXRyeUlmQmxvY2tlZE9uKGFjdGl2aXR5SW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9jdXNJZkZvY3VzYWJsZShub2RlLCBmb2N1c09wdGlvbnMpIHtcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzKCkge1xuICAgICAgICBkaWRGb2N1cyA9ICEwO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBub2RlKSByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgZGlkRm9jdXMgPSAhMTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vZGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgaGFuZGxlRm9jdXMsICEwKSxcbiAgICAgICAgICAobm9kZS5mb2N1cyB8fCBIVE1MRWxlbWVudC5wcm90b3R5cGUuZm9jdXMpLmNhbGwobm9kZSwgZm9jdXNPcHRpb25zKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIG5vZGUub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgaGFuZGxlRm9jdXMsICEwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaWRGb2N1cztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVxdWVzdFBvc3RQYWludENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICBsb2NhbFJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvY2FsUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlU2luZ2xldG9uSW5zdGFuY2UoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICByb290Q29udGFpbmVySW5zdGFuY2UsXG4gICAgICBob3N0Q29udGV4dCxcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZ0RldlxuICAgICkge1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nRGV2ICYmXG4gICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBob3N0Q29udGV4dC5hbmNlc3RvckluZm8pO1xuICAgICAgcHJvcHMgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICAgIHR5cGUgPSBwcm9wcy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiUmVhY3QgZXhwZWN0ZWQgYW4gPGh0bWw+IGVsZW1lbnQgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgdG8gZXhpc3QgaW4gdGhlIERvY3VtZW50IGJ1dCBvbmUgd2FzIG5vdCBmb3VuZC4gUmVhY3QgbmV2ZXIgcmVtb3ZlcyB0aGUgZG9jdW1lbnRFbGVtZW50IGZvciBhbnkgRG9jdW1lbnQgaXQgcmVuZGVycyBpbnRvIHNvIHRoZSBjYXVzZSBpcyBsaWtlbHkgaW4gc29tZSBvdGhlciBzY3JpcHQgcnVubmluZyBvbiB0aGlzIHBhZ2UuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIGNhc2UgXCJoZWFkXCI6XG4gICAgICAgICAgdHlwZSA9IHByb3BzLmhlYWQ7XG4gICAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiUmVhY3QgZXhwZWN0ZWQgYSA8aGVhZD4gZWxlbWVudCAoZG9jdW1lbnQuaGVhZCkgdG8gZXhpc3QgaW4gdGhlIERvY3VtZW50IGJ1dCBvbmUgd2FzIG5vdCBmb3VuZC4gUmVhY3QgbmV2ZXIgcmVtb3ZlcyB0aGUgaGVhZCBmb3IgYW55IERvY3VtZW50IGl0IHJlbmRlcnMgaW50byBzbyB0aGUgY2F1c2UgaXMgbGlrZWx5IGluIHNvbWUgb3RoZXIgc2NyaXB0IHJ1bm5pbmcgb24gdGhpcyBwYWdlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgIHR5cGUgPSBwcm9wcy5ib2R5O1xuICAgICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIlJlYWN0IGV4cGVjdGVkIGEgPGJvZHk+IGVsZW1lbnQgKGRvY3VtZW50LmJvZHkpIHRvIGV4aXN0IGluIHRoZSBEb2N1bWVudCBidXQgb25lIHdhcyBub3QgZm91bmQuIFJlYWN0IG5ldmVyIHJlbW92ZXMgdGhlIGJvZHkgZm9yIGFueSBEb2N1bWVudCBpdCByZW5kZXJzIGludG8gc28gdGhlIGNhdXNlIGlzIGxpa2VseSBpbiBzb21lIG90aGVyIHNjcmlwdCBydW5uaW5nIG9uIHRoaXMgcGFnZS5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwicmVzb2x2ZVNpbmdsZXRvbkluc3RhbmNlIHdhcyBjYWxsZWQgd2l0aCBhbiBlbGVtZW50IHR5cGUgdGhhdCBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWNxdWlyZVNpbmdsZXRvbkluc3RhbmNlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBpbnRlcm5hbEluc3RhbmNlSGFuZGxlXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpbnN0YW5jZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSAmJlxuICAgICAgICBnZXRJbnN0YW5jZUZyb21Ob2RlKGluc3RhbmNlKVxuICAgICAgKSB7XG4gICAgICAgIHZhciB0YWdOYW1lID0gaW5zdGFuY2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiWW91IGFyZSBtb3VudGluZyBhIG5ldyAlcyBjb21wb25lbnQgd2hlbiBhIHByZXZpb3VzIG9uZSBoYXMgbm90IGZpcnN0IHVubW91bnRlZC4gSXQgaXMgYW4gZXJyb3IgdG8gcmVuZGVyIG1vcmUgdGhhbiBvbmUgJXMgY29tcG9uZW50IGF0IGEgdGltZSBhbmQgYXR0cmlidXRlcyBhbmQgY2hpbGRyZW4gb2YgdGhlc2UgY29tcG9uZW50cyB3aWxsIGxpa2VseSBmYWlsIGluIHVucHJlZGljdGFibGUgd2F5cy4gUGxlYXNlIG9ubHkgcmVuZGVyIGEgc2luZ2xlIGluc3RhbmNlIG9mIDwlcz4gYW5kIGlmIHlvdSBuZWVkIHRvIG1vdW50IGEgbmV3IG9uZSwgZW5zdXJlIGFueSBwcmV2aW91cyBvbmVzIGhhdmUgdW5tb3VudGVkIGZpcnN0LlwiLFxuICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICB0YWdOYW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImh0bWxcIjpcbiAgICAgICAgY2FzZSBcImhlYWRcIjpcbiAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJhY3F1aXJlU2luZ2xldG9uSW5zdGFuY2Ugd2FzIGNhbGxlZCB3aXRoIGFuIGVsZW1lbnQgdHlwZSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgaXMgYSBidW
15852cgaW4gUmVhY3QuXCJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yICh0YWdOYW1lID0gaW5zdGFuY2UuYXR0cmlidXRlczsgdGFnTmFtZS5sZW5ndGg7IClcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlTm9kZSh0YWdOYW1lWzBdKTtcbiAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcyk7XG4gICAgICBpbnN0YW5jZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGludGVybmFsSW5zdGFuY2VIYW5kbGU7XG4gICAgICBpbnN0YW5jZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxlYXNlU2luZ2xldG9uSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wS2V5IGluIHByb3BzKSB7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wS2V5XTtcbiAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgJiZcbiAgICAgICAgICBudWxsICE9IHByb3BWYWx1ZSAmJlxuICAgICAgICAgIHNldFByb3AoaW5zdGFuY2UsIHR5cGUsIHByb3BLZXksIG51bGwsIGVtcHR5UHJvcHMsIHByb3BWYWx1ZSk7XG4gICAgICB9XG4gICAgICBudWxsICE9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIChpbnN0YW5jZS50ZXh0Q29udGVudCA9IFwiXCIpO1xuICAgICAgaW5zdGFuY2Uub25jbGljayA9PT0gbm9vcCQxICYmIChpbnN0YW5jZS5vbmNsaWNrID0gbnVsbCk7XG4gICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhclNpbmdsZXRvblByZWFtYmxlQ29udHJpYnV0aW9uKGluc3RhbmNlKSB7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2UuYXR0cmlidXRlczsgYXR0cmlidXRlcy5sZW5ndGg7IClcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyaWJ1dGVzWzBdKTtcbiAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEhvaXN0YWJsZVJvb3QoY29udGFpbmVyKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGFpbmVyLmdldFJvb3ROb2RlKSB7XG4gICAgICAgIHZhciByb290Tm9kZSA9IGNvbnRhaW5lci5nZXRSb290Tm9kZSgpO1xuICAgICAgICBpZiAoOSA9PT0gcm9vdE5vZGUubm9kZVR5cGUgfHwgMTEgPT09IHJvb3ROb2RlLm5vZGVUeXBlKVxuICAgICAgICAgIHJldHVybiByb290Tm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiA5ID09PSBjb250YWluZXIubm9kZVR5cGUgPyBjb250YWluZXIgOiBjb250YWluZXIub3duZXJEb2N1bWVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlY29ubmVjdEFzKHJlbCwgaHJlZiwgY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gZ2xvYmFsRG9jdW1lbnQ7XG4gICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBcInN0cmluZ1wiID09PSB0eXBlb2YgaHJlZiAmJiBocmVmKSB7XG4gICAgICAgIHZhciBsaW1pdGVkRXNjYXBlZEhyZWYgPVxuICAgICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoaHJlZik7XG4gICAgICAgIGxpbWl0ZWRFc2NhcGVkSHJlZiA9XG4gICAgICAgICAgJ2xpbmtbcmVsPVwiJyArIHJlbCArICdcIl1baHJlZj1cIicgKyBsaW1pdGVkRXNjYXBlZEhyZWYgKyAnXCJdJztcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNyb3NzT3JpZ2luICYmXG4gICAgICAgICAgKGxpbWl0ZWRFc2NhcGVkSHJlZiArPSAnW2Nyb3Nzb3JpZ2luPVwiJyArIGNyb3NzT3JpZ2luICsgJ1wiXScpO1xuICAgICAgICBwcmVjb25uZWN0c1NldC5oYXMobGltaXRlZEVzY2FwZWRIcmVmKSB8fFxuICAgICAgICAgIChwcmVjb25uZWN0c1NldC5hZGQobGltaXRlZEVzY2FwZWRIcmVmKSxcbiAgICAgICAgICAocmVsID0geyByZWw6IHJlbCwgY3Jvc3NPcmlnaW46IGNyb3NzT3JpZ2luLCBocmVmOiBocmVmIH0pLFxuICAgICAgICAgIG51bGwgPT09IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihsaW1pdGVkRXNjYXBlZEhyZWYpICYmXG4gICAgICAgICAgICAoKGhyZWYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpKSxcbiAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGhyZWYsIFwibGlua1wiLCByZWwpLFxuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShocmVmKSxcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChocmVmKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRSZXNvdXJjZSh0eXBlLCBjdXJyZW50UHJvcHMsIHBlbmRpbmdQcm9wcywgY3VycmVudFJlc291cmNlKSB7XG4gICAgICB2Y
15852XIgcmVzb3VyY2VSb290ID0gKHJlc291cmNlUm9vdCA9IHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpXG4gICAgICAgID8gZ2V0SG9pc3RhYmxlUm9vdChyZXNvdXJjZVJvb3QpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmICghcmVzb3VyY2VSb290KVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnXCJyZXNvdXJjZVJvb3RcIiB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJ1xuICAgICAgICApO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgIGNhc2UgXCJ0aXRsZVwiOlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcy5wcmVjZWRlbmNlICYmXG4gICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcGVuZGluZ1Byb3BzLmhyZWZcbiAgICAgICAgICAgID8gKChwZW5kaW5nUHJvcHMgPSBnZXRTdHlsZUtleShwZW5kaW5nUHJvcHMuaHJlZikpLFxuICAgICAgICAgICAgICAoY3VycmVudFByb3BzID1cbiAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXNGcm9tUm9vdChyZXNvdXJjZVJvb3QpLmhvaXN0YWJsZVN0eWxlcyksXG4gICAgICAgICAgICAgIChjdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UHJvcHMuZ2V0KHBlbmRpbmdQcm9wcykpLFxuICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgICAoKGN1cnJlbnRSZXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3R5bGVcIixcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgY291bnQ6IDAsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogbnVsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wcy5zZXQocGVuZGluZ1Byb3BzLCBjdXJyZW50UmVzb3VyY2UpKSxcbiAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlKVxuICAgICAgICAgICAgOiB7IHR5cGU6IFwidm9pZFwiLCBpbnN0YW5jZTogbnVsbCwgY291bnQ6IDAsIHN0YXRlOiBudWxsIH07XG4gICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJzdHlsZXNoZWV0XCIgPT09IHBlbmRpbmdQcm9wcy5yZWwgJiZcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwZW5kaW5nUHJvcHMuaHJlZiAmJlxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcy5wcmVjZWRlbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gZ2V0U3R5bGVLZXkocGVuZGluZ1Byb3BzLmhyZWYpO1xuICAgICAgICAgICAgdmFyIF9zdHlsZXMgPSBnZXRSZXNvdXJjZXNGcm9tUm9vdChyZXNvdXJjZVJvb3QpLmhvaXN0YWJsZVN0eWxlcyxcbiAgICAgICAgICAgICAgX3Jlc291cmNlID0gX3N0eWxlcy5nZXQodHlwZSk7XG4gICAgICAgICAgICBfcmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgKChyZXNvdXJjZVJvb3QgPSByZXNvdXJjZVJvb3Qub3duZXJEb2N1bWVudCB8fCByZXNvdXJjZVJvb3QpLFxuICAgICAgICAgICAgICAoX3Jlc291cmNlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3R5bGVzaGVldFwiLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB7IGxvYWRpbmc6IE5vdExvYWRlZCwgcHJlbG9hZDogbnVsbCB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfc3R5bGVzLnNldCh0eXBlLCBfcmVzb3VyY2UpLFxuICAgICAgICAgICAgICAoX3N0eWxlcyA9IHJlc291cmNlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgIGdldFN0eWxlc2hlZXRTZWxlY3RvckZyb21LZXkodHlwZSlcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA/IF9zdHlsZXMuX3AgfHxcbiAgICAgICAgICAgICAgICAgICgoX3Jlc291cmNlLmluc3RhbmNlID0gX3N0eWxlcyksXG4gICAgICAgICAgICAgICAgICAoX3Jlc291cmNlLnN0YXRlLmxvYWRpbmcgPSBMb2FkZWQgfCBJbnNlcnRlZCkpXG4gICAgICAgICAgICAgICAgOiAoKF9zdHlsZXMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KHR5cGUpKSxcbiAgICAgICAgICAgICAgICAgIF9zdHlsZXMgfHxcbiAgICAgICAgICAgICAgICAgICAgKChfc3R5bGVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlbDogXCJwcmVsb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXM6IFwic3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgICBocmVmOiBwZW5kaW5nUHJvcHMuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogcGVuZGluZ1Byb3BzLmNyb3NzT3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICAgIGludGVncml0eTogcGVuZGluZ1Byb3BzLmludGVncml0eSxcbiAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogcGVuZGluZ1Byb3BzLm1lZGlhLFxuICAgICAgICAgICAgICAgICAgICAgIGhyZWZMYW5nOiBwZW5kaW5nUHJvcHMuaHJlZkxhbmcsXG4gICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6IHBlbmRpbmdQcm9wcy5yZWZlcnJlclBvbGljeVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFByb3BzTWFwLnNldCh0eXBlLCBfc3R5bGVzKSksXG4gICAgICAgICAgICAgICAgICBwcmVsb2FkU3R5bGVzaGVldChcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VSb290LFxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICBfc3R5bGVzLFxuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2Uuc3RhdGVcbiAgICAgICAgICAgICAgICAgICkpKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcHMgJiYgbnVsbCA9PT0gY3VycmVudFJlc291cmNlKVxuICAgICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICAgKChwZW5kaW5nUHJvcHMgPVxuICAgICAgICAgICAgICAgICAgXCJcXG5cXG4gIC0gXCIgK1xuICAgICAgICAgICAgICAgICAgZGVzY3JpYmVMaW5rRm9yUmVzb3VyY2VFcnJvckRFVihjdXJyZW50UHJvcHMpICtcbiAgICAgICAgICAgICAgICAgIFwiXFxuICArIFwiICtcbiAgICAgICAgICAgICAgICAgIGRlc2NyaWJlTGlua0ZvclJlc291cmNlRXJyb3JERVYocGVuZGluZ1Byb3BzKSksXG4gICAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkV4cGVjdGVkIDxsaW5rPiBub3QgdG8gdXBkYXRlIHRvIGJlIHVwZGF0ZWQgdG8gYSBzdHlsZXNoZWV0IHdpdGggcHJlY2VkZW5jZS4gQ2hlY2sgdGhlIGByZWxgLCBgaHJlZmAsIGFuZCBgcHJlY2VkZW5jZWAgcHJvcHMgb2YgdGhpcyBjb21wb25lbnQuIEFsdGVybmF0aXZlbHksIGNoZWNrIHdoZXRoZXIgdHdvIGRpZmZlcmVudCA8bGluaz4gY29tcG9uZW50cyByZW5kZXIgaW4gdGhlIHNhbWUgc2xvdCBvciBzaGFyZSB0aGUgc2FtZSBrZXkuXCIgK1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUHJvcHNcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIF9yZXNvdXJjZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRQcm9wcyAmJiBudWxsICE9PSBjdXJyZW50UmVzb3VyY2UpXG4gICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICgocGVuZGluZ1Byb3BzID1cbiAgICAgICAgICAgICAgICBcIlxcblxcbiAgLSBcIiArXG4gICAgICAgICAgICAgICAgZGVzY3JpYmVMaW5rRm9yUmVzb3VyY2VFcnJvckRFVihjdXJyZW50UHJvcHMpICtcbiAgICAgICAgICAgICAgICBcIlxcbiAgKyBcIiArXG4gICAgICAgICAgICAgICAgZGVzY3JpYmVMaW5rRm9yUmVzb3VyY2VFcnJvckRFVihwZW5kaW5nUHJvcHMpKSxcbiAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJFeHBlY3RlZCBzdHlsZXNoZWV0IHdpdGggcHJlY2VkZW5jZSB0byBub3QgYmUgdXBkYXRlZCB0byBhIGRpZmZlcmVudCBraW5kIG9mIDxsaW5rPi4gQ2hlY2sgdGhlIGByZWxgLCBgaHJlZmAsIGFuZCBgcHJlY2VkZW5jZWAgcHJvcHMgb2YgdGhpcyBjb21wb25lbnQuIEFsdGVybmF0aXZlbHksIGNoZWNrIHdoZXRoZXIgdHdvIGRpZmZlcmVudCA8bGluaz4gY29tcG9uZW50cyByZW5kZXIgaW4gdGhlIHNhbWUgc2xvdCBvciBzaGFyZSB0aGUgc2FtZSBrZXkuXCIgK1xuICAgICAgICAgICAgICAgICAgcGVuZGluZ1Byb3BzXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgI
15852HJldHVybiBudWxsO1xuICAgICAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChjdXJyZW50UHJvcHMgPSBwZW5kaW5nUHJvcHMuYXN5bmMpLFxuICAgICAgICAgICAgKHBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcy5zcmMpLFxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcyAmJlxuICAgICAgICAgICAgY3VycmVudFByb3BzICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjdXJyZW50UHJvcHMgJiZcbiAgICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBjdXJyZW50UHJvcHNcbiAgICAgICAgICAgICAgPyAoKHBlbmRpbmdQcm9wcyA9IGdldFNjcmlwdEtleShwZW5kaW5nUHJvcHMpKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudFByb3BzID1cbiAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlc0Zyb21Sb290KHJlc291cmNlUm9vdCkuaG9pc3RhYmxlU2NyaXB0cyksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRQcm9wcy5nZXQocGVuZGluZ1Byb3BzKSksXG4gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlIHx8XG4gICAgICAgICAgICAgICAgICAoKGN1cnJlbnRSZXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzY3JpcHRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogbnVsbFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcHMuc2V0KHBlbmRpbmdQcm9wcywgY3VycmVudFJlc291cmNlKSksXG4gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlKVxuICAgICAgICAgICAgICA6IHsgdHlwZTogXCJ2b2lkXCIsIGluc3RhbmNlOiBudWxsLCBjb3VudDogMCwgc3RhdGU6IG51bGwgfVxuICAgICAgICAgICk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0UmVzb3VyY2UgZW5jb3VudGVyZWQgYSB0eXBlIGl0IGRpZCBub3QgZXhwZWN0OiBcIicgK1xuICAgICAgICAgICAgICB0eXBlICtcbiAgICAgICAgICAgICAgJ1wiLiB0aGlzIGlzIGEgYnVnIGluIFJlYWN0LidcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUxpbmtGb3JSZXNvdXJjZUVycm9yREVWKHByb3BzKSB7XG4gICAgICB2Y
15852XIgZGVzY3JpYmVkUHJvcHMgPSAwLFxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiPGxpbmtcIjtcbiAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwcm9wcy5yZWxcbiAgICAgICAgPyAoZGVzY3JpYmVkUHJvcHMrKywgKGRlc2NyaXB0aW9uICs9ICcgcmVsPVwiJyArIHByb3BzLnJlbCArICdcIicpKVxuICAgICAgICA6IGhhc093blByb3BlcnR5LmNhbGwocHJvcHMsIFwicmVsXCIpICYmXG4gICAgICAgICAgKGRlc2NyaWJlZFByb3BzKyssXG4gICAgICAgICAgKGRlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICAnIHJlbD1cIicgK1xuICAgICAgICAgICAgKG51bGwgPT09IHByb3BzLnJlbCA/IFwibnVsbFwiIDogXCJpbnZhbGlkIHR5cGUgXCIgKyB0eXBlb2YgcHJvcHMucmVsKSArXG4gICAgICAgICAgICAnXCInKSk7XG4gICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuaHJlZlxuICAgICAgICA/IChkZXNjcmliZWRQcm9wcysrLCAoZGVzY3JpcHRpb24gKz0gJyBocmVmPVwiJyArIHByb3BzLmhyZWYgKyAnXCInKSlcbiAgICAgICAgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBcImhyZWZcIikgJiZcbiAgICAgICAgICAoZGVzY3JpYmVkUHJvcHMrKyxcbiAgICAgICAgICAoZGVzY3JpcHRpb24gKz1cbiAgICAgICAgICAgICcgaHJlZj1cIicgK1xuICAgICAgICAgICAgKG51bGwgPT09IHByb3BzLmhyZWZcbiAgICAgICAgICAgICAgPyBcIm51bGxcIlxuICAgICAgICAgICAgICA6IFwiaW52YWxpZCB0eXBlIFwiICsgdHlwZW9mIHByb3BzLmhyZWYpICtcbiAgICAgICAgICAgICdcIicpKTtcbiAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwcm9wcy5wcmVjZWRlbmNlXG4gICAgICAgID8gKGRlc2NyaWJlZFByb3BzKyssXG4gICAgICAgICAgKGRlc2NyaXB0aW9uICs9ICcgcHJlY2VkZW5jZT1cIicgKyBwcm9wcy5wcmVjZWRlbmNlICsgJ1wiJykpXG4gICAgICAgIDogaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgXCJwcmVjZWRlbmNlXCIpICYmXG4gICAgICAgICAgKGRlc2NyaWJlZFByb3BzKyssXG4gICAgICAgICAgKGRlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICBcIiBwcmVjZWRlbmNlPXtcIiArXG4gICAgICAgICAgICAobnVsbCA9PT0gcHJvcHMucHJlY2VkZW5jZVxuICAgICAgICAgICAgICA/IFwibnVsbFwiXG4gICAgICAgICAgICAgIDogXCJpbnZhbGlkIHR5cGUgXCIgKyB0eXBlb2YgcHJvcHMucHJlY2VkZW5jZSkgK1xuICAgICAgICAgICAgXCJ9XCIpKTtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3BzKS5sZW5ndGggPiBkZXNjcmliZWRQcm9wcyAmJlxuICAgICAgICAoZGVzY3JpcHRpb24gKz0gXCIgLi4uXCIpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uICsgXCIgLz5cIjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3R5bGVLZXkoaHJlZikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgJ2hyZWY9XCInICsgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhocmVmKSArICdcIidcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFN0eWxlc2hlZXRTZWxlY3RvckZyb21LZXkoa2V5KSB7XG4gICAgICByZXR1cm4gJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXVsnICsga2V5ICsgXCJdXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0eWxlc2hlZXRQcm9wc0Zyb21SYXdQcm9wcyhyYXdQcm9wcykge1xuICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcmF3UHJvcHMsIHtcbiAgICAgICAgXCJkYXRhLXByZWNlZGVuY2VcIjogcmF3UHJvcHMucHJlY2VkZW5jZSxcbiAgICAgICAgcHJlY2VkZW5jZTogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZWxvYWRTdHlsZXNoZWV0KG93bmVyRG9jdW1lbnQsIGtleSwgcHJlbG9hZFByb3BzLCBzdGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAoa2V5ID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICdsaW5rW3JlbD1cInByZWxvYWRcIl1bYXM9XCJzdHlsZVwiXVsnICsga2V5ICsgXCJdXCJcbiAgICAgICAgKSlcbiAgICAgICkge1xuICAgICAgICBpZiAoITAgIT09IGtleVtpbnRlcm5hbExvYWRQZW5kaW5nS2V5XSkge1xuICAgICAgICAgIHN0YXRlLmxvYWRpbmcgPSBMb2FkZWQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgKGtleSA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLFxuICAgICAgICAgIChrZXlbaW50ZXJuYWxMb2FkUGVuZGluZ0tleV0gPSAhMCksXG4gICAgICAgICAgKGtleS5vbmxvYWQgPSBrZXkub25lcnJvciA9IGNsZWFyUGVuZGluZ0xvYWRPbk5vZGUuYmluZChudWxsLCBrZXkpKSxcbiAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhrZXksIFwibGlua1wiLCBwcmVsb2FkUHJvcHMpLFxuICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoa2V5KSxcbiAgICAgICAgICBvd25lckRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoa2V5KTtcbiAgICAgIHN0YXRlLnByZWxvYWQgPSBrZXk7XG4gICAgICBrZXkuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHN0YXRlLmxvYWRpbmcgfD0gTG9hZGVkKTtcbiAgICAgIH0pO1xuICAgICAga2V5LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoc3RhdGUubG9hZGluZyB8PSBFcnJvcmVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTY3JpcHRLZXkoc3JjKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAnW3NyYz1cIicgKyBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKHNyYykgKyAnXCJdJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSkge1xuICAgICAgcmV0dXJuIFwic2NyaXB0W2FzeW5jXVwiICsga2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBhY3F1aXJlUmVzb3VyY2UoaG9pc3RhYmxlUm9vdCwgcmVzb3VyY2UsIHByb3BzKSB7XG4gICAgICByZXNvdXJjZS5jb3VudCsrO1xuICAgICAgaWYgKG51bGwgPT09IHJlc291cmNlLmluc3RhbmNlKVxuICAgICAgICBzd2l0Y2ggKHJlc291cmNlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgI
15852HZhciBpbnN0YW5jZSA9IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgJ3N0eWxlW2RhdGEtaHJlZn49XCInICtcbiAgICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKHByb3BzLmhyZWYpICtcbiAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSlcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAocmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhciBzdHlsZVByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgICAgICBcImRhdGEtaHJlZlwiOiBwcm9wcy5ocmVmLFxuICAgICAgICAgICAgICBcImRhdGEtcHJlY2VkZW5jZVwiOiBwcm9wcy5wcmVjZWRlbmNlLFxuICAgICAgICAgICAgICBocmVmOiBudWxsLFxuICAgICAgICAgICAgICBwcmVjZWRlbmNlOiBudWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlID0gKFxuICAgICAgICAgICAgICBob2lzdGFibGVSb290Lm93bmVyRG9jdW1lbnQgfHwgaG9pc3RhYmxlUm9vdFxuICAgICAgICAgICAgKS5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGluc3RhbmNlLCBcInN0eWxlXCIsIHN0eWxlUHJvcHMpO1xuICAgICAgICAgICAgaW5zZXJ0U3R5bGVzaGVldChpbnN0YW5jZSwgcHJvcHMucHJlY2VkZW5jZSwgaG9pc3RhYmxlUm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gKHJlc291cmNlLmluc3RhbmNlID0gaW5zdGFuY2UpO1xuICAgICAgICAgIGNhc2UgXCJzdHlsZXNoZWV0XCI6XG4gICAgICAgICAgICBzdHlsZVByb3BzID0gZ2V0U3R5bGVLZXkocHJvcHMuaHJlZik7XG4gICAgICAgICAgICB2Y
15852XIgX2luc3RhbmNlID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KHN0eWxlUHJvcHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZSlcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAocmVzb3VyY2Uuc3RhdGUubG9hZGluZyB8PSBJbnNlcnRlZCksXG4gICAgICAgICAgICAgICAgKHJlc291cmNlLmluc3RhbmNlID0gX2luc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKF9pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgX2luc3RhbmNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHN0eWxlc2hlZXRQcm9wc0Zyb21SYXdQcm9wcyhwcm9wcyk7XG4gICAgICAgICAgICAoc3R5bGVQcm9wcyA9IHByZWxvYWRQcm9wc01hcC5nZXQoc3R5bGVQcm9wcykpICYmXG4gICAgICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU3R5bGVzaGVldChpbnN0YW5jZSwgc3R5bGVQcm9wcyk7XG4gICAgICAgICAgICBfaW5zdGFuY2UgPSAoXG4gICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290XG4gICAgICAgICAgICApLmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShfaW5zdGFuY2UpO1xuICAgICAgICAgICAgdmFyIGxpbmtJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICAgICAgICAgIGxpbmtJbnN0YW5jZS5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgbGlua0luc3RhbmNlLm9ubG9hZCA9IHJlc29sdmU7XG4gICAgICAgICAgICAgIGxpbmtJbnN0YW5jZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhfaW5zdGFuY2UsIFwibGlua1wiLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICByZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkO1xuICAgICAgICAgICAgaW5zZXJ0U3R5bGVzaGVldChfaW5zdGFuY2UsIHByb3BzLnByZWNlZGVuY2UsIGhvaXN0YWJsZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIChyZXNvdXJjZS5pbnN0YW5jZSA9IF9pbnN0YW5jZSk7XG4gICAgICAgICAgY2FzZSBcInNjcmlwdFwiOlxuICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0U2NyaXB0S2V5KHByb3BzLnNyYyk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChzdHlsZVByb3BzID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgIGdldFNjcmlwdFNlbGVjdG9yRnJvbUtleShfaW5zdGFuY2UpXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKHJlc291cmNlLmluc3RhbmNlID0gc3R5bGVQcm9wcyksXG4gICAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShzdHlsZVByb3BzKSxcbiAgICAgICAgICAgICAgICBzdHlsZVByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHByb3BzO1xuICAgICAgICAgICAgaWYgKChzdHlsZVByb3BzID0gcHJlbG9hZFByb3BzTWFwLmdldChfaW5zdGFuY2UpKSlcbiAgICAgICAgICAgICAgKGluc3RhbmNlID0gYXNzaWduKHt9LCBwcm9wcykpLFxuICAgICAgICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU2NyaXB0KGluc3RhbmNlLCBzdHlsZVByb3BzKTtcbiAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QgPSBob2lzdGFibGVSb290Lm93bmVyRG9jdW1lbnQgfHwgaG9pc3RhYmxlUm9vdDtcbiAgICAgICAgICAgIHN0eWxlUHJvcHMgPSBob2lzdGFibGVSb290LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKHN0eWxlUHJvcHMpO1xuICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoc3R5bGVQcm9wcywgXCJsaW5rXCIsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiAocmVzb3VyY2UuaW5zdGFuY2UgPSBzdHlsZVByb3BzKTtcbiAgICAgICAgICBjYXNlIFwidm9pZFwiOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAnYWNxdWlyZVJlc291cmNlIGVuY291bnRlcmVkIGEgcmVzb3VyY2UgdHlwZSBpdCBkaWQgbm90IGV4cGVjdDogXCInICtcbiAgICAgICAgICAgICAgICByZXNvdXJjZS50eXBlICtcbiAgICAgICAgICAgICAgICAnXCIuIHRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gcmVzb3VyY2UudHlwZSAmJlxuICAgICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgSW5zZXJ0ZWQpID09PSBOb3RMb2FkZWQgJiZcbiAgICAgICAgICAoKGluc3RhbmNlID0gcmVzb3VyY2UuaW5zdGFuY2UpLFxuICAgICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkKSxcbiAgICAgICAgICBpbnNlcnRTdHlsZXNoZWV0KGluc3RhbmNlLCBwcm9wcy5wcmVjZWRlbmNlLCBob2lzdGFibGVSb290KSk7XG4gICAgICByZXR1cm4gcmVzb3VyY2UuaW5zdGFuY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydFN0eWxlc2hlZXQoaW5zdGFuY2UsIHByZWNlZGVuY2UsIHJvb3QpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBub2RlcyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1bZGF0YS1wcmVjZWRlbmNlXSxzdHlsZVtkYXRhLXByZWNlZGVuY2VdJ1xuICAgICAgICAgICksXG4gICAgICAgICAgbGFzdCA9IG5vZGVzLmxlbmd0aCA/IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdIDogbnVsbCxcbiAgICAgICAgICBwcmlvciA9IGxhc3QsXG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIGkgPCBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGkrK1xuICAgICAgKSB7XG4gICAgICAgI
15852HZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLmRhdGFzZXQucHJlY2VkZW5jZSA9PT0gcHJlY2VkZW5jZSkgcHJpb3IgPSBub2RlO1xuICAgICAgICBlbHNlIGlmIChwcmlvciAhPT0gbGFzdCkgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmlvclxuICAgICAgICA/IHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluc3RhbmNlLCBwcmlvci5uZXh0U2libGluZylcbiAgICAgICAgOiAoKHByZWNlZGVuY2UgPSA5ID09PSByb290Lm5vZGVUeXBlID8gcm9vdC5oZWFkIDogcm9vdCksXG4gICAgICAgICAgcHJlY2VkZW5jZS5pbnNlcnRCZWZvcmUoaW5zdGFuY2UsIHByZWNlZGVuY2UuZmlyc3RDaGlsZCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZG9wdFByZWxvYWRQcm9wc0ZvclN0eWxlc2hlZXQoc3R5bGVzaGVldFByb3BzLCBwcmVsb2FkUHJvcHMpIHtcbiAgICAgIG51bGwgPT0gc3R5bGVzaGVldFByb3BzLmNyb3NzT3JpZ2luICYmXG4gICAgICAgIChzdHlsZXNoZWV0UHJvcHMuY3Jvc3NPcmlnaW4gPSBwcmVsb2FkUHJvcHMuY3Jvc3NPcmlnaW4pO1xuICAgICAgbnVsbCA9PSBzdHlsZXNoZWV0UHJvcHMucmVmZXJyZXJQb2xpY3kgJiZcbiAgICAgICAgKHN0eWxlc2hlZXRQcm9wcy5yZWZlcnJlclBvbGljeSA9IHByZWxvYWRQcm9wcy5yZWZlcnJlclBvbGljeSk7XG4gICAgICBudWxsID09IHN0eWxlc2hlZXRQcm9wcy50aXRsZSAmJlxuICAgICAgICAoc3R5bGVzaGVldFByb3BzLnRpdGxlID0gcHJlbG9hZFByb3BzLnRpdGxlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc2NyaXB0UHJvcHMsIHByZWxvYWRQcm9wcykge1xuICAgICAgbnVsbCA9PSBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbiAmJlxuICAgICAgICAoc2NyaXB0UHJvcHMuY3Jvc3NPcmlnaW4gPSBwcmVsb2FkUHJvcHMuY3Jvc3NPcmlnaW4pO1xuICAgICAgbnVsbCA9PSBzY3JpcHRQcm9wcy5yZWZlcnJlclBvbGljeSAmJlxuICAgICAgICAoc2NyaXB0UHJvcHMucmVmZXJyZXJQb2xpY3kgPSBwcmVsb2FkUHJvcHMucmVmZXJyZXJQb2xpY3kpO1xuICAgICAgbnVsbCA9PSBzY3JpcHRQcm9wcy5pbnRlZ3JpdHkgJiZcbiAgICAgICAgKHNjcmlwdFByb3BzLmludGVncml0eSA9IHByZWxvYWRQcm9wcy5pbnRlZ3JpdHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRIeWRyYXRhYmxlSG9pc3RhYmxlQ2FjaGUodHlwZSwga2V5QXR0cmlidXRlLCBvd25lckRvY3VtZW50KSB7XG4gICAgICBpZiAobnVsbCA9PT0gdGFnQ2FjaGVzKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGNhY2hlcyA9ICh0YWdDYWNoZXMgPSBuZXcgTWFwKCkpO1xuICAgICAgICBjYWNoZXMuc2V0KG93bmVyRG9jdW1lbnQsIGNhY2hlKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICAoY2FjaGVzID0gdGFnQ2FjaGVzKSxcbiAgICAgICAgICAoY2FjaGUgPSBjYWNoZXMuZ2V0KG93bmVyRG9jdW1lbnQpKSxcbiAgICAgICAgICBjYWNoZSB8fCAoKGNhY2hlID0gbmV3IE1hcCgpKSwgY2FjaGVzLnNldChvd25lckRvY3VtZW50LCBjYWNoZSkpO1xuICAgICAgaWYgKGNhY2hlLmhhcyh0eXBlKSkgcmV0dXJuIGNhY2hlO1xuICAgICAgY2FjaGUuc2V0KHR5cGUsIG51bGwpO1xuICAgICAgb3duZXJEb2N1bWVudCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHlwZSk7XG4gICAgICBmb3IgKGNhY2hlcyA9IDA7IGNhY2hlcyA8IG93bmVyRG9jdW1lbnQubGVuZ3RoOyBjYWNoZXMrKykge1xuICAgICAgICB2Y
15852XIgbm9kZSA9IG93bmVyRG9jdW1lbnRbY2FjaGVzXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEoXG4gICAgICAgICAgICBub2RlW2ludGVybmFsSG9pc3RhYmxlTWFya2VyXSB8fFxuICAgICAgICAgICAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fFxuICAgICAgICAgICAgKFwibGlua1wiID09PSB0eXBlICYmIFwic3R5bGVzaGVldFwiID09PSBub2RlLmdldEF0dHJpYnV0ZShcInJlbFwiKSlcbiAgICAgICAgICApICYmXG4gICAgICAgICAgbm9kZS5uYW1lc3BhY2VVUkkgIT09IFNWR19OQU1FU1BBQ0VcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIG5vZGVLZXkgPSBub2RlLmdldEF0dHJpYnV0ZShrZXlBdHRyaWJ1dGUpIHx8IFwiXCI7XG4gICAgICAgICAgbm9kZUtleSA9IHR5cGUgKyBub2RlS2V5O1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IGNhY2hlLmdldChub2RlS2V5KTtcbiAgICAgICAgICBleGlzdGluZyA/IGV4aXN0aW5nLnB1c2gobm9kZSkgOiBjYWNoZS5zZXQobm9kZUtleSwgW25vZGVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudEhvaXN0YWJsZShob2lzdGFibGVSb290LCB0eXBlLCBpbnN0YW5jZSkge1xuICAgICAgaG9pc3RhYmxlUm9vdCA9IGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290O1xuICAgICAgaG9pc3RhYmxlUm9vdC5oZWFkLmluc2VydEJlZm9yZShcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIFwidGl0bGVcIiA9PT0gdHlwZSA/IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcImhlYWQgPiB0aXRsZVwiKSA6IG51bGxcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzSG9zdEhvaXN0YWJsZVR5cGUodHlwZSwgcHJvcHMsIGhvc3RDb250ZXh0KSB7XG4gICAgICB2Y
15852XIgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ID1cbiAgICAgICAgIWhvc3RDb250ZXh0LmFuY2VzdG9ySW5mby5jb250YWluZXJUYWdJblNjb3BlO1xuICAgICAgaWYgKFxuICAgICAgICBob3N0Q29udGV4dC5jb250ZXh0ID09PSBIb3N0Q29udGV4dE5hbWVzcGFjZVN2ZyB8fFxuICAgICAgICBudWxsICE9IHByb3BzLml0ZW1Qcm9wXG4gICAgICApXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIW91dHNpZGVIb3N0Q29udGFpbmVyQ29udGV4dCB8fFxuICAgICAgICAgICAgbnVsbCA9PSBwcm9wcy5pdGVtUHJvcCB8fFxuICAgICAgICAgICAgKFwibWV0YVwiICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgIFwidGl0bGVcIiAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICBcInN0eWxlXCIgIT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgXCJsaW5rXCIgIT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgXCJzY3JpcHRcIiAhPT0gdHlwZSkgfHxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiQ2Fubm90IHJlbmRlciBhIDwlcz4gb3V0c2lkZSB0aGUgbWFpbiBkb2N1bWVudCBpZiBpdCBoYXMgYW4gYGl0ZW1Qcm9wYCBwcm9wLiBgaXRlbVByb3BgIHN1Z2dlc3RzIHRoZSB0YWcgYmVsb25ncyB0byBhbiBgaXRlbVNjb3BlYCB3aGljaCBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBET00uIElmIHlvdSB3ZXJlIGludGVuZGluZyBmb3IgUmVhY3QgdG8gaG9pc3QgdGhpcyA8JXM+IHJlbW92ZSB0aGUgYGl0ZW1Qcm9wYCBwcm9wLiBPdGhlcndpc2UsIHRyeSBtb3ZpbmcgdGhpcyB0YWcgaW50byB0aGUgPGhlYWQ+IG9yIDxib2R5PiBvZiB0aGUgRG9jdW1lbnQuXCIsXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgITFcbiAgICAgICAgKTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwibWV0YVwiOlxuICAgICAgICBjYXNlIFwidGl0bGVcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5wcmVjZWRlbmNlIHx8XG4gICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcHMuaHJlZiB8fFxuICAgICAgICAgICAgXCJcIiA9PT0gcHJvcHMuaHJlZlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCByZW5kZXIgYSA8c3R5bGU+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBrbm93aW5nIGl0cyBwcmVjZWRlbmNlIGFuZCBhIHVuaXF1ZSBocmVmIGtleS4gUmVhY3QgY2FuIGhvaXN0IGFuZCBkZWR1cGxpY2F0ZSA8c3R5bGU+IHRhZ3MgaWYgeW91IHByb3ZpZGUgYSBgcHJlY2VkZW5jZWAgcHJvcCBhbG9uZyB3aXRoIGFuIGBocmVmYCBwcm9wIHRoYXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgYGhyZWZgIHZhbHVlcyB1c2VkIGluIGFueSBvdGhlciBob2lzdGVkIDxzdHlsZT4gb3IgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIC4uLj4gdGFncy4gIE5vdGUgdGhhdCBob2lzdGluZyA8c3R5bGU+IHRhZ3MgaXMgY29uc2lkZXJlZCBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgbW9zdCB3aWxsIG5vdCB1c2UgZGlyZWN0bHkuIENvbnNpZGVyIG1vdmluZyB0aGUgPHN0eWxlPiB0YWcgdG8gdGhlIDxoZWFkPiBvciBjb25zaWRlciBhZGRpbmcgYSBgcHJlY2VkZW5jZT1cImRlZmF1bHRcImAgYW5kIGBocmVmPVwic29tZSB1bmlxdWUgcmVzb3VyY2UgaWRlbnRpZmllclwiYC4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5yZWwgfHxcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5ocmVmIHx8XG4gICAgICAgICAgICBcIlwiID09PSBwcm9wcy5ocmVmIHx8XG4gICAgICAgICAgICBwcm9wcy5vbkxvYWQgfHxcbiAgICAgICAgICAgIHByb3BzLm9uRXJyb3JcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJzdHlsZXNoZWV0XCIgPT09IHByb3BzLnJlbCAmJlxuICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMucHJlY2VkZW5jZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHR5cGUgPSBwcm9wcy5ocmVmO1xuICAgICAgICAgICAgICB2Y
15852XIgb25FcnJvciA9IHByb3BzLm9uRXJyb3IsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZDtcbiAgICAgICAgICAgICAgaG9zdENvbnRleHQgPSBbXTtcbiAgICAgICAgICAgICAgcHJvcHMub25Mb2FkICYmIGhvc3RDb250ZXh0LnB1c2goXCJgb25Mb2FkYFwiKTtcbiAgICAgICAgICAgICAgb25FcnJvciAmJiBob3N0Q29udGV4dC5wdXNoKFwiYG9uRXJyb3JgXCIpO1xuICAgICAgICAgICAgICBudWxsICE9IGRpc2FibGVkICYmIGhvc3RDb250ZXh0LnB1c2goXCJgZGlzYWJsZWRgXCIpO1xuICAgICAgICAgICAgICBvbkVycm9yID0gcHJvcE5hbWVzTGlzdEpvaW4oaG9zdENvbnRleHQsIFwiYW5kXCIpO1xuICAgICAgICAgICAgICBvbkVycm9yICs9IDEgPT09IGhvc3RDb250ZXh0Lmxlbmd0aCA/IFwiIHByb3BcIiA6IFwiIHByb3BzXCI7XG4gICAgICAgICAgICAgIGRpc2FibGVkID1cbiAgICAgICAgICAgICAgICAxID09PSBob3N0Q29udGV4dC5sZW5ndGggPyBcImFuIFwiICsgb25FcnJvciA6IFwidGhlIFwiICsgb25FcnJvcjtcbiAgICAgICAgICAgICAgaG9zdENvbnRleHQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdSZWFjdCBlbmNvdW50ZXJlZCBhIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJXNcIiAuLi4gLz4gd2l0aCBhIGBwcmVjZWRlbmNlYCBwcm9wIHRoYXQgYWxzbyBpbmNsdWRlZCAlcy4gVGhlIHByZXNlbmNlIG9mIGxvYWRpbmcgYW5kIGVycm9yIGhhbmRsZXJzIGluZGljYXRlcyBhbiBpbnRlbnQgdG8gbWFuYWdlIHRoZSBzdHlsZXNoZWV0IGxvYWRpbmcgc3RhdGUgZnJvbSB5b3VyIGZyb20geW91ciBDb21wb25lbnQgY29kZSBhbmQgUmVhY3Qgd2lsbCBub3QgaG9pc3Qgb3IgZGVkdXBsaWNhdGUgdGhpcyBzdHlsZXNoZWV0LiBJZiB5b3VyIGludGVudCB3YXMgdG8gaGF2ZSBSZWFjdCBob2lzdCBhbmQgZGVkdXBsY2lhdGUgdGhpcyBzdHlsZXNoZWV0IHVzaW5nIHRoZSBgcHJlY2VkZW5jZWAgcHJvcCByZW1vdmUgdGhlICVzLCBvdGhlcndpc2UgcmVtb3ZlIHRoZSBgcHJlY2VkZW5jZWAgcHJvcC4nLFxuICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgb25FcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRzaWRlSG9zdENvbnRhaW5lckNvbnRleHQgJiZcbiAgICAgICAgICAgICAgKFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5yZWwgfHxcbiAgICAgICAgICAgICAgXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHByb3BzLmhyZWYgfHxcbiAgICAgICAgICAgICAgXCJcIiA9PT0gcHJvcHMuaHJlZlxuICAgICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3QgcmVuZGVyIGEgPGxpbms+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBhIGByZWxgIGFuZCBgaHJlZmAgcHJvcC4gVHJ5IGFkZGluZyBhIGByZWxgIGFuZC9vciBgaHJlZmAgcHJvcCB0byB0aGlzIDxsaW5rPiBvciBtb3ZpbmcgdGhlIGxpbmsgaW50byB0aGUgPGhlYWQ+IHRhZ1wiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiAocHJvcHMub25FcnJvciB8fCBwcm9wcy5vbkxvYWQpICYmXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCByZW5kZXIgYSA8bGluaz4gd2l0aCBvbkxvYWQgb3Igb25FcnJvciBsaXN0ZW5lcnMgb3V0c2lkZSB0aGUgbWFpbiBkb2N1bWVudC4gVHJ5IHJlbW92aW5nIG9uTG9hZD17Li4ufSBhbmQgb25FcnJvcj17Li4ufSBvciBtb3ZpbmcgaXQgaW50byB0aGUgcm9vdCA8aGVhZD4gdGFnIG9yIHNvbWV3aGVyZSBpbiB0aGUgPGJvZHk+LlwiXG4gICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHByb3BzLnJlbCkge1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlc2hlZXRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAodHlwZSA9IHByb3BzLnByZWNlZGVuY2UpLFxuICAgICAgICAgICAgICAgIChwcm9wcyA9IHByb3BzLmRpc2FibGVkKSxcbiAgICAgICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ICYmXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IHJlbmRlciBhIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiAvPiBvdXRzaWRlIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQga25vd2luZyBpdHMgcHJlY2VkZW5jZS4gQ29uc2lkZXIgYWRkaW5nIHByZWNlZGVuY2U9XCJkZWZhdWx0XCIgb3IgbW92aW5nIGl0IGludG8gdGhlIHJvb3QgPGhlYWQ+IHRhZy4nXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlICYmIG51bGwgPT0gcHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICB0eXBlID1cbiAgICAgICAgICAgIHByb3BzLmFzeW5jICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBwcm9wcy5hc3luYyAmJlxuICAgICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHByb3BzLmFzeW5jO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0eXBlIHx8XG4gICAgICAgICAgICBwcm9wcy5vbkxvYWQgfHxcbiAgICAgICAgICAgIHByb3BzLm9uRXJyb3IgfHxcbiAgICAgICAgICAgICFwcm9wcy5zcmMgfHxcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5zcmNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG91dHNpZGVIb3N0Q29udGFpbmVyQ29udGV4dCAmJlxuICAgICAgICAgICAgICAodHlwZVxuICAgICAgICAgICAgICAgID8gcHJvcHMub25Mb2FkIHx8IHByb3BzLm9uRXJyb3JcbiAgICAgICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCByZW5kZXIgYSA8c2NyaXB0PiB3aXRoIG9uTG9hZCBvciBvbkVycm9yIGxpc3RlbmVycyBvdXRzaWRlIHRoZSBtYWluIGRvY3VtZW50LiBUcnkgcmVtb3Zpbmcgb25Mb2FkPXsuLi59IGFuZCBvbkVycm9yPXsuLi59IG9yIG1vdmluZyBpdCBpbnRvIHRoZSByb290IDxoZWFkPiB0YWcgb3Igc29tZXdoZXJlIGluIHRoZSA8Ym9keT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IHJlbmRlciBhIDxzY3JpcHQ+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBgYXN5bmM9e3RydWV9YCBhbmQgYS
15852Bub24tZW1wdHkgYHNyY2AgcHJvcC4gRW5zdXJlIHRoZXJlIGlzIGEgdmFsaWQgYHNyY2AgYW5kIGVpdGhlciBtYWtlIHRoZSBzY3JpcHQgYXN5bmMgb3IgbW92ZSBpdCBpbnRvIHRoZSByb290IDxoZWFkPiB0YWcgb3Igc29tZXdoZXJlIGluIHRoZSA8Ym9keT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCByZW5kZXIgYSBzeW5jIG9yIGRlZmVyIDxzY3JpcHQ+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBrbm93aW5nIGl0cyBvcmRlci4gVHJ5IGFkZGluZyBhc3luYz1cIlwiIG9yIG1vdmluZyBpdCBpbnRvIHRoZSByb290IDxoZWFkPiB0YWcuJ1xuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBjYXNlIFwibm9zY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRlbXBsYXRlXCI6XG4gICAgICAgICAgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkNhbm5vdCByZW5kZXIgPCVzPiBvdXRzaWRlIHRoZSBtYWluIGRvY3VtZW50LiBUcnkgbW92aW5nIGl0IGludG8gdGhlIHJvb3QgPGhlYWQ+IHRhZy5cIixcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWF5U3VzcGVuZENvbW1pdCh0eXBlLCBwcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJpbWdcIiA9PT0gdHlwZSAmJlxuICAgICAgICBudWxsICE9IHByb3BzLnNyYyAmJlxuICAgICAgICBcIlwiICE9PSBwcm9wcy5zcmMgJiZcbiAgICAgICAgbnVsbCA9PSBwcm9wcy5vbkxvYWQgJiZcbiAgICAgICAgXCJsYXp5XCIgIT09IHByb3BzLmxvYWRpbmdcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZWxvYWRSZXNvdXJjZShyZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwic3R5bGVzaGVldFwiID09PSByZXNvdXJjZS50eXBlICYmXG4gICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgU2V0dGxlZCkgPT09IE5vdExvYWRlZFxuICAgICAgICA/ICExXG4gICAgICAgIDogITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVzdGltYXRlSW1hZ2VCeXRlcyhpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGluc3RhbmNlLndpZHRoIHx8IDEwMCkgKlxuICAgICAgICAoaW5zdGFuY2UuaGVpZ2h0IHx8IDEwMCkgKlxuICAgICAgICAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIGRldmljZVBpeGVsUmF0aW8gPyBkZXZpY2VQaXhlbFJhdGlvIDogMSkgKlxuICAgICAgICAwLjI1XG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdXNwZW5kSW5zdGFuY2Uoc3RhdGUsIGluc3RhbmNlKSB7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5kZWNvZGUgJiZcbiAgICAgICAgKHN0YXRlLmltZ0NvdW50KyssXG4gICAgICAgIGluc3RhbmNlLmNvbXBsZXRlIHx8XG4gICAgICAgICAgKChzdGF0ZS5pbWdCeXRlcyArPSBlc3RpbWF0ZUltYWdlQnl0ZXMoaW5zdGFuY2UpKSxcbiAgICAgICAgICBzdGF0ZS5zdXNwZW5zZXlJbWFnZXMucHVzaChpbnN0YW5jZSkpLFxuICAgICAgICAoc3RhdGUgPSBvblVuc3VzcGVuZEltZy5iaW5kKHN0YXRlKSksXG4gICAgICAgIGluc3RhbmNlLmRlY29kZSgpLnRoZW4oc3RhdGUsIHN0YXRlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1c3BlbmRSZXNvdXJjZShzdGF0ZSwgaG9pc3RhYmxlUm9vdCwgcmVzb3VyY2UsIHByb3BzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwic3R5bGVzaGVldFwiID09PSByZXNvdXJjZS50eXBlICYmXG4gICAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcHMubWVkaWEgfHxcbiAgICAgICAgICAhMSAhPT0gbWF0Y2hNZWRpYShwcm9wcy5tZWRpYSkubWF0Y2hlcykgJiZcbiAgICAgICAgKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiBJbnNlcnRlZCkgPT09IE5vdExvYWRlZFxuICAgICAgKSB7XG4gICAgICAgIGlmIChudWxsID09PSByZXNvdXJjZS5pbnN0YW5jZSkge1xuICAgICAgICAgIHZhciBrZXkgPSBnZXRTdHlsZUtleShwcm9wcy5ocmVmKSxcbiAgICAgICAgICAgIGluc3RhbmNlID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICBob2lzdGFibGVSb290ID0gaW5zdGFuY2UuX3A7XG4gICAgICAgICAgICBudWxsICE9PSBob2lzdGFibGVSb290ICYmXG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBob2lzdGFibGVSb290ICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGhvaXN0YWJsZVJvb3QudGhlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUuY291bnQrKyxcbiAgICAgICAgICAgICAgKHN0YXRlID0gb25VbnN1c3BlbmQuYmluZChzdGF0ZSkpLFxuICAgICAgICAgICAgICBob2lzdGFibGVSb290LnRoZW4oc3RhdGUsIHN0YXRlKSk7XG4gICAgICAgICAgICByZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkO1xuICAgICAgICAgICAgcmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoaW5zdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnN0YW5jZSA9IGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290O1xuICAgICAgICAgIHByb3BzID0gc3R5bGVzaGVldFByb3BzRnJvbVJhd1Byb3BzKHByb3BzKTtcbiAgICAgICAgICAoa2V5ID0gcHJlbG9hZFByb3BzTWFwLmdldChrZXkpKSAmJlxuICAgICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTdHlsZXNoZWV0KHByb3BzLCBrZXkpO1xuICAgICAgICAgIGluc3RhbmNlID0gaW5zdGFuY2UuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICAgICAgdmFyIGxpbmtJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgIGxpbmtJbnN0YW5jZS5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGxpbmtJbnN0YW5jZS5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICAgICAgbGlua0luc3RhbmNlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoaW5zdGFuY2UsIFwibGlua1wiLCBwcm9wcyk7XG4gICAgICAgICAgcmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgICBudWxsID09PSBzdGF0ZS5zdHlsZXNoZWV0cyAmJiAoc3RhdGUuc3R5bGVzaGVldHMgPSBuZXcgTWFwKCkpO1xuICAgICAgICBzdGF0ZS5zdHlsZXNoZWV0cy5zZXQocmVzb3VyY2UsIGhvaXN0YWJsZVJvb3QpO1xuICAgICAgICAoaG9pc3RhYmxlUm9vdCA9IHJlc291cmNlLnN0YXRlLnByZWxvYWQpICYmXG4gICAgICAgICAgKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiBTZXR0bGVkKSA9PT0gTm90TG9hZGVkICYmXG4gICAgICAgICAgKHN0YXRlLmNvdW50KyssXG4gICAgICAgICAgKHJlc291cmNlID0gb25VbnN1c3BlbmQuYmluZChzdGF0ZSkpLFxuICAgICAgICAgIGhvaXN0YWJsZVJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcmVzb3VyY2UpLFxuICAgICAgICAgIGhvaXN0YWJsZVJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHJlc291cmNlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhaXRGb3JDb21taXRUb0JlUmVhZHkoc3RhdGUsIHRpbWVvdXRPZmZzZXQpIHtcbiAgICAgIHN0YXRlLnN0eWxlc2hlZXRzICYmXG4gICAgICAgIDAgPT09IHN0YXRlLmNvdW50ICYmXG4gICAgICAgIGluc2VydFN1c3BlbmRlZFN0eWxlc2hlZXRzKHN0YXRlLCBzdGF0ZS5zdHlsZXNoZWV0cyk7XG4gICAgICByZXR1cm4gMCA8IHN0YXRlLmNvdW50IHx8IDAgPCBzdGF0ZS5pbWdDb3VudFxuICAgICAgICA/IGZ1bmN0aW9uIChjb21taXQpIHtcbiAgICAgICAgICAgI
15852HZhciBzdHlsZXNoZWV0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc3R5bGVzaGVldHMgJiZcbiAgICAgICAgICAgICAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUudW5zdXNwZW5kKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuc3VzcGVuZCA9IHN0YXRlLnVuc3VzcGVuZDtcbiAgICAgICAgICAgICAgICBzdGF0ZS51bnN1c3BlbmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHVuc3VzcGVuZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBTVVNQRU5TRVlfU1RZTEVTSEVFVF9USU1FT1VUICsgdGltZW91dE9mZnNldCk7XG4gICAgICAgICAgICAwIDwgc3RhdGUuaW1nQnl0ZXMgJiZcbiAgICAgICAgICAgICAgMCA9PT0gZXN0aW1hdGVkQnl0ZXNXaXRoaW5MaW1pdCAmJlxuICAgICAgICAgICAgICAoZXN0aW1hdGVkQnl0ZXNXaXRoaW5MaW1pdCA9XG4gICAgICAgICAgICAgICAgMTI1ICogZXN0aW1hdGVCYW5kd2lkdGgoKSAqIFNVU1BFTlNFWV9JTUFHRV9USU1FX0VTVElNQVRFKTtcbiAgICAgICAgICAgIHZhciBpbWdUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS53YWl0aW5nRm9ySW1hZ2VzID0gITE7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgMCA9PT0gc3RhdGUuY291bnQgJiZcbiAgICAgICAgICAgICAgICAgIChzdGF0ZS5zdHlsZXNoZWV0cyAmJlxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpLFxuICAgICAgICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHVuc3VzcGVuZCA9IHN0YXRlLnVuc3VzcGVuZDtcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnVuc3VzcGVuZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB1bnN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChzdGF0ZS5pbWdCeXRlcyA+IGVzdGltYXRlZEJ5dGVzV2l0aGluTGltaXRcbiAgICAgICAgICAgICAgICA/IDUwXG4gICAgICAgICAgICAgICAgOiBTVVNQRU5TRVlfSU1BR0VfVElNRU9VVCkgKyB0aW1lb3V0T2Zmc2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kID0gY29tbWl0O1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kID0gbnVsbDtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHN0eWxlc2hlZXRUaW1lcik7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChpbWdUaW1lcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmRnVsbHlVbnN1c3BlbmRlZChzdGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAwID09PSBzdGF0ZS5jb3VudCAmJlxuICAgICAgICAoMCA9PT0gc3RhdGUuaW1nQ291bnQgfHwgIXN0YXRlLndhaXRpbmdGb3JJbWFnZXMpXG4gICAgICApXG4gICAgICAgIGlmIChzdGF0ZS5zdHlsZXNoZWV0cylcbiAgICAgICAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpO1xuICAgICAgICBlbHNlIGlmIChzdGF0ZS51bnN1c3BlbmQpIHtcbiAgICAgICAgICB2Y
15852XIgdW5zdXNwZW5kID0gc3RhdGUudW5zdXNwZW5kO1xuICAgICAgICAgIHN0YXRlLnVuc3VzcGVuZCA9IG51bGw7XG4gICAgICAgICAgdW5zdXNwZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25VbnN1c3BlbmQoKSB7XG4gICAgICB0aGlzLmNvdW50LS07XG4gICAgICBjaGVja0lmRnVsbHlVbnN1c3BlbmRlZCh0aGlzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25VbnN1c3BlbmRJbWcoKSB7XG4gICAgICB0aGlzLmltZ0NvdW50LS07XG4gICAgICBjaGVja0lmRnVsbHlVbnN1c3BlbmRlZCh0aGlzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5zZXJ0U3VzcGVuZGVkU3R5bGVzaGVldHMoc3RhdGUsIHJlc291cmNlcykge1xuICAgICAgc3RhdGUuc3R5bGVzaGVldHMgPSBudWxsO1xuICAgICAgbnVsbCAhPT0gc3RhdGUudW5zdXNwZW5kICYmXG4gICAgICAgIChzdGF0ZS5jb3VudCsrLFxuICAgICAgICAocHJlY2VkZW5jZXNCeVJvb3QgPSBuZXcgTWFwKCkpLFxuICAgICAgICByZXNvdXJjZXMuZm9yRWFjaChpbnNlcnRTdHlsZXNoZWV0SW50b1Jvb3QsIHN0YXRlKSxcbiAgICAgICAgKHByZWNlZGVuY2VzQnlSb290ID0gbnVsbCksXG4gICAgICAgIG9uVW5zdXNwZW5kLmNhbGwoc3RhdGUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5zZXJ0U3R5bGVzaGVldEludG9Sb290KHJvb3QsIHJlc291cmNlKSB7XG4gICAgICBpZiAoIShyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgSW5zZXJ0ZWQpKSB7XG4gICAgICAgIHZhciBwcmVjZWRlbmNlcyA9IHByZWNlZGVuY2VzQnlSb290LmdldChyb290KTtcbiAgICAgICAgaWYgKHByZWNlZGVuY2VzKSB2YXIgbGFzdCA9IHByZWNlZGVuY2VzLmdldChMQVNUX1BSRUNFREVOQ0UpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBwcmVjZWRlbmNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICBwcmVjZWRlbmNlc0J5Um9vdC5zZXQocm9vdCwgcHJlY2VkZW5jZXMpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICB2Y
15852XIgbm9kZXMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgXCJsaW5rW2RhdGEtcHJlY2VkZW5jZV0sc3R5bGVbZGF0YS1wcmVjZWRlbmNlXVwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgaSA8IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJMSU5LXCIgPT09IG5vZGUubm9kZU5hbWUgfHxcbiAgICAgICAgICAgICAgXCJub3QgYWxsXCIgIT09IG5vZGUuZ2V0QXR0cmlidXRlKFwibWVkaWFcIilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcHJlY2VkZW5jZXMuc2V0KG5vZGUuZGF0YXNldC5wcmVjZWRlbmNlLCBub2RlKSwgKGxhc3QgPSBub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdCAmJiBwcmVjZWRlbmNlcy5zZXQoTEFTVF9QUkVDRURFTkNFLCBsYXN0KTtcbiAgICAgICAgfVxuICAgICAgICBub2RlcyA9IHJlc291cmNlLmluc3RhbmNlO1xuICAgICAgICBub2RlID0gbm9kZXMuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmVjZWRlbmNlXCIpO1xuICAgICAgICBpID0gcHJlY2VkZW5jZXMuZ2V0KG5vZGUpIHx8IGxhc3Q7XG4gICAgICAgIGkgPT09IGxhc3QgJiYgcHJlY2VkZW5jZXMuc2V0KExBU1RfUFJFQ0VERU5DRSwgbm9kZXMpO1xuICAgICAgICBwcmVjZWRlbmNlcy5zZXQobm9kZSwgbm9kZXMpO1xuICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgICAgIGxhc3QgPSBvblVuc3VzcGVuZC5iaW5kKHRoaXMpO1xuICAgICAgICBub2Rlcy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBsYXN0KTtcbiAgICAgICAgbm9kZXMuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIGxhc3QpO1xuICAgICAgICBpXG4gICAgICAgICAgPyBpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGVzLCBpLm5leHRTaWJsaW5nKVxuICAgICAgICAgIDogKChyb290ID0gOSA9PT0gcm9vdC5ub2RlVHlwZSA/IHJvb3QuaGVhZCA6IHJvb3QpLFxuICAgICAgICAgICAgcm9vdC5pbnNlcnRCZWZvcmUobm9kZXMsIHJvb3QuZmlyc3RDaGlsZCkpO1xuICAgICAgICByZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBGaWJlclJvb3ROb2RlKFxuICAgICAgY29udGFpbmVySW5mbyxcbiAgICAgIHRhZyxcbiAgICAgIGh5ZHJhdGUsXG4gICAgICBpZGVudGlmaWVyUHJlZml4LFxuICAgICAgb25VbmNhdWdodEVycm9yLFxuICAgICAgb25DYXVnaHRFcnJvcixcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcixcbiAgICAgIG9uRGVmYXVsdFRyYW5zaXRpb25JbmRpY2F0b3IsXG4gICAgICBmb3JtU3RhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudGFnID0gMTtcbiAgICAgIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gICAgICB0aGlzLnBpbmdDYWNoZSA9IHRoaXMuY3VycmVudCA9IHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgICAgIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgICAgIHRoaXMuY2FsbGJhY2tOb2RlID1cbiAgICAgICAgdGhpcy5uZXh0ID1cbiAgICAgICAgdGhpcy5wZW5kaW5nQ29udGV4dCA9XG4gICAgICAgIHRoaXMuY29udGV4dCA9XG4gICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ0NvbW1pdCA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IDA7XG4gICAgICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoLTEpO1xuICAgICAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9XG4gICAgICAgIHRoaXMuc2hlbGxTdXNwZW5kQ291bnRlciA9XG4gICAgICAgIHRoaXMuZXJyb3JSZWNvdmVyeURpc2FibGVkTGFuZXMgPVxuICAgICAgICB0aGlzLmV4cGlyZWRMYW5lcyA9XG4gICAgICAgIHRoaXMud2FybUxhbmVzID1cbiAgICAgICAgdGhpcy5waW5nZWRMYW5lcyA9XG4gICAgICAgIHRoaXMuc3VzcGVuZGVkTGFuZXMgPVxuICAgICAgICB0aGlzLnBlbmRpbmdMYW5lcyA9XG4gICAgICAgICAgMDtcbiAgICAgIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoMCk7XG4gICAgICB0aGlzLmhpZGRlblVwZGF0ZXMgPSBjcmVhdGVMYW5lTWFwKG51bGwpO1xuICAgICAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgICAgIHRoaXMub25VbmNhdWdodEVycm9yID0gb25VbmNhdWdodEVycm9yO1xuICAgICAgdGhpcy5vbkNhdWdodEVycm9yID0gb25DYXVnaHRFcnJvcjtcbiAgICAgIHRoaXMub25SZWNvdmVyYWJsZUVycm9yID0gb25SZWNvdmVyYWJsZUVycm9yO1xuICAgICAgdGhpcy5wb29sZWRDYWNoZSA9IG51bGw7XG4gICAgICB0aGlzLnBvb2xlZENhY2hlTGFuZXMgPSAwO1xuICAgICAgdGhpcy5mb3JtU3RhdGUgPSBmb3JtU3RhdGU7XG4gICAgICB0aGlzLnRyYW5zaXRpb25UeXBlcyA9IG51bGw7XG4gICAgICB0aGlzLmluY29tcGxldGVUcmFuc2l0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gdGhpcy5lZmZlY3REdXJhdGlvbiA9IC0wO1xuICAgICAgdGhpcy5tZW1vaXplZFVwZGF0ZXJzID0gbmV3IFNldCgpO1xuICAgICAgY29udGFpbmVySW5mbyA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuICAgICAgZm9yICh0YWcgPSAwOyAzMSA+IHRhZzsgdGFnKyspIGNvbnRhaW5lckluZm8ucHVzaChuZXcgU2V0KCkpO1xuICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyBcImh5ZHJhdGVSb290KClcIiA6IFwiY3JlYXRlUm9vdCgpXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChcbiAgICAgIGNvbnRhaW5lckluZm8sXG4gICAgICB0YWcsXG4gICAgICBoeWRyYXRlLFxuICAgICAgaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaHlkcmF0aW9uQ2FsbGJhY2tzLFxuICAgICAgaXNTdHJpY3RNb2RlLFxuICAgICAgaWRlbnRpZmllclByZWZpeCxcbiAgICAgIGZvcm1TdGF0ZSxcbiAgICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICAgIG9uQ2F1Z2h0RXJyb3IsXG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICBvbkRlZmF1bHRUcmFuc2l0aW9uSW5kaWNhdG9yXG4gICAgKSB7XG4gICAgICBjb250YWluZXJJbmZvID0gbmV3IEZpYmVyUm9vdE5vZGUoXG4gICAgICAgIGNvbnRhaW5lckluZm8sXG4gICAgICAgI
15852HRhZyxcbiAgICAgICAgaHlkcmF0ZSxcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCxcbiAgICAgICAgb25VbmNhdWdodEVycm9yLFxuICAgICAgICBvbkNhdWdodEVycm9yLFxuICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICAgIG9uRGVmYXVsdFRyYW5zaXRpb25JbmRpY2F0b3IsXG4gICAgICAgIGZvcm1TdGF0ZVxuICAgICAgKTtcbiAgICAgIHRhZyA9IENvbmN1cnJlbnRNb2RlO1xuICAgICAgITAgPT09IGlzU3RyaWN0TW9kZSAmJiAodGFnIHw9IFN0cmljdExlZ2FjeU1vZGUgfCBTdHJpY3RFZmZlY3RzTW9kZSk7XG4gICAgICB0YWcgfD0gUHJvZmlsZU1vZGU7XG4gICAgICBpc1N0cmljdE1vZGUgPSBjcmVhdGVGaWJlcigzLCBudWxsLCBudWxsLCB0YWcpO1xuICAgICAgY29udGFpbmVySW5mby5jdXJyZW50ID0gaXNTdHJpY3RNb2RlO1xuICAgICAgaXNTdHJpY3RNb2RlLnN0YXRlTm9kZSA9IGNvbnRhaW5lckluZm87XG4gICAgICB0YWcgPSBjcmVhdGVDYWNoZSgpO1xuICAgICAgcmV0YWluQ2FjaGUodGFnKTtcbiAgICAgIGNvbnRhaW5lckluZm8ucG9vbGVkQ2FjaGUgPSB0YWc7XG4gICAgICByZXRhaW5DYWNoZSh0YWcpO1xuICAgICAgaXNTdHJpY3RNb2RlLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbixcbiAgICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgICBjYWNoZTogdGFnXG4gICAgICB9O1xuICAgICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGlzU3RyaWN0TW9kZSk7XG4gICAgICByZXR1cm4gY29udGFpbmVySW5mbztcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBpZiAoIXBhcmVudENvbXBvbmVudCkgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICAgIHBhcmVudENvbXBvbmVudCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICAgIHJldHVybiBwYXJlbnRDb21wb25lbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckltcGwoXG4gICAgICByb290RmliZXIsXG4gICAgICBsYW5lLFxuICAgICAgZWxlbWVudCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIGNhbGxiYWNrXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGluamVjdGVkSG9vayAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdFxuICAgICAgKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIGNvbnRhaW5lciwgZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yIHx8XG4gICAgICAgICAgICAoKGhhc0xvZ2dlZEVycm9yID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVvXCIsXG4gICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIHBhcmVudENvbXBvbmVudCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG4gICAgICBudWxsID09PSBjb250YWluZXIuY29udGV4dFxuICAgICAgICA/IChjb250YWluZXIuY29udGV4dCA9IHBhcmVudENvbXBvbmVudClcbiAgICAgICAgOiAoY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gcGFyZW50Q29tcG9uZW50KTtcbiAgICAgIGlzUmVuZGVyaW5nICYmXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgJiZcbiAgICAgICAgKChkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gITApLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLlwiLFxuICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkgfHwgXCJVbmtub3duXCJcbiAgICAgICAgKSk7XG4gICAgICBjb250YWluZXIgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gICAgICBjb250YWluZXIucGF5bG9hZCA9IHsgZWxlbWVudDogZWxlbWVudCB9O1xuICAgICAgY2FsbGJhY2sgPSB2b2lkIDAgPT09IGNhbGxiYWNrID8gbnVsbCA6IGNhbGxiYWNrO1xuICAgICAgbnVsbCAhPT0gY2FsbGJhY2sgJiZcbiAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNhbGxiYWNrICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgKSxcbiAgICAgICAgKGNvbnRhaW5lci5jYWxsYmFjayA9IGNhbGxiYWNrKSk7XG4gICAgICBlbGVtZW50ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIGNvbnRhaW5lciwgbGFuZSk7XG4gICAgICBudWxsICE9PSBlbGVtZW50ICYmXG4gICAgICAgIChzdGFydFVwZGF0ZVRpbWVyQnlMYW5lKGxhbmUsIFwicm9vdC5yZW5kZXIoKVwiLCBudWxsKSxcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGVsZW1lbnQsIHJvb3RGaWJlciwgbGFuZSksXG4gICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMoZWxlbWVudCwgcm9vdEZpYmVyLCBsYW5lKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgICAgIGZpYmVyID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGlmIChudWxsICE9PSBmaWJlciAmJiBudWxsICE9PSBmaWJlci5kZWh5ZHJhdGVkKSB7XG4gICAgICAgI
15852HZhciBhID0gZmliZXIucmV0cnlMYW5lO1xuICAgICAgICBmaWJlci5yZXRyeUxhbmUgPSAwICE9PSBhICYmIGEgPCByZXRyeUxhbmUgPyBhIDogcmV0cnlMYW5lO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKSB7XG4gICAgICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgIChmaWJlciA9IGZpYmVyLmFsdGVybmF0ZSkgJiYgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZpYmVyKSB7XG4gICAgICBpZiAoMTMgPT09IGZpYmVyLnRhZyB8fCAzMSA9PT0gZmliZXIudGFnKSB7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCA2NzEwODg2NCk7XG4gICAgICAgIG51bGwgIT09IHJvb3QgJiYgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCA2NzEwODg2NCk7XG4gICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCA2NzEwODg2NCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmaWJlcikge1xuICAgICAgaWYgKDEzID09PSBmaWJlci50YWcgfHwgMzEgPT09IGZpYmVyLnRhZykge1xuICAgICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgICAgbGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUobGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcbiAgICAgICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChcbiAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICBjb250YWluZXIsXG4gICAgICBuYXRpdmVFdmVudFxuICAgICkge1xuICAgICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgdHJ5IHtcbiAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpLFxuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG5hdGl2ZUV2ZW50XG4gICAgKSB7XG4gICAgICB2Y
15852XIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5UO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IG51bGw7XG4gICAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gICAgICB0cnkge1xuICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSxcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcHJldlRyYW5zaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIG5hdGl2ZUV2ZW50XG4gICAgKSB7XG4gICAgICBpZiAoX2VuYWJsZWQpIHtcbiAgICAgICAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgICAgICBpZiAobnVsbCA9PT0gYmxvY2tlZE9uKVxuICAgICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShcbiAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgIHJldHVybl90YXJnZXRJbnN0LFxuICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyXG4gICAgICAgICAgKSxcbiAgICAgICAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoXG4gICAgICAgICAgICBibG9ja2VkT24sXG4gICAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCksXG4gICAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyAmIDQgJiZcbiAgICAgICAgICAgIC0xIDwgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZG9tRXZlbnROYW1lKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yICg7IG51bGwgIT09IGJsb2NrZWRPbjsgKSB7XG4gICAgICAgICAgICB2Y
15852XIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gZmliZXIpXG4gICAgICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgZmliZXIgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBpZiAoZmliZXIuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhmaWJlci5wZW5kaW5nTGFuZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gbGFuZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IGZpYmVyO1xuICAgICAgICAgICAgICAgICAgICAgIHJvb3QucGVuZGluZ0xhbmVzIHw9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChyb290LmVudGFuZ2xlZExhbmVzIHw9IDI7IGxhbmVzOyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYW5lID0gMSA8PCAoMzEgLSBjbHozMihsYW5lcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5lbnRhbmdsZW1lbnRzWzFdIHw9IGxhbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKGZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgTm9Db250ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3ckMSgpICsgUkVOREVSX1RJTUVPVVRfTVMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgKHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIDIpLFxuICAgICAgICAgICAgICAgICAgICBmbHVzaFN5bmNXb3JrJDEoKSxcbiAgICAgICAgICAgICAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIDIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWJlciA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgbnVsbCA9PT0gZmliZXIgJiZcbiAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICAgIHJldHVybl90YXJnZXRJbnN0LFxuICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZpYmVyID09PSBibG9ja2VkT24pIGJyZWFrO1xuICAgICAgICAgICAgYmxvY2tlZE9uID0gZmliZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IGJsb2NrZWRPbiAmJiBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgICAgIG5hdGl2ZUV2ZW50ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZUJsb2NraW5nVGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdUYXJnZXQodGFyZ2V0Tm9kZSkge1xuICAgICAgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsO1xuICAgICAgdGFyZ2V0Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHRhcmdldE5vZGUpO1xuICAgICAgaWYgKG51bGwgIT09IHRhcmdldE5vZGUpIHtcbiAgICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXROb2RlKTtcbiAgICAgICAgaWYgKG51bGwgPT09IG5lYXJlc3RNb3VudGVkKSB0YXJnZXROb2RlID0gbnVsbDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcbiAgICAgICAgICBpZiAoMTMgPT09IHRhZykge1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHRhcmdldE5vZGUpIHJldHVybiB0YXJnZXROb2RlO1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmICgzMSA9PT0gdGFnKSB7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gZ2V0QWN0aXZpdHlJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdGFyZ2V0Tm9kZSkgcmV0dXJuIHRhcmdldE5vZGU7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKDMgPT09IHRhZykge1xuICAgICAgICAgICAgaWYgKG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4gMyA9PT0gbmVhcmVzdE1vdW50ZWQudGFnXG4gICAgICAgICAgICAgICAgPyBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgI
15852HRhcmdldE5vZGUgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSBuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0Tm9kZSAmJiAodGFyZ2V0Tm9kZSA9IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAgIGNhc2UgXCJiZWZvcmV0b2dnbGVcIjpcbiAgICAgICAgY2FzZSBcImNhbmNlbFwiOlxuICAgICAgICBjYXNlIFwiY2xpY2tcIjpcbiAgICAgICAgY2FzZSBcImNsb3NlXCI6XG4gICAgICAgIGNhc2UgXCJjb250ZXh0bWVudVwiOlxuICAgICAgICBjYXNlIFwiY29weVwiOlxuICAgICAgICBjYXNlIFwiY3V0XCI6XG4gICAgICAgIGNhc2UgXCJhdXhjbGlja1wiOlxuICAgICAgICBjYXNlIFwiZGJsY2xpY2tcIjpcbiAgICAgICAgY2FzZSBcImRyYWdlbmRcIjpcbiAgICAgICAgY2FzZSBcImRyYWdzdGFydFwiOlxuICAgICAgICBjYXNlIFwiZHJvcFwiOlxuICAgICAgICBjYXNlIFwiZm9jdXNpblwiOlxuICAgICAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgIGNhc2UgXCJpbnZhbGlkXCI6XG4gICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgIGNhc2UgXCJrZXlwcmVzc1wiOlxuICAgICAgICBjYXNlIFwia2V5dXBcIjpcbiAgICAgICAgY2FzZSBcIm1vdXNlZG93blwiOlxuICAgICAgICBjYXNlIFwibW91c2V1cFwiOlxuICAgICAgICBjYXNlIFwicGFzdGVcIjpcbiAgICAgICAgY2FzZSBcInBhdXNlXCI6XG4gICAgICAgIGNhc2UgXCJwbGF5XCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVyY2FuY2VsXCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVyZG93blwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcnVwXCI6XG4gICAgICAgIGNhc2UgXCJyYXRlY2hhbmdlXCI6XG4gICAgICAgIGNhc2UgXCJyZXNldFwiOlxuICAgICAgICBjYXNlIFwic2Vla2VkXCI6XG4gICAgICAgIGNhc2UgXCJzdWJtaXRcIjpcbiAgICAgICAgY2FzZSBcInRvZ2dsZVwiOlxuICAgICAgICBjYXNlIFwidG91Y2hjYW5jZWxcIjpcbiAgICAgICAgY2FzZSBcInRvdWNoZW5kXCI6XG4gICAgICAgIGNhc2UgXCJ0b3VjaHN0YXJ0XCI6XG4gICAgICAgIGNhc2UgXCJ2b2x1bWVjaGFuZ2VcIjpcbiAgICAgICAgY2FzZSBcImNoYW5nZVwiOlxuICAgICAgICBjYXNlIFwic2VsZWN0aW9uY2hhbmdlXCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0SW5wdXRcIjpcbiAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjpcbiAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6XG4gICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOlxuICAgICAgICBjYXNlIFwiYmVmb3JlYmx1clwiOlxuICAgICAgICBjYXNlIFwiYWZ0ZXJibHVyXCI6XG4gICAgICAgIGNhc2UgXCJiZWZvcmVpbnB1dFwiOlxuICAgICAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgICBjYXNlIFwiZnVsbHNjcmVlbmNoYW5nZVwiOlxuICAgICAgICBjYXNlIFwiZnVsbHNjcmVlbmVycm9yXCI6XG4gICAgICAgIGNhc2UgXCJmb2N1c1wiOlxuICAgICAgICBjYXNlIFwiaGFzaGNoYW5nZVwiOlxuICAgICAgICBjYXNlIFwicG9wc3RhdGVcIjpcbiAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICBjYXNlIFwic2VsZWN0c3RhcnRcIjpcbiAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICAgICAgICBjYXNlIFwiZHJhZ1wiOlxuICAgICAgICBjYXNlIFwiZHJhZ2VudGVyXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnZXhpdFwiOlxuICAgICAgICBjYXNlIFwiZHJhZ2xlYXZlXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnb3ZlclwiOlxuICAgICAgICBjYXNlIFwibW91c2Vtb3ZlXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZW91dFwiOlxuICAgICAgICBjYXNlIFwibW91c2VvdmVyXCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVybW92ZVwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcm92ZXJcIjpcbiAgICAgICAgY2FzZSBcInJlc2l6ZVwiOlxuICAgICAgICBjYXNlIFwic2Nyb2xsXCI6XG4gICAgICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcbiAgICAgICAgY2FzZSBcIndoZWVsXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZWVudGVyXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVyZW50ZXJcIjpcbiAgICAgICAgY2FzZSBcInBvaW50ZXJsZWF2ZVwiOlxuICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICBzd2l0Y2ggKGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgICBjYXNlIE5vcm1hbFByaW9yaXR5JDE6XG4gICAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZHJhZ2VudGVyXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnbGVhdmVcIjpcbiAgICAgICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICBjYXNlIFwibW91c2VvdXRcIjpcbiAgICAgICAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwb2ludGVyb3ZlclwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICAgI
15852HF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShuYXRpdmVFdmVudC5wb2ludGVySWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpcbiAgICAgICAgY2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOlxuICAgICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUobmF0aXZlRXZlbnQucG9pbnRlcklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgIGV4aXN0aW5nUXVldWVkRXZlbnQsXG4gICAgICBibG9ja2VkT24sXG4gICAgICBkb21FdmVudE5hbWUsXG4gICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgbmF0aXZlRXZlbnRcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCA9PT0gZXhpc3RpbmdRdWV1ZWRFdmVudCB8fFxuICAgICAgICBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudFxuICAgICAgKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChleGlzdGluZ1F1ZXVlZEV2ZW50ID0ge1xuICAgICAgICAgICAgYmxvY2tlZE9uOiBibG9ja2VkT24sXG4gICAgICAgICAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG51bGwgIT09IGJsb2NrZWRPbiAmJlxuICAgICAgICAgICAgKChibG9ja2VkT24gPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbikpLFxuICAgICAgICAgICAgbnVsbCAhPT0gYmxvY2tlZE9uICYmIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGJsb2NrZWRPbikpLFxuICAgICAgICAgIGV4aXN0aW5nUXVldWVkRXZlbnRcbiAgICAgICAgKTtcbiAgICAgIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICAgICAgYmxvY2tlZE9uID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuICAgICAgbnVsbCAhPT0gdGFyZ2V0Q29udGFpbmVyICYmXG4gICAgICAgIC0xID09PSBibG9ja2VkT24uaW5kZXhPZih0YXJnZXRDb250YWluZXIpICYmXG4gICAgICAgIGJsb2NrZWRPbi5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gICAgICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChcbiAgICAgIGJsb2NrZWRPbixcbiAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICBuYXRpdmVFdmVudFxuICAgICkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgICAgICAgICAgcXVldWVkRm9jdXMsXG4gICAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICEwXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoXG4gICAgICAgICAgICAgIHF1ZXVlZERyYWcsXG4gICAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICEwXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KFxuICAgICAgICAgICAgICBxdWV1ZWRNb3VzZSxcbiAgICAgICAgICAgICAgYmxvY2tlZE9uLFxuICAgICAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgITBcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwicG9pbnRlcm92ZXJcIjpcbiAgICAgICAgICB2Y
15852XIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChcbiAgICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICAgIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoXG4gICAgICAgICAgICAgIHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsXG4gICAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGNhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkKSxcbiAgICAgICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoXG4gICAgICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgICAgICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBibG9ja2VkT24sXG4gICAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAhMFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgICAgIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG4gICAgICBpZiAobnVsbCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgICAgICB2Y
15852XIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuICAgICAgICBpZiAobnVsbCAhPT0gbmVhcmVzdE1vdW50ZWQpXG4gICAgICAgICAgaWYgKCgodGFyZ2V0SW5zdCA9IG5lYXJlc3RNb3VudGVkLnRhZyksIDEzID09PSB0YXJnZXRJbnN0KSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoKHRhcmdldEluc3QgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKSksXG4gICAgICAgICAgICAgIG51bGwgIT09IHRhcmdldEluc3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IHRhcmdldEluc3Q7XG4gICAgICAgICAgICAgIHJ1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoMzEgPT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKCh0YXJnZXRJbnN0ID0gZ2V0QWN0aXZpdHlJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCkpLFxuICAgICAgICAgICAgICBudWxsICE9PSB0YXJnZXRJbnN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSB0YXJnZXRJbnN0O1xuICAgICAgICAgICAgICBydW5XaXRoUHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgMyA9PT0gdGFyZ2V0SW5zdCAmJlxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPVxuICAgICAgICAgICAgICAzID09PSBuZWFyZXN0TW91bnRlZC50YWdcbiAgICAgICAgICAgICAgICA/IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gICAgICBpZiAobnVsbCAhPT0gcXVldWVkRXZlbnQuYmxvY2tlZE9uKSByZXR1cm4gITE7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG4gICAgICAgIDAgPCB0YXJnZXRDb250YWluZXJzLmxlbmd0aDtcblxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7XG4gICAgICAgIGlmIChudWxsID09PSBuZXh0QmxvY2tlZE9uKSB7XG4gICAgICAgICAgbmV4dEJsb2NrZWRPbiA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5leHRCbG9ja2VkT24uY29uc3RydWN0b3IoXG4gICAgICAgICAgICAgIG5leHRCbG9ja2VkT24udHlwZSxcbiAgICAgICAgICAgICAgbmV4dEJsb2NrZWRPblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGV2ZW50ID0gbmF0aXZlRXZlbnRDbG9uZTtcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBiZSBudWxsLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xuICAgICAgICAgIG5leHRCbG9ja2VkT24udGFyZ2V0LmRpc3BhdGNoRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50ICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0YXJnZXRDb250YWluZXJzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKSksXG4gICAgICAgICAgICBudWxsICE9PSB0YXJnZXRDb250YWluZXJzICYmXG4gICAgICAgICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKHRhcmdldENvbnRhaW5lcnMpLFxuICAgICAgICAgICAgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT24pLFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpICYmIG1hcC5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9ICExO1xuICAgICAgbnVsbCAhPT0gcXVldWVkRm9jdXMgJiZcbiAgICAgICAgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykgJiZcbiAgICAgICAgKHF1ZXVlZEZvY3VzID0gbnVsbCk7XG4gICAgICBudWxsICE9PSBxdWV1ZWREcmFnICYmXG4gICAgICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykgJiZcbiAgICAgICAgKHF1ZXVlZERyYWcgPSBudWxsKTtcbiAgICAgIG51bGwgIT09IHF1ZXVlZE1vdXNlICYmXG4gICAgICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpICYmXG4gICAgICAgIChxdWV1ZWRNb3VzZSA9IG51bGwpO1xuICAgICAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xuICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkICYmXG4gICAgICAgICgocXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbCksXG4gICAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgfHxcbiAgICAgICAgICAoKGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSAhMCksXG4gICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soXG4gICAgICAgICAgICBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgICAgICAgICByZXBsYXlVbmJsb2NrZWRFdmVudHNcbiAgICAgICAgICApKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChmb3JtUmVwbGF5aW5nUXVldWUpIHtcbiAgICAgIGxhc3RTY2hlZHVsZWRSZXBsYXlRdWV1ZSAhPT0gZm9ybVJlcGxheWluZ1F1ZXVlICYmXG4gICAgICAgICgobGFzdFNjaGVkdWxlZFJlcGxheVF1ZXVlID0gZm9ybVJlcGxheWluZ1F1ZXVlKSxcbiAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soXG4gICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxhc3RTY2hlZHVsZWRSZXBsYXlRdWV1ZSA9PT0gZm9ybVJlcGxheWluZ1F1ZXVlICYmXG4gICAgICAgICAgICAgIChsYXN0U2NoZWR1bGVkUmVwbGF5UXVldWUgPSBudWxsKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybVJlcGxheWluZ1F1ZXVlLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICAgI
15852HZhciBmb3JtID0gZm9ybVJlcGxheWluZ1F1ZXVlW2ldLFxuICAgICAgICAgICAgICAgIHN1Ym1pdHRlck9yQWN0aW9uID0gZm9ybVJlcGxheWluZ1F1ZXVlW2kgKyAxXSxcbiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IGZvcm1SZXBsYXlpbmdRdWV1ZVtpICsgMl07XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBzdWJtaXR0ZXJPckFjdGlvbilcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBudWxsID09PSBmaW5kSW5zdGFuY2VCbG9ja2luZ1RhcmdldChzdWJtaXR0ZXJPckFjdGlvbiB8fCBmb3JtKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICAgICAgICAgIHZhciBmb3JtSW5zdCA9IGdldEluc3RhbmNlRnJvbU5vZGUoZm9ybSk7XG4gICAgICAgICAgICAgIG51bGwgIT09IGZvcm1JbnN0ICYmXG4gICAgICAgICAgICAgICAgKGZvcm1SZXBsYXlpbmdRdWV1ZS5zcGxpY2UoaSwgMyksXG4gICAgICAgICAgICAgICAgKGkgLT0gMyksXG4gICAgICAgICAgICAgICAgKGZvcm0gPSB7XG4gICAgICAgICAgICAgICAgICBwZW5kaW5nOiAhMCxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgbWV0aG9kOiBmb3JtLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogc3VibWl0dGVyT3JBY3Rpb25cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKGZvcm0pLFxuICAgICAgICAgICAgICAgIHN0YXJ0SG9zdFRyYW5zaXRpb24oXG4gICAgICAgICAgICAgICAgICBmb3JtSW5zdCxcbiAgICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbixcbiAgICAgICAgICAgICAgICAgIGZvcm1EYXRhXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgICAgIGZ1bmN0aW9uIHVuYmxvY2socXVldWVkRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTtcbiAgICAgIH1cbiAgICAgIG51bGwgIT09IHF1ZXVlZEZvY3VzICYmXG4gICAgICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgICAgIG51bGwgIT09IHF1ZXVlZERyYWcgJiYgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gICAgICBudWxsICE9PSBxdWV1ZWRNb3VzZSAmJlxuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gICAgICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
15852XIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldO1xuICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQgJiYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsKTtcbiAgICAgIH1cbiAgICAgIGZvciAoXG4gICAgICAgIDtcbiAgICAgICAgMCA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggJiZcbiAgICAgICAgKChpID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdKSwgbnVsbCA9PT0gaS5ibG9ja2VkT24pO1xuXG4gICAgICApXG4gICAgICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChpKSxcbiAgICAgICAgICBudWxsID09PSBpLmJsb2NrZWRPbiAmJiBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIGkgPSAodW5ibG9ja2VkLm93bmVyRG9jdW1lbnQgfHwgdW5ibG9ja2VkKS4kJHJlYWN0Rm9ybVJlcGxheTtcbiAgICAgIGlmIChudWxsICE9IGkpXG4gICAgICAgIGZvciAocXVldWVkVGFyZ2V0ID0gMDsgcXVldWVkVGFyZ2V0IDwgaS5sZW5ndGg7IHF1ZXVlZFRhcmdldCArPSAzKSB7XG4gICAgICAgICAgdmFyIGZvcm0gPSBpW3F1ZXVlZFRhcmdldF0sXG4gICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbiA9IGlbcXVldWVkVGFyZ2V0ICsgMV0sXG4gICAgICAgICAgICBmb3JtUHJvcHMgPSBmb3JtW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHN1Ym1pdHRlck9yQWN0aW9uKVxuICAgICAgICAgICAgZm9ybVByb3BzIHx8IHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChpKTtcbiAgICAgICAgICBlbHNlIGlmIChmb3JtUHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBhY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbiAmJlxuICAgICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbi5oYXNBdHRyaWJ1dGUoXCJmb3JtQWN0aW9uXCIpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoKGZvcm0gPSBzdWJtaXR0ZXJPckFjdGlvbiksXG4gICAgICAgICAgICAgICAgKGZvcm1Qcm9wcyA9IHN1Ym1pdHRlck9yQWN0aW9uW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGwpKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYWN0aW9uID0gZm9ybVByb3BzLmZvcm1BY3Rpb247XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBmaW5kSW5zdGFuY2VCbG9ja2luZ1RhcmdldChmb3JtKSkgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgYWN0aW9uID0gZm9ybVByb3BzLmFjdGlvbjtcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvblxuICAgICAgICAgICAgICA/IChpW3F1ZXVlZFRhcmdldCArIDFdID0gYWN0aW9uKVxuICAgICAgICAgICAgICA6IChpLnNwbGljZShxdWV1ZWRUYXJnZXQsIDMpLCAocXVldWVkVGFyZ2V0IC09IDMpKTtcbiAgICAgICAgICAgIHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdE9uRGVmYXVsdFRyYW5zaXRpb25JbmRpY2F0b3IoKSB7XG4gICAgICBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZShldmVudCkge1xuICAgICAgICBldmVudC5jYW5JbnRlcmNlcHQgJiZcbiAgICAgICAgICBcInJlYWN0LXRyYW5zaXRpb25cIiA9PT0gZXZlbnQuaW5mbyAmJlxuICAgICAgICAgIGV2ZW50LmludGVyY2VwdCh7XG4gICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZS
15852hmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAocGVuZGluZ1Jlc29sdmUgPSByZXNvbHZlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9jdXNSZXNldDogXCJtYW51YWxcIixcbiAgICAgICAgICAgIHNjcm9sbDogXCJtYW51YWxcIlxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gaGFuZGxlTmF2aWdhdGVDb21wbGV0ZSgpIHtcbiAgICAgICAgbnVsbCAhPT0gcGVuZGluZ1Jlc29sdmUgJiYgKHBlbmRpbmdSZXNvbHZlKCksIChwZW5kaW5nUmVzb2x2ZSA9IG51bGwpKTtcbiAgICAgICAgaXNDYW5jZWxsZWQgfHwgc2V0VGltZW91dChzdGFydEZha2VOYXZpZ2F0aW9uLCAyMCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzdGFydEZha2VOYXZpZ2F0aW9uKCkge1xuICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkICYmICFuYXZpZ2F0aW9uLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICB2YXIgY3VycmVudEVudHJ5ID0gbmF2aWdhdGlvbi5jdXJyZW50RW50cnk7XG4gICAgICAgICAgY3VycmVudEVudHJ5ICYmXG4gICAgICAgICAgICBudWxsICE9IGN1cnJlbnRFbnRyeS51cmwgJiZcbiAgICAgICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoY3VycmVudEVudHJ5LnVybCwge1xuICAgICAgICAgICAgICBzdGF0ZTogY3VycmVudEVudHJ5LmdldFN0YXRlKCksXG4gICAgICAgICAgICAgIGluZm86IFwicmVhY3QtdHJhbnNpdGlvblwiLFxuICAgICAgICAgICAgICBoaXN0b3J5OiBcInJlcGxhY2VcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgbmF2aWdhdGlvbikge1xuICAgICAgICB2Y
15852XIgaXNDYW5jZWxsZWQgPSAhMSxcbiAgICAgICAgICBwZW5kaW5nUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIG5hdmlnYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihcIm5hdmlnYXRlXCIsIGhhbmRsZU5hdmlnYXRlKTtcbiAgICAgICAgbmF2aWdhdGlvbi5hZGRFdmVudExpc3RlbmVyKFwibmF2aWdhdGVzdWNjZXNzXCIsIGhhbmRsZU5hdmlnYXRlQ29tcGxldGUpO1xuICAgICAgICBuYXZpZ2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJuYXZpZ2F0ZWVycm9yXCIsIGhhbmRsZU5hdmlnYXRlQ29tcGxldGUpO1xuICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0RmFrZU5hdmlnYXRpb24sIDEwMCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICBuYXZpZ2F0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJuYXZpZ2F0ZVwiLCBoYW5kbGVOYXZpZ2F0ZSk7XG4gICAgICAgICAgbmF2aWdhdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJuYXZpZ2F0ZXN1Y2Nlc3NcIixcbiAgICAgICAgICAgIGhhbmRsZU5hdmlnYXRlQ29tcGxldGVcbiAgICAgICAgICApO1xuICAgICAgICAgIG5hdmlnYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibmF2aWdhdGVlcnJvclwiLFxuICAgICAgICAgICAgaGFuZGxlTmF2aWdhdGVDb21wbGV0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgbnVsbCAhPT0gcGVuZGluZ1Jlc29sdmUgJiZcbiAgICAgICAgICAgIChwZW5kaW5nUmVzb2x2ZSgpLCAocGVuZGluZ1Jlc29sdmUgPSBudWxsKSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICAgICAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldICYmXG4gICAgICAgIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lclxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgcGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgcm9vdC5yZW5kZXIoKSBvbiB0aGUgZXhpc3Rpbmcgcm9vdCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBpdC5cIlxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoXCJzY2hlZHVsZXJcIiksXG4gICAgICBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgICAgIFJlYWN0RE9NID0gcmVxdWlyZShcInJlYW
15852N0LWRvbVwiKSxcbiAgICAgIHNlYXJjaFRhcmdldCA9IG51bGwsXG4gICAgICBzZWFyY2hCb3VuZGFyeSA9IG51bGwsXG4gICAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICAgICAgUkVBQ1RfTEVHQUNZX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLFxuICAgICAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLFxuICAgICAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLFxuICAgICAgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxcbiAgICAgIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksXG4gICAgICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLFxuICAgICAgUkVBQ1RfQ09OU1VNRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb25zdW1lclwiKSxcbiAgICAgIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLFxuICAgICAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgICAgIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksXG4gICAgICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKSxcbiAgICAgIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLFxuICAgICAgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnNjb3BlXCIpO1xuICAgIHZhciBSRUFDVF9BQ1RJVklUWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmFjdGl2aXR5XCIpLFxuICAgICAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnRyYWNpbmdfbWFya2VyXCIpO1xuICAgIHZhciBSRUFDVF9NRU1PX0NBQ0hFX1NFTlRJTkVMID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9fY2FjaGVfc2VudGluZWxcIiksXG4gICAgICBSRUFDVF9WSUVXX1RSQU5TSVRJT05fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC52aWV3X3RyYW5zaXRpb25cIiksXG4gICAgICBSRUFDVF9SRUNPVkVSQUJMRV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnJlY292ZXJhYmxlXCIpLFxuICAgICAgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5LFxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPVxuICAgICAgICBSZWFjdC5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsXG4gICAgICBSZWFjdERPTVNoYXJlZEludGVybmFscyA9XG4gICAgICAgIFJlYWN0RE9NLl9fRE9NX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSxcbiAgICAgIE5vdFBlbmRpbmcgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgcGVuZGluZzogITEsXG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIG1ldGhvZDogbnVsbCxcbiAgICAgICAgYWN0aW9uOiBudWxsXG4gICAgICB9KSxcbiAgICAgIHZhbHVlU3RhY2sgPSBbXTtcbiAgICB2YXIgZmliZXJTdGFjayA9IFtdO1xuICAgIHZhciBpbmRleCRqc2NvbXAkMCA9IC0xLFxuICAgICAgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICAgICAgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gICAgICByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKSxcbiAgICAgIGhvc3RUcmFuc2l0aW9uUHJvdmlkZXJDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gICAgICBkaXNhYmxlZERlcHRoID0gMCxcbiAgICAgIHByZXZMb2csXG4gICAgICBwcmV2SW5mbyxcbiAgICAgIHByZXZXYXJuLFxuICAgICAgcHJldkVycm9yLFxuICAgICAgcHJldkdyb3VwLFxuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkLFxuICAgICAgcHJldkdyb3VwRW5kO1xuICAgIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9ICEwO1xuICAgIHZhciBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICByZWVudHJ5ID0gITE7XG4gICAgdmFyIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgKFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXBcbiAgICApKCk7XG4gICAgdmFyIGN1cnJlbnQgPSBudWxsLFxuICAgICAgaXNSZW5kZXJpbmcgPSAhMSxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMyA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFxuICAgICAgY2FuY2VsQ2FsbGJhY2skMSA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgICAgIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFxuICAgICAgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludCxcbiAgICAgIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdyxcbiAgICAgIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLFxuICAgICAgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksXG4gICAgICBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxcbiAgICAgIE5vcm1hbFByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgICBMb3dQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Mb3dQcmlvcml0eSxcbiAgICAgIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHksXG4gICAgICBsb2ckMSA9IFNjaGVkdWxlci5sb2csXG4gICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSxcbiAgICAgIHJlbmRlcmVySUQgPSBudWxsLFxuICAgICAgaW5qZWN0ZWRIb29rID0gbnVsbCxcbiAgICAgIGhhc0xvZ2dlZEVycm9yID0gITEsXG4gICAgICBpc0RldlRvb2xzUHJlc2VudCA9IFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sXG4gICAgICBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjayxcbiAgICAgIGxvZyA9IE1hdGgubG9nLFxuICAgICAgTE4yID0gTWF0aC5MTjIsXG4gICAgICBuZXh0VHJhbnNpdGlvblVwZGF0ZUxhbmUgPSAyNTYsXG4gICAgICBuZXh0VHJhbnNpdGlvbkRlZmVycmVkTGFuZSA9IDI2MjE0NCxcbiAgICAgIG5leHRSZXRyeUxhbmUgPSA0MTk0MzA0LFxuICAgICAgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gMixcbiAgICAgIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gOCxcbiAgICAgIERlZmF1bHRFdmVudFByaW9yaXR5ID0gMzIsXG4gICAgICBJZGxlRXZlbnRQcmlvcml0eSA9IDI2ODQzNTQ1NixcbiAgICAgIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmc
15852oMzYpLnNsaWNlKDIpLFxuICAgICAgaW50ZXJuYWxJbnN0YW5jZUtleSA9IFwiX19yZWFjdEZpYmVyJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxQcm9wc0tleSA9IFwiX19yZWFjdFByb3BzJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9IFwiX19yZWFjdENvbnRhaW5lciRcIiArIHJhbmRvbUtleSxcbiAgICAgIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9IFwiX19yZWFjdEV2ZW50cyRcIiArIHJhbmRvbUtleSxcbiAgICAgIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gXCJfX3JlYWN0TGlzdGVuZXJzJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSBcIl9fcmVhY3RIYW5kbGVzJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxSb290Tm9kZVJlc291cmNlc0tleSA9IFwiX19yZWFjdFJlc291cmNlcyRcIiArIHJhbmRvbUtleSxcbiAgICAgIGludGVybmFsSG9pc3RhYmxlTWFya2VyID0gXCJfX3JlYWN0TWFya2VyJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxMb2FkUGVuZGluZ0tleSA9IFwiX19yZWFjdExvYWQkXCIgKyByYW5kb21LZXksXG4gICAgICBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCksXG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge30sXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0ge30sXG4gICAgICBoYXNSZWFkT25seVZhbHVlID0ge1xuICAgICAgICBidXR0b246ICEwLFxuICAgICAgICBjaGVja2JveDogITAsXG4gICAgICAgIGltYWdlOiAhMCxcbiAgICAgICAgaGlkZGVuOiAhMCxcbiAgICAgICAgcmFkaW86ICEwLFxuICAgICAgICByZXNldDogITAsXG4gICAgICAgIHN1Ym1pdDogITBcbiAgICAgIH0sXG4gICAgICBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IFJlZ0V4cChcbiAgICAgICAgXCJeWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRdWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiXG4gICAgICApLFxuICAgICAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9LFxuICAgICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge30sXG4gICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExLFxuICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3Rlc1JlZ2V4ID0gL1tcXG5cIlxcXFxdL2csXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9ICExLFxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9ICExLFxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSAhMSxcbiAgICAgIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSAhMSxcbiAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gITE7XG4gICAgdmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9ICExO1xuICAgIHZhciB2YWx1ZVByb3BOYW1lcyA9IFtcInZhbHVlXCIsIFwiZGVmYXVsdFZhbHVlXCJdLFxuICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSAhMSxcbiAgICAgIG5lZWRzRXNjYXBpbmcgPSAvW1wiJyY8PlxcblxcdF18Xlxcc3xcXHMkLyxcbiAgICAgIHNwZWNpYWxUYWdzID1cbiAgICAgICAgXCJhZGRyZXNzIGFwcGxldCBhcmVhIGFydGljbGUgYXNpZGUgYmFzZSBiYXNlZm9udCBiZ3NvdW5kIGJsb2NrcXVvdGUgYm9keSBiciBidXR0b24gY2FwdGlvbiBjZW50ZXIgY29sIGNvbGdyb3VwIGRkIGRldGFpbHMgZGlyIGRpdiBkbCBkdCBlbWJlZCBmaWVsZHNldCBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgZm9ybSBmcmFtZSBmcmFtZXNldCBoMSBoMiBoMyBoNCBoNSBoNiBoZWFkIGhlYWRlciBoZ3JvdXAgaHIgaHRtbCBpZnJhbWUgaW1nIGlucHV0IGlzaW5kZXggbGkgbGluayBsaXN0aW5nIG1haW4gbWFycXVlZSBtZW51IG1lbnVpdGVtIG1ldGEgbmF2IG5vZW1iZWQgbm9mcmFtZXMgbm9zY3JpcHQgb2JqZWN0IG9sIHAgcGFyYW0gcGxhaW50ZXh0IHByZSBzY3JpcHQgc2VjdGlvbiBzZWxlY3Qgc291cmNlIHN0eWxlIHN1bW1hcnkgdGFibGUgdGJvZHkgdGQgdGVtcGxhdGUgdGV4dGFyZWEgdGZvb3QgdGggdGhlYWQgdGl0bGUgdHIgdHJhY2sgdWwgd2JyIHhtcFwiLnNwbGl0KFxuICAgICAgICAgIFwiIFwiXG4gICAgICAgICksXG4gICAgICBpblNjb3BlVGFncyA9XG4gICAgICAgIFwiYXBwbGV0IGNhcHRpb24gaHRtbCB0YWJsZSB0ZCB0aCBtYXJxdWVlIG9iamVjdCBzZWxlY3QgdGVtcGxhdGUgZm9yZWlnbk9iamVjdCBkZXNjIHRpdGxlXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbXCJidXR0b25cIl0pLFxuICAgICAgaW1wbGllZEVuZFRhZ3MgPSBcImRkIGR0IGxpIG9wdGlvbiBvcHRncm91cCBwIHJwIHJ0XCIuc3BsaXQoXCIgXCIpLFxuICAgICAgZW1wdHlBbmNlc3RvckluZm9EZXYgPSB7XG4gICAgICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgICAgIGZvcm1UYWc6IG51bGwsXG4gICAgICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgICAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgICAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICAgICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgICAgICBjb250YWluZXJUYWdJblNjb3BlOiBudWxsLFxuICAgICAgICBpbXBsaWNpdFJvb3RTY29wZTogITFcbiAgICAgIH0sXG4gICAgICBkaWRXYXJuID0ge30sXG4gICAgICBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICAgICAgICBhbmltYXRpb246XG4gICAgICAgICAgXCJhbmltYXRpb25EZWxheSBhbmltYXRpb25EaXJlY3Rpb24gYW5pbWF0aW9uRHVyYXRpb24gYW5pbWF0aW9uRmlsbE1vZGUgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYW5pbWF0aW9uTmFtZSBhbmltYXRpb25QbGF5U3RhdGUgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb25cIi5zcGxpdChcbiAgICAgICAgICAgIFwiIFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICBcImJhY2tncm91bmRBdHRhY2htZW50IGJhY2tncm91bmRDbGlwIGJhY2tncm91bmRDb2xvciBiYWNrZ3JvdW5kSW1hZ2UgYmFja2dyb3VuZE9yaWdpbiBiYWNrZ3JvdW5kUG9zaXRpb25YIGJhY2tncm91bmRQb3NpdGlvblkgYmFja2dyb3VuZFJlcGVhdCBiYWNrZ3JvdW5kU2l6ZVwiLnNwbGl0KFxuICAgICAgICAgICAgXCIgXCJcbiAgICAgICAgICApLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFtcImJhY2tncm91bmRQb3NpdGlvblhcIiwgXCJiYWNrZ3JvdW5kUG9zaXRpb25ZXCJdLFxuICAgICAgICBib3JkZXI6XG4gICAgICAgICAgXCJib3JkZXJCb3R0b21Db2xvciBib3JkZXJCb3R0b21TdHlsZSBib3JkZXJCb3R0b21XaWR0aCBib3JkZXJJbWFnZU91dHNldCBib3JkZXJJbWFnZVJlcGVhdCBib3JkZXJJbWFnZVNsaWNlIGJvcmRlckltYWdlU291cmNlIGJvcmRlckltYWdlV2lkdGggYm9yZGVyTGVmdENvbG9yIGJvcmRlckxlZnRTdHlsZSBib3JkZXJMZWZ0V2lkdGggYm9yZGVyUmlnaHRDb2xvciBib3JkZXJSaWdodFN0eWxlIGJvcmRlclJpZ2h0V2lkdGggYm9yZGVyVG9wQ29sb3IgYm9yZGVyVG9wU3R5bGUgYm9yZGVyVG9wV2lkdGhcIi5zcGxpdChcbiAgICAgICAgICAgIFwiIFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgYm9yZGVyQmxvY2s6XG4gICAgICAgICAgXCJib3JkZXJCbG9ja0VuZENvbG9yIGJvcmRlckJsb2NrRW5kU3R5bGUgYm9yZGVyQmxvY2tFbmRXaWR0aCBib3JkZXJCbG9ja1N0YXJ0Q29sb3IgYm9yZGVyQmxvY2tTdGFydFN0eWxlIGJvcmRlckJsb2NrU3RhcnRXaWR0aFwiLnNwbGl0KFxuICAgICAgICAgICAgXCIgXCJcbiAgICAgICAgICApLFxuICAgICAgICBib3JkZXJCbG9ja0NvbG9yOiBbXCJib3JkZXJCbG9ja0VuZENvbG9yXCIsIFwiYm9yZGVyQmxvY2tTdGFydENvbG9yXCJdLFxuICAgICAgICBib3JkZXJCbG9ja0VuZDogW1xuICAgICAgICAgIFwiYm9yZGVyQmxvY2tFbmRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyQmxvY2tFbmRTdHlsZVwiLFxuICAgICAgICAgIFwiYm9yZGVyQmxvY2tFbmRXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlckJsb2NrU3RhcnQ6IFtcbiAgICAgICAgICBcImJvcmRlckJsb2NrU3RhcnRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyQmxvY2tTdGFydFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJCbG9ja1N0YXJ0V2lkdGhcIlxuICAgICAgICBdLFxuICAgICAgICBib3JkZXJCbG9ja1N0eWxlOiBbXCJib3JkZXJCbG9ja0VuZFN0eWxlXCIsIFwiYm9yZGVyQmxvY2tTdGFydFN0eWxlXCJdLFxuICAgICAgICBib3JkZXJCbG9ja1dpZHR
15852oOiBbXCJib3JkZXJCbG9ja0VuZFdpZHRoXCIsIFwiYm9yZGVyQmxvY2tTdGFydFdpZHRoXCJdLFxuICAgICAgICBib3JkZXJCb3R0b206IFtcbiAgICAgICAgICBcImJvcmRlckJvdHRvbUNvbG9yXCIsXG4gICAgICAgICAgXCJib3JkZXJCb3R0b21TdHlsZVwiLFxuICAgICAgICAgIFwiYm9yZGVyQm90dG9tV2lkdGhcIlxuICAgICAgICBdLFxuICAgICAgICBib3JkZXJDb2xvcjogW1xuICAgICAgICAgIFwiYm9yZGVyQm90dG9tQ29sb3JcIixcbiAgICAgICAgICBcImJvcmRlckxlZnRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyUmlnaHRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyVG9wQ29sb3JcIlxuICAgICAgICBdLFxuICAgICAgICBib3JkZXJJbWFnZTogW1xuICAgICAgICAgIFwiYm9yZGVySW1hZ2VPdXRzZXRcIixcbiAgICAgICAgICBcImJvcmRlckltYWdlUmVwZWF0XCIsXG4gICAgICAgICAgXCJib3JkZXJJbWFnZVNsaWNlXCIsXG4gICAgICAgICAgXCJib3JkZXJJbWFnZVNvdXJjZVwiLFxuICAgICAgICAgIFwiYm9yZGVySW1hZ2VXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlcklubGluZTpcbiAgICAgICAgICBcImJvcmRlcklubGluZUVuZENvbG9yIGJvcmRlcklubGluZUVuZFN0eWxlIGJvcmRlcklubGluZUVuZFdpZHRoIGJvcmRlcklubGluZVN0YXJ0Q29sb3IgYm9yZGVySW5saW5lU3RhcnRTdHlsZSBib3JkZXJJbmxpbmVTdGFydFdpZHRoXCIuc3BsaXQoXG4gICAgICAgICAgICBcIiBcIlxuICAgICAgICAgICksXG4gICAgICAgIGJvcmRlcklubGluZUNvbG9yOiBbXCJib3JkZXJJbmxpbmVFbmRDb2xvclwiLCBcImJvcmRlcklubGluZVN0YXJ0Q29sb3JcIl0sXG4gICAgICAgIGJvcmRlcklubGluZUVuZDogW1xuICAgICAgICAgIFwiYm9yZGVySW5saW5lRW5kQ29sb3JcIixcbiAgICAgICAgICBcImJvcmRlcklubGluZUVuZFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVFbmRXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiBbXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVTdGFydENvbG9yXCIsXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVTdGFydFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVTdGFydFdpZHRoXCJcbiAgICAgICAgXSxcbiAgICAgICAgYm9yZGVySW5saW5lU3R5bGU6IFtcImJvcmRlcklubGluZUVuZFN0eWxlXCIsIFwiYm9yZGVySW5saW5lU3RhcnRTdHlsZVwiXSxcbiAgICAgICAgYm9yZGVySW5saW5lV2lkdGg6IFtcImJvcmRlcklubGluZUVuZFdpZHRoXCIsIFwiYm9yZGVySW5saW5lU3RhcnRXaWR0aFwiXSxcbiAgICAgICAgYm9yZGVyTGVmdDogW1wiYm9yZGVyTGVmdENvbG9yXCIsIFwiYm9yZGVyTGVmdFN0eWxlXCIsIFwiYm9yZGVyTGVmdFdpZHRoXCJdLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFtcbiAgICAgICAgICBcImJvcmRlckJvdHRvbUxlZnRSYWRpdXNcIixcbiAgICAgICAgICBcImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzXCIsXG4gICAgICAgICAgXCJib3JkZXJUb3BMZWZ0UmFkaXVzXCIsXG4gICAgICAgICAgXCJib3JkZXJUb3BSaWdodFJhZGl1c1wiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlclJpZ2h0OiBbXG4gICAgICAgICAgXCJib3JkZXJSaWdodENvbG9yXCIsXG4gICAgICAgICAgXCJib3JkZXJSaWdodFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJSaWdodFdpZHRoXCJcbiAgICAgICAgXSxcbiAgICAgICAgYm9yZGVyU3R5bGU6IFtcbiAgICAgICAgICBcImJvcmRlckJvdHRvbVN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJMZWZ0U3R5bGVcIixcbiAgICAgICAgICBcImJvcmRlclJpZ2h0U3R5bGVcIixcbiAgICAgICAgICBcImJvcmRlclRvcFN0eWxlXCJcbiAgICAgICAgXSxcbiAgICAgICAgYm9yZGVyVG9wOiBbXCJib3JkZXJUb3BDb2xvclwiLCBcImJvcmRlclRvcFN0eWxlXCIsIFwiYm9yZGVyVG9wV2lkdGhcIl0sXG4gICAgICAgIGJvcmRlcldpZHRoOiBbXG4gICAgICAgICAgXCJib3JkZXJCb3R0b21XaWR0aFwiLFxuICAgICAgICAgIFwiYm9yZGVyTGVmdFdpZHRoXCIsXG4gICAgICAgICAgXCJib3JkZXJSaWdodFdpZHRoXCIsXG4gICAgICAgICAgXCJib3JkZXJUb3BXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGNvbG9yQWRqdXN0OiBbXCJwcmludENvbG9yQWRqdXN0XCJdLFxuICAgICAgICBjb2x1bW5SdWxlOiBbXCJjb2x1bW5SdWxlQ29sb3JcIiwgXCJjb2x1bW5SdWxlU3R5bGVcIiwgXCJjb2x1bW5SdWxlV2lkdGhcIl0sXG4gICAgICAgIGNvbHVtbnM6IFtcImNvbHVtbkNvdW50XCIsIFwiY29sdW1uV2lkdGhcIl0sXG4gICAgICAgIGNvbnRhaW5JbnRyaW5zaWNTaXplOiBbXG4gICAgICAgICAgXCJjb250YWluSW50cmluc2ljSGVpZ2h0XCIsXG4gICAgICAgICAgXCJjb250YWluSW50cmluc2ljV2lkdGhcIlxuICAgICAgICBdLFxuICAgICAgICBjb250YWluZXI6IFtcImNvbnRhaW5lck5hbWVcIiwgXCJjb250YWluZXJUeXBlXCJdLFxuICAgICAgICBmbGV4OiBbXCJmbGV4QmFzaXNcIiwgXCJmbGV4R3Jvd1wiLCBcImZsZXhTaHJpbmtcIl0sXG4gICAgICAgIGZsZXhGbG93OiBbXCJmbGV4RGlyZWN0aW9uXCIsIFwiZmxleFdyYXBcIl0sXG4gICAgICAgIGZvbnQ6IFwiZm9udEZhbWlseSBmb250RmVhdHVyZVNldHRpbmdzIGZvbnRLZXJuaW5nIGZvbnRMYW5ndWFnZU92ZXJyaWRlIGZvbnRTaXplIGZvbnRTaXplQWRqdXN0IGZvbnRTdHJldGNoIGZvbnRTdHlsZSBmb250VmFyaWFudCBmb250VmFyaWFudEFsdGVybmF0ZXMgZm9udFZhcmlhbnRDYXBzIGZvbnRWYXJpYW50RWFzdEFzaWFuIGZvbnRWYXJpYW50TGlnYXR1cmVzIGZvbnRWYXJpYW50TnVtZXJpYyBmb250VmFyaWFudFBvc2l0aW9uIGZvbnRXZWlnaHQgbGluZUhlaWdodFwiLnNwbGl0KFxuICAgICAgICAgIFwiIFwiXG4gICAgICAgICksXG4gICAgICAgIGZvbnRTeW50aGVzaXM6IFtcbiAgICAgICAgICBcImZvbnRTeW50aGVzaXNQb3NpdGlvblwiLFxuICAgICAgICAgIFwiZm9udFN5bnRoZXNpc1NtYWxsQ2Fwc1wiLFxuICAgICAgICAgIFwiZm9udFN
158525bnRoZXNpc1N0eWxlXCIsXG4gICAgICAgICAgXCJmb250U3ludGhlc2lzV2VpZ2h0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9udFZhcmlhbnQ6XG4gICAgICAgICAgXCJmb250VmFyaWFudEFsdGVybmF0ZXMgZm9udFZhcmlhbnRDYXBzIGZvbnRWYXJpYW50RWFzdEFzaWFuIGZvbnRWYXJpYW50TGlnYXR1cmVzIGZvbnRWYXJpYW50TnVtZXJpYyBmb250VmFyaWFudFBvc2l0aW9uXCIuc3BsaXQoXG4gICAgICAgICAgICBcIiBcIlxuICAgICAgICAgICksXG4gICAgICAgIGdhcDogW1wiY29sdW1uR2FwXCIsIFwicm93R2FwXCJdLFxuICAgICAgICBncmlkOiBcImdyaWRBdXRvQ29sdW1ucyBncmlkQXV0b0Zsb3cgZ3JpZEF1dG9Sb3dzIGdyaWRUZW1wbGF0ZUFyZWFzIGdyaWRUZW1wbGF0ZUNvbHVtbnMgZ3JpZFRlbXBsYXRlUm93c1wiLnNwbGl0KFxuICAgICAgICAgIFwiIFwiXG4gICAgICAgICksXG4gICAgICAgIGdyaWRBcmVhOiBbXG4gICAgICAgICAgXCJncmlkQ29sdW1uRW5kXCIsXG4gICAgICAgICAgXCJncmlkQ29sdW1uU3RhcnRcIixcbiAgICAgICAgICBcImdyaWRSb3dFbmRcIixcbiAgICAgICAgICBcImdyaWRSb3dTdGFydFwiXG4gICAgICAgIF0sXG4gICAgICAgIGdyaWRDb2x1bW46IFtcImdyaWRDb2x1bW5FbmRcIiwgXCJncmlkQ29sdW1uU3RhcnRcIl0sXG4gICAgICAgIGdyaWRDb2x1bW5HYXA6IFtcImNvbHVtbkdhcFwiXSxcbiAgICAgICAgZ3JpZEdhcDogW1wiY29sdW1uR2FwXCIsIFwicm93R2FwXCJdLFxuICAgICAgICBncmlkUm93OiBbXCJncmlkUm93RW5kXCIsIFwiZ3JpZFJvd1N0YXJ0XCJdLFxuICAgICAgICBncmlkUm93R2FwOiBbXCJyb3dHYXBcIl0sXG4gICAgICAgIGdyaWRUZW1wbGF0ZTogW1xuICAgICAgICAgIFwiZ3JpZFRlbXBsYXRlQXJlYXNcIixcbiAgICAgICAgICBcImdyaWRUZW1wbGF0ZUNvbHVtbnNcIixcbiAgICAgICAgICBcImdyaWRUZW1wbGF0ZVJvd3NcIlxuICAgICAgICBdLFxuICAgICAgICBpbnNldDogW1wiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwidG9wXCJdLFxuICAgICAgICBpbnNldEJsb2NrOiBbXCJpbnNldEJsb2NrRW5kXCIsIFwiaW5zZXRCbG9ja1N0YXJ0XCJdLFxuICAgICAgICBpbnNldElubGluZTogW1wiaW5zZXRJbmxpbmVFbmRcIiwgXCJpbnNldElubGluZVN0YXJ0XCJdLFxuICAgICAgICBsaXN0U3R5bGU6IFtcImxpc3RTdHlsZUltYWdlXCIsIFwibGlzdFN0eWxlUG9zaXRpb25cIiwgXCJsaXN0U3R5bGVUeXBlXCJdLFxuICAgICAgICBtYXJnaW46IFtcIm1hcmdpbkJvdHRvbVwiLCBcIm1hcmdpbkxlZnRcIiwgXCJtYXJnaW5SaWdodFwiLCBcIm1hcmdpblRvcFwiXSxcbiAgICAgICAgbWFyZ2luQmxvY2s6IFtcIm1hcmdpbkJsb2NrRW5kXCIsIFwibWFyZ2luQmxvY2tTdGFydFwiXSxcbiAgICAgICAgbWFyZ2luSW5saW5lOiBbXCJtYXJnaW5JbmxpbmVFbmRcIiwgXCJtYXJnaW5JbmxpbmVTdGFydFwiXSxcbiAgICAgICAgbWFya2VyOiBbXCJtYXJrZXJFbmRcIiwgXCJtYXJrZXJNaWRcIiwgXCJtYXJrZXJTdGFydFwiXSxcbiAgICAgICAgbWFzazogXCJtYXNrQ2xpcCBtYXNrQ29tcG9zaXRlIG1hc2tJbWFnZSBtYXNrTW9kZSBtYXNrT3JpZ2luIG1hc2tQb3NpdGlvblggbWFza1Bvc2l0aW9uWSBtYXNrUmVwZWF0IG1hc2tTaXplXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgICAgbWFza1Bvc2l0aW9uOiBbXCJtYXNrUG9zaXRpb25YXCIsIFwibWFza1Bvc2l0aW9uWVwiXSxcbiAgICAgICAgb2Zmc2V0OiBbXG4gICAgICAgICAgXCJvZmZzZXRBbmNob3JcIixcbiAgICAgICAgICBcIm9mZnNldERpc3RhbmNlXCIsXG4gICAgICAgICAgXCJvZmZzZXRQYXRoXCIsXG4gICAgICAgICAgXCJvZmZzZXRQb3NpdGlvblwiLFxuICAgICAgICAgIFwib2Zmc2V0Um90YXRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgb3V0bGluZTogW1wib3V0bGluZUNvbG9yXCIsIFwib3V0bGluZVN0eWxlXCIsIFwib3V0bGluZVdpZHRoXCJdLFxuICAgICAgICBvdmVyZmxvdzogW1wib3ZlcmZsb3dYXCIsIFwib3ZlcmZsb3dZXCJdLFxuICAgICAgICBvdmVyc2Nyb2xsQmVoYXZpb3I6IFtcIm92ZXJzY3JvbGxCZWhhdmlvclhcIiwgXCJvdmVyc2Nyb2xsQmVoYXZpb3JZXCJdLFxuICAgICAgICBwYWRkaW5nOiBbXCJwYWRkaW5nQm90dG9tXCIsIFwicGFkZGluZ0xlZnRcIiwgXCJwYWRkaW5nUmlnaHRcIiwgXCJwYWRkaW5nVG9wXCJdLFxuICAgICAgICBwYWRkaW5nQmxvY2s6IFtcInBhZGRpbmdCbG9ja0VuZFwiLCBcInBhZGRpbmdCbG9ja1N0YXJ0XCJdLFxuICAgICAgICBwYWRkaW5nSW5saW5lOiBbXCJwYWRkaW5nSW5saW5lRW5kXCIsIFwicGFkZGluZ0lubGluZVN0YXJ0XCJdLFxuICAgICAgICBwYWdlQnJlYWtBZnRlcjogW1wiYnJlYWtBZnRlclwiXSxcbiAgICAgICAgcGFnZUJyZWFrQmVmb3JlOiBbXCJicmVha0JlZm9yZVwiXSxcbiAgICAgICAgcGFnZUJyZWFrSW5zaWRlOiBbXCJicmVha0luc2lkZVwiXSxcbiAgICAgICAgcGxhY2VDb250ZW50OiBbXCJhbGlnbkNvbnRlbnRcIiwgXCJqdXN0aWZ5Q29udGVudFwiXSxcbiAgICAgICAgcGxhY2VJdGVtczogW1wiYWxpZ25JdGVtc1wiLCBcImp1c3RpZnlJdGVtc1wiXSxcbiAgICAgICAgcGxhY2VTZWxmOiBbXCJhbGlnblNlbGZcIiwgXCJqdXN0aWZ5U2VsZlwiXSxcbiAgICAgICAgc2Nyb2xsTWFyZ2luOiBbXG4gICAgICAgICAgXCJzY3JvbGxNYXJnaW5Cb3R0b21cIixcbiAgICAgICAgICBcInNjcm9sbE1hcmdpbkxlZnRcIixcbiAgICAgICAgICBcInNjcm9sbE1hcmdpblJpZ2h0XCIsXG4gICAgICAgICAgXCJzY3JvbGxNYXJnaW5Ub3BcIlxuICAgICAgICBdLFxuICAgICAgICBzY3JvbGxNYXJnaW5CbG9jazogW1wic2Nyb2xsTWFyZ2luQmxvY2tFbmRcIiwgXCJzY3JvbGxNYXJnaW5CbG9ja1N0YXJ0XCJdLFxuICAgICAgICBzY3JvbGxNYXJnaW5JbmxpbmU6IFtcbiAgICAgICAgICBcInNjcm9sbE1hcmdpbklubGluZUVuZFwiLFxuICAgICAgICAgIFwic2Nyb2xsTWFyZ2luSW5saW5lU3RhcnRcIlxuICAgICAgICBdLFxuICAgICAgICBzY3JvbGxQYWRkaW5nOiBbXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nQm90dG9tXCIsXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nTGVmdFwiLFxuICAgICAgICAgIFwic2Nyb2xsUGFkZGluZ1JpZ2h0XCIsXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nVG9wXCJcbiAgICAgICAgXSxcbiAgICAgICAgc2Nyb2xsUGFkZGluZ0Jsb2NrOiBbXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nQmxvY2tFbmRcIixcbiAgICAgICAgICBcInNjcm9sbFBhZGRpbmdCbG9ja1N0YXJ0XCJcbiAgICAgICAgXSxcbiAgICAgICAgc2Nyb2xsUGFkZGluZ0lubGluZTogW1xuICAgICAgICAgIFwic2Nyb2xsUGFkZGluZ0lubGluZUVuZFwiLFxuICAgICAgICAgIFwic2Nyb2xsUGFkZGluZ0lubGluZVN0YXJ0XCJcbiAgICAgICAgXSxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFtcbiAgICAgICAgICBcInRleHREZWNvcmF0aW9uQ29sb3JcIixcbiAgICAgICAgICBcInRleHREZWNvcmF0aW9uTGluZVwiLFxuICAgICAgICAgIFwidG
15852V4dERlY29yYXRpb25TdHlsZVwiLFxuICAgICAgICAgIFwidGV4dERlY29yYXRpb25UaGlja25lc3NcIlxuICAgICAgICBdLFxuICAgICAgICB0ZXh0RW1waGFzaXM6IFtcInRleHRFbXBoYXNpc0NvbG9yXCIsIFwidGV4dEVtcGhhc2lzU3R5bGVcIl0sXG4gICAgICAgIHRleHRXcmFwOiBbXCJ0ZXh0V3JhcE1vZGVcIiwgXCJ0ZXh0V3JhcFN0eWxlXCJdLFxuICAgICAgICB0cmFuc2l0aW9uOiBbXG4gICAgICAgICAgXCJ0cmFuc2l0aW9uQmVoYXZpb3JcIixcbiAgICAgICAgICBcInRyYW5zaXRpb25EZWxheVwiLFxuICAgICAgICAgIFwidHJhbnNpdGlvbkR1cmF0aW9uXCIsXG4gICAgICAgICAgXCJ0cmFuc2l0aW9uUHJvcGVydHlcIixcbiAgICAgICAgICBcInRyYW5zaXRpb25UaW1pbmdGdW5jdGlvblwiXG4gICAgICAgIF0sXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFtcImFsaWdubWVudEJhc2VsaW5lXCIsIFwiYmFzZWxpbmVTaGlmdFwiLCBcImJhc2VsaW5lU291cmNlXCJdLFxuICAgICAgICB3aGl0ZVNwYWNlOiBbXCJ0ZXh0V3JhcE1vZGVcIiwgXCJ3aGl0ZVNwYWNlQ29sbGFwc2VcIl0sXG4gICAgICAgIHdvcmRXcmFwOiBbXCJvdmVyZmxvd1dyYXBcIl1cbiAgICAgIH0sXG4gICAgICB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZyxcbiAgICAgIG1zUGF0dGVybiQxID0gL15tcy0vLFxuICAgICAgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vLFxuICAgICAgbXNQYXR0ZXJuID0gL14tbXMtLyxcbiAgICAgIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nLFxuICAgICAgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC8sXG4gICAgICB3YXJuZWRTdHlsZU5hbWVzID0ge30sXG4gICAgICB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9LFxuICAgICAgd2FybmVkRm9yTmFOVmFsdWUgPSAhMSxcbiAgICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSAhMSxcbiAgICAgIHVuaXRsZXNzTnVtYmVycyA9IG5ldyBTZXQoXG4gICAgICAgIFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYXNwZWN0UmF0aW8gYm9yZGVySW1hZ2VPdXRzZXQgYm9yZGVySW1hZ2VTbGljZSBib3JkZXJJbWFnZVdpZHRoIGJveEZsZXggYm94RmxleEdyb3VwIGJveE9yZGluYWxHcm91cCBjb2x1bW5Db3VudCBjb2x1bW5zIGZsZXggZmxleEdyb3cgZmxleFBvc2l0aXZlIGZsZXhTaHJpbmsgZmxleE5lZ2F0aXZlIGZsZXhPcmRlciBncmlkQXJlYSBncmlkUm93IGdyaWRSb3dFbmQgZ3JpZFJvd1NwYW4gZ3JpZFJvd1N0YXJ0IGdyaWRDb2x1bW4gZ3JpZENvbHVtbkVuZCBncmlkQ29sdW1uU3BhbiBncmlkQ29sdW1uU3RhcnQgZm9udFdlaWdodCBsaW5lQ2xhbXAgbGluZUhlaWdodCBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgc2NhbGUgdGFiU2l6ZSB3aWRvd3MgekluZGV4IHpvb20gZmlsbE9wYWNpdHkgZmxvb2RPcGFjaXR5IHN0b3BPcGFjaXR5IHN0cm9rZURhc2hhcnJheSBzdHJva2VEYXNob2Zmc2V0IHN0cm9rZU1pdGVybGltaXQgc3Ryb2tlT3BhY2l0eSBzdHJva2VXaWR0aCBNb3pBbmltYXRpb25JdGVyYXRpb25Db3VudCBNb3pCb3hGbGV4IE1vekJveEZsZXhHcm91cCBNb3pMaW5lQ2xhbXAgbXNBbmltYXRpb25JdGVyYXRpb25Db3VudCBtc0ZsZXggbXNab29tIG1zRmxleEdyb3cgbXNGbGV4TmVnYXRpdmUgbXNGbGV4T3JkZXIgbXNGbGV4UG9zaXRpdmUgbXNGbGV4U2hyaW5rIG1zR3JpZENvbHVtbiBtc0dyaWRDb2x1bW5TcGFuIG1zR3JpZFJvdyBtc0dyaWRSb3dTcGFuIFdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IFdlYmtpdEJveEZsZXggV2ViS2l0Qm94RmxleEdyb3VwIFdlYmtpdEJveE9yZGluYWxHcm91cCBXZWJraXRDb2x1bW5Db3VudCBXZWJraXRDb2x1bW5zIFdlYmtpdEZsZXggV2Via2l0RmxleEdyb3cgV2Via2l0RmxleFBvc2l0aXZlIFdlYmtpdEZsZXhTaHJpbmsgV2Via2l0TGluZUNsYW1wXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIE1BVEhfTkFNRVNQQUNFID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIsXG4gICAgICBTVkdfTkFNRVNQQUNFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgICAgYWxpYXNlcyA9IG5ldyBNYXAoW1xuICAgICAgICBbXCJhY2NlcHRDaGFyc2V0XCIsIFwiYWNjZXB0LWNoYXJzZXRcIl0sXG4gICAgICAgIFtcImh0bWxGb3JcIiwgXCJmb3JcIl0sXG4gICAgICAgIFtcImh0dHBFcXVpdlwiLCBcImh0dHAtZXF1aXZcIl0sXG4gICAgICAgIFtcImNyb3NzT3JpZ2luXCIsIFwiY3Jvc3NvcmlnaW5cIl0sXG4gICAgICAgIFtcImFjY2VudEhlaWdodFwiLCBcImFjY2VudC1oZWlnaHRcIl0sXG4gICAgICAgIFtcImFsaWdubWVudEJhc2VsaW5lXCIsIFwiYWxpZ25tZW50LWJhc2VsaW5lXCJdLFxuICAgICAgICBbXCJhcmFiaWNGb3JtXCIsIFwiYXJhYmljLWZvcm1cIl0sXG4gICAgICAgIFtcImJhc2VsaW5lU2hpZnRcIiwgXCJiYXNlbGluZS1zaGlmdFwiXSxcbiAgICAgICAgW1wiY2FwSGVpZ2h0XCIsIFwiY2FwLWhlaWdodFwiXSxcbiAgICAgICAgW1wiY2xpcFBhdGhcIiwgXCJjbGlwLXBhdGhcIl0sXG4gICAgICAgIFtcImNsaXBSdWxlXCIsIFwiY2xpcC1ydWxlXCJdLFxuICAgICAgICBbXCJjb2xvckludGVycG9sYXRpb25cIiwgXCJjb2xvci1pbnRlcnBvbGF0aW9uXCJdLFxuICAgICAgICBbXCJjb2xvckludGVycG9sYXRpb25GaWx0ZXJzXCIsIFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCJdLFxuICAgICAgICBbXCJjb2xvclByb2ZpbGVcIiwgXCJjb2xvci1wcm9maWxlXCJdLFxuICAgICAgICBbXCJjb2xvclJlbmRlcmluZ1wiLCBcImNvbG9yLXJlbmRlcmluZ1wiXSxcbiAgICAgICAgW1wiZG9taW5hbnRCYXNlbGluZVwiLCBcImRvbWluYW50LWJhc2VsaW5lXCJdLFxuICAgICAgICBbXCJlbmFibGVCYWNrZ3JvdW5kXCIsIFwiZW5hYmxlLWJhY2tncm91bmRcIl0sXG4gICAgICAgIFtcImZpbGxPcGFjaXR5XCIsIFwiZmlsbC1vcGFjaXR5XCJdLFxuICAgICAgICBbXCJmaWxsUnVsZVwiLCBcImZpbGwtcnVsZVwiXSxcbiAgICAgICAgW1wiZmxvb2RDb2xvclwiLCBcImZsb29kLWNvbG9yXCJdLFxuICAgICAgICBbXCJmbG9vZE9wYWNpdHlcIiwgXCJmbG9vZC1vcGFjaXR5XCJdLFxuICAgICAgICBbXCJmb250RmFtaWx5XCIsIFwiZm9udC1mYW1pbHlcIl0sXG4gICAgICAgIFtcImZvbnRTaXplXCIsIFwiZm9udC1zaXplXCJdLFxuICAgICAgICBbXCJmb250U2l6ZU
15852FkanVzdFwiLCBcImZvbnQtc2l6ZS1hZGp1c3RcIl0sXG4gICAgICAgIFtcImZvbnRTdHJldGNoXCIsIFwiZm9udC1zdHJldGNoXCJdLFxuICAgICAgICBbXCJmb250U3R5bGVcIiwgXCJmb250LXN0eWxlXCJdLFxuICAgICAgICBbXCJmb250VmFyaWFudFwiLCBcImZvbnQtdmFyaWFudFwiXSxcbiAgICAgICAgW1wiZm9udFdlaWdodFwiLCBcImZvbnQtd2VpZ2h0XCJdLFxuICAgICAgICBbXCJnbHlwaE5hbWVcIiwgXCJnbHlwaC1uYW1lXCJdLFxuICAgICAgICBbXCJnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbFwiLCBcImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWxcIl0sXG4gICAgICAgIFtcImdseXBoT3JpZW50YXRpb25WZXJ0aWNhbFwiLCBcImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsXCJdLFxuICAgICAgICBbXCJob3JpekFkdlhcIiwgXCJob3Jpei1hZHYteFwiXSxcbiAgICAgICAgW1wiaG9yaXpPcmlnaW5YXCIsIFwiaG9yaXotb3JpZ2luLXhcIl0sXG4gICAgICAgIFtcImltYWdlUmVuZGVyaW5nXCIsIFwiaW1hZ2UtcmVuZGVyaW5nXCJdLFxuICAgICAgICBbXCJsZXR0ZXJTcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIl0sXG4gICAgICAgIFtcImxpZ2h0aW5nQ29sb3JcIiwgXCJsaWdodGluZy1jb2xvclwiXSxcbiAgICAgICAgW1wibWFya2VyRW5kXCIsIFwibWFya2VyLWVuZFwiXSxcbiAgICAgICAgW1wibWFya2VyTWlkXCIsIFwibWFya2VyLW1pZFwiXSxcbiAgICAgICAgW1wibWFya2VyU3RhcnRcIiwgXCJtYXJrZXItc3RhcnRcIl0sXG4gICAgICAgIFtcIm1hc2tUeXBlXCIsIFwibWFzay10eXBlXCJdLFxuICAgICAgICBbXCJvdmVybGluZVBvc2l0aW9uXCIsIFwib3ZlcmxpbmUtcG9zaXRpb25cIl0sXG4gICAgICAgIFtcIm92ZXJsaW5lVGhpY2tuZXNzXCIsIFwib3ZlcmxpbmUtdGhpY2tuZXNzXCJdLFxuICAgICAgICBbXCJwYWludE9yZGVyXCIsIFwicGFpbnQtb3JkZXJcIl0sXG4gICAgICAgIFtcInBhbm9zZS0xXCIsIFwicGFub3NlLTFcIl0sXG4gICAgICAgIFtcInBvaW50ZXJFdmVudHNcIiwgXCJwb2ludGVyLWV2ZW50c1wiXSxcbiAgICAgICAgW1wicmVuZGVyaW5nSW50ZW50XCIsIFwicmVuZGVyaW5nLWludGVudFwiXSxcbiAgICAgICAgW1wic2hhcGVSZW5kZXJpbmdcIiwgXCJzaGFwZS1yZW5kZXJpbmdcIl0sXG4gICAgICAgIFtcInN0b3BDb2xvclwiLCBcInN0b3AtY29sb3JcIl0sXG4gICAgICAgIFtcInN0b3BPcGFjaXR5XCIsIFwic3RvcC1vcGFjaXR5XCJdLFxuICAgICAgICBbXCJzdHJpa2V0aHJvdWdoUG9zaXRpb25cIiwgXCJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uXCJdLFxuICAgICAgICBbXCJzdHJpa2V0aHJvdWdoVGhpY2tuZXNzXCIsIFwic3RyaWtldGhyb3VnaC10aGlja25lc3NcIl0sXG4gICAgICAgIFtcInN0cm9rZURhc2hhcnJheVwiLCBcInN0cm9rZS1kYXNoYXJyYXlcIl0sXG4gICAgICAgIFtcInN0cm9rZURhc2hvZmZzZXRcIiwgXCJzdHJva2UtZGFzaG9mZnNldFwiXSxcbiAgICAgICAgW1wic3Ryb2tlTGluZWNhcFwiLCBcInN0cm9rZS1saW5lY2FwXCJdLFxuICAgICAgICBbXCJzdHJva2VMaW5lam9pblwiLCBcInN0cm9rZS1saW5lam9pblwiXSxcbiAgICAgICAgW1wic3Ryb2tlTWl0ZXJsaW1pdFwiLCBcInN0cm9rZS1taXRlcmxpbWl0XCJdLFxuICAgICAgICBbXCJzdHJva2VPcGFjaXR5XCIsIFwic3Ryb2tlLW9wYWNpdHlcIl0sXG4gICAgICAgIFtcInN0cm9rZVdpZHRoXCIsIFwic3Ryb2tlLXdpZHRoXCJdLFxuICAgICAgICBbXCJ0ZXh0QW5jaG9yXCIsIFwidGV4dC1hbmNob3JcIl0sXG4gICAgICAgIFtcInRleHREZWNvcmF0aW9uXCIsIFwidGV4dC1kZWNvcmF0aW9uXCJdLFxuICAgICAgICBbXCJ0ZXh0UmVuZGVyaW5nXCIsIFwidGV4dC1yZW5kZXJpbmdcIl0sXG4gICAgICAgIFtcInRyYW5zZm9ybU9yaWdpblwiLCBcInRyYW5zZm9ybS1vcmlnaW5cIl0sXG4gICAgICAgIFtcInVuZGVybGluZVBvc2l0aW9uXCIsIFwidW5kZXJsaW5lLXBvc2l0aW9uXCJdLFxuICAgICAgICBbXCJ1bmRlcmxpbmVUaGlja25lc3NcIiwgXCJ1bmRlcmxpbmUtdGhpY2tuZXNzXCJdLFxuICAgICAgICBbXCJ1bmljb2RlQmlkaVwiLCBcInVuaWNvZGUtYmlkaVwiXSxcbiAgICAgICAgW1widW5pY29kZVJhbmdlXCIsIFwidW5pY29kZS1yYW5nZVwiXSxcbiAgICAgICAgW1widW5pdHNQZXJFbVwiLCBcInVuaXRzLXBlci1lbVwiXSxcbiAgICAgICAgW1widkFscGhhYmV0aWNcIiwgXCJ2LWFscGhhYmV0aWNcIl0sXG4gICAgICAgIFtcInZIYW5naW5nXCIsIFwidi1oYW5naW5nXCJdLFxuICAgICAgICBbXCJ2SWRlb2dyYXBoaWNcIiwgXCJ2LWlkZW9ncmFwaGljXCJdLFxuICAgICAgICBbXCJ2TWF0aGVtYXRpY2FsXCIsIFwidi1tYXRoZW1hdGljYWxcIl0sXG4gICAgICAgIFtcInZlY3RvckVmZmVjdFwiLCBcInZlY3Rvci1lZmZlY3RcIl0sXG4gICAgICAgIFtcInZlcnRBZHZZXCIsIFwidmVydC1hZHYteVwiXSxcbiAgICAgICAgW1widmVydE9yaWdpblhcIiwgXCJ2ZXJ0LW9yaWdpbi14XCJdLFxuICAgICAgICBbXCJ2ZXJ0T3JpZ2luWVwiLCBcInZlcnQtb3Jp
15852Z2luLXlcIl0sXG4gICAgICAgIFtcIndvcmRTcGFjaW5nXCIsIFwid29yZC1zcGFjaW5nXCJdLFxuICAgICAgICBbXCJ3cml0aW5nTW9kZVwiLCBcIndyaXRpbmctbW9kZVwiXSxcbiAgICAgICAgW1wieG1sbnNYbGlua1wiLCBcInhtbG5zOnhsaW5rXCJdLFxuICAgICAgICBbXCJ4SGVpZ2h0XCIsIFwieC1oZWlnaHRcIl1cbiAgICAgIF0pLFxuICAgICAgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAgICAgICBhY2NlcHQ6IFwiYWNjZXB0XCIsXG4gICAgICAgIGFjY2VwdGNoYXJzZXQ6IFwiYWNjZXB0Q2hhcnNldFwiLFxuICAgICAgICBcImFjY2VwdC1jaGFyc2V0XCI6IFwiYWNjZXB0Q2hhcnNldFwiLFxuICAgICAgICBhY2Nlc3NrZXk6IFwiYWNjZXNzS2V5XCIsXG4gICAgICAgIGFjdGlvbjogXCJhY3Rpb25cIixcbiAgICAgICAgYWxsb3dmdWxsc2NyZWVuOiBcImFsbG93RnVsbFNjcmVlblwiLFxuICAgICAgICBhbHQ6IFwiYWx0XCIsXG4gICAgICAgIGFzOiBcImFzXCIsXG4gICAgICAgIGFzeW5jOiBcImFzeW5jXCIsXG4gICAgICAgIGF1dG9jYXBpdGFsaXplOiBcImF1dG9DYXBpdGFsaXplXCIsXG4gICAgICAgIGF1dG9jb21wbGV0ZTogXCJhdXRvQ29tcGxldGVcIixcbiAgICAgICAgYXV0b2NvcnJlY3Q6IFwiYXV0b0NvcnJlY3RcIixcbiAgICAgICAgYXV0b2ZvY3VzOiBcImF1dG9Gb2N1c1wiLFxuICAgICAgICBhdXRvcGxheTogXCJhdXRvUGxheVwiLFxuICAgICAgICBhdXRvc2F2ZTogXCJhdXRvU2F2ZVwiLFxuICAgICAgICBjYXB0dXJlOiBcImNhcHR1cmVcIixcbiAgICAgICAgY2VsbHBhZGRpbmc6IFwiY2VsbFBhZGRpbmdcIixcbiAgICAgICAgY2VsbHNwYWNpbmc6IFwiY2VsbFNwYWNpbmdcIixcbiAgICAgICAgY2hhbGxlbmdlOiBcImNoYWxsZW5nZVwiLFxuICAgICAgICBjaGFyc2V0OiBcImNoYXJTZXRcIixcbiAgICAgICAgY2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgICAgIGNoaWxkcmVuOiBcImNoaWxkcmVuXCIsXG4gICAgICAgIGNpdGU6IFwiY2l0ZVwiLFxuICAgICAgICBjbGFzczogXCJjbGFzc05hbWVcIixcbiAgICAgICAgY2xhc3NpZDogXCJjbGFzc0lEXCIsXG4gICAgICAgIGNsYXNzbmFtZTogXCJjbGFzc05hbWVcIixcbiAgICAgICAgY29sczogXCJjb2xzXCIsXG4gICAgICAgIGNvbHNwYW46IFwiY29sU3BhblwiLFxuICAgICAgICBjb250ZW50OiBcImNvbnRlbnRcIixcbiAgICAgICAgY29udGVudGVkaXRhYmxlOiBcImNvbnRlbnRFZGl0YWJsZVwiLFxuICAgICAgICBjb250ZXh0bWVudTogXCJjb250ZXh0TWVudVwiLFxuICAgICAgICBjb250cm9sczogXCJjb250cm9sc1wiLFxuICAgICAgICBjb250cm9sc2xpc3Q6IFwiY29udHJvbHNMaXN0XCIsXG4gICAgICAgIGNvb3JkczogXCJjb29yZHNcIixcbiAgICAgICAgY3JlZGVudGlhbGxlc3M6IFwiY3JlZGVudGlhbGxlc3NcIixcbiAgICAgICAgY3Jvc3NvcmlnaW46IFwiY3Jvc3NPcmlnaW5cIixcbiAgICAgICAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIixcbiAgICAgICAgZGF0YTogXCJkYXRhXCIsXG4gICAgICAgIGRhdGV0aW1lOiBcImRhdGVUaW1lXCIsXG4gICAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgICBkZWZhdWx0Y2hlY2tlZDogXCJkZWZhdWx0Q2hlY2tlZFwiLFxuICAgICAgICBkZWZhdWx0dmFsdWU6IFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgICAgIGRlZmVyOiBcImRlZmVyXCIsXG4gICAgICAgIGRpcjogXCJkaXJcIixcbiAgICAgICAgZGlzYWJsZWQ6IFwiZGlzYWJsZWRcIixcbiAgICAgICAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6IFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIixcbiAgICAgICAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiBcImRpc2FibGVSZW1vdGVQbGF5YmFja1wiLFxuICAgICAgICBkb3dubG9hZDogXCJkb3dubG9hZFwiLFxuICAgICAgICBkcmFnZ2FibGU6IFwiZHJhZ2dhYmxlXCIsXG4gICAgICAgIGVuY3R5cGU6IFwiZW5jVHlwZVwiLFxuICAgICAgICBlbnRlcmtleWhpbnQ6IFwiZW50ZXJLZXlIaW50XCIsXG4gICAgICAgIGZldGNocHJpb3JpdHk6IFwiZmV0Y2hQcmlvcml0eVwiLFxuICAgICAgICBmb3I6IFwiaHRtbEZvclwiLFxuICAgICAgICBmb3JtOiBcImZvcm1cIixcbiAgICAgICAgZm9ybW1ldGhvZDogXCJmb3JtTWV0aG9kXCIsXG4gICAgICAgIGZvcm1hY3Rpb246IFwiZm9ybUFjdGlvblwiLFxuICAgICAgICBmb3JtZW5jdHlwZTogXCJmb3JtRW5jVHlwZVwiLFxuICAgICAgICBmb3Jtbm92YWxpZGF0ZTogXCJmb3JtTm9WYWxpZGF0ZVwiLFxuICAgICAgICBmb3JtdGFyZ2V0OiBcImZvcm1UYXJnZXRcIixcbiAgICAgICAgZnJhbWVib3JkZXI6IFwiZnJhbWVCb3JkZXJcIixcbiAgICAgICAgaGVhZGVyczogXCJoZWFkZXJzXCIsXG4gICAgICAgIGhlaWdodDogXCJoZWlnaHRcIixcbiAgICAgICAgaGlkZGVuOiBcImhpZGRlblwiLFxuICAgICAgICBoaWdoOiBcImhpZ2hcIixcbiAgICAgICAgaHJlZjogXCJocmVmXCIsXG4gICAgICAgIGhyZWZsYW5nOiBcImhyZWZMYW5nXCIsXG4gICAgICAgIGh0bWxmb3I6IFwiaHRtbEZvclwiLFxuICAgICAgICBodHRwZXF1aXY6IFwiaHR0cEVxdWl2XCIsXG4gICAgICAgIFwiaHR0cC1lcXVpdlwiOiBcImh0dHBFcXVpdlwiLFxuICAgICAgICBpY29uOiBcImljb25cIixcbiAgICAgICAgaWQ6IFwiaWRcIixcbiAgICAgICAgaW1hZ2VzaXplczogXCJpbWFnZVNpemVzXCIsXG4gICAgICAgIGltYWdlc3Jjc2V0OiBcImltYWdlU3JjU2V0XCIsXG4gICAgICAgIGluZXJ0OiBcImluZXJ0XCIsXG4gICAgICAgIGlubmVyaHRtbDogXCJpbm5lckhUTUxcIixcbiAgICAgICAgaW5wdXRtb2RlOiBcImlucHV0TW9kZVwiLFxuICAgICAgICBpbnRlZ3JpdHk6IFwiaW50ZWdyaXR5XCIsXG4gICAgICAgIGlzOiBcImlzXCIsXG4gICAgICAgIGl0ZW1pZDogXCJpdGVtSURcIixcbiAgICAgICAgaXRlbXByb3A6IFwiaXRlbVByb3BcIixcbiAgICAgICAgaXRlbXJlZjogXCJpdGVtUmVmXCIsXG4gICAgICAgIGl0ZW1zY29wZTogXCJpdGVtU2NvcGVcIixcbiAgICAgICAgaXRlbXR5cGU6IFwiaXRlbVR5cGVcIixcbiAgICAgICAga2V5cGFyYW1zOiBcImtleVBhcmFtc1wiLFxuICAgICAgICBrZXl0eXBlOiBcImtleVR5cGVcIixcbiAgICAgICAga2luZDogXCJraW5kXCIsXG4gICAgICAgIGxhYmVsOiBcImxhYmVsXCIsXG4gICAgICAgIGxhbmc6IFwibGFuZ1wiLFxuICAgICAgICBsaXN0OiBcImxpc3RcIixcbiAgICAgICAgbG9vcDogXCJsb29wXCIsXG4gICAgICAgIGxvdzogXCJsb3dcIixcbiAgICAgICAgbWFuaWZlc3Q6IFwibWFuaWZlc3RcIixcbiAgICAgICAgbWFyZ2lud2lkdGg6IFwibWFyZ2luV2lkdGhcIixcbiAgICAgICAgbWFyZ2luaGVpZ2h0OiBcIm1hcmdpbkhlaWdodFwiLFxuICAgICAgICBtYXg6IFwibWF4XCIsXG4gICAgICAgIG1heGxlbmd0aDogXCJtYXhMZW5ndGhcIixcbiAgICAgICAgbWVkaWE6IFwibWVkaWFcIixcbiAgICAgICAgbWVkaWFncm91cDogXCJtZWRpYUdyb3VwXCIsXG4gICAgICAgIG1ldGhvZDogXCJtZXRob2RcIixcbiAgICAgICAgbWluOiBcIm1pblwiLFxuICAgICAgICBtaW5sZW5ndGg6IFwibWluTGVuZ3RoXCIsXG4gICAgICAgIG11bHRpcGxlOiBcIm11bHRpcGxlXCIsXG4gICAgICAgIG11dGVkOiBcIm11dG
15852VkXCIsXG4gICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICBub21vZHVsZTogXCJub01vZHVsZVwiLFxuICAgICAgICBub25jZTogXCJub25jZVwiLFxuICAgICAgICBub3ZhbGlkYXRlOiBcIm5vVmFsaWRhdGVcIixcbiAgICAgICAgb3BlbjogXCJvcGVuXCIsXG4gICAgICAgIG9wdGltdW06IFwib3B0aW11bVwiLFxuICAgICAgICBwYXR0ZXJuOiBcInBhdHRlcm5cIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwicGxhY2Vob2xkZXJcIixcbiAgICAgICAgcGxheXNpbmxpbmU6IFwicGxheXNJbmxpbmVcIixcbiAgICAgICAgcG9zdGVyOiBcInBvc3RlclwiLFxuICAgICAgICBwcmVsb2FkOiBcInByZWxvYWRcIixcbiAgICAgICAgcHJvZmlsZTogXCJwcm9maWxlXCIsXG4gICAgICAgIHJhZGlvZ3JvdXA6IFwicmFkaW9Hcm91cFwiLFxuICAgICAgICByZWFkb25seTogXCJyZWFkT25seVwiLFxuICAgICAgICByZWZlcnJlcnBvbGljeTogXCJyZWZlcnJlclBvbGljeVwiLFxuICAgICAgICByZWw6IFwicmVsXCIsXG4gICAgICAgIHJlcXVpcmVkOiBcInJlcXVpcmVkXCIsXG4gICAgICAgIHJldmVyc2VkOiBcInJldmVyc2VkXCIsXG4gICAgICAgIHJvbGU6IFwicm9sZVwiLFxuICAgICAgICByb3dzOiBcInJvd3NcIixcbiAgICAgICAgcm93c3BhbjogXCJyb3dTcGFuXCIsXG4gICAgICAgIHNhbmRib3g6IFwic2FuZGJveFwiLFxuICAgICAgICBzY29wZTogXCJzY29wZVwiLFxuICAgICAgICBzY29wZWQ6IFwic2NvcGVkXCIsXG4gICAgICAgIHNjcm9sbGluZzogXCJzY3JvbGxpbmdcIixcbiAgICAgICAgc2VhbWxlc3M6IFwic2VhbWxlc3NcIixcbiAgICAgICAgc2VsZWN0ZWQ6IFwic2VsZWN0ZWRcIixcbiAgICAgICAgc2hhcGU6IFwic2hhcGVcIixcbiAgICAgICAgc2l6ZTogXCJzaXplXCIsXG4gICAgICAgIHNpemVzOiBcInNpemVzXCIsXG4gICAgICAgIHNwYW46IFwic3BhblwiLFxuICAgICAgICBzcGVsbGNoZWNrOiBcInNwZWxsQ2hlY2tcIixcbiAgICAgICAgc3JjOiBcInNyY1wiLFxuICAgICAgICBzcmNkb2M6IFwic3JjRG9jXCIsXG4gICAgICAgIHNyY2xhbmc6IFwic3JjTGFuZ1wiLFxuICAgICAgICBzcmNzZXQ6IFwic3JjU2V0XCIsXG4gICAgICAgIHN0YXJ0OiBcInN0YXJ0XCIsXG4gICAgICAgIHN0ZXA6IFwic3RlcFwiLFxuICAgICAgICBzdHlsZTogXCJzdHlsZVwiLFxuICAgICAgICBzdW1tYXJ5OiBcInN1bW1hcnlcIixcbiAgICAgICAgdGFiaW5kZXg6IFwidGFiSW5kZXhcIixcbiAgICAgICAgdGFyZ2V0OiBcInRhcmdldFwiLFxuICAgICAgICB0aXRsZTogXCJ0aXRsZVwiLFxuICAgICAgICB0eXBlOiBcInR5cGVcIixcbiAgICAgICAgdXNlbWFwOiBcInVzZU1hcFwiLFxuICAgICAgICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICAgICAgICB3aWR0aDogXCJ3aWR0aFwiLFxuICAgICAgICB3bW9kZTogXCJ3bW9kZVwiLFxuICAgICAgICB3cmFwOiBcIndyYXBcIixcbiAgICAgICAgYWJvdXQ6IFwiYWJvdXRcIixcbiAgICAgICAgYWNjZW50aGVpZ2h0OiBcImFjY2VudEhlaWdodFwiLFxuICAgICAgICBcImFjY2VudC1oZWlnaHRcIjogXCJhY2NlbnRIZWlnaHRcIixcbiAgICAgICAgYWNjdW11bGF0ZTogXCJhY2N1bXVsYXRlXCIsXG4gICAgICAgIGFkZGl0aXZlOiBcImFkZGl0aXZlXCIsXG4gICAgICAgIGFsaWdubWVudGJhc2VsaW5lOiBcImFsaWdubWVudEJhc2VsaW5lXCIsXG4gICAgICAgIFwiYWxpZ25tZW50LWJhc2VsaW5lXCI6IFwiYWxpZ25tZW50QmFzZWxpbmVcIixcbiAgICAgICAgYWxsb3dyZW9yZGVyOiBcImFsbG93UmVvcmRlclwiLFxuICAgICAgICBhbHBoYWJldGljOiBcImFscGhhYmV0aWNcIixcbiAgICAgICAgYW1wbGl0dWRlOiBcImFtcGxpdHVkZVwiLFxuICAgICAgICBhcmFiaWNmb3JtOiBcImFyYWJpY0Zvcm1cIixcbiAgICAgICAgXCJhcmFiaWMtZm9ybVwiOiBcImFyYWJpY0Zvcm1cIixcbiAgICAgICAgYXNjZW50OiBcImFzY2VudFwiLFxuICAgICAgICBhdHRyaWJ1dGVuYW1lOiBcImF0dHJpYnV0ZU5hbWVcIixcbiAgICAgICAgYXR0cmlidXRldHlwZTogXCJhdHRyaWJ1dGVUeXBlXCIsXG4gICAgICAgIGF1dG9yZXZlcnNlOiBcImF1dG9SZXZlcnNlXCIsXG4gICAgICAgIGF6aW11dGg6IFwiYXppbXV0aFwiLFxuICAgICAgICBiYXNlZnJlcXVlbmN5OiBcImJhc2VGcmVxdWVuY3lcIixcbiAgICAgICAgYmFzZWxpbmVzaGlmdDogXCJiYXNlbGluZVNoaWZ0XCIsXG4gICAgICAgIFwiYmFzZWxpbmUtc2hpZnRcIjogXCJiYXNlbGluZVNoaWZ0XCIsXG4gICAgICAgIGJhc2Vwcm9maWxlOiBcImJhc2VQcm9maWxlXCIsXG4gICAgICAgIGJib3g6IFwiYmJveFwiLFxuICAgICAgICBiZWdpbjogXCJiZWdpblwiLFxuICAgICAgICBiaWFzOiBcImJpYXNcIixcbiAgICAgICAgYnk6IFwiYnlcIixcbiAgICAgICAgY2FsY21vZGU6IFwiY2FsY01vZGVcIixcbiAgICAgICAgY2FwaGVpZ2h0OiBcImNhcEhlaWdodFwiLFxuICAgICAgICBcImNhcC1oZWlnaHRcIjogXCJjYXBIZWlnaHRcIixcbiAgICAgICAgY2xpcDogXCJjbGlwXCIsXG4gICAgICAgIGNsaXBwYXRoOiBcImNsaXBQYXRoXCIsXG4gICAgICAgIFwiY2xpcC1wYXRoXCI6IFwiY2xpcFBhdGhcIixcbiAgICAgICAgY2xpcHBhdGh1bml0czogXCJjbGlwUGF0aFVuaXRzXCIsXG4gICAgICAgIGNsaXBydWxlOiBcImNsaXBSdWxlXCIsXG4gICAgICAgIFwiY2xpcC1ydWxlXCI6IFwiY2xpcFJ1bGVcIixcbiAgICAgICAgY29sb3I6IFwiY29sb3JcIixcbiAgICAgICAgY29sb3JpbnRlcnBvbGF0aW9uOiBcImNvbG9ySW50ZXJwb2xhdGlvblwiLFxuICAgICAgICBcImNvbG9yLWludGVycG9sYXRpb25cIjogXCJjb2xvckludGVycG9sYXRpb25cIixcbiAgICAgICAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogXCJjb2xvckludGVycG9sYXRpb25GaWx0ZXJzXCIsXG4gICAgICAgIFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCI6IFwiY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyc1wiLFxuICAgICAgICBjb2xvcnByb2ZpbGU6IFwiY29sb3JQcm9maWxlXCIsXG4gICAgICAgIFwiY29sb3ItcHJvZmlsZVwiOiBcImNvbG9yUHJvZmlsZVwiLFxuICAgICAgICBjb2xvcnJlbmRlcmluZzogXCJjb2xvclJlbmRlcmluZ1wiLFxuICAgICAgICBcImNvbG9yLXJlbmRlcmluZ1wiOiBcImNvbG9yUmVuZGVyaW5nXCIsXG4gICAgICAgIGNvbnRlbn
15852RzY3JpcHR0eXBlOiBcImNvbnRlbnRTY3JpcHRUeXBlXCIsXG4gICAgICAgIGNvbnRlbnRzdHlsZXR5cGU6IFwiY29udGVudFN0eWxlVHlwZVwiLFxuICAgICAgICBjdXJzb3I6IFwiY3Vyc29yXCIsXG4gICAgICAgIGN4OiBcImN4XCIsXG4gICAgICAgIGN5OiBcImN5XCIsXG4gICAgICAgIGQ6IFwiZFwiLFxuICAgICAgICBkYXRhdHlwZTogXCJkYXRhdHlwZVwiLFxuICAgICAgICBkZWNlbGVyYXRlOiBcImRlY2VsZXJhdGVcIixcbiAgICAgICAgZGVzY2VudDogXCJkZXNjZW50XCIsXG4gICAgICAgIGRpZmZ1c2Vjb25zdGFudDogXCJkaWZmdXNlQ29uc3RhbnRcIixcbiAgICAgICAgZGlyZWN0aW9uOiBcImRpcmVjdGlvblwiLFxuICAgICAgICBkaXNwbGF5OiBcImRpc3BsYXlcIixcbiAgICAgICAgZGl2aXNvcjogXCJkaXZpc29yXCIsXG4gICAgICAgIGRvbWluYW50YmFzZWxpbmU6IFwiZG9taW5hbnRCYXNlbGluZVwiLFxuICAgICAgICBcImRvbWluYW50LWJhc2VsaW5lXCI6IFwiZG9taW5hbnRCYXNlbGluZVwiLFxuICAgICAgICBkdXI6IFwiZHVyXCIsXG4gICAgICAgIGR4OiBcImR4XCIsXG4gICAgICAgIGR5OiBcImR5XCIsXG4gICAgICAgIGVkZ2Vtb2RlOiBcImVkZ2VNb2RlXCIsXG4gICAgICAgIGVsZXZhdGlvbjogXCJlbGV2YXRpb25cIixcbiAgICAgICAgZW5hYmxlYmFja2dyb3VuZDogXCJlbmFibGVCYWNrZ3JvdW5kXCIsXG4gICAgICAgIFwiZW5hYmxlLWJhY2tncm91bmRcIjogXCJlbmFibGVCYWNrZ3JvdW5kXCIsXG4gICAgICAgIGVuZDogXCJlbmRcIixcbiAgICAgICAgZXhwb25lbnQ6IFwiZXhwb25lbnRcIixcbiAgICAgICAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogXCJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXCIsXG4gICAgICAgIGZpbGw6IFwiZmlsbFwiLFxuICAgICAgICBmaWxsb3BhY2l0eTogXCJmaWxsT3BhY2l0eVwiLFxuICAgICAgICBcImZpbGwtb3BhY2l0eVwiOiBcImZpbGxPcGFjaXR5XCIsXG4gICAgICAgIGZpbGxydWxlOiBcImZpbGxSdWxlXCIsXG4gICAgICAgIFwiZmlsbC1ydWxlXCI6IFwiZmlsbFJ1bGVcIixcbiAgICAgICAgZmlsdGVyOiBcImZpbHRlclwiLFxuICAgICAgICBmaWx0ZXJyZXM6IFwiZmlsdGVyUmVzXCIsXG4gICAgICAgIGZpbHRlcnVuaXRzOiBcImZpbHRlclVuaXRzXCIsXG4gICAgICAgIGZsb29kb3BhY2l0eTogXCJmbG9vZE9wYWNpdHlcIixcbiAgICAgICAgXCJmbG9vZC1vcGFjaXR5XCI6IFwiZmxvb2RPcGFjaXR5XCIsXG4gICAgICAgIGZsb29kY29sb3I6IFwiZmxvb2RDb2xvclwiLFxuICAgICAgICBcImZsb29kLWNvbG9yXCI6IFwiZmxvb2RDb2xvclwiLFxuICAgICAgICBmb2N1c2FibGU6IFwiZm9jdXNhYmxlXCIsXG4gICAgICAgIGZvbnRmYW1pbHk6IFwiZm9udEZhbWlseVwiLFxuICAgICAgICBcImZvbnQtZmFtaWx5XCI6IFwiZm9udEZhbWlseVwiLFxuICAgICAgICBmb250c2l6ZTogXCJmb250U2l6ZVwiLFxuICAgICAgICBcImZvbnQtc2l6ZVwiOiBcImZvbnRTaXplXCIsXG4gICAgICAgIGZvbnRzaXplYWRqdXN0OiBcImZvbnRTaXplQWRqdXN0XCIsXG4gICAgICAgIFwiZm9udC1zaXplLWFkanVzdFwiOiBcImZvbnRTaXplQWRqdXN0XCIsXG4gICAgICAgIGZvbnRzdHJldGNoOiBcImZvbnRTdHJldGNoXCIsXG4gICAgICAgIFwiZm9udC1zdHJldGNoXCI6IFwiZm9udFN0cmV0Y2hcIixcbiAgICAgICAgZm9udHN0eWxlOiBcImZvbnRTdHlsZVwiLFxuICAgICAgICBcImZvbnQtc3R5bGVcIjogXCJmb250U3R5bGVcIixcbiAgICAgICAgZm9udHZhcmlhbnQ6IFwiZm9udFZhcmlhbnRcIixcbiAgICAgICAgXCJmb250LXZhcmlhbnRcIjogXCJmb250VmFyaWFudFwiLFxuICAgICAgICBmb250d2VpZ2h0OiBcImZvbnRXZWlnaHRcIixcbiAgICAgICAgXCJmb250LXdlaWdodFwiOiBcImZvbnRXZWlnaHRcIixcbiAgICAgICAgZm9ybWF0OiBcImZvcm1hdFwiLFxuICAgICAgICBmcm9tOiBcImZyb21cIixcbiAgICAgICAgZng6IFwiZnhcIixcbiAgICAgICAgZnk6IFwiZnlcIixcbiAgICAgICAgZzE6IFwiZzFcIixcbiAgICAgICAgZzI6IFwiZzJcIixcbiAgICAgICAgZ2x5cGhuYW1lOiBcImdseXBoTmFtZVwiLFxuICAgICAgICBcImdseXBoLW5hbWVcIjogXCJnbHlwaE5hbWVcIixcbiAgICAgICAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6IFwiZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWxcIixcbiAgICAgICAgXCJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsXCI6IFwiZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWxcIixcbiAgICAgICAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiBcImdseXBoT3JpZW50YXRpb25WZXJ0aWNhbFwiLFxuICAgICAgICBcImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsXCI6IFwiZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsXCIsXG4gICAgICAgIGdseXBocmVmOiBcImdseXBoUmVmXCIsXG4gICAgICAgIGdyYWRpZW50dHJhbnNmb3JtOiBcImdyYWRpZW50VHJhbnNmb3JtXCIsXG4gICAgICAgIGdyYWRpZW50dW5pdHM6IFwiZ3JhZGllbnRVbml0c1wiLFxuICAgICAgICBoYW5naW5nOiBcImhhbmdpbmdcIixcbiAgICAgICAgaG9yaXphZHZ4OiBcImhvcml6QWR2WFwiLFxuICAgICAgICBcImhvcml6LWFkdi14XCI6IFwiaG9yaXpBZHZYXCIsXG4gICAgICAgIGhvcml6b3JpZ2lueDogXCJob3Jpek9yaWdpblhcIixcbiAgICAgICAgXCJob3Jpei1vcmlnaW4teFwiOiBcImhvcml6T3JpZ2luWFwiLFxuICAgICAgICBpZGVvZ3JhcGhpYzogXCJpZGVvZ3JhcGh
15852pY1wiLFxuICAgICAgICBpbWFnZXJlbmRlcmluZzogXCJpbWFnZVJlbmRlcmluZ1wiLFxuICAgICAgICBcImltYWdlLXJlbmRlcmluZ1wiOiBcImltYWdlUmVuZGVyaW5nXCIsXG4gICAgICAgIGluMjogXCJpbjJcIixcbiAgICAgICAgaW46IFwiaW5cIixcbiAgICAgICAgaW5saXN0OiBcImlubGlzdFwiLFxuICAgICAgICBpbnRlcmNlcHQ6IFwiaW50ZXJjZXB0XCIsXG4gICAgICAgIGsxOiBcImsxXCIsXG4gICAgICAgIGsyOiBcImsyXCIsXG4gICAgICAgIGszOiBcImszXCIsXG4gICAgICAgIGs0OiBcIms0XCIsXG4gICAgICAgIGs6IFwia1wiLFxuICAgICAgICBrZXJuZWxtYXRyaXg6IFwia2VybmVsTWF0cml4XCIsXG4gICAgICAgIGtlcm5lbHVuaXRsZW5ndGg6IFwia2VybmVsVW5pdExlbmd0aFwiLFxuICAgICAgICBrZXJuaW5nOiBcImtlcm5pbmdcIixcbiAgICAgICAga2V5cG9pbnRzOiBcImtleVBvaW50c1wiLFxuICAgICAgICBrZXlzcGxpbmVzOiBcImtleVNwbGluZXNcIixcbiAgICAgICAga2V5dGltZXM6IFwia2V5VGltZXNcIixcbiAgICAgICAgbGVuZ3RoYWRqdXN0OiBcImxlbmd0aEFkanVzdFwiLFxuICAgICAgICBsZXR0ZXJzcGFjaW5nOiBcImxldHRlclNwYWNpbmdcIixcbiAgICAgICAgXCJsZXR0ZXItc3BhY2luZ1wiOiBcImxldHRlclNwYWNpbmdcIixcbiAgICAgICAgbGlnaHRpbmdjb2xvcjogXCJsaWdodGluZ0NvbG9yXCIsXG4gICAgICAgIFwibGlnaHRpbmctY29sb3JcIjogXCJsaWdodGluZ0NvbG9yXCIsXG4gICAgICAgIGxpbWl0aW5nY29uZWFuZ2xlOiBcImxpbWl0aW5nQ29uZUFuZ2xlXCIsXG4gICAgICAgIGxvY2FsOiBcImxvY2FsXCIsXG4gICAgICAgIG1hcmtlcmVuZDogXCJtYXJrZXJFbmRcIixcbiAgICAgICAgXCJtYXJrZXItZW5kXCI6IFwibWFya2VyRW5kXCIsXG4gICAgICAgIG1hcmtlcmhlaWdodDogXCJtYXJrZXJIZWlnaHRcIixcbiAgICAgICAgbWFya2VybWlkOiBcIm1hcmtlck1pZFwiLFxuICAgICAgICBcIm1hcmtlci1taWRcIjogXCJtYXJrZXJNaWRcIixcbiAgICAgICAgbWFya2Vyc3RhcnQ6IFwibWFya2VyU3RhcnRcIixcbiAgICAgICAgXCJtYXJrZXItc3RhcnRcIjogXCJtYXJrZXJTdGFydFwiLFxuICAgICAgICBtYXJrZXJ1bml0czogXCJtYXJrZXJVbml0c1wiLFxuICAgICAgICBtYXJrZXJ3aWR0aDogXCJtYXJrZXJXaWR0aFwiLFxuICAgICAgICBtYXNrOiBcIm1hc2tcIixcbiAgICAgICAgbWFza2NvbnRlbnR1bml0czogXCJtYXNrQ29udGVudFVuaXRzXCIsXG4gICAgICAgIG1hc2t0eXBlOiBcIm1hc2tUeXBlXCIsXG4gICAgICAgIG1hc2t1bml0czogXCJtYXNrVW5pdHNcIixcbiAgICAgICAgbWF0aGVtYXRpY2FsOiBcIm1hdGhlbWF0aWNhbFwiLFxuICAgICAgICBtb2RlOiBcIm1vZGVcIixcbiAgICAgICAgbnVtb2N0YXZlczogXCJudW1PY3RhdmVzXCIsXG4gICAgICAgIG9mZnNldDogXCJvZmZzZXRcIixcbiAgICAgICAgb3BhY2l0eTogXCJvcGFjaXR5XCIsXG4gICAgICAgIG9wZXJhdG9yOiBcIm9wZXJhdG9yXCIsXG4gICAgICAgIG9yZGVyOiBcIm9yZGVyXCIsXG4gICAgICAgIG9yaWVudDogXCJvcmllbnRcIixcbiAgICAgICAgb3JpZW50YXRpb246IFwib3JpZW50YXRpb25cIixcbiAgICAgICAgb3JpZ2luOiBcIm9yaWdpblwiLFxuICAgICAgICBvdmVyZmxvdzogXCJvdmVyZmxvd1wiLFxuICAgICAgICBvdmVybGluZXBvc2l0aW9uOiBcIm92ZXJsaW5lUG9zaXRpb25cIixcbiAgICAgICAgXCJvdmVybGluZS1wb3NpdGlvblwiOiBcIm92ZXJsaW5lUG9zaXRpb25cIixcbiAgICAgICAgb3ZlcmxpbmV0aGlja25lc3M6IFwib3ZlcmxpbmVUaGlja25lc3NcIixcbiAgICAgICAgXCJvdmVybGluZS10aGlja25lc3NcIjogXCJvdmVybGluZVRoaWNrbmVzc1wiLFxuICAgICAgICBwYWludG9yZGVyOiBcInBhaW50T3JkZXJcIixcbiAgICAgICAgXCJwYWludC1vcmRlclwiOiBcInBhaW50T3JkZXJcIixcbiAgICAgICAgcGFub3NlMTogXCJwYW5vc2UxXCIsXG4gICAgICAgIFwicGFub3NlLTFcIjogXCJwYW5vc2UxXCIsXG4gICAgICAgIHBhdGhsZW5ndGg6IFwicGF0aExlbmd0aFwiLFxuICAgICAgICBwYXR0ZXJuY29udGVudHVuaXRzOiBcInBhdHRlcm5Db250ZW50VW5pdHNcIixcbiAgICAgICAgcGF0dGVybnRyYW5zZm9ybTogXCJwYXR0ZXJuVHJhbnNmb3JtXCIsXG4gICAgICAgIHBhdHRlcm51bml0czogXCJwYXR0ZXJuVW5pdHNcIixcbiAgICAgICAgcG9pbnRlcmV2ZW50czogXCJwb2ludGVyRXZlbnRzXCIsXG4gICAgICAgIFwicG9pbnRlci1ldmVudHNcIjogXCJwb2ludGVyRXZlbnRzXCIsXG4gICAgICAgIHBvaW50czogXCJwb2ludHNcIixcbiAgICAgICAgcG9pbnRzYXR4OiBcInBvaW50c0F0WFwiLFxuICAgICAgICBwb2ludHNhdHk6IFwicG9pbnRzQXRZXCIsXG4gICAgICAgIHBvaW50c2F0ejogXCJwb2ludHNBdFpcIixcbiAgICAgICAgcG9wb3ZlcjogXCJwb3BvdmVyXCIsXG4gICAgICAgIHBvcG92ZXJ0YXJnZXQ6IFwicG9wb3ZlclRhcmdldFwiLFxuICAgICAgICBwb3BvdmVydGFyZ2V0YWN0aW9uOiBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbiAgICAgICAgcHJlZml4OiBcInByZWZpeFwiLFxuICAgICAgICBwcmVzZXJ2ZWFscGhhOiBcInByZXNlcnZlQWxwaGFcIixcbiAgICAgICAgcHJlc2VydmVhc3BlY3RyYXRpbzogXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsXG4gICAgICAgIHByaW1pdGl2ZXVuaXRzOiBcInByaW1pdGl2ZVVuaXRzXCIsXG4gICAgICAgIHByb3BlcnR5OiBcInByb3BlcnR5XCIsXG4gICAgICAgIHI6IFwiclwiLFxuICAgICAgICByYWRpdXM6IFwicmFkaXVzXCIsXG4gICAgICAgIHJlZng6IFwicmVmWFwiLFxuICAgICAgICByZWZ5OiBcInJlZllcIixcbiAgICAgICAgcmVuZGVyaW5naW50ZW50OiBcInJlbmRlcmluZ0ludGVudFwiLFxuICAgICAgICBcInJlbmRlcmluZy1pbnRlbnRcIjogXCJyZW5kZXJpbmdJbnRlbnRcIixcbiAgICAgICAgcmVwZWF0Y291bnQ6IFwicmVwZWF0Q291bnRcIixcbiAgICAgICAgcmVwZWF0ZHVyOiBcInJlcGVhdER1clwiLFxuICAgICAgICByZXF1aXJlZGV4dGVuc2lvbnM6IFwicmVxdWlyZWRFeHRlbnNpb25zXCIsXG4gICAgICAgI
15852HJlcXVpcmVkZmVhdHVyZXM6IFwicmVxdWlyZWRGZWF0dXJlc1wiLFxuICAgICAgICByZXNvdXJjZTogXCJyZXNvdXJjZVwiLFxuICAgICAgICByZXN0YXJ0OiBcInJlc3RhcnRcIixcbiAgICAgICAgcmVzdWx0OiBcInJlc3VsdFwiLFxuICAgICAgICByZXN1bHRzOiBcInJlc3VsdHNcIixcbiAgICAgICAgcm90YXRlOiBcInJvdGF0ZVwiLFxuICAgICAgICByeDogXCJyeFwiLFxuICAgICAgICByeTogXCJyeVwiLFxuICAgICAgICBzY2FsZTogXCJzY2FsZVwiLFxuICAgICAgICBzZWN1cml0eTogXCJzZWN1cml0eVwiLFxuICAgICAgICBzZWVkOiBcInNlZWRcIixcbiAgICAgICAgc2hhcGVyZW5kZXJpbmc6IFwic2hhcGVSZW5kZXJpbmdcIixcbiAgICAgICAgXCJzaGFwZS1yZW5kZXJpbmdcIjogXCJzaGFwZVJlbmRlcmluZ1wiLFxuICAgICAgICBzbG9wZTogXCJzbG9wZVwiLFxuICAgICAgICBzcGFjaW5nOiBcInNwYWNpbmdcIixcbiAgICAgICAgc3BlY3VsYXJjb25zdGFudDogXCJzcGVjdWxhckNvbnN0YW50XCIsXG4gICAgICAgIHNwZWN1bGFyZXhwb25lbnQ6IFwic3BlY3VsYXJFeHBvbmVudFwiLFxuICAgICAgICBzcGVlZDogXCJzcGVlZFwiLFxuICAgICAgICBzcHJlYWRtZXRob2Q6IFwic3ByZWFkTWV0aG9kXCIsXG4gICAgICAgIHN0YXJ0b2Zmc2V0OiBcInN0YXJ0T2Zmc2V0XCIsXG4gICAgICAgIHN0ZGRldmlhdGlvbjogXCJzdGREZXZpYXRpb25cIixcbiAgICAgICAgc3RlbWg6IFwic3RlbWhcIixcbiAgICAgICAgc3RlbXY6IFwic3RlbXZcIixcbiAgICAgICAgc3RpdGNodGlsZXM6IFwic3RpdGNoVGlsZXNcIixcbiAgICAgICAgc3RvcGNvbG9yOiBcInN0b3BDb2xvclwiLFxuICAgICAgICBcInN0b3AtY29sb3JcIjogXCJzdG9wQ29sb3JcIixcbiAgICAgICAgc3RvcG9wYWNpdHk6IFwic3RvcE9wYWNpdHlcIixcbiAgICAgICAgXCJzdG9wLW9wYWNpdHlcIjogXCJzdG9wT3BhY2l0eVwiLFxuICAgICAgICBzdHJpa2V0aHJvdWdocG9zaXRpb246IFwic3RyaWtldGhyb3VnaFBvc2l0aW9uXCIsXG4gICAgICAgIFwic3RyaWtldGhyb3VnaC1wb3NpdGlvblwiOiBcInN0cmlrZXRocm91Z2hQb3NpdGlvblwiLFxuICAgICAgICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiBcInN0cmlrZXRocm91Z2hUaGlja25lc3NcIixcbiAgICAgICAgXCJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzc1wiOiBcInN0cmlrZXRocm91Z2hUaGlja25lc3NcIixcbiAgICAgICAgc3RyaW5nOiBcInN0cmluZ1wiLFxuICAgICAgICBzdHJva2U6IFwic3Ryb2tlXCIsXG4gICAgICAgIHN0cm9rZWRhc2hhcnJheTogXCJzdHJva2VEYXNoYXJyYXlcIixcbiAgICAgICAgXCJzdHJva2UtZGFzaGFycmF5XCI6IFwic3Ryb2tlRGFzaGFycmF5XCIsXG4gICAgICAgIHN0cm9rZWRhc2hvZmZzZXQ6IFwic3Ryb2tlRGFzaG9mZnNldFwiLFxuICAgICAgICBcInN0cm9rZS1kYXNob2Zmc2V0XCI6IFwic3Ryb2tlRGFzaG9mZnNldFwiLFxuICAgICAgICBzdHJva2VsaW5lY2FwOiBcInN0cm9rZUxpbmVjYXBcIixcbiAgICAgICAgXCJzdHJva2UtbGluZWNhcFwiOiBcInN0cm9rZUxpbmVjYXBcIixcbiAgICAgICAgc3Ryb2tlbGluZWpvaW46IFwic3Ryb2tlTGluZWpvaW5cIixcbiAgICAgICAgXCJzdHJva2UtbGluZWpvaW5cIjogXCJzdHJva2VMaW5lam9pblwiLFxuICAgICAgICBzdHJva2VtaXRlcmxpbWl0OiBcInN0cm9rZU1pdGVybGltaXRcIixcbiAgICAgICAgXCJzdHJva2UtbWl0ZXJsaW1pdFwiOiBcInN0cm9rZU1pdGVybGltaXRcIixcbiAgICAgICAgc3Ryb2tld2lkdGg6IFwic3Ryb2tlV2lkdGhcIixcbiAgICAgICAgXCJzdHJva2Utd2lkdGhcIjogXCJzdHJva2VXaWR0aFwiLFxuICAgICAgICBzdHJva2VvcGFjaXR5OiBcInN0cm9rZU9wYWNpdHlcIixcbiAgICAgICAgXCJzdHJva2Utb3BhY2l0eVwiOiBcInN0cm9rZU9wYWNpdHlcIixcbiAgICAgICAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiBcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiLFxuICAgICAgICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6IFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIsXG4gICAgICAgIHN1cmZhY2VzY2FsZTogXCJzdXJmYWNlU2NhbGVcIixcbiAgICAgICAgc3lzdGVtbGFuZ3VhZ2U6IFwic3lzdGVtTGFuZ3VhZ2VcIixcbiAgICAgICAgdGFibGV2YWx1ZXM6IFwidGFibGVWYWx1ZXNcIixcbiAgICAgICAgdGFyZ2V0eDogXCJ0YXJnZXRYXCIsXG4gICAgICAgIHRhcmdldHk6IFwidGFyZ2V0WVwiLFxuICAgICAgICB0ZXh0YW5jaG9yOiBcInRleHRBbmNob3JcIixcbiAgICAgICAgXCJ0ZXh0LWFuY2hvclwiOiBcInRleHRBbmNob3JcIixcbiAgICAgICAgdGV4dGRlY29yYXRpb246IFwidGV4dERlY29yYXRpb25cIixcbiAgICAgICAgXCJ0ZXh0LWRlY29yYXRpb25cIjogXCJ0ZXh0RGVjb3JhdGlvblwiLFxuICAgICAgICB0ZXh0bGVuZ3RoOiBcInRleHRMZW5ndGhcIixcbiAgICAgICAgdGV4dHJlbmRlcmluZzogXCJ0ZXh0UmVuZGVyaW5nXCIsXG4gICAgICAgIFwidGV4dC1yZW5kZXJpbmdcIjogXCJ0ZXh0UmVuZGVyaW5nXCIsXG4gICAgICAgIHRvOiBcInRvXCIsXG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgdHJhbnNmb3Jtb3JpZ2luOiBcInRyYW5zZm9ybU9yaWdpblwiLFxuICAgICAgICBcInRyYW5zZm9ybS1vcmlnaW5cIjogXCJ0cmFuc2Zvcm1PcmlnaW5cIixcbiAgICAgICAgdHlwZW9mOiBcInR5cGVvZlwiLFxuICAgICAgICB1MTogXCJ1MVwiLFxuICAgICAgICB1MjogXCJ1MlwiLFxuICAgICAgICB1bmRlcmxpbmVwb3NpdGlvbjogXCJ1bmRlcmxpbmVQb3NpdGlvblwiLFxuICAgICAgICBcInVuZGVybGluZS1wb3NpdGlvblwiOiBcInVuZGVybGluZVBvc2l0aW9uXCIsXG4gICAgICAgIHVuZGVybGluZXRoaWNrbmVzczogXCJ1bmRlcmxpbmVUaGlja25lc3NcIixcbiAgICAgICAgXCJ1bmRlcmxpbmUtdGhpY2tuZXNzXCI6IFwidW5kZXJsaW5lVGhpY2tuZXNzXCIsXG4gICAgICAgIHVuaWNvZGU6IFwidW5pY29kZVwiLFxuICAgICAgICB1bmljb2RlYmlkaTogXCJ1bmljb2RlQmlkaVwiLFxuICAgICAgICBcInVuaWNvZGUtYmlkaVwiOiBcInVuaWNvZGVCaWRpXCIsXG4gICAgICAgI
15852HVuaWNvZGVyYW5nZTogXCJ1bmljb2RlUmFuZ2VcIixcbiAgICAgICAgXCJ1bmljb2RlLXJhbmdlXCI6IFwidW5pY29kZVJhbmdlXCIsXG4gICAgICAgIHVuaXRzcGVyZW06IFwidW5pdHNQZXJFbVwiLFxuICAgICAgICBcInVuaXRzLXBlci1lbVwiOiBcInVuaXRzUGVyRW1cIixcbiAgICAgICAgdW5zZWxlY3RhYmxlOiBcInVuc2VsZWN0YWJsZVwiLFxuICAgICAgICB2YWxwaGFiZXRpYzogXCJ2QWxwaGFiZXRpY1wiLFxuICAgICAgICBcInYtYWxwaGFiZXRpY1wiOiBcInZBbHBoYWJldGljXCIsXG4gICAgICAgIHZhbHVlczogXCJ2YWx1ZXNcIixcbiAgICAgICAgdmVjdG9yZWZmZWN0OiBcInZlY3RvckVmZmVjdFwiLFxuICAgICAgICBcInZlY3Rvci1lZmZlY3RcIjogXCJ2ZWN0b3JFZmZlY3RcIixcbiAgICAgICAgdmVyc2lvbjogXCJ2ZXJzaW9uXCIsXG4gICAgICAgIHZlcnRhZHZ5OiBcInZlcnRBZHZZXCIsXG4gICAgICAgIFwidmVydC1hZHYteVwiOiBcInZlcnRBZHZZXCIsXG4gICAgICAgIHZlcnRvcmlnaW54OiBcInZlcnRPcmlnaW5YXCIsXG4gICAgICAgIFwidmVydC1vcmlnaW4teFwiOiBcInZlcnRPcmlnaW5YXCIsXG4gICAgICAgIHZlcnRvcmlnaW55OiBcInZlcnRPcmlnaW5ZXCIsXG4gICAgICAgIFwidmVydC1vcmlnaW4teVwiOiBcInZlcnRPcmlnaW5ZXCIsXG4gICAgICAgIHZoYW5naW5nOiBcInZIYW5naW5nXCIsXG4gICAgICAgIFwidi1oYW5naW5nXCI6IFwidkhhbmdpbmdcIixcbiAgICAgICAgdmlkZW9ncmFwaGljOiBcInZJZGVvZ3JhcGh
15852pY1wiLFxuICAgICAgICBcInYtaWRlb2dyYXBoaWNcIjogXCJ2SWRlb2dyYXBoaWNcIixcbiAgICAgICAgdmlld2JveDogXCJ2aWV3Qm94XCIsXG4gICAgICAgIHZpZXd0YXJnZXQ6IFwidmlld1RhcmdldFwiLFxuICAgICAgICB2aXNpYmlsaXR5OiBcInZpc2liaWxpdHlcIixcbiAgICAgICAgdm1hdGhlbWF0aWNhbDogXCJ2TWF0aGVtYXRpY2FsXCIsXG4gICAgICAgIFwidi1tYXRoZW1hdGljYWxcIjogXCJ2TWF0aGVtYXRpY2FsXCIsXG4gICAgICAgIHZvY2FiOiBcInZvY2FiXCIsXG4gICAgICAgIHdpZHRoczogXCJ3aWR0aHNcIixcbiAgICAgICAgd29yZHNwYWNpbmc6IFwid29yZFNwYWNpbmdcIixcbiAgICAgICAgXCJ3b3JkLXNwYWNpbmdcIjogXCJ3b3JkU3BhY2luZ1wiLFxuICAgICAgICB3cml0aW5nbW9kZTogXCJ3cml0aW5nTW9kZVwiLFxuICAgICAgICBcIndyaXRpbmctbW9kZVwiOiBcIndyaXRpbmdNb2RlXCIsXG4gICAgICAgIHgxOiBcIngxXCIsXG4gICAgICAgIHgyOiBcIngyXCIsXG4gICAgICAgIHg6IFwieFwiLFxuICAgICAgICB4Y2hhbm5lbHNlbGVjdG9yOiBcInhDaGFubmVsU2VsZWN0b3JcIixcbiAgICAgICAgeGhlaWdodDogXCJ4SGVpZ2h0XCIsXG4gICAgICAgIFwieC1oZWlnaHRcIjogXCJ4SGVpZ2h0XCIsXG4gICAgICAgIHhsaW5rYWN0dWF0ZTogXCJ4bGlua0FjdHVhdGVcIixcbiAgICAgICAgXCJ4bGluazphY3R1YXRlXCI6IFwieGxpbmtBY3R1YXRlXCIsXG4gICAgICAgIHhsaW5rYXJjcm9sZTogXCJ4bGlua0FyY3JvbGVcIixcbiAgICAgICAgXCJ4bGluazphcmNyb2xlXCI6IFwieGxpbmtBcmNyb2xlXCIsXG4gICAgICAgIHhsaW5raHJlZjogXCJ4bGlua0hyZWZcIixcbiAgICAgICAgXCJ4bGluazpocmVmXCI6IFwieGxpbmtIcmVmXCIsXG4gICAgICAgIHhsaW5rcm9sZTogXCJ4bGlua1JvbGVcIixcbiAgICAgICAgXCJ4bGluazpyb2xlXCI6IFwieGxpbmtSb2xlXCIsXG4gICAgICAgIHhsaW5rc2hvdzogXCJ4bGlua1Nob3dcIixcbiAgICAgICAgXCJ4bGluazpzaG93XCI6IFwieGxpbmtTaG93XCIsXG4gICAgICAgIHhsaW5rdGl0bGU6IFwieGxpbmtUaXRsZVwiLFxuICAgICAgICBcInhsaW5rOnRpdGxlXCI6IFwieGxpbmtUaXRsZVwiLFxuICAgICAgICB4bGlua3R5cGU6IFwieGxpbmtUeXBlXCIsXG4gICAgICAgIFwieGxpbms6dHlwZVwiOiBcInhsaW5rVHlwZVwiLFxuICAgICAgICB4bWxiYXNlOiBcInhtbEJhc2VcIixcbiAgICAgICAgXCJ4bWw6YmFzZVwiOiBcInhtbEJhc2VcIixcbiAgICAgICAgeG1sbGFuZzogXCJ4bWxMYW5nXCIsXG4gICAgICAgIFwieG1sOmxhbmdcIjogXCJ4bWxMYW5nXCIsXG4gICAgICAgIHhtbG5zOiBcInhtbG5zXCIsXG4gICAgICAgIFwieG1sOnNwYWNlXCI6IFwieG1sU3BhY2VcIixcbiAgICAgICAgeG1sbnN4bGluazogXCJ4bWxuc1hsaW5rXCIsXG4gICAgICAgIFwieG1sbnM6eGxpbmtcIjogXCJ4bWxuc1hsaW5rXCIsXG4gICAgICAgIHhtbHNwYWNlOiBcInhtbFNwYWNlXCIsXG4gICAgICAgIHkxOiBcInkxXCIsXG4gICAgICAgIHkyOiBcInkyXCIsXG4gICAgICAgIHk6IFwieVwiLFxuICAgICAgICB5Y2hhbm5lbHNlbGVjdG9yOiBcInlDaGFubmVsU2VsZWN0b3JcIixcbiAgICAgICAgejogXCJ6XCIsXG4gICAgICAgIHpvb21hbmRwYW46IFwiem9vbUFuZFBhblwiXG4gICAgICB9LFxuICAgICAgYXJpYVByb3BlcnRpZXMgPSB7XG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IDAsXG4gICAgICAgIFwiYXJpYS1kZXNjcmlwdGlvblwiOiAwLFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiOiAwLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiAwLFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiAwLFxuICAgICAgICBcImFyaWEta2V5c2hvcnRjdXRzXCI6IDAsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiAwLFxuICAgICAgICBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCI6IDAsXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogMCxcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IDAsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiAwLFxuICAgICAgICBcImFyaWEtbGV2ZWxcIjogMCxcbiAgICAgICAgXCJhcmlhLW1vZGFsXCI6IDAsXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogMCxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiAwLFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogMCxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IDAsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IDAsXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiAwLFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IDAsXG4gICAgICAgIFwiYXJpYS1zb3J0XCI6IDAsXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiAwLFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogMCxcbiAgICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IDAsXG4gICAgICAgIFwiYXJpYS12YWx1ZXRleHRcIjogMCxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiAwLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiAwLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiAwLFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjogMCxcbiAgICAgICAgXCJhcmlhLWRyb3BlZmZlY3RcIjogMCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjogMCxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IDAsXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleFwiOiAwLFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiAwLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogMCxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IDAsXG4gICAgICAgIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIjogMCxcbiAgICAgICAgXCJhcmlhLWZsb3d0b1wiOiAwLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiAwLFxuICAgICAgICBcImFyaWEtb3duc1wiOiAwLFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjogMCxcbiAgICAgICAgXCJhcmlhLXJvd2NvdW50XCI6IDAsXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiAwLFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiAwLFxuICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiAwLFxuICAgICAgICBcImFyaWEtYnJhaWxsZWxhYmVsXCI6IDAsXG4gICAgICAgIFwiYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uXCI6IDAsXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleHRleHRcIjogMCxcbiAgICAgICAgXCJhcmlhLXJvd2luZGV4dGV4dFwiOiAwXG4gICAgICB9LFxuICAgICAgd2FybmVkUHJvcGVydGllcyQxID0ge30sXG4gICAgICByQVJJQSQxID0gUmVnRXhwKFxuICAgICAgICBcIl4oYXJpYSktWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiXG4gICAgICApLFxuICAgICAgckFSSUFDYW1lbCQxID0gUmVnRXhwKFxuICAgICAgICBcIl4oYXJpYSlbQS1aXVs6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBdKiRcIlxuICAgICAgKSxcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSAhMSxcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMgPSB7fSxcbiAgICAgIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi8sXG4gICAgICBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLyxcbiAgICAgIHJBUklBID0gUmVnRXhwKFxuICAgICAgICBcIl4oYXJpYSktWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiXG4gICAgICApLFxuICAgICAgckFSSUFDYW1lbCA9IFJlZ0V4cChcbiAgICAgICAgXCJeKGFyaWEpW0EtWl1bOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRFxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXSokXCJcbiAgICAgICksXG4gICAgICBpc0phdmFTY3JpcHRQcm90b2NvbCA9XG4gICAgICAgIC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyX
15852FxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSo6L2ksXG4gICAgICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsLFxuICAgICAgcmVzdG9yZVRhcmdldCA9IG51bGwsXG4gICAgICByZXN0b3JlUXVldWUgPSBudWxsLFxuICAgICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSAhMSxcbiAgICAgIGNhblVzZURPTSA9ICEoXG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudCB8fFxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICAgICksXG4gICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9ICExO1xuICAgIGlmIChjYW5Vc2VET00pXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgb3B0aW9ucyRqc2NvbXAkMCA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucyRqc2NvbXAkMCwgXCJwYXNzaXZlXCIsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIG9wdGlvbnMkanNjb21wJDAsIG9wdGlvbnMkanNjb21wJDApO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwgb3B0aW9ucyRqc2NvbXAkMCwgb3B0aW9ucyRqc2NvbXAkMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gITE7XG4gICAgICB9XG4gICAgdmFyIHJvb3QgPSBudWxsLFxuICAgICAgc3RhcnRUZXh0ID0gbnVsbCxcbiAgICAgIGZhbGxiYWNrVGV4dCA9IG51bGwsXG4gICAgICBFdmVudEludGVyZmFjZSA9IHtcbiAgICAgICAgZXZlbnRQaGFzZTogMCxcbiAgICAgICAgYnViYmxlczogMCxcbiAgICAgICAgY2FuY2VsYWJsZTogMCxcbiAgICAgICAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gICAgICAgIGlzVHJ1c3RlZDogMFxuICAgICAgfSxcbiAgICAgIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHsgdmlldzogMCwgZGV0YWlsOiAwIH0pLFxuICAgICAgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgbGFzdE1vdmVtZW50WCxcbiAgICAgIGxhc3RNb3ZlbWVudFksXG4gICAgICBsYXN0TW91c2VFdmVudCxcbiAgICAgIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgc2NyZWVuWDogMCxcbiAgICAgICAgc2NyZWVuWTogMCxcbiAgICAgICAgY2xpZW50WDogMCxcbiAgICAgICAgY2xpZW50WTogMCxcbiAgICAgICAgcGFnZVg6IDAsXG4gICAgICAgIHBhZ2VZOiAwLFxuICAgICAgICBjdHJsS2V5OiAwLFxuICAgICAgICBzaGlmdEtleTogMCxcbiAgICAgICAgYWx0S2V5OiAwLFxuICAgICAgICBtZXRhS2V5OiAwLFxuICAgICAgICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gICAgICAgIGJ1dHRvbjogMCxcbiAgICAgICAgYnV0dG9uczogMCxcbiAgICAgICAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgPyBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudFxuICAgICAgICAgICAgICA/IGV2ZW50LnRvRWxlbWVudFxuICAgICAgICAgICAgICA6IGV2ZW50LmZyb21FbGVtZW50XG4gICAgICAgICAgICA6IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKFwibW92ZW1lbnRYXCIgaW4gZXZlbnQpIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgICAgICAgZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50ICYmXG4gICAgICAgICAgICAobGFzdE1vdXNlRXZlbnQgJiYgXCJtb3VzZW1vdmVcIiA9PT0gZXZlbnQudHlwZVxuICAgICAgICAgICAgICA/ICgobGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YKSxcbiAgICAgICAgICAgICAgICAobGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZKSlcbiAgICAgICAgICAgICAgOiAobGFzdE1vdmVtZW50WSA9IGxhc3RNb3ZlbWVudFggPSAwKSxcbiAgICAgICAgICAgIChsYXN0TW91c2VFdmVudCA9IGV2ZW50KSk7XG4gICAgICAgICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFwibW92ZW1lbnRZXCIgaW4gZXZlbnQgPyBldmVudC5tb3ZlbWVudFkgOiBsYXN0TW92ZW1lbnRZO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwgeyBkYXRhV
15852HJhbnNmZXI6IDAgfSksXG4gICAgICBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwgeyByZWxhdGVkVGFyZ2V0OiAwIH0pLFxuICAgICAgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IDAsXG4gICAgICAgIGVsYXBzZWRUaW1lOiAwLFxuICAgICAgICBwc2V1ZG9FbGVtZW50OiAwXG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgICAgIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBcImNsaXBib2FyZERhdGFcIiBpbiBldmVudFxuICAgICAgICAgICAgPyBldmVudC5jbGlwYm9hcmREYXRhXG4gICAgICAgICAgICA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHsgZGF0YTogMCB9KSxcbiAgICAgIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChcbiAgICAgICAgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZVxuICAgICAgKSxcbiAgICAgIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LFxuICAgICAgbm9ybWFsaXplS2V5ID0ge1xuICAgICAgICBFc2M6IFwiRXNjYXBlXCIsXG4gICAgICAgIFNwYWNlYmFyOiBcIiBcIixcbiAgICAgICAgTGVmdDogXCJBcnJvd0xlZnRcIixcbiAgICAgICAgVXA6IFwiQXJyb3dVcFwiLFxuICAgICAgICBSaWdodDogXCJBcnJvd1JpZ2h0XCIsXG4gICAgICAgIERvd246IFwiQXJyb3dEb3duXCIsXG4gICAgICAgIERlbDogXCJEZWxldGVcIixcbiAgICAgICAgV2luOiBcIk9TXCIsXG4gICAgICAgIE1lbnU6IFwiQ29udGV4dE1lbnVcIixcbiAgICAgICAgQXBwczogXCJDb250ZXh0TWVudVwiLFxuICAgICAgICBTY3JvbGw6IFwiU2Nyb2xsTG9ja1wiLFxuICAgICAgICBNb3pQcmludGFibGVLZXk6IFwiVW5pZGVudGlmaWVkXCJcbiAgICAgIH0sXG4gICAgICB0cmFuc2xhdGVUb0tleSA9IHtcbiAgICAgICAgODogXCJCYWNrc3BhY2VcIixcbiAgICAgICAgOTogXCJUYWJcIixcbiAgICAgICAgMTI6IFwiQ2xlYXJcIixcbiAgICAgICAgMTM6IFwiRW50ZXJcIixcbiAgICAgICAgMTY6IFwiU2hpZnRcIixcbiAgICAgICAgMTc6IFwiQ29udHJvbFwiLFxuICAgICAgICAxODogXCJBbHRcIixcbiAgICAgICAgMTk6IFwiUGF1c2VcIixcbiAgICAgICAgMjA6IFwiQ2Fwc0xvY2tcIixcbiAgICAgICAgMjc6IFwiRXNjYXBlXCIsXG4gICAgICAgIDMyOiBcIiBcIixcbiAgICAgICAgMzM6IFwiUGFnZVVwXCIsXG4gICAgICAgIDM0OiBcIlBhZ2VEb3duXCIsXG4gICAgICAgIDM1OiBcIkVuZFwiLFxuICAgICAgICAzNjogXCJIb21lXCIsXG4gICAgICAgIDM3OiBcIkFycm93TGVmdFwiLFxuICAgICAgICAzODogXCJBcnJvd1VwXCIsXG4gICAgICAgIDM5OiBcIkFycm93UmlnaHRcIixcbiAgICAgICAgNDA6IFwiQXJyb3dEb3duXCIsXG4gICAgICAgIDQ1OiBcIkluc2VydFwiLFxuICAgICAgICA0NjogXCJEZWxldGVcIixcbiAgICAgICAgMTEyOiBcIkYxXCIsXG4gICAgICAgIDExMzogXCJGMlwiLFxuICAgICAgICAxMTQ6IFwiRjNcIixcbiAgICAgICAgMTE1OiBcIkY0XCIsXG4gICAgICAgIDExNjogXCJGNVwiLFxuICAgICAgICAxMTc6IFwiRjZcIixcbiAgICAgICAgMTE4OiBcIkY3XCIsXG4gICAgICAgIDExOTogXCJGOFwiLFxuICAgICAgICAxMjA6IFwiRjlcIixcbiAgICAgICAgMTIxOiBcIkYxMFwiLFxuICAgICAgICAxMjI6IFwiRjExXCIsXG4gICAgICAgIDEyMzogXCJGMTJcIixcbiAgICAgICAgMTQ0OiBcIk51bUxvY2tcIixcbiAgICAgICAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgICAgICAgMjI0OiBcIk1ldGFcIlxuICAgICAgfSxcbiAgICAgIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICAgICAgICBBbHQ6IFwiYWx0S2V5XCIsXG4gICAgICAgIENvbnRyb2w6IFwiY3RybEtleVwiLFxuICAgICAgICBNZXRhOiBcIm1ldGFLZXlcIixcbiAgICAgICAgU2hpZnQ6IFwic2hpZnRLZXlcIlxuICAgICAgfSxcbiAgICAgIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAga2V5OiBmdW5jdGlvbiAobmF0aXZlRXZlbnQpIHtcbiAgICAgICAgICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgICAgICAgICB2Y
15852XIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuICAgICAgICAgICAgaWYgKFwiVW5pZGVudGlmaWVkXCIgIT09IGtleSkgcmV0dXJuIGtleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwia2V5cHJlc3NcIiA9PT0gbmF0aXZlRXZlbnQudHlwZVxuICAgICAgICAgICAgPyAoKG5hdGl2ZUV2ZW50ID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkpLFxuICAgICAgICAgICAgICAxMyA9PT0gbmF0aXZlRXZlbnQgPyBcIkVudGVyXCIgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50KSlcbiAgICAgICAgICAgIDogXCJrZXlkb3duXCIgPT09IG5hdGl2ZUV2ZW50LnR5cGUgfHwgXCJrZXl1cFwiID09PSBuYXRpdmVFdmVudC50eXBlXG4gICAgICAgICAgICAgID8gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgXCJVbmlkZW50aWZpZWRcIlxuICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIH0sXG4gICAgICAgIGNvZGU6IDAsXG4gICAgICAgIGxvY2F0aW9uOiAwLFxuICAgICAgICBjdHJsS2V5OiAwLFxuICAgICAgICBzaGlmdEtleTogMCxcbiAgICAgICAgYWx0S2V5OiAwLFxuICAgICAgICBtZXRhS2V5OiAwLFxuICAgICAgICByZXBlYXQ6IDAsXG4gICAgICAgIGxvY2FsZTogMCxcbiAgICAgICAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAgICAgICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFwia2V5cHJlc3NcIiA9PT0gZXZlbnQudHlwZSA/IGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpIDogMDtcbiAgICAgICAgfSxcbiAgICAgICAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFwia2V5ZG93blwiID09PSBldmVudC50eXBlIHx8IFwia2V5dXBcIiA9PT0gZXZlbnQudHlwZVxuICAgICAgICAgICAgPyBldmVudC5rZXlDb2RlXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIH0sXG4gICAgICAgIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gXCJrZXlwcmVzc1wiID09PSBldmVudC50eXBlXG4gICAgICAgICAgICA/IGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpXG4gICAgICAgICAgICA6IFwia2V5ZG93blwiID09PSBldmVudC50eXBlIHx8IFwia2V5dXBcIiA9PT0gZXZlbnQudHlwZVxuICAgICAgICAgICAgICA/IGV2ZW50LmtleUNvZGVcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFBvaW50ZXJFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICAgICAgICBwb2ludGVySWQ6IDAsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHByZXNzdXJlOiAwLFxuICAgICAgICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gICAgICAgIHRpbHRYOiAwLFxuICAgICAgICB0aWx0WTogMCxcbiAgICAgICAgdHdpc3Q6IDAsXG4gICAgICAgIHBvaW50ZXJUeXBlOiAwLFxuICAgICAgICBpc1ByaW1hcnk6IDBcbiAgICAgIH0pLFxuICAgICAgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFN1Ym1pdEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwgeyBzdWJtaXR0ZXI6IDAgfSksXG4gICAgICBTeW50aGV0aWNTdWJtaXRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFN1Ym1pdEV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgdG91Y2hlczogMCxcbiAgICAgICAgdGFyZ2V0VG91Y2hlczogMCxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gICAgICAgIGFsdEtleTogMCxcbiAgICAgICAgbWV0YUtleTogMCxcbiAgICAgICAgY3RybEtleTogMCxcbiAgICAgICAgc2hpZnRLZXk6IDAsXG4gICAgICAgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxuICAgICAgfSksXG4gICAgICBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSksXG4gICAgICBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogMCxcbiAgICAgICAgZWxhcHNlZFRpbWU6IDAsXG4gICAgICAgIHBzZXVkb0VsZW1lbnQ6IDBcbiAgICAgIH0pLFxuICAgICAgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gXCJkZWx0YVhcIiBpbiBldmVudFxuICAgICAgICAgICAgPyBldmVudC5kZWx0YVhcbiAgICAgICAgICAgIDogXCJ3aGVlbERlbHRhWFwiIGluIGV2ZW50XG4gICAgICAgICAgICAgID8gLWV2ZW50LndoZWVsRGVsdGFYXG4gICAgICAgICAgICAgIDogMDtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gXCJkZWx0YVlcIiBpbiBldmVudFxuICAgICAgICAgICAgPyBldmVudC5kZWx0YVlcbiAgICAgICAgICAgIDogXCJ3aGVlbERlbHRhWVwiIGluIGV2ZW50XG4gICAgICAgICAgICAgID8gLWV2ZW50LndoZWVsRGVsdGFZXG4gICAgICAgICAgICAgIDogXCJ3aGVlbERlbHRhXCIgaW4gZXZlbnRcbiAgICAgICAgICAgICAgICA/IC1ldmVudC53aGVlbERlbHRhXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICB9LFxuICAgICAgICBkZWx0YVo6IDAsXG4gICAgICAgIGRlbHRhTW9kZTogMFxuICAgICAgfSksXG4gICAgICBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSksXG4gICAgICBUb2dnbGVFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgbmV3
15852U3RhdGU6IDAsXG4gICAgICAgIG9sZFN0YXRlOiAwLFxuICAgICAgICBzb3VyY2U6IDBcbiAgICAgIH0pLFxuICAgICAgU3ludGhldGljVG9nZ2xlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb2dnbGVFdmVudEludGVyZmFjZSksXG4gICAgICBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl0sXG4gICAgICBTVEFSVF9LRVlDT0RFID0gMjI5LFxuICAgICAgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiBcIkNvbXBvc2l0aW9uRXZlbnRcIiBpbiB3aW5kb3csXG4gICAgICBkb2N1bWVudE1vZGUgPSBudWxsO1xuICAgIGNhblVzZURPTSAmJlxuICAgICAgXCJkb2N1bWVudE1vZGVcIiBpbiBkb2N1bWVudCAmJlxuICAgICAgKGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG4gICAgdmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID1cbiAgICAgICAgY2FuVXNlRE9NICYmIFwiVGV4dEV2ZW50XCIgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGUsXG4gICAgICB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9XG4gICAgICAgIGNhblVzZURPTSAmJlxuICAgICAgICAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHxcbiAgICAgICAgICAoZG9jdW1lbnRNb2RlICYmIDggPCBkb2N1bWVudE1vZGUgJiYgMTEgPj0gZG9jdW1lbnRNb2RlKSksXG4gICAgICBTUEFDRUJBUl9DT0RFID0gMzIsXG4gICAgICBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKSxcbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSAhMSxcbiAgICAgIGlzQ29tcG9zaW5nID0gITEsXG4gICAgICBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICAgICAgICBjb2xvcjogITAsXG4gICAgICAgIGRhdGU6ICEwLFxuICAgICAgICBkYXRldGltZTogITAsXG4gICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogITAsXG4gICAgICAgIGVtYWlsOiAhMCxcbiAgICAgICAgbW9udGg6ICEwLFxuICAgICAgICBudW1iZXI6ICEwLFxuICAgICAgICBwYXNzd29yZDogITAsXG4gICAgICAgIHJhbmdlOiAhMCxcbiAgICAgICAgc2VhcmNoOiAhMCxcbiAgICAgICAgdGVsOiAhMCxcbiAgICAgICAgdGV4dDogITAsXG4gICAgICAgIHRpbWU6ICEwLFxuICAgICAgICB1cmw6ICEwLFxuICAgICAgICB3ZWVrOiAhMFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGwsXG4gICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbCxcbiAgICAgIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9ICExO1xuICAgIGNhblVzZURPTSAmJlxuICAgICAgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9XG4gICAgICAgIGlzRXZlbnRTdXBwb3J0ZWQoXCJpbnB1dFwiKSAmJlxuICAgICAgICAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA5IDwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSk7XG4gICAgdmFyIG9iamVjdElzID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgT2JqZWN0LmlzID8gT2JqZWN0LmlzIDogaXMsXG4gICAgICBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPVxuICAgICAgICBjYW5Vc2VET00gJiYgXCJkb2N1bWVudE1vZGVcIiBpbiBkb2N1bWVudCAmJiAxMSA+PSBkb2N1bWVudC5kb2N1bWVudE1vZGUsXG4gICAgICBhY3RpdmVFbGVtZW50ID0gbnVsbCxcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbCxcbiAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsLFxuICAgICAgbW91c2VEb3duID0gITEsXG4gICAgICB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgICAgICAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKFwiQW5pbWF0aW9uXCIsIFwiQW5pbWF0aW9uRW5kXCIpLFxuICAgICAgICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoXCJBbmltYXRpb25cIiwgXCJBbmltYXRpb25JdGVyYXRpb25cIiksXG4gICAgICAgIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKFwiQW5pbWF0aW9uXCIsIFwiQW5pbWF0aW9uU3RhcnRcIiksXG4gICAgICAgIHRyYW5zaXRpb25ydW46IG1ha2VQcmVmaXhNYXAoXCJUcmFuc2l0aW9uXCIsIFwiVHJhbnNpdGlvblJ1blwiKSxcbiAgICAgICAgdHJhbnNpdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25TdGFydFwiKSxcbiAgICAgICAgdHJhbnNpdGlvbmNhbmNlbDogbWFrZVByZWZpeE1hcChcIlRyYW5zaXRpb25cIiwgXCJUcmFuc2l0aW9uQ2FuY2VsXCIpLFxuICAgICAgICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25FbmRcIilcbiAgICAgIH0sXG4gICAgICBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fSxcbiAgICAgIHN0eWxlID0ge307XG4gICAgY2FuVXNlRE9NICYmXG4gICAgICAoKHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZSksXG4gICAgICBcIkFuaW1hdGlvbkV2ZW50XCIgaW4gd2luZG93IHx8XG4gICAgICAgIChkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixcbiAgICAgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sXG4gICAgICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLFxuICAgICAgXCJUcmFuc2l0aW9uRXZlbnRcIiBpbiB3aW5kb3cgfHxcbiAgICAgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7XG4gICAgdmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcImFuaW1hdGlvbmVuZFwiKSxcbiAgICAgIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcImFuaW1hdGlvbml0ZXJhdGlvblwiKSxcbiAgICAgIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKFwiYW5pbWF0aW9uc3RhcnRcIiksXG4gICAgICBUUkFOU0lUSU9OX1JVTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKFwidHJhbnNpdGlvbnJ1blwiKSxcbiAgICAgIFRSQU5TSVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25zdGFydFwiKSxcbiAgICAgIFRSQU5TSVRJT05fQ0FOQ0VMID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoXCJ0cmFuc2l0aW9uY2FuY2VsXCIpLFxuICAgICAgVFJBTlNJVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25lbmRcIiksXG4gICAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKSxcbiAgICAgIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID1cbiAgICAgICAgXCJhYm9ydCBhdXhDbGljayBiZWZvcmVUb2dnbGUgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZnVsbHNjcmVlbkNoYW5nZSBmdWxsc2NyZWVuRXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2Ug
15852cGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWxcIi5zcGxpdChcbiAgICAgICAgICBcIiBcIlxuICAgICAgICApO1xuICAgIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLnB1c2goXCJzY3JvbGxFbmRcIik7XG4gICAgdmFyIGdsb2JhbENsaWVudElkQ291bnRlciQxID0gMCxcbiAgICAgIGxhc3RSZXNldFRpbWUgPSAwO1xuICAgIGlmIChcbiAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBwZXJmb3JtYW5jZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2Uubm93XG4gICAgKSB7XG4gICAgICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuICAgICAgdmFyIGdldEN1cnJlbnRUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICAgICAgZ2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBsb2NhbERhdGUubm93KCk7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmVwb3J0R2xvYmFsRXJyb3IgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXBvcnRFcnJvclxuICAgICAgICAgID8gcmVwb3J0RXJyb3JcbiAgICAgICAgICA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHdpbmRvdyAmJlxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHdpbmRvdy5FcnJvckV2ZW50XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyB3aW5kb3cuRXJyb3JFdmVudChcImVycm9yXCIsIHtcbiAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6ICEwLFxuICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogITAsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICA/IFN0cmluZyhlcnJvci5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHByb2Nlc3MgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcm9jZXNzLmVtaXRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbWl0KFwidW5jYXVnaHRFeGNlcHRpb25cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0sXG4gICAgICBPTUlUVEVEX1BST1BfRVJST1IgPVxuICAgICAgICBcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIG9taXR0ZWQgYnkgUmVhY3QgaW4gdGhlIGNvbnNvbGUgbG9nIHRvIGF2b2lkIHNlbmRpbmcgdG9vIG11Y2ggZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuIFRyeSBsb2dnaW5nIHNtYWxsZXIgb3IgbW9yZSBzcGVjaWZpYyBvYmplY3RzLlwiLFxuICAgICAgRU1QVFlfQVJSQVkgPSAwLFxuICAgICAgQ09NUExFWF9BUlJBWSA9IDEsXG4gICAgICBQUklNSVRJVkVfQVJSQVkgPSAyLFxuICAgICAgRU5UUklFU19BUlJBWSA9IDMsXG4gICAgICBPQkpFQ1RfV0lEVEhfTElNSVQgPSAxMDAsXG4gICAgICBSRU1PVkVEID0gXCItXFx1MDBhMFwiLFxuICAgICAgQURERUQgPSBcIitcXHUwMGEwXCIsXG4gICAgICBVTkNIQU5HRUQgPSBcIlxcdTIwMDdcXHUwMGEwXCIsXG4gICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgPVxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgY29uc29sZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb25zb2xlLnRpbWVTdGFtcCAmJlxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgcGVyZm9ybWFuY2UgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2UubWVhc3VyZSxcbiAgICAgIENPTVBPTkVOVFNfVFJBQ0sgPSBcIkNvbXBvbmVudHMgXFx1MjY5YlwiLFxuICAgICAgTEFORVNfVFJBQ0tfR1JPVVAgPSBcIlNjaGVkdWxlciBcXHUyNjliXCIsXG4gICAgICBjdXJyZW50VHJhY2sgPSBcIkJsb2NraW5nXCIsXG4gICAgICBhbHJlYWR5V2FybmVkRm9yRGVlcEVxdWFsaXR5ID0gITEsXG4gICAgICByZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzID0ge1xuICAgICAgICBjb2xvcjogXCJwcmltYXJ5XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICAgIHRvb2x0aXBUZXh0OiBcIlwiLFxuICAgICAgICB0cmFjazogQ09NUE9ORU5UU19UUkFDS1xuICAgICAgfSxcbiAgICAgIHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucyA9IHtcbiAgICAgICAgc3RhcnQ6IC0wLFxuICAgICAgICBlbmQ6IC0wLFxuICAgICAgICBkZXRhaWw6IHsgZGV2dG9vbHM6IHJldXNhYmxlQ29tcG9uZW50RGV2VG9vbERldGFpbHMgfVxuICAgICAgfSxcbiAgICAgIHJldXNhYmxlQ2hhbmdlZFByb3BzRW50cnkgPSBbXCJDaGFuZ2VkIFByb3BzXCIsIFwiXCJdLFxuICAgICAgREVFUF9FUVVBTElUWV9XQVJOSU5HID1cbiAgICAgICAgXCJUaGlzIGNvbXBvbmVudCByZWNlaXZlZCBkZW
15852VwbHkgZXF1YWwgcHJvcHMuIEl0IG1pZ2h0IGJlbmVmaXQgZnJvbSB1c2VNZW1vIG9yIHRoZSBSZWFjdCBDb21waWxlciBpbiBpdHMgb3duZXIuXCIsXG4gICAgICByZXVzYWJsZURlZXBseUVxdWFsUHJvcHNFbnRyeSA9IFtcIkNoYW5nZWQgUHJvcHNcIiwgREVFUF9FUVVBTElUWV9XQVJOSU5HXSxcbiAgICAgIE9mZnNjcmVlblZpc2libGUgPSAxLFxuICAgICAgT2Zmc2NyZWVuUGFzc2l2ZUVmZmVjdHNDb25uZWN0ZWQgPSAyLFxuICAgICAgY29uY3VycmVudFF1ZXVlcyA9IFtdLFxuICAgICAgY29uY3VycmVudFF1ZXVlc0luZGV4ID0gMCxcbiAgICAgIGNvbmN1cnJlbnRseVVwZGF0ZWRMYW5lcyA9IDAsXG4gICAgICBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcbiAgICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG4gICAgdmFyIHJlc29sdmVGYW1pbHkgPSBudWxsLFxuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG51bGwsXG4gICAgICBOb01vZGUgPSAwLFxuICAgICAgQ29uY3VycmVudE1vZGUgPSAxLFxuICAgICAgUHJvZmlsZU1vZGUgPSAyLFxuICAgICAgU3RyaWN0TGVnYWN5TW9kZSA9IDgsXG4gICAgICBTdHJpY3RFZmZlY3RzTW9kZSA9IDE2LFxuICAgICAgU3VzcGVuc2V5SW1hZ2VzTW9kZSA9IDMyO1xuICAgIHZhciBoYXNCYWRNYXBQb2x5ZmlsbCA9ICExO1xuICAgIHRyeSB7XG4gICAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICAgIG5ldyBTZXQoW25vbkV4dGVuc2libGVPYmplY3RdKTtcbiAgICB9IGNhdGNoIChlJDQpIHtcbiAgICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gITA7XG4gICAgfVxuICAgIHZhciBDYXB0dXJlZFN0YWNrcyA9IG5ldyBXZWFrTWFwKCksXG4gICAgICBmb3JrU3RhY2sgPSBbXSxcbiAgICAgIGZvcmtTdGFja0luZGV4ID0gMCxcbiAgICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsLFxuICAgICAgdHJlZUZvcmtDb3VudCA9IDAsXG4gICAgICBpZFN0YWNrID0gW10sXG4gICAgICBpZFN0YWNrSW5kZXggPSAwLFxuICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGwsXG4gICAgICB0cmVlQ29udGV4dElkID0gMSxcbiAgICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBcIlwiLFxuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsLFxuICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGwsXG4gICAgICBpc0h5ZHJhdGluZyA9ICExLFxuICAgICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSAhMSxcbiAgICAgIGh5ZHJhdGlvbkRpZmZSb290REVWID0gbnVsbCxcbiAgICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGwsXG4gICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITEsXG4gICAgICBIeWRyYXRpb25NaXNtYXRjaEV4Y2VwdGlvbiA9IEVycm9yKFxuICAgICAgICBcIkh5ZHJhdGlvbiBNaXNtYXRjaCBFeGNlcHRpb246IFRoaXMgaXMgbm90IGEgcmVhbCBlcnJvciwgYW5kIHNob3VsZCBub3QgbGVhayBpbnRvIHVzZXJzcGFjZS4gSWYgeW91J3JlIHNlZWluZyB0aGlzLCBpdCdzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgKSxcbiAgICAgIHZhbHVlQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpO1xuICAgIHZhciByZW5kZXJlckN1cnNvckRFViA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbiAgICB2YXIgcmVuZGVyZXJTaWdpbCA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbCxcbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGwsXG4gICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITEsXG4gICAgICBBYm9ydENvbnRyb2xsZXJMb2NhbCA9XG4gICAgICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBBYm9ydENvbnRyb2xsZXJcbiAgICAgICAgICA/IEFib3J0Q29udHJvbGxlclxuICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2Y
15852XIgbGlzdGVuZXJzID0gW10sXG4gICAgICAgICAgICAgICAgc2lnbmFsID0gKHRoaXMuc2lnbmFsID0ge1xuICAgICAgICAgICAgICAgICAgYWJvcnRlZDogITEsXG4gICAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNpZ25hbC5hYm9ydGVkID0gITA7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDIgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxcbiAgICAgIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFxuICAgICAgQ2FjaGVDb250ZXh0ID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgICBDb25zdW1lcjogbnVsbCxcbiAgICAgICAgUHJvdmlkZXI6IG51bGwsXG4gICAgICAgIF9jdXJyZW50VmFsdWU6IG51bGwsXG4gICAgICAgIF9jdXJyZW50VmFsdWUyOiBudWxsLFxuICAgICAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgICAgIF9jdXJyZW50UmVuZGVyZXI6IG51bGwsXG4gICAgICAgIF9jdXJyZW50UmVuZGVyZXIyOiBudWxsXG4gICAgICB9LFxuICAgICAgZW50YW5nbGVkVHJhbnNpdGlvblR5cGVzID0gbnVsbCxcbiAgICAgIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3csXG4gICAgICBjcmVhdGVUYXNrID0gY29uc29sZS5jcmVhdGVUYXNrXG4gICAgICAgID8gY29uc29sZS5jcmVhdGVUYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgIFNQQVdORURfVVBEQVRFID0gMSxcbiAgICAgIFBJTkdFRF9VUERBVEUgPSAyLFxuICAgICAgcmVuZGVyU3RhcnRUaW1lID0gLTAsXG4gICAgICBjb21taXRTdGFydFRpbWUgPSAtMCxcbiAgICAgIGNvbW1pdEVuZFRpbWUgPSAtMCxcbiAgICAgIGNvbW1pdEVycm9ycyA9IG51bGwsXG4gICAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xLjEsXG4gICAgICBwcm9maWxlckVmZmVjdER1cmF0aW9uID0gLTAsXG4gICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbiA9IC0wLFxuICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lID0gLTEuMSxcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgPSAtMS4xLFxuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gbnVsbCxcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSAhMSxcbiAgICAgIGJsb2NraW5nQ2xhbXBUaW1lID0gLTAsXG4gICAgICBibG9ja2luZ1VwZGF0ZVRpbWUgPSAtMS4xLFxuICAgICAgYmxvY2tpbmdVcGRhdGVUYXNrID0gbnVsbCxcbiAgICAgIGJsb2NraW5nVXBkYXRlVHlwZSA9IDAsXG4gICAgICBibG9ja2luZ1VwZGF0ZU1ldGhvZE5hbWUgPSBudWxsLFxuICAgICAgYmxvY2tpbmdVcGRhdGVDb21wb25lbnROYW1lID0gbnVsbCxcbiAgICAgIGJsb2NraW5nRXZlbnRUaW1lID0gLTEuMSxcbiAgICAgIGJsb2NraW5nRXZlbnRUeXBlID0gbnVsbCxcbiAgICAgIGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gLTEuMSxcbiAgICAgIGJsb2NraW5nU3VzcGVuZGVkVGltZSA9IC0xLjEsXG4gICAgICB0cmFuc2l0aW9uQ2xhbXBUaW1lID0gLTAsXG4gICAgICB0cmFuc2l0aW9uU3RhcnRUaW1lID0gLTEuMSxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVUaW1lID0gLTEuMSxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVUeXBlID0gMCxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVUYXNrID0gbnVsbCxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVNZXRob2ROYW1lID0gbnVsbCxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVDb21wb25lbnROYW1lID0gbnVsbCxcbiAgICAgIHRyYW5zaXRpb25FdmVudFRpbWUgPSAtMS4xLFxuICAgICAgdHJhbnNpdGlvbkV2ZW50VHlwZSA9IG51bGwsXG4gICAgICB0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lID0gLTEuMSxcbiAgICAgIHRyYW5zaXRpb25TdXNwZW5kZWRUaW1lID0gLTEuMSxcbiAgICAgIHJldHJ5Q2xhbXBUaW1lID0gLTAsXG4gICAgICBpZGxlQ2xhbXBUaW1lID0gLTAsXG4gICAgICBhbmltYXRpbmdMYW5lcyA9IDAsXG4gICAgICBhbmltYXRpbmdUYXNrID0gbnVsbCxcbiAgICAgIHlpZWxkUmVhc29uID0gMCxcbiAgICAgIHlpZWxkU3RhcnRUaW1lID0gLTEuMSxcbiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9ICExLFxuICAgICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gITEsXG4gICAgICBjdXJyZW50RW50YW5nbGVkTGlzdGVuZXJzID0gbnVsbCxcbiAgICAgIGN1cnJlbnRFbnRhbmdsZWRQZW5kaW5nQ291bnQgPSAwLFxuICAgICAgY3VycmVudEVudGFuZ2xlZExhbmUgPSAwLFxuICAgICAgY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlID0gbnVsbCxcbiAgICAgIHByZXZPblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUyA9IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCByZXR1cm5WYWx1ZSkge1xuICAgICAgZ2xvYmFsTW9zdFJlY2VudFRyYW5zaXRpb25UaW1lID0gbm93JDEoKTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlICYmXG4gICAgICAgIG51bGwgIT09IHJldHVyblZhbHVlICYmXG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW5cbiAgICAgICkge1xuICAgICAgICBpZiAoMCA+IHRyYW5zaXRpb25TdGFydFRpbWUgJiYgMCA+IHRyYW5zaXRpb25VcGRhdGVUaW1lKSB7XG4gICAgICAgICAgdHJhbnNpdGlvblN0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgI
15852HZhciBuZXdFdmVudFRpbWUgPSByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKSxcbiAgICAgICAgICAgIG5ld0V2ZW50VHlwZSA9IHJlc29sdmVFdmVudFR5cGUoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBuZXdFdmVudFRpbWUgIT09IHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgfHxcbiAgICAgICAgICAgIG5ld0V2ZW50VHlwZSAhPT0gdHJhbnNpdGlvbkV2ZW50VHlwZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgPSAtMS4xO1xuICAgICAgICAgIHRyYW5zaXRpb25FdmVudFRpbWUgPSBuZXdFdmVudFRpbWU7XG4gICAgICAgICAgdHJhbnNpdGlvbkV2ZW50VHlwZSA9IG5ld0V2ZW50VHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbnRhbmdsZUFzeW5jQWN0aW9uKHRyYW5zaXRpb24sIHJldHVyblZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChudWxsICE9PSBlbnRhbmdsZWRUcmFuc2l0aW9uVHlwZXMpXG4gICAgICAgIGZvciAobmV3RXZlbnRUaW1lID0gZmlyc3RTY2hlZHVsZWRSb290OyBudWxsICE9PSBuZXdFdmVudFRpbWU7IClcbiAgICAgICAgICBxdWV1ZVRyYW5zaXRpb25UeXBlcyhuZXdFdmVudFRpbWUsIGVudGFuZ2xlZFRyYW5zaXRpb25UeXBlcyksXG4gICAgICAgICAgICAobmV3RXZlbnRUaW1lID0gbmV3RXZlbnRUaW1lLm5leHQpO1xuICAgICAgbmV3RXZlbnRUaW1lID0gdHJhbnNpdGlvbi50eXBlcztcbiAgICAgIGlmIChudWxsICE9PSBuZXdFdmVudFRpbWUpIHtcbiAgICAgICAgZm9yIChuZXdFdmVudFR5cGUgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7IG51bGwgIT09IG5ld0V2ZW50VHlwZTsgKVxuICAgICAgICAgIHF1ZXVlVHJhbnNpdGlvblR5cGVzKG5ld0V2ZW50VHlwZSwgbmV3RXZlbnRUaW1lKSxcbiAgICAgICAgICAgIChuZXdFdmVudFR5cGUgPSBuZXdFdmVudFR5cGUubmV4dCk7XG4gICAgICAgIGlmICgwICE9PSBjdXJyZW50RW50YW5nbGVkTGFuZSkge1xuICAgICAgICAgIG5ld0V2ZW50VHlwZSA9IGVudGFuZ2xlZFRyYW5zaXRpb25UeXBlcztcbiAgICAgICAgICBudWxsID09PSBuZXdFdmVudFR5cGUgJiZcbiAgICAgICAgICAgIChuZXdFdmVudFR5cGUgPSBlbnRhbmdsZWRUcmFuc2l0aW9uVHlwZXMgPSBbXSk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdFdmVudFRpbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uVHlwZSA9IG5ld0V2ZW50VGltZVtpXTtcbiAgICAgICAgICAgIC0xID09PSBuZXdFdmVudFR5cGUuaW5kZXhPZih0cmFuc2l0aW9uVHlwZSkgJiZcbiAgICAgICAgICAgICAgbmV3RXZlbnRUeXBlLnB1c2godHJhbnNpdGlvblR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbnVsbCAhPT0gcHJldk9uU3RhcnRUcmFuc2l0aW9uRmluaXNoICYmXG4gICAgICAgIHByZXZPblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCh0cmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgfTtcbiAgICB2YXIgcmVzdW1lZENhY2hlID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gICAgICAgIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gICAgICAgIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxuICAgICAgfSxcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdLFxuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdLFxuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdLFxuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXSxcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXSxcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW10sXG4gICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKFxuICAgICAgZmliZXIsXG4gICAgICBpbnN0YW5jZVxuICAgICkge1xuICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkgfHxcbiAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICEwICE9PSBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAmJlxuICAgICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKSxcbiAgICAgICAgZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiZcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKSxcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgICEwICE9PVxuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICYmXG4gICAgICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKSxcbiAgICAgICAgZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiZcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgI
15852HBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpLFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlICYmXG4gICAgICAgICAgITAgIT09IGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAmJlxuICAgICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlciksXG4gICAgICAgIGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgJiZcbiAgICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKSk7XG4gICAgfTtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoICYmXG4gICAgICAgIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgfSksXG4gICAgICAgIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXSkpO1xuICAgICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCAmJlxuICAgICAgICAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgfSksXG4gICAgICAgIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW10pKTtcbiAgICAgIHZhciBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAwIDwgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICAgIH0pLFxuICAgICAgICAocGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdKSk7XG4gICAgICB2Y
15852XIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goXG4gICAgICAgICAgZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChcbiAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW10pKTtcbiAgICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAwIDwgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICAgIH0pLFxuICAgICAgICAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdKSk7XG4gICAgICB2Y
15852XIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgfSksXG4gICAgICAgIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdKSk7XG4gICAgICBpZiAoMCA8IFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplKSB7XG4gICAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFxuICAgICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lc1xuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbiogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlc1wiLFxuICAgICAgICAgIHNvcnRlZE5hbWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAwIDwgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplICYmXG4gICAgICAgICgoc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhcbiAgICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzXG4gICAgICAgICkpLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkIGFuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuIFNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4qIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCByZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0LmRldi9saW5rL2Rlcml2ZWQtc3RhdGVcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgJiZcbiAgICAgICAgKChzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFxuICAgICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXNcbiAgICAgICAgKSksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbiogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplICYmXG4gICAgICAgICgoc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcykpLFxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiBTZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuKiBSZW5hbWUgY29tcG9uZW50V2lsbE1vdW50IHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biBgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSAmJlxuICAgICAgICAoKHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoXG4gICAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU
158525hbWVzXG4gICAgICAgICkpLFxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbiogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4qIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvZGVyaXZlZC1zdGF0ZVxcbiogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biBgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSAmJlxuICAgICAgICAoKHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKSksXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcImNvbXBvbmVudFdpbGxVcGRhdGUgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiBTZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbiogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biBgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICB9O1xuICAgIHZhciBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCksXG4gICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgICAgZmliZXIsXG4gICAgICBpbnN0YW5jZVxuICAgICkge1xuICAgICAgdmFyIHN0cmljdFJvb3QgPSBudWxsO1xuICAgICAgZm9yICh2YXIgbm9kZSA9IGZpYmVyOyBudWxsICE9PSBub2RlOyApXG4gICAgICAgIG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgKHN0cmljdFJvb3QgPSBub2RlKSxcbiAgICAgICAgICAobm9kZSA9IG5vZGUucmV0dXJuKTtcbiAgICAgIG51bGwgPT09IHN0cmljdFJvb3RcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgKVxuICAgICAgICA6ICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSAmJlxuICAgICAgICAgICgobm9kZSA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCkpLFxuICAgICAgICAgIG51bGwgIT0gZmliZXIudHlwZS5jb250ZXh0VHlwZXMgfHxcbiAgICAgICAgICAgIG51bGwgIT0gZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyB8fFxuICAgICAgICAgICAgKG51bGwgIT09IGluc3RhbmNlICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCkpICYmXG4gICAgICAgICAgKHZvaWQgMCA9PT0gbm9kZSAmJlxuICAgICAgICAgICAgKChub2RlID0gW10pLCBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIG5vZGUpKSxcbiAgICAgICAgICBub2RlLnB1c2goZmliZXIpKTtcbiAgICB9O1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSkge1xuICAgICAgICBpZiAoMCAhPT0gZmliZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICB2Y
15852XIgZmlyc3RGaWJlciA9IGZpYmVyQXJyYXlbMF0sXG4gICAgICAgICAgICB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIik7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmlyc3RGaWJlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS5cXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyB1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9sZWdhY3ktY29udGV4dFwiLFxuICAgICAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgICB9O1xuICAgIHZhciBSRUFDVF9SRUNPVkVSQUJMRV9ESUdFU1QgPSBcIlwiLFxuICAgICAgY2FsbENvbXBvbmVudCA9IHtcbiAgICAgICAgcmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lOiBmdW5jdGlvbiAoQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnKSB7XG4gICAgICAgICAgdmFyIHdhc1JlbmRlcmluZyA9IGlzUmVuZGVyaW5nO1xuICAgICAgICAgIGlzUmVuZGVyaW5nID0gITA7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzUmVuZGVyaW5nID0gd2FzUmVuZGVyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxDb21wb25lbnRJbkRFViA9XG4gICAgICAgIGNhbGxDb21wb25lbnQucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoY2FsbENvbXBvbmVudCksXG4gICAgICBjYWxsUmVuZGVyID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgIHZhciB3YXNSZW5kZXJpbmcgPSBpc1JlbmRlcmluZztcbiAgICAgICAgICBpc1JlbmRlcmluZyA9ICEwO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzUmVuZGVyaW5nID0gd2FzUmVuZGVyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxSZW5kZXJJbkRFViA9IGNhbGxSZW5kZXIucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoY2FsbFJlbmRlciksXG4gICAgICBjYWxsQ29tcG9uZW50RGlkTW91bnQgPSB7XG4gICAgICAgIHJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZTogZnVuY3Rpb24gKGZpbmlzaGVkV29yaywgaW5zdGFuY2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYgPVxuICAgICAgICBjYWxsQ29tcG9uZW50RGlkTW91bnQucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoXG4gICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50XG4gICAgICAgICksXG4gICAgICBjYWxsQ29tcG9uZW50RGlkVXBkYXRlID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcHJldlByb3BzLFxuICAgICAgICAgIHByZXZTdGF0ZSxcbiAgICAgICAgICBzbmFwc2hvdFxuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxDb21wb25lbnREaWRVcGRhdGVJbkRFViA9XG4gICAgICAgIGNhbGxDb21wb25lbnREaWRVcGRhdGUucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoXG4gICAgICAgICAgY2FsbENvbXBvbmVudERpZFVwZGF0ZVxuICAgICAgICApLFxuICAgICAgY2FsbENvbXBvbmVudERpZENhdGNoID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChpbnN0YW5jZSwgZXJyb3JJbmZvKSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoKGVycm9ySW5mby52YWx1ZSwge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2s6IG51bGwgIT09IHN0YWNrID8gc3RhY2sgOiBcIlwiXG4gICAgICAgICAgfSk7XG4gICAgICAgI
15852H1cbiAgICAgIH0sXG4gICAgICBjYWxsQ29tcG9uZW50RGlkQ2F0Y2hJbkRFViA9XG4gICAgICAgIGNhbGxDb21wb25lbnREaWRDYXRjaC5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChcbiAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkQ2F0Y2hcbiAgICAgICAgKSxcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudCA9IHtcbiAgICAgICAgcmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lOiBmdW5jdGlvbiAoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50SW5ERVYgPVxuICAgICAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnQucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoXG4gICAgICAgICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50XG4gICAgICAgICksXG4gICAgICBjYWxsQ3JlYXRlID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChlZmZlY3QpIHtcbiAgICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcbiAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QuaW5zdDtcbiAgICAgICAgICBjcmVhdGUgPSBjcmVhdGUoKTtcbiAgICAgICAgICByZXR1cm4gKGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxDcmVhdGVJbkRFViA9IGNhbGxDcmVhdGUucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoY2FsbENyZWF0ZSksXG4gICAgICBjYWxsRGVzdHJveSA9IHtcbiAgICAgICAgcmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lOiBmdW5jdGlvbiAoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgIGRlc3Ryb3lcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxEZXN0cm95SW5ERVYgPSBjYWxsRGVzdHJveS5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChjYWxsRGVzdHJveSksXG4gICAgICBjYWxsTGF6eUluaXQgPSB7XG4gICAgICAgIHJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZTogZnVuY3Rpb24gKGxhenkpIHtcbiAgICAgICAgICB2Y
15852XIgaW5pdCA9IGxhenkuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIGluaXQobGF6eS5fcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYWxsTGF6eUluaXRJbkRFViA9XG4gICAgICAgIGNhbGxMYXp5SW5pdC5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChjYWxsTGF6eUluaXQpLFxuICAgICAgU3VzcGVuc2VFeGNlcHRpb24gPSBFcnJvcihcbiAgICAgICAgXCJTdXNwZW5zZSBFeGNlcHRpb246IFRoaXMgaXMgbm90IGEgcmVhbCBlcnJvciEgSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgYHVzZWAgdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IHJlbmRlci4gWW91IG11c3QgZWl0aGVyIHJldGhyb3cgaXQgaW1tZWRpYXRlbHksIG9yIG1vdmUgdGhlIGB1c2VgIGNhbGwgb3V0c2lkZSBvZiB0aGUgYHRyeS9jYXRjaGAgYmxvY2suIENhcHR1cmluZyB3aXRob3V0IHJldGhyb3dpbmcgd2lsbCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXFxuXFxuVG8gaGFuZGxlIGFzeW5jIGVycm9ycywgd3JhcCB5b3VyIGNvbXBvbmVudCBpbiBhbiBlcnJvciBib3VuZGFyeSwgb3IgY2FsbCB0aGUgcHJvbWlzZSdzIGAuY2F0Y2hgIG1ldGhvZCBhbmQgcGFzcyB0aGUgcmVzdWx0IHRvIGB1c2VgLlwiXG4gICAgICApLFxuICAgICAgU3VzcGVuc2V5Q29tbWl0RXhjZXB0aW9uID0gRXJyb3IoXG4gICAgICAgIFwiU3VzcGVuc2UgRXhjZXB0aW9uOiBUaGlzIGlzIG5vdCBhIHJlYWwgZXJyb3IsIGFuZCBzaG91bGQgbm90IGxlYWsgaW50byB1c2Vyc3BhY2UuIElmIHlvdSdyZSBzZWVpbmcgdGhpcywgaXQncyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICksXG4gICAgICBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvbiA9IEVycm9yKFxuICAgICAgICBcIlN1c3BlbnNlIEV4Y2VwdGlvbj
15852ogVGhpcyBpcyBub3QgYSByZWFsIGVycm9yISBJdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBgdXNlQWN0aW9uU3RhdGVgIHRvIGludGVycnVwdCB0aGUgY3VycmVudCByZW5kZXIuIFlvdSBtdXN0IGVpdGhlciByZXRocm93IGl0IGltbWVkaWF0ZWx5LCBvciBtb3ZlIHRoZSBgdXNlQWN0aW9uU3RhdGVgIGNhbGwgb3V0c2lkZSBvZiB0aGUgYHRyeS9jYXRjaGAgYmxvY2suIENhcHR1cmluZyB3aXRob3V0IHJldGhyb3dpbmcgd2lsbCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXFxuXFxuVG8gaGFuZGxlIGFzeW5jIGVycm9ycywgd3JhcCB5b3VyIGNvbXBvbmVudCBpbiBhbiBlcnJvciBib3VuZGFyeS5cIlxuICAgICAgKSxcbiAgICAgIG5vb3BTdXNwZW5zZXlDb21taXRUaGVuYWJsZSA9IHtcbiAgICAgICAgdGhlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEEgbGlzdGVuZXIgd2FzIHVuZXhwZWN0ZWRseSBhdHRhY2hlZCB0byBhIFwibm9vcFwiIHRoZW5hYmxlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxhc3RTdXNwZW5kZWRGaWJlciA9IG51bGwsXG4gICAgICBsYXN0U3VzcGVuZGVkU3RhY2sgPSBudWxsLFxuICAgICAgZGlkSXNzdWVVc2VXYXJuaW5nID0gITEsXG4gICAgICBzdXNwZW5kZWRUaGVuYWJsZSA9IG51bGwsXG4gICAgICBuZWVkc1RvUmVzZXRTdXNwZW5kZWRUaGVuYWJsZURFViA9ICExLFxuICAgICAgdGhlbmFibGVTdGF0ZSQxID0gbnVsbCxcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwLFxuICAgICAgY3VycmVudERlYnVnSW5mbyA9IG51bGwsXG4gICAgICBkaWRXYXJuQWJvdXRNYXBzO1xuICAgIHZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gKGRpZFdhcm5BYm91dE1hcHMgPSAhMSk7XG4gICAgdmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICAgIHZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcbiAgICB2YXIgb3duZXJIYXNTeW1ib2xUeXBlV2FybmluZyA9IHt9O1xuICAgIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKHJldHVybkZpYmVyLCB3b3JrSW5Qcm9ncmVzcywgY2hpbGQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCAhPT0gY2hpbGQgJiZcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGNoaWxkICYmXG4gICAgICAgIGNoaWxkLl9zdG9yZSAmJlxuICAgICAgICAoKCFjaGlsZC5fc3RvcmUudmFsaWRhdGVkICYmIG51bGwgPT0gY2hpbGQua2V5KSB8fFxuICAgICAgICAgIDIgPT09IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQpXG4gICAgICApIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgIT09IHR5cGVvZiBjaGlsZC5fc3RvcmUpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlJlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSAxO1xuICAgICAgICB2Y
15852XIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpLFxuICAgICAgICAgIGNvbXBvbmVudEtleSA9IGNvbXBvbmVudE5hbWUgfHwgXCJudWxsXCI7XG4gICAgICAgIGlmICghb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudEtleV0pIHtcbiAgICAgICAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50S2V5XSA9ICEwO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuX293bmVyO1xuICAgICAgICAgIHJldHVybkZpYmVyID0gcmV0dXJuRmliZXIuX2RlYnVnT3duZXI7XG4gICAgICAgICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBcIlwiO1xuICAgICAgICAgIHJldHVybkZpYmVyICYmXG4gICAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgcmV0dXJuRmliZXIudGFnICYmXG4gICAgICAgICAgICAoY29tcG9uZW50S2V5ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikpICYmXG4gICAgICAgICAgICAoY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9XG4gICAgICAgICAgICAgIFwiXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYFwiICsgY29tcG9uZW50S2V5ICsgXCJgLlwiKTtcbiAgICAgICAgICBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvIHx8XG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSAmJlxuICAgICAgICAgICAgICAoY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9XG4gICAgICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArXG4gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICAgICAgICAgXCI+LlwiKSk7XG4gICAgICAgICAgdmFyIGNoaWxkT3duZXJBcHBlbmRpeCA9IFwiXCI7XG4gICAgICAgICAgbnVsbCAhPSBjaGlsZCAmJlxuICAgICAgICAgICAgcmV0dXJuRmliZXIgIT09IGNoaWxkICYmXG4gICAgICAgICAgICAoKGNvbXBvbmVudE5hbWUgPSBudWxsKSxcbiAgICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBjaGlsZC50YWdcbiAgICAgICAgICAgICAgPyAoY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY2hpbGQpKVxuICAgICAgICAgICAgICA6IFwic3RyaW5nXCIgPT09IHR5cGVvZiBjaGlsZC5uYW1lICYmIChjb21wb25lbnROYW1lID0gY2hpbGQubmFtZSksXG4gICAgICAgICAgICBjb21wb25lbnROYW1lICYmXG4gICAgICAgICAgICAgIChjaGlsZE93bmVyQXBwZW5kaXggPVxuICAgICAgICAgICAgICAgIFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgY29tcG9uZW50TmFtZSArIFwiLlwiKSk7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYod29ya0luUHJvZ3Jlc3MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyxcbiAgICAgICAgICAgICAgY2hpbGRPd25lckFwcGVuZGl4XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBjcmVhdGVDaGlsZFJlY29uY2lsZXIoITApLFxuICAgICAgbW91bnRDaGlsZEZpYmVycyA9IGNyZWF0ZUNoaWxkUmVjb25jaWxlcighMSksXG4gICAgICBVcGRhdGVTdGF0ZSA9IDAsXG4gICAgICBSZXBsYWNlU3RhdGUgPSAxLFxuICAgICAgRm9yY2VVcGRhdGUgPSAyLFxuICAgICAgQ2FwdHVyZVVwZGF0ZSA9IDMsXG4gICAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgIHZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gITE7XG4gICAgdmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gICAgdmFyIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24gPSAhMSxcbiAgICAgIGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gICAgICBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoMCksXG4gICAgICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKSxcbiAgICAgIHNoZWxsQm91bmRhcnkgPSBudWxsLFxuICAgICAgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxLFxuICAgICAgRm9yY2VTdXNwZW5zZUZhbGxiYWNrID0gMixcbiAgICAgIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoMCksXG4gICAgICBOb0ZsYWdzID0gMCxcbiAgICAgIEhhc0VmZmVjdCA9IDEsXG4gICAgICBJbnNlcnRpb24gPSAyLFxuICAgICAgTGF5b3V0ID0gNCxcbiAgICAgIFBhc3NpdmUgPSA4LFxuICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3Q7XG4gICAgdmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0VXNlV3JhcHBlZEluVHJ5Q2F0Y2ggPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dEFzeW5jQ2xpZW50Q29tcG9uZW50ID0gbmV3IFNldCgpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRVc2VGb3JtU3RhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHJlbmRlckxhbmVzID0gMCxcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbCxcbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGwsXG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gITEsXG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSAhMSxcbiAgICAgIHNob3VsZERvdWJsZUludm9rZVVzZXJGbnNJbkhvb2tzREVWID0gITEsXG4gICAgICBsb2NhbElkQ291bnRlciA9IDAsXG4gICAgICB0aGVuYWJsZUluZGV4Q291bnRlciA9IDAsXG4gICAgICB0aGVuYWJsZVN0YXRlID0gbnVsbCxcbiAgICAgIGdsb2JhbENsaWVudElkQ29
158521bnRlciA9IDAsXG4gICAgICBSRV9SRU5ERVJfTElNSVQgPSAyNSxcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbCxcbiAgICAgIGhvb2tUeXBlc0RldiA9IG51bGwsXG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xLFxuICAgICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSAhMSxcbiAgICAgIENvbnRleHRPbmx5RGlzcGF0Y2hlciA9IHtcbiAgICAgICAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICAgICAgICB1c2U6IHVzZSxcbiAgICAgICAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VMYXlvdXRFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlRm9ybVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZUFjdGlvblN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZU9wdGltaXN0aWM6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlTWVtb0NhY2hlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZUNhY2hlUmVmcmVzaDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VFZmZlY3RFdmVudDogdGhyb3dJbnZhbGlkSG9va0Vycm9yXG4gICAgICB9LFxuICAgICAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbCxcbiAgICAgIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsLFxuICAgICAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGwsXG4gICAgICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsLFxuICAgICAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGwsXG4gICAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGwsXG4gICAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcbiAgICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZTogdXNlLFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ29udGV4dFwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbnNlcnRpb25FZmZlY3RcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIG1vdW50RWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgI
15852HJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVmXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTdGF0ZVwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIH0sXG4gICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVmZXJyZWRWYWx1ZVwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVRyYW5zaXRpb25cIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgICBnZXRTbmFwc2hvdCxcbiAgICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJZFwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgICAgfSxcbiAgICAgIHVzZUZvcm1TdGF0ZTogZnVuY3Rpb24gKGFjdGlvbiwgaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VGb3JtU3RhdGVcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgd2Fybk9uVXNlRm9ybVN0YXRlSW5EZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50QWN0aW9uU3RhdGUoYWN0aW9uLCBpbml0aWFsU3RhdGUpO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUFjdGlvblN0YXRlXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0sXG4gICAgICB1c2VPcHRpbWlzdGljOiBmdW5jdGlvbiAocGFzc3Rocm91Z2gpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU9wdGltaXN0aWNcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50T3B0aW1pc3RpYyhwYXNzdGhyb3VnaCk7XG4gICAgICB9LFxuICAgICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzLFxuICAgICAgdXNlTWVtb0NhY2hlOiB1c2VNZW1vQ2FjaGUsXG4gICAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNhY2hlUmVmcmVzaFwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRSZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0RXZlbnRcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50RXZlbnQoY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlOiB1c2UsXG4gICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDYWxsYmFja1wiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDb250ZXh0XCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbnNlcnRpb25
15852FZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIG1vdW50RWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN0YXRlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgICB9LFxuICAgICAgdXNlQWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24sIGluaXRpYWxTdGF0ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQWN0aW9uU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24sIGluaXRpYWxTdGF0ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRm9ybVN0YXRlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB3YXJuT25Vc2VGb3JtU3RhdGVJbkRldigpO1xuICAgICAgICByZXR1cm4gbW91bnRBY3Rpb25TdGF0ZShhY3Rpb24sIGluaXRpYWxTdGF0ZSk7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRPcHRpbWlzdGljKHBhc3N0aHJvdWdoKTtcbiAgICAgIH0sXG4gICAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogdXNlSG9zdFRyYW5zaXRpb25TdGF0dXMsXG4gICAgICB1c2VNZW1vQ2FjaGU6IHVzZU1lbW9DYWNoZSxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRSZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0RXZlbnRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEV2ZW50KGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZTogdXNlLFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNvbnRleHRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUVmZmVjdFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCBQYXNzaXZlLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUluc2VydGlvbkVmZmVjd
15852DogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VNZW1vXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVmXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVidWdWYWx1ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIH0sXG4gICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVmZXJyZWRWYWx1ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgICBnZXRTbmFwc2hvdCxcbiAgICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJZFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICB9LFxuICAgICAgdXNlRm9ybVN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VGb3JtU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHdhcm5PblVzZUZvcm1TdGF0ZUluRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VBY3Rpb25TdGF0ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUFjdGlvblN0YXRlKGFjdGlvbik7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgI
15852HVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlT3B0aW1pc3RpYyhwYXNzdGhyb3VnaCwgcmVkdWNlcik7XG4gICAgICB9LFxuICAgICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzLFxuICAgICAgdXNlTWVtb0NhY2hlOiB1c2VNZW1vQ2FjaGUsXG4gICAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNhY2hlUmVmcmVzaFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0RXZlbnRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFdmVudChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZTogdXNlLFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNvbnRleHRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUVmZmVjdFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCBQYXNzaXZlLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VNZW1vXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VSZWR1Y2VyXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVmXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoXG4gICAgICAgICAgc3Vic2NyaWJlLFxuICAgICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUlkXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgd2Fybk9uVXNlRm9ybVN0YXRlSW5EZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyQWN0aW9uU3RhdGUoYWN0aW9uKTtcbiAgICAgIH0sXG4gICAgICB1c2VBY3Rpb25TdGF0ZTogZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQWN0aW9uU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckFjdGlvblN0YXRlKGFjdGlvbik7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIH0sXG4gICAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogdXNlSG9zdFRyYW5zaXRpb25TdGF0dXMsXG4gICAgICB1c2VNZW1vQ2FjaGU6IHVzZU1lbW9DYWNoZSxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgI
15852HVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUV2ZW50KGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2U6IGZ1bmN0aW9uICh1c2FibGUpIHtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHJldHVybiB1c2UodXNhYmxlKTtcbiAgICAgIH0sXG4gICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDYWxsYmFja1wiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDb250ZXh0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbnNlcnRpb25FZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIG1vdW50RWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN0YXRlXCI7XG4gICAgICAgI
15852Hdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgICB9LFxuICAgICAgdXNlRm9ybVN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50QWN0aW9uU3RhdGUoYWN0aW9uLCBpbml0aWFsU3RhdGUpO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUFjdGlvblN0YXRlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRBY3Rpb25TdGF0ZShhY3Rpb24sIGluaXRpYWxTdGF0ZSk7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRPcHRpbWlzdGljKHBhc3N0aHJvdWdoKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlTWVtb0NhY2hlKHNpemUpO1xuICAgICAgfSxcbiAgICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudFJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50RXZlbnQoY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2U6IGZ1bmN0aW9uICh1c2FibGUpIHtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHJldHVybiB1c2UodXNhYmxlKTtcbiAgICAgIH0sXG4gICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDYWxsYmFja1wiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgI
15852HJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNvbnRleHRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB1cGRhdGVFZmZlY3RJbXBsKDIwNDgsIFBhc3NpdmUsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbXBlcmF0aXZlSGFuZGxlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoNCwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlTGF5b3V0RWZmZWN0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoNCwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgfSxcbiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVidWdWYWx1ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSwgaW5pdGlhbFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VUcmFuc2l0aW9uXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VBY3Rpb25TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHVzZU9wdGltaXN0aWM6IGZ1bmN0aW9uIChwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlT3B0aW1pc3RpY1wiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgI
15852HJldHVybiB1cGRhdGVPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlTWVtb0NhY2hlKHNpemUpO1xuICAgICAgfSxcbiAgICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFdmVudChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlOiBmdW5jdGlvbiAodXNhYmxlKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlKHVzYWJsZSk7XG4gICAgICB9LFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDb250ZXh0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCBQYXNzaXZlLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUluc2VydGlvbkVmZmVjdFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUxheW91dEVmZmVjdFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VNZW1vXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZHVjZXJcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgfSxcbiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VEZWJ1Z1ZhbHVlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIH0sXG4gICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVmZXJyZWRWYWx1ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckFjdGlvblN0YXRlKGFjdGlvbik7XG4gICAgICB9LFxuICAgICAgdXNlQWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUFjdGlvblN0YXRlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyQWN0aW9uU3RhdGUoYWN0aW9uKTtcbiAgICAgIH0sXG4gICAgICB1c2VPcHRpbWlzdGljOiBmdW5jdGlvbiAocGFzc3Rocm91Z2gsIHJlZHVjZXIpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU9wdGltaXN0aWNcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlTWVtb0NhY2hlKHNpemUpO1xuICAgICAgfSxcbiAgICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgI
15852HJldHVybiB1cGRhdGVFdmVudChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVzJDEgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dENoaWxkQ29udGV4dFR5cGVzID0gbmV3IFNldCgpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcbiAgICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbiAgICB2YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICAgICAgICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgICAgICAgIGluc3QgPSBpbnN0Ll9yZWFjdEludGVybmFscztcbiAgICAgICAgICB2Y
15852XIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGluc3QpLFxuICAgICAgICAgICAgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGxhbmUpO1xuICAgICAgICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgICB2b2lkIDAgIT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICBudWxsICE9PSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgKHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjayksICh1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaykpO1xuICAgICAgICAgIHBheWxvYWQgPSBlbnF1ZXVlVXBkYXRlKGluc3QsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgbnVsbCAhPT0gcGF5bG9hZCAmJlxuICAgICAgICAgICAgKHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUobGFuZSwgXCJ0aGlzLnNldFN0YXRlKClcIiwgaW5zdCksXG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocGF5bG9hZCwgaW5zdCwgbGFuZSksXG4gICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHBheWxvYWQsIGluc3QsIGxhbmUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgaW5zdCA9IGluc3QuX3JlYWN0SW50ZXJuYWxzO1xuICAgICAgICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoaW5zdCksXG4gICAgICAgICAgICB1cGRhdGUgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICAgICAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgICAgdm9pZCAwICE9PSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gY2FsbGJhY2sgJiZcbiAgICAgICAgICAgICh3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2spLCAodXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2spKTtcbiAgICAgICAgICBwYXlsb2FkID0gZW5xdWV1ZVVwZGF0ZShpbnN0LCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgIG51bGwgIT09IHBheWxvYWQgJiZcbiAgICAgICAgICAgIChzdGFydFVwZGF0ZVRpbWVyQnlMYW5lKGxhbmUsIFwidGhpcy5yZXBsYWNlU3RhdGUoKVwiLCBpbnN0KSxcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXlsb2FkLCBpbnN0LCBsYW5lKSxcbiAgICAgICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocGF5bG9hZCwgaW5zdCwgbGFuZSkpO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgICAgICAgIGluc3QgPSBpbnN0Ll9yZWFjdEludGVybmFscztcbiAgICAgICAgICB2Y
15852XIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGluc3QpLFxuICAgICAgICAgICAgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGxhbmUpO1xuICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICB2b2lkIDAgIT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICBudWxsICE9PSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgKHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjayksICh1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaykpO1xuICAgICAgICAgIGNhbGxiYWNrID0gZW5xdWV1ZVVwZGF0ZShpbnN0LCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgIG51bGwgIT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICAoc3RhcnRVcGRhdGVUaW1lckJ5TGFuZShsYW5lLCBcInRoaXMuZm9yY2VVcGRhdGUoKVwiLCBpbnN0KSxcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihjYWxsYmFjaywgaW5zdCwgbGFuZSksXG4gICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKGNhbGxiYWNrLCBpbnN0LCBsYW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjb21wb25lbnROYW1lID0gbnVsbCxcbiAgICAgIGVycm9yQm91bmRhcnlOYW1lID0gbnVsbCxcbiAgICAgIFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvbiA9IEVycm9yKFxuICAgICAgICBcIlRoaXMgaXMgbm90IGEgcmVhbCBlcnJvci4gSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgUmVhY3QncyBzZWxlY3RpdmUgaHlkcmF0aW9uIGZlYXR1cmUuIElmIHRoaXMgbGVha3MgaW50byB1c2Vyc3BhY2UsIGl0J3MgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICApLFxuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9ICExO1xuICAgIHZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICAgIHZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVzID0ge307XG4gICAgdmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9ICExO1xuICAgIHZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlciA9IHt9O1xuICAgIHZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucyA9IHt9O1xuICAgIHZhciBkaWRXYXJuQWJvdXRDbGFzc05hbWVPblZpZXdUcmFuc2l0aW9uID0ge307XG4gICAgdmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gICAgICAgIGRlaHlkcmF0ZWQ6IG51bGwsXG4gICAgICAgIHRyZWVDb250ZXh0OiBudWxsLFxuICAgICAgICByZXRyeUxhbmU6IDAsXG4gICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgfSxcbiAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gITEsXG4gICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG4gICAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHNob3VsZFN0YXJ0Vmlld1RyYW5zaXRpb24gPSAhMSxcbiAgICAgIGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyA9IG51bGwsXG4gICAgICB2aWV3VHJhbnNpdGlvbkNhbmNlbGFibGVDaGlsZHJlbiA9IG51bGwsXG4gICAgICB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCA9IDAsXG4gICAgICBtb3VudGVkTmFtZWRWaWV3VHJhbnNpdGlvbnMgPSBuZXcgTWFwKCksXG4gICAgICBkaWRXYXJuQWJvdXROYW1lID0ge30sXG4gICAgICBOb0xheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzID0gMCxcbiAgICAgIEluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgPSAxLFxuICAgICAgSW5jbHVkZUhvc3RTaW5nbGV0b25zID0gMixcbiAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9ICExLFxuICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9ICExLFxuICAgICAgb2Zmc2NyZWVuRGlyZWN0UGFyZW50SXNIaWRkZW4gPSAhMSxcbiAgICAgIG5lZWRzRm9ybVJlc2V0ID0gITEsXG4gICAgICBQb3NzaWJseVdlYWtTZXQgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBXZWFrU2V0ID8gV2Vha1NldCA6IFNldCxcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsLFxuICAgICAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbCxcbiAgICAgIGluUHJvZ3Jlc3NSb290ID0gbnVsbCxcbiAgICAgIHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQgPSAhMSxcbiAgICAgIGluVXBkYXRlVmlld1RyYW5zaXRpb24gPSAhMSxcbiAgICAgIHJvb3RWaWV3VHJhbnNpdGlvbkFmZmVjdGVkID0gITEsXG4gICAgICByb290Vmlld1RyYW5zaXRpb25OYW1lQ2FuY2VsZWQgPSAhMSxcbiAgICAgIGhvc3RQYXJlbnQgPSBudWxsLFxuICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITEsXG4gICAgICBjdXJyZW50SG9pc3RhYmxlUm9vdCA9IG51bGwsXG4gICAgICBpbkh5ZHJhdGVkU3VidHJlZSA9ICExLFxuICAgICAgc3VzcGVuc2V5Q29tbWl0RmxhZyA9IDgxOTIsXG4gICAgICBEZWZhdWx0QXN5bmNEaXNwYXRjaGVyID0ge1xuICAgICAgICBnZXRDYWNoZUZvclR5cGU6IGZ1bmN0aW9uIChyZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgICB2Y
15852XIgY2FjaGUgPSByZWFkQ29udGV4dChDYWNoZUNvbnRleHQpLFxuICAgICAgICAgICAgY2FjaGVGb3JUeXBlID0gY2FjaGUuZGF0YS5nZXQocmVzb3VyY2VUeXBlKTtcbiAgICAgICAgICB2b2lkIDAgPT09IGNhY2hlRm9yVHlwZSAmJlxuICAgICAgICAgICAgKChjYWNoZUZvclR5cGUgPSByZXNvdXJjZVR5cGUoKSksXG4gICAgICAgICAgICBjYWNoZS5kYXRhLnNldChyZXNvdXJjZVR5cGUsIGNhY2hlRm9yVHlwZSkpO1xuICAgICAgICAgIHJldHVybiBjYWNoZUZvclR5cGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNhY2hlU2lnbmFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KENhY2hlQ29udGV4dCkuY29udHJvbGxlci5zaWduYWw7XG4gICAgICAgIH0sXG4gICAgICAgIGdldE93bmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuZm9yKSB7XG4gICAgICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgICAgIHN5bWJvbEZvcihcInNlbGVjdG9yLmNvbXBvbmVudFwiKTtcbiAgICAgIHN5bWJvbEZvcihcInNlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3NcIik7XG4gICAgICBzeW1ib2xGb3IoXCJzZWxlY3Rvci5yb2xlXCIpO1xuICAgICAgc3ltYm9sRm9yKFwic2VsZWN0b3IudGVzdF9pZFwiKTtcbiAgICAgIHN5bWJvbEZvcihcInNlbGVjdG9yLnRleHRcIik7XG4gICAgfVxuICAgIHZhciBjb21taXRIb29rcyA9IFtdLFxuICAgICAgUG9zc2libHlXZWFrTWFwID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXAsXG4gICAgICBOb0NvbnRleHQgPSAwLFxuICAgICAgUmVuZGVyQ29udGV4dCA9IDIsXG4gICAgICBDb21taXRDb250ZXh0ID0gNCxcbiAgICAgIFJvb3RJblByb2dyZXNzID0gMCxcbiAgICAgIFJvb3RGYXRhbEVycm9yZWQgPSAxLFxuICAgICAgUm9vdEVycm9yZWQgPSAyLFxuICAgICAgUm9vdFN1c3BlbmRlZCA9IDMsXG4gICAgICBSb290U3VzcGVuZGVkV2l0aERlbGF5ID0gNCxcbiAgICAgIFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsID0gNixcbiAgICAgIFJvb3RDb21wbGV0ZWQgPSA1LFxuICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGwsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGwsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IDAsXG4gICAgICBOb3RTdXNwZW5kZWQgPSAwLFxuICAgICAgU3VzcGVuZGVkT25FcnJvciA9IDEsXG4gICAgICBTdXNwZW5kZWRPbkRhdGEgPSAyLFxuICAgICAgU3VzcGVuZGVkT25JbW1lZGlhdGUgPSAzLFxuICAgICAgU3VzcGVuZGVkT25JbnN0YW5jZSA9IDQsXG4gICAgICBTdXNwZW5kZWRPbkluc3RhbmNlQW5kUmVhZHlUb0NvbnRpbnVlID0gNSxcbiAgICAgIFN1c3BlbmRlZE9uRGVwcmVjYXRlZFRocm93UHJvbWlzZSA9IDYsXG4gICAgICBTdXNwZW5kZWRBbmRSZWFkeVRvQ29udGludWUgPSA3LFxuICAgICAgU3VzcGVuZGVkT25IeWRyYXRpb24gPSA4LFxuICAgICAgU3VzcGVuZGVkT25BY3Rpb24gPSA5LFxuICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSBOb3RTdXNwZW5kZWQsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyA9ICExLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgPSAhMSxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEF0dGFjaFBpbmdMaXN0ZW5lciA9ICExLFxuICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXMgPSAwLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9IDAsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEluY2x1ZGVSZWN1cnNpdmVSZW5kZXJVcGRhdGUgPSAhMSxcbiAgICAgIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwLFxuICAgICAgZ2xvYmFsTW9zdFJlY2VudFRyYW5zaXRpb25UaW1lID0gMCxcbiAgICAgIEZBTExCQUNLX1RIUk9UVExFX01TID0gMzAwLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IEluZmluaXR5LFxuICAgICAgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDAsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayA9IG51bGwsXG4gICAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGwsXG4gICAgICBJTU1FRElBVEVfQ09NTUlUID0gMCxcbiAgICAgIEFCT1JURURfVklFV19UUkFOU0lUSU9OX0NPTU1JVCA9IDEsXG4gICAgICBERUxBWUVEX1BBU1NJVkVfQ09NTUlUID0gMixcbiAgICAgIEFOSU1BVElPTl9TVEFSVEVEX0NPTU1JVCA9IDMsXG4gICAgICBOT19QRU5ESU5HX0VGRkVDVFMgPSAwLFxuICAgICAgUEVORElOR19NVVRBVElPTl9QSEFTRSA9IDEsXG4gICAgICBQRU5ESU5HX0xBWU9VVF9QSEFTRSA9IDIsXG4gICAgICBQRU5ESU5HX0FGVEVSX01VVEFUSU9OX1BIQVNFID0gMyxcbiAgICAgIFBFTkRJTkdfU1BBV05FRF9XT1JLID0gNCxcbiAgICAgIFBFTkRJTkdfUEFTU0lWRV9QSEFTRSA9IDUsXG4gICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IDAsXG4gICAgICBwZW5kaW5nRWZmZWN0c1Jvb3QgPSBudWxsLFxuICAgICAgcGVuZGluZ0ZpbmlzaGVkV29yayA9IG51bGwsXG4gICAgICBwZW5kaW5nRWZmZWN0c0xhbmVzID0gMCxcbiAgICAgIHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXMgPSAwLFxuICAgICAgcGVuZGluZ0VmZmVjdHNSZW5kZXJFbmRUaW1lID0gLTAsXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbCxcbiAgICAgIHBlbmRpbmdSZWNvdmVyYWJsZUVycm9ycyA9IG51bGwsXG4gICAgICBwZW5kaW5nVmlld1RyYW5zaXRpb24gPSBudWxsLFxuICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzID0gbnVsbCxcbiAgICAgIHBlbmRpbmdUcmFuc2l0aW9uVHlwZXMgPSBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbmRlZENvbW1pdFJlYXNvbiA9IG51bGwsXG4gICAgICBwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9IElNTUVESUFURV9DT01NSVQsXG4gICAgICBwZW5kaW5nU3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPSBudWxsLFxuICAgICAgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwLFxuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwLFxuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbCxcbiAgICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9ICExLFxuICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9ICExLFxuICAgICAgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTAsXG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwLFxuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGwsXG4gICAgICBpc1J1bm5pbmdJbnNlcnRpb25
15852FZmZlY3QgPSAhMSxcbiAgICAgIGRpZFdhcm5BYm91dEludGVycnVwdGVkVmlld1RyYW5zaXRpb25zID0gITEsXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbnVsbCxcbiAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gITE7XG4gICAgdmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZmFrZUFjdENhbGxiYWNrTm9kZSQxID0ge30sXG4gICAgICBmaXJzdFNjaGVkdWxlZFJvb3QgPSBudWxsLFxuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSBudWxsLFxuICAgICAgZGlkU2NoZWR1bGVNaWNyb3Rhc2sgPSAhMSxcbiAgICAgIGRpZFNjaGVkdWxlTWljcm90YXNrX2FjdCA9ICExLFxuICAgICAgbWlnaHRIYXZlUGVuZGluZ1N5bmNXb3JrID0gITEsXG4gICAgICBpc0ZsdXNoaW5nV29yayA9ICExLFxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSAwLFxuICAgICAgZmFrZUFjdENhbGxiYWNrTm9kZSA9IHt9O1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXSxcbiAgICAgICAgICBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgZXZlbnROYW1lID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCBcIm9uXCIgKyBldmVudE5hbWUpO1xuICAgICAgfVxuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCBcIm9uQW5pbWF0aW9uRW5kXCIpO1xuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCBcIm9uQW5pbWF0aW9uSXRlcmF0aW9uXCIpO1xuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsIFwib25BbmltYXRpb25TdGFydFwiKTtcbiAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoXCJkYmxjbGlja1wiLCBcIm9uRG91YmxlQ2xpY2tcIik7XG4gICAgICByZWdpc3RlclNpbXBsZUV2ZW50KFwiZm9jdXNpblwiLCBcIm9uRm9jdXNcIik7XG4gICAgICByZWdpc3RlclNpbXBsZUV2ZW50KFwiZm9jdXNvdXRcIiwgXCJvbkJsdXJcIik7XG4gICAgICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fUlVOLCBcIm9uVHJhbnNpdGlvblJ1blwiKTtcbiAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9TVEFSVCwgXCJvblRyYW5zaXRpb25TdGFydFwiKTtcbiAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9DQU5DRUwsIFwib25UcmFuc2l0aW9uQ2FuY2VsXCIpO1xuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgXCJvblRyYW5zaXRpb25FbmRcIik7XG4gICAgfSkoKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Nb3VzZUVudGVyXCIsIFtcIm1vdXNlb3V0XCIsIFwibW91c2VvdmVyXCJdKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Nb3VzZUxlYXZlXCIsIFtcIm1vdXNlb3V0XCIsIFwibW91c2VvdmVyXCJdKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Qb2ludGVyRW50ZXJcIiwgW1wicG9pbnRlcm91dFwiLCBcInBvaW50ZXJvdmVyXCJdKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Qb2ludGVyTGVhdmVcIiwgW1wicG9pbnRlcm91dFwiLCBcInBvaW50ZXJvdmVyXCJdKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uQ2hhbmdlXCIsXG4gICAgICBcImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXG4gICAgICAgIFwiIFwiXG4gICAgICApXG4gICAgKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uU2VsZWN0XCIsXG4gICAgICBcImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFxuICAgICAgICBcIiBcIlxuICAgICAgKVxuICAgICk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KFwib25CZWZvcmVJbnB1dFwiLCBbXG4gICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICBcImtleXByZXNzXCIsXG4gICAgICBcInRleHRJbnB1dFwiLFxuICAgICAgXCJwYXN0ZVwiXG4gICAgXSk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KFxuICAgICAgXCJvbkNvbXBvc2l0aW9uRW5kXCIsXG4gICAgICBcImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpXG4gICAgKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uQ29tcG9zaXRpb25TdGFydFwiLFxuICAgICAgXCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpXG4gICAgKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uQ29tcG9zaXRpb25VcGRhdGVcIixcbiAgICAgIFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIilcbiAgICApO1xuICAgIHZhciBtZWRpYUV2ZW50VHlwZXMgPVxuICAgICAgICBcImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoXG4gICAgICAgIFwiYmVmb3JldG9nZ2xlIGNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHNjcm9sbGVuZCB0b2dnbGVcIlxuICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAuY29uY2F0KG1lZGlhRXZlbnRUeXBlcylcbiAgICAgICksXG4gICAgICBsaXN0ZW5pbmdNYXJrZXIgPSBcIl9yZWFjdExpc3RlbmluZ1wiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gITEsXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gITEsXG4gICAgICBkaWRXYXJuRm9ybUFjdGlvblR5cGUgPSAhMSxcbiAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uTmFtZSA9ICExLFxuICAgICAgZGlkV2Fyb
15852kZvcm1BY3Rpb25UYXJnZXQgPSAhMSxcbiAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uTWV0aG9kID0gITEsXG4gICAgICBkaWRXYXJuUG9wb3ZlclRhcmdldE9iamVjdCA9ICExO1xuICAgIHZhciBkaWRXYXJuRm9yTmV3Qm9vbGVhblByb3BzV2l0aEVtcHR5VmFsdWUgPSB7fTtcbiAgICB2YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZyxcbiAgICAgIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZyxcbiAgICAgIHhsaW5rTmFtZXNwYWNlID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gICAgICB4bWxOYW1lc3BhY2UgPSBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICAgICAgZW1wdHlQcm9wcyA9IHt9LFxuICAgICAgRVhQRUNURURfRk9STV9BQ1RJT05fVVJMID1cbiAgICAgICAgXCJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignUmVhY3QgZm9ybSB1bmV4cGVjdGVkbHkgc3VibWl0dGVkLicpXCIsXG4gICAgICBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9IFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIsXG4gICAgICBBQ1RJVklUWV9TVEFSVF9EQVRBID0gXCImXCIsXG4gICAgICBBQ1RJVklUWV9FTkRfREFUQSA9IFwiLyZcIixcbiAgICAgIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSBcIiRcIixcbiAgICAgIFNVU1BFTlNFX0VORF9EQVRBID0gXCIvJFwiLFxuICAgICAgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gXCIkP1wiLFxuICAgICAgU1VTUEVOU0VfUVVFVUVEX1NUQVJUX0RBVEEgPSBcIiR+XCIsXG4gICAgICBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gXCIkIVwiLFxuICAgICAgUFJFQU1CTEVfQ09OVFJJQlVUSU9OX0hUTUwgPSBcImh0bWxcIixcbiAgICAgIFBSRUFNQkxFX0NPTlRSSUJVVElPTl9CT0RZID0gXCJib2R5XCIsXG4gICAgICBQUkVBTUJMRV9DT05UUklCVVRJT05fSEVBRCA9IFwiaGVhZFwiLFxuICAgICAgRk9STV9TVEFURV9JU19NQVRDSElORyA9IFwiRiFcIixcbiAgICAgIEZPUk1fU1RBVEVfSVNfTk9UX01BVENISU5HID0gXCJGXCIsXG4gICAgICBET0NVTUVOVF9SRUFEWV9TVEFURV9MT0FESU5HID0gXCJsb2FkaW5nXCIsXG4gICAgICBTVFlMRSA9IFwic3R5bGVcIixcbiAgICAgIEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZSA9IDAsXG4gICAgICBIb3N0Q29udGV4dE5hbWVzcGFjZVN2ZyA9IDEsXG4gICAgICBIb3N0Q29udGV4dE5hbWVzcGFjZU1hdGggPSAyLFxuICAgICAgZXZlbnRzRW5hYmxlZCA9IG51bGwsXG4gICAgICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGwsXG4gICAgICBkaWRXYXJuU2NyaXB0VGFncyA9ICExLFxuICAgICAgd2FybmVkVW5rbm93blRhZ3MgPSB7IGRpYWxvZzogITAsIHdlYnZpZXc6ICEwIH0sXG4gICAgICBjdXJyZW50UG9wc3RhdGVUcmFuc2l0aW9uRXZlbnQgPSBudWxsLFxuICAgICAgc2NoZWR1bGVyRXZlbnQgPSB2b2lkIDAsXG4gICAgICBzY2hlZHVsZVRpbWVvdXQgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBzZXRUaW
158521lb3V0ID8gc2V0VGltZW91dCA6IHZvaWQgMCxcbiAgICAgIGNhbmNlbFRpbWVvdXQgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjbGVhclRpbWVvdXQgPyBjbGVhclRpbWVvdXQgOiB2b2lkIDAsXG4gICAgICBub1RpbWVvdXQgPSAtMSxcbiAgICAgIGxvY2FsUHJvbWlzZSA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFByb21pc2UgPyBQcm9taXNlIDogdm9pZCAwLFxuICAgICAgbG9jYWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgIDogc2NoZWR1bGVUaW1lb3V0LFxuICAgICAgc2NoZWR1bGVNaWNyb3Rhc2sgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBxdWV1ZU1pY3JvdGFza1xuICAgICAgICAgID8gcXVldWVNaWNyb3Rhc2tcbiAgICAgICAgICA6IFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBsb2NhbFByb21pc2VcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgLnJlc29sdmUobnVsbClcbiAgICAgICAgICAgICAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogc2NoZWR1bGVUaW1lb3V0LFxuICAgICAgU1VTUEVOU0VZX0ZPTlRfQU5EX0lNQUdFX1RJTUVPVVQgPSA1MDA7XG4gICAgVmlld1RyYW5zaXRpb25Qc2V1ZG9FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKFxuICAgICAga2V5ZnJhbWVzLFxuICAgICAgb3B0aW9uc1xuICAgICkge1xuICAgICAgb3B0aW9ucyA9XG4gICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBvcHRpb25zXG4gICAgICAgICAgPyB7IGR1cmF0aW9uOiBvcHRpb25zIH1cbiAgICAgICAgICA6IGFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBzZXVkb0VsZW1lbnQgPSB0aGlzLl9zZWxlY3RvcjtcbiAgICAgIHJldHVybiB0aGlzLl9zY29wZS5hbmltYXRlKGtleWZyYW1lcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBWaWV3VHJhbnNpdGlvblBzZXVkb0VsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgc2NvcGUgPSB0aGlzLl9zY29wZSxcbiAgICAgICAgICBzZWxlY3RvciA9IHRoaXMuX3NlbGVjdG9yLFxuICAgICAgICAgIGFuaW1hdGlvbnMgPSBzY29wZS5nZXRBbmltYXRpb25zKHsgc3VidHJlZTogITAgfSksXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIGkgPCBhbmltYXRpb25zLmxlbmd0aDtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgdmFyIGVmZmVjdCA9IGFuaW1hdGlvbnNbaV0uZWZmZWN0O1xuICAgICAgICBudWxsICE9PSBlZmZlY3QgJiZcbiAgICAgICAgICBlZmZlY3QudGFyZ2V0ID09PSBzY29wZSAmJlxuICAgICAgICAgIGVmZmVjdC5wc2V1ZG9FbGVtZW50ID09PSBzZWxlY3RvciAmJlxuICAgICAgICAgIHJlc3VsdC5wdXNoKGFuaW1hdGlvbnNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIFZpZXdUcmFuc2l0aW9uUHNldWRvRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX3Njb3BlLCB0aGlzLl9zZWxlY3Rvcik7XG4gICAgfTtcbiAgICBGcmFnbWVudEluc3RhbmNlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgdmFyIHNpZ25hbCA9IG51bGwsXG4gICAgICAgIGNsZWFudXAgPSBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9IG9wdGlvbnNPclVzZUNhcHR1cmUgJiZcbiAgICAgICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiBvcHRpb25zT3JVc2VDYXB0dXJlICYmXG4gICAgICAgICgoc2lnbmFsID0gb3B0aW9uc09yVXNlQ2FwdHVyZS5zaWduYWwgfHwgbnVsbCksXG4gICAgICAgIG51bGwgIT09IHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbnVsbCA9PT0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMgJiYgKHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW10pO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzO1xuICAgICAgaWYgKFxuICAgICAgICAtMSA9PT1cbiAgICAgICAgaW5kZXhPZkV2ZW50TGlzdGVuZXIobGlzdGVuZXJzLCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9uc09yVXNlQ2FwdHVyZSlcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgZnJhZ21lbnRJbnN0YW5jZSA9IHRoaXMsXG4gICAgICAgICAgYXR0YWNoZWRMaXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgICAgICBudWxsICE9IG9wdGlvbnNPclVzZUNhcHR1cmUgJiZcbiAgICAgICAgICBcImJvb2xlYW5cIiAhPT0gdHlwZW9mIG9wdGlvbnNPclVzZUNhcHR1cmUgJiZcbiAgICAgICAgICAhMCA9PT0gb3B0aW9uc09yVXNlQ2FwdHVyZS5vbmNlICYmXG4gICAgICAgICAgKGF0dGFjaGVkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGZyYWdtZW50SW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICAgIG9wdGlvbnNPclVzZUNhcHR1cmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsaXN0ZW5lclxuICAgICAgICAgICAgICA/IGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgICAgICAgIDogbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICBudWxsICE9PSBzaWduYWwgJiZcbiAgICAgICAgICAoKGNsZWFudXAgPSBmcmFnbWVudEluc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChcbiAgICAgICAgICAgIGZyYWdtZW50SW5zdGFuY2UsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlXG4gICAgICAgICAgKSksXG4gICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjbGVhbnVwLCB7IG9uY2U6ICEwIH0pLFxuICAgICAgICAgIChjbGVhbnVwID0gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgICAgIGNsZWFudXBcbiAgICAgICAgICApKSk7XG4gICAgICAgIHNpZ25hbCA9IGdldEF0dGFjaE9wdGlvbnMob3B0aW9uc09yVXNlQ2FwdHVyZSk7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlOiBvcHRpb25zT3JVc2VDYXB0dXJlLFxuICAgICAgICAgIGF0dGFjaGVkTGlzdGVuZXI6IGF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgY2xlYW51cDogY2xlYW51cFxuICAgICAgICB9KTtcbiAgICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgICBhZGRFdmVudExpc3RlbmVyVG9DaGlsZCxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgc2lnbmFsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IGxpc3RlbmVycztcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoXG4gICAgICB0eXBlLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBvcHRpb25zT3JVc2VDYXB0dXJlXG4gICAgKSB7XG4gICAgICB2Y
15852XIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnM7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGxpc3RlbmVycyAmJlxuICAgICAgICAoKGxpc3RlbmVyID0gaW5kZXhPZkV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgbGlzdGVuZXJzLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgICApKSxcbiAgICAgICAgLTEgIT09IGxpc3RlbmVyKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBfbGlzdGVuZXJzJGluZGV4ID0gbGlzdGVuZXJzW2xpc3RlbmVyXTtcbiAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZSA9IF9saXN0ZW5lcnMkaW5kZXguYXR0YWNoZWRMaXN0ZW5lcjtcbiAgICAgICAgdmFyIGNsZWFudXAgPSBfbGlzdGVuZXJzJGluZGV4LmNsZWFudXA7XG4gICAgICAgIF9saXN0ZW5lcnMkaW5kZXggPSBnZXRBdHRhY2hPcHRpb25zKFxuICAgICAgICAgIF9saXN0ZW5lcnMkaW5kZXgub3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgICApO1xuICAgICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tQ2hpbGQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlLFxuICAgICAgICAgIF9saXN0ZW5lcnMkaW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lciwgMSk7XG4gICAgICAgIG51bGwgIT09IGNsZWFudXAgJiYgY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIHBhcmVudEhvc3RGaWJlciA9IGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApO1xuICAgICAgaWYgKG51bGwgPT09IHBhcmVudEhvc3RGaWJlcikgcmV0dXJuICEwO1xuICAgICAgcGFyZW50SG9zdEZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKHBhcmVudEhvc3RGaWJlcik7XG4gICAgICB2Y
15852XIgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9ldmVudExpc3RlbmVycztcbiAgICAgIGlmIChcbiAgICAgICAgKG51bGwgIT09IGV2ZW50TGlzdGVuZXJzICYmIDAgPCBldmVudExpc3RlbmVycy5sZW5ndGgpIHx8XG4gICAgICAgICFldmVudC5idWJibGVzXG4gICAgICApIHtcbiAgICAgICAgdmFyIHRlbXAgPVxuICAgICAgICAgIDkgPT09IHBhcmVudEhvc3RGaWJlci5ub2RlVHlwZVxuICAgICAgICAgICAgPyBwYXJlbnRIb3N0RmliZXIuY3JlYXRlQ29tbWVudChcIlwiKVxuICAgICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBfZXZlbnRMaXN0ZW5lcnMkaSA9IGV2ZW50TGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgdGVtcC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaS50eXBlLFxuICAgICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaS5hdHRhY2hlZExpc3RlbmVyLFxuICAgICAgICAgICAgICBnZXRBdHRhY2hPcHRpb25zKF9ldmVudExpc3RlbmVycyRpLm9wdGlvbnNPclVzZUNhcHR1cmUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgcGFyZW50SG9zdEZpYmVyLmFwcGVuZENoaWxkKHRlbXApO1xuICAgICAgICBldmVudCA9IHRlbXAuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycylcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAoX2V2ZW50TGlzdGVuZXJzJGkgPSBldmVudExpc3RlbmVyc1tpXSksXG4gICAgICAgICAgICAgIHRlbXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaS50eXBlLFxuICAgICAgICAgICAgICAgIF9ldmVudExpc3RlbmVycyRpLmF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgZ2V0QXR0YWNoT3B0aW9ucyhfZXZlbnRMaXN0ZW5lcnMkaS5vcHRpb25zT3JVc2VDYXB0dXJlKVxuICAgICAgICAgICAgICApO1xuICAgICAgICBwYXJlbnRIb3N0RmliZXIucmVtb3ZlQ2hpbGQodGVtcCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRIb3N0RmliZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfTtcbiAgICBGcmFnbWVudEluc3RhbmNlLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIChmb2N1c09wdGlvbnMpIHtcbiAgICAgIHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXIuY2hpbGQsXG4gICAgICAgICEwLFxuICAgICAgICBzZXRGb2N1c09uRmliZXJJZkZvY3VzYWJsZSxcbiAgICAgICAgZm9jdXNPcHRpb25zLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHZvaWQgMFxuICAgICAgKTtcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLmZvY3VzTGFzdCA9IGZ1bmN0aW9uIChmb2N1c09wdGlvbnMpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgdHJhdmVyc2VWaXNpYmxlSW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlci5jaGlsZCxcbiAgICAgICAgITAsXG4gICAgICAgIGNvbGxlY3RDaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdm9pZCAwXG4gICAgICApO1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAwIDw9IGkgJiYgIXNldEZvY3VzT25GaWJlcklmRm9jdXNhYmxlKGNoaWxkcmVuW2ldLCBmb2N1c09wdGlvbnMpO1xuICAgICAgICBpLS1cbiAgICAgICk7XG4gICAgfTtcbiAgICBGcmFnbWVudEluc3RhbmNlLnByb3RvdHlwZS5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhcmVudEhvc3RGaWJlciA9IGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApO1xuICAgICAgbnVsbCAhPT0gcGFyZW50SG9zdEZpYmVyICYmXG4gICAgICAgICgocGFyZW50SG9zdEZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKHBhcmVudEhvc3RGaWJlcikpLFxuICAgICAgICAocGFyZW50SG9zdEZpYmVyID1cbiAgICAgICAgICBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocGFyZW50SG9zdEZpYmVyKS5hY3RpdmVFbGVtZW50KSxcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50SG9zdEZpYmVyICYmXG4gICAgICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICAgICAgYmx1ckFjdGl2ZUVsZW1lbnRXaXRoaW5GcmFnbWVudCxcbiAgICAgICAgICAgIHBhcmVudEhvc3RGaWJlclxuICAgICAgICAgICkpO1xuICAgIH07XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUub2JzZXJ2ZVVzaW5nID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2Y
15852XIgaGFzVGV4dCA9ICExLFxuICAgICAgICBoYXNFbGVtZW50ID0gITE7XG4gICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgaGFzVGV4dCA9ICEwO1xuICAgICAgICAgIGVsc2UgcmV0dXJuIChoYXNFbGVtZW50ID0gITApO1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGhhc1RleHQgJiZcbiAgICAgICAgIWhhc0VsZW1lbnQgJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIm9ic2VydmVVc2luZygpIHdhcyBjYWxsZWQgb24gYSBGcmFnbWVudEluc3RhbmNlIHdpdGggb25seSB0ZXh0IGNoaWxkcmVuLiBPYnNlcnZlcnMgZG8gbm90IHdvcmsgb24gdGV4dCBub2Rlcy5cIlxuICAgICAgICApO1xuICAgICAgbnVsbCA9PT0gdGhpcy5fb2JzZXJ2ZXJzICYmICh0aGlzLl9vYnNlcnZlcnMgPSBuZXcgU2V0KCkpO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7XG4gICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgb2JzZXJ2ZUNoaWxkLFxuICAgICAgICBvYnNlcnZlclxuICAgICAgKTtcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLnVub2JzZXJ2ZVVzaW5nID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2Y
15852XIgb2JzZXJ2ZXJzID0gdGhpcy5fb2JzZXJ2ZXJzO1xuICAgICAgaWYgKG51bGwgIT09IG9ic2VydmVycyAmJiBvYnNlcnZlcnMuaGFzKG9ic2VydmVyKSkge1xuICAgICAgICBvYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgICB1bm9ic2VydmVDaGlsZCxcbiAgICAgICAgICBvYnNlcnZlclxuICAgICAgICApO1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBpID0gKG9ic2VydmVycyA9IDApO1xuICAgICAgICAgIGkgPCBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcy5sZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBwZW5kaW5nID0gcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXNbaV07XG4gICAgICAgICAgcGVuZGluZy5mcmFnbWVudEluc3RhbmNlID09PSB0aGlzICYmIHBlbmRpbmcub2JzZXJ2ZXIgPT09IG9ic2VydmVyXG4gICAgICAgICAgICA/IG9ic2VydmVyLnVub2JzZXJ2ZShwZW5kaW5nLmluc3RhbmNlKVxuICAgICAgICAgICAgOiAocGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXNbb2JzZXJ2ZXJzKytdID0gcGVuZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXMubGVuZ3RoID0gb2JzZXJ2ZXJzO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgYXJlIGNhbGxpbmcgdW5vYnNlcnZlVXNpbmcoKSB3aXRoIGFuIG9ic2VydmVyIHRoYXQgaXMgbm90IGJlaW5nIG9ic2VydmVkIHdpdGggdGhpcyBmcmFnbWVudCBpbnN0YW5jZS4gRmlyc3QgYXR0YWNoIHRoZSBvYnNlcnZlciB3aXRoIG9ic2VydmVVc2luZygpXCJcbiAgICAgICAgKTtcbiAgICB9O1xuICAgIHZhciBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcyA9IFtdLFxuICAgICAgaW50ZXJzZWN0aW9uVW5vYnNlcnZlU2NoZWR1bGVkID0gITE7XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUuZ2V0Q2xpZW50UmVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
15852XIgcmVjdHMgPSBbXTtcbiAgICAgIHRyYXZlcnNlRnJhZ21lbnRJbnN0YW5jZXNBbmRUZXh0SW5zdGFuY2VzKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICBjb2xsZWN0Q2xpZW50UmVjdHMsXG4gICAgICAgIHJlY3RzXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlY3RzO1xuICAgIH07XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUgPSBmdW5jdGlvbiAoZ2V0Um9vdE5vZGVPcHRpb25zKSB7XG4gICAgICB2YXIgcGFyZW50SG9zdEZpYmVyID0gZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoXG4gICAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gcGFyZW50SG9zdEZpYmVyXG4gICAgICAgID8gdGhpc1xuICAgICAgICA6IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihwYXJlbnRIb3N0RmliZXIpLmdldFJvb3ROb2RlKFxuICAgICAgICAgICAgZ2V0Um9vdE5vZGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24gKG90aGVyTm9kZSkge1xuICAgICAgdmFyIHBhcmVudEhvc3RGaWJlciA9IGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApO1xuICAgICAgaWYgKG51bGwgPT09IHBhcmVudEhvc3RGaWJlcikgcmV0dXJuIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRElTQ09OTkVDVEVEO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgY29sbGVjdENoaWxkcmVuLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKTtcbiAgICAgIHZhciBwYXJlbnRIb3N0SW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIocGFyZW50SG9zdEZpYmVyKTtcbiAgICAgIGlmICgwID09PSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyID0gcGFyZW50SG9zdEluc3RhbmNlO1xuICAgICAgICBpZiAoZmliZXJJc1BvcnRhbGVkSW50b0hvc3QodGhpcy5fZnJhZ21lbnRGaWJlcikpIHtcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBmb3IgKGNoaWxkcmVuID0gdGhpcy5fZnJhZ21lbnRGaWJlci5yZXR1cm47IG51bGwgIT09IGNoaWxkcmVuOyApIHtcbiAgICAgICAgICAgICAgaWYgKDQgPT09IGNoaWxkcmVuLnRhZykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgMyA9PT0gY2hpbGRyZW4udGFnIHx8XG4gICAgICAgICAgICAgICAgNSA9PT0gY2hpbGRyZW4udGFnIHx8XG4gICAgICAgICAgICAgICAgMjcgPT09IGNoaWxkcmVuLnRhZ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBudWxsICE9IGNoaWxkcmVuICYmIChwYXJlbnRIb3N0RmliZXIgPSBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4gPSB0aGlzLl9mcmFnbWVudEZpYmVyO1xuICAgICAgICB2Y
15852XIgcmVzdWx0ID0gKHBhcmVudEhvc3RJbnN0YW5jZSA9XG4gICAgICAgICAgcGFyZW50SG9zdEZpYmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG90aGVyTm9kZSkpO1xuICAgICAgICBwYXJlbnRIb3N0RmliZXIgPT09IG90aGVyTm9kZVxuICAgICAgICAgID8gKHJlc3VsdCA9IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpXG4gICAgICAgICAgOiBwYXJlbnRIb3N0SW5zdGFuY2UgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSAmJlxuICAgICAgICAgICAgKChjaGlsZHJlbiA9XG4gICAgICAgICAgICAgIGdldEZyYWdtZW50SW5zdGFuY2VPclRleHRJbnN0YW5jZVNpYmxpbmdzKGNoaWxkcmVuKVsxXSksXG4gICAgICAgICAgICBudWxsID09PSBjaGlsZHJlblxuICAgICAgICAgICAgICA/IChyZXN1bHQgPSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORylcbiAgICAgICAgICAgICAgOiAoKG90aGVyTm9kZSA9XG4gICAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGRyZW4pLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgICBvdGhlck5vZGVcbiAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIChyZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgMCA9PT0gb3RoZXJOb2RlIHx8XG4gICAgICAgICAgICAgICAgICBvdGhlck5vZGUgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lOR1xuICAgICAgICAgICAgICAgICAgICA/IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICAgICAgICAgICAgICAgIDogTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpKSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0IHw9IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fSU1QTEVNRU5UQVRJT05fU1BFQ0lGSUMpO1xuICAgICAgfVxuICAgICAgcGFyZW50SG9zdEZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkcmVuWzBdKTtcbiAgICAgIHJlc3VsdCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSk7XG4gICAgICB2Y
15852XIgcGFyZW50SG9zdEluc3RhbmNlRnJvbURPTSA9IGZpYmVySXNQb3J0YWxlZEludG9Ib3N0KFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApXG4gICAgICAgID8gcGFyZW50SG9zdEZpYmVyLnBhcmVudEVsZW1lbnRcbiAgICAgICAgOiBwYXJlbnRIb3N0SW5zdGFuY2U7XG4gICAgICBpZiAobnVsbCA9PSBwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NKVxuICAgICAgICByZXR1cm4gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9ESVNDT05ORUNURUQ7XG4gICAgICBwYXJlbnRIb3N0SW5zdGFuY2UgPVxuICAgICAgICBwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHBhcmVudEhvc3RGaWJlcikgJlxuICAgICAgICBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWTtcbiAgICAgIHBhcmVudEhvc3RJbnN0YW5jZUZyb21ET00gPVxuICAgICAgICBwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHJlc3VsdCkgJlxuICAgICAgICBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWTtcbiAgICAgIHZhciBmaXJzdFJlc3VsdCA9IHBhcmVudEhvc3RGaWJlci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihvdGhlck5vZGUpLFxuICAgICAgICBsYXN0UmVzdWx0ID0gcmVzdWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG90aGVyTm9kZSksXG4gICAgICAgIG90aGVyTm9kZUlzV2l0aGluRmlyc3RPckxhc3RDaGlsZCA9XG4gICAgICAgICAgZmlyc3RSZXN1bHQgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSB8fFxuICAgICAgICAgIGxhc3RSZXN1bHQgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWTtcbiAgICAgIGxhc3RSZXN1bHQgPVxuICAgICAgICBwYXJlbnRIb3N0SW5zdGFuY2UgJiZcbiAgICAgICAgcGFyZW50SG9zdEluc3RhbmNlRnJvbURPTSAmJlxuICAgICAgICBmaXJzdFJlc3VsdCAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HICYmXG4gICAgICAgIGxhc3RSZXN1bHQgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORztcbiAgICAgIHBhcmVudEhvc3RGaWJlciA9XG4gICAgICAgIChwYXJlbnRIb3N0SW5zdGFuY2UgJiYgcGFyZW50SG9zdEZpYmVyID09PSBvdGhlck5vZGUpIHx8XG4gICAgICAgIChwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NICYmIHJlc3VsdCA9PT0gb3RoZXJOb2RlKSB8fFxuICAgICAgICBvdGhlck5vZGVJc1dpdGhpbkZpcnN0T3JMYXN0Q2hpbGQgfHxcbiAgICAgICAgbGFzdFJlc3VsdFxuICAgICAgICAgID8gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQllcbiAgICAgICAgICA6ICghcGFyZW50SG9zdEluc3RhbmNlICYmIHBhcmVudEhvc3RGaWJlciA9PT0gb3RoZXJOb2RlKSB8fFxuICAgICAgICAgICAgICAoIXBhcmVudEhvc3RJbnN0YW5jZUZyb21ET00gJiYgcmVzdWx0ID09PSBvdGhlck5vZGUpXG4gICAgICAgICAgICA/IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fSU1QTEVNRU5UQVRJT05fU1BFQ0lGSUNcbiAgICAgICAgICAgIDogZmlyc3RSZXN1bHQ7XG4gICAgICByZXR1cm4gcGFyZW50SG9zdEZpYmVyICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9ESVNDT05ORUNURUQgfHxcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9JTVBMRU1
15852FTlRBVElPTl9TUEVDSUZJQyB8fFxuICAgICAgICB2YWxpZGF0ZURvY3VtZW50UG9zaXRpb25XaXRoRmliZXJUcmVlKFxuICAgICAgICAgIHBhcmVudEhvc3RGaWJlcixcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICAgIGNoaWxkcmVuWzBdLFxuICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLFxuICAgICAgICAgIG90aGVyTm9kZVxuICAgICAgICApXG4gICAgICAgID8gcGFyZW50SG9zdEZpYmVyXG4gICAgICAgIDogTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9JTVBMRU1FTlRBVElPTl9TUEVDSUZJQztcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLnNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gKGFsaWduVG9Ub3ApIHtcbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgYWxpZ25Ub1RvcClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJGcmFnbWVudEluc3RhbmNlLnNjcm9sbEludG9WaWV3KCkgZG9lcyBub3Qgc3VwcG9ydCBzY3JvbGxJbnRvVmlld09wdGlvbnMuIFVzZSB0aGUgYWxpZ25Ub1RvcCBib29sZWFuIGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXIsXG4gICAgICAgIGNvbGxlY3RDaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICk7XG4gICAgICB2YXIgcmVzb2x2ZWRBbGlnblRvVG9wID0gITEgIT09IGFsaWduVG9Ub3A7XG4gICAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob3N0U2libGluZ3MgPSBnZXRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICAgICk7XG4gICAgICAgIGhvc3RTaWJsaW5ncyA9IHJlc29sdmVkQWxpZ25Ub1RvcFxuICAgICAgICAgID8gaG9zdFNpYmxpbmdzWzFdIHx8XG4gICAgICAgICAgICBob3N0U2libGluZ3NbMF0gfHxcbiAgICAgICAgICAgIGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKHRoaXMuX2ZyYWdtZW50RmliZXIpXG4gICAgICAgICAgOiBob3N0U2libGluZ3NbMF0gfHwgaG9zdFNpYmxpbmdzWzFdO1xuICAgICAgICBpZiAobnVsbCA9PT0gaG9zdFNpYmxpbmdzKSByZXR1cm47XG4gICAgICAgIGlmICg2ID09PSBob3N0U2libGluZ3MudGFnKSB7XG4gICAgICAgICAgYWxpZ25Ub1RvcCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihob3N0U2libGluZ3MpO1xuICAgICAgICAgIHNjcm9sbFRleHROb2RlSW50b1ZpZXcoYWxpZ25Ub1RvcCwgcmVzb2x2ZWRBbGlnblRvVG9wKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaG9zdFNpYmxpbmdzID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGhvc3RTaWJsaW5ncyk7XG4gICAgICAgIGlmICg5ICE9PSBob3N0U2libGluZ3Mubm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAoMTEgPT09IGhvc3RTaWJsaW5ncy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRBbGlnblRvVG9wID1cbiAgICAgICAgICAgICAgXCJob3N0XCIgaW4gaG9zdFNpYmxpbmdzID8gaG9zdFNpYmxpbmdzLmhvc3QgOiBudWxsO1xuICAgICAgICAgICAgbnVsbCAhPT0gcmVzb2x2ZWRBbGlnblRvVG9wXG4gICAgICAgICAgICAgID8gcmVzb2x2ZWRBbGlnblRvVG9wLnNjcm9sbEludG9WaWV3KGFsaWduVG9Ub3ApXG4gICAgICAgICAgICAgIDogY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgXCJZb3UgYXJlIGF0dGVtcHRpbmcgdG8gc2Nyb2xsIGEgRnJhZ21lbnRJbnN0YW5jZSB0aGF0IGlzIG9ubHkgbW91bnRlZCBpbnNpZGUgYSBkZXRhY2hlZCBEb2N1bWVudEZyYWdtZW50LiBObyBzY3JvbGwgd2FzIHBlcmZvcm1lZC5cIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGhvc3RTaWJsaW5ncy5zY3JvbGxJbnRvVmlldyhhbGlnblRvVG9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChcbiAgICAgICAgaG9zdFNpYmxpbmdzID0gcmVzb2x2ZWRBbGlnblRvVG9wID8gY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDA7XG4gICAgICAgIGhvc3RTaWJsaW5ncyAhPT0gKHJlc29sdmVkQWxpZ25Ub1RvcCA/IC0xIDogY2hpbGRyZW4ubGVuZ3RoKTtcblxuICAgICAgKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2hvc3RTaWJsaW5nc107XG4gICAgICAgIDYgPT09IGNoaWxkLnRhZ1xuICAgICAgICAgID8gKChjaGlsZCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZCkpLFxuICAgICAgICAgICAgc2Nyb2xsVGV4dE5vZGVJbnRvVmlldyhjaGlsZCwgcmVzb2x2ZWRBbGlnblRvVG9wKSlcbiAgICAgICAgICA6IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZCkuc2Nyb2xsSW50b1ZpZXcoYWxpZ25Ub1RvcCk7XG4gICAgICAgIGhvc3RTaWJsaW5ncyArPSByZXNvbHZlZEFsaWduVG9Ub3AgPyAtMSA6IDE7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiA9IG51bGwsXG4gICAgICBOb3RMb2FkZWQgPSAwLFxuICAgICAgTG9hZGVkID0gMSxcbiAgICAgIEVycm9yZWQgPSAyLFxuICAgICAgU2V0dGxlZCA9IDMsXG4gICAgICBJbnNlcnRlZCA9IDQsXG4gICAgICBwcmVsb2FkUHJvcHNNYXAgPSBuZXcgTWFwKCksXG4gICAgICBwcmVjb25uZWN0c1NldCA9IG5ldyBTZXQoKSxcbiAgICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLmQ7XG4gICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMuZCA9IHtcbiAgICAgIGY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzV2FzUmVuZGVyaW5nID0gcHJldmlvdXNEaXNwYXRjaGVyLmYoKSxcbiAgICAgICAgICB3YXNSZW5kZXJpbmcgPSBmbHVzaFN5bmNXb3JrJDEoKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzV2FzUmVuZGVyaW5nIHx8IHdhc1JlbmRlcmluZztcbiAgICAgIH0sXG4gICAgICByOiBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICB2Y
15852XIgZm9ybUluc3QgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGZvcm0pO1xuICAgICAgICBudWxsICE9PSBmb3JtSW5zdCAmJiA1ID09PSBmb3JtSW5zdC50YWcgJiYgXCJmb3JtXCIgPT09IGZvcm1JbnN0LnR5cGVcbiAgICAgICAgICA/IHJlcXVlc3RGb3JtUmVzZXQkMShmb3JtSW5zdClcbiAgICAgICAgICA6IHByZXZpb3VzRGlzcGF0Y2hlci5yKGZvcm0pO1xuICAgICAgfSxcbiAgICAgIEQ6IGZ1bmN0aW9uIChocmVmKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5EKGhyZWYpO1xuICAgICAgICBwcmVjb25uZWN0QXMoXCJkbnMtcHJlZmV0Y2hcIiwgaHJlZiwgbnVsbCk7XG4gICAgICB9LFxuICAgICAgQzogZnVuY3Rpb24gKGhyZWYsIGNyb3NzT3JpZ2luKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5DKGhyZWYsIGNyb3NzT3JpZ2luKTtcbiAgICAgICAgcHJlY29ubmVjdEFzKFwicHJlY29ubmVjdFwiLCBocmVmLCBjcm9zc09yaWdpbik7XG4gICAgICB9LFxuICAgICAgTDogZnVuY3Rpb24gKGhyZWYsIGFzLCBvcHRpb25zKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5MKGhyZWYsIGFzLCBvcHRpb25zKTtcbiAgICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxEb2N1bWVudDtcbiAgICAgICAgaWYgKG93bmVyRG9jdW1lbnQgJiYgaHJlZiAmJiBhcykge1xuICAgICAgICAgIHZhciBwcmVsb2FkU2VsZWN0b3IgPVxuICAgICAgICAgICAgJ2xpbmtbcmVsPVwicHJlbG9hZFwiXVthcz1cIicgK1xuICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhhcykgK1xuICAgICAgICAgICAgJ1wiXSc7XG4gICAgICAgICAgXCJpbWFnZVwiID09PSBhc1xuICAgICAgICAgICAgPyBvcHRpb25zICYmIG9wdGlvbnMuaW1hZ2VTcmNTZXRcbiAgICAgICAgICAgICAgPyAoKHByZWxvYWRTZWxlY3RvciArPVxuICAgICAgICAgICAgICAgICAgJ1tpbWFnZXNyY3NldD1cIicgK1xuICAgICAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbWFnZVNyY1NldFxuICAgICAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICAgICAnXCJdJyksXG4gICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VTaXplcyAmJlxuICAgICAgICAgICAgICAgICAgKHByZWxvYWRTZWxlY3RvciArPVxuICAgICAgICAgICAgICAgICAgICAnW2ltYWdlc2l6ZXM9XCInICtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmltYWdlU2l6ZXNcbiAgICAgICAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICAgICAgICdcIl0nKSlcbiAgICAgICAgICAgICAgOiAocHJlbG9hZFNlbGVjdG9yICs9XG4gICAgICAgICAgICAgICAgICAnW2hyZWY9XCInICtcbiAgICAgICAgICAgICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoaHJlZikgK1xuICAgICAgICAgICAgICAgICAgJ1wiXScpXG4gICAgICAgICAgICA6IChwcmVsb2FkU2VsZWN0b3IgKz1cbiAgICAgICAgICAgICAgICAnW2hyZWY9XCInICtcbiAgICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGhyZWYpICtcbiAgICAgICAgICAgICAgICAnXCJdJyk7XG4gICAgICAgICAgdmFyIGtleSA9IHByZWxvYWRTZWxlY3RvcjtcbiAgICAgICAgICBzd2l0Y2ggKGFzKSB7XG4gICAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgICAga2V5ID0gZ2V0U3R5bGVLZXkoaHJlZik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNjcmlwdFwiOlxuICAgICAgICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoaHJlZik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgIHByZWxvYWRQcm9wc01hcC5oYXMoa2V5KSB8fFxuICAgICAgICAgICAgICAoKGhyZWYgPSBhc3NpZ24oXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVsOiBcInByZWxvYWRcIixcbiAgICAgICAgICAgICAgICAgIGhyZWY6XG4gICAgICAgICAgICAgICAgICAgIFwiaW1hZ2VcIiA9PT0gYXMgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmltYWdlU3JjU2V0XG4gICAgICAgICAgICAgICAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgICAgICAgICAgICAgICA6IGhyZWYsXG4gICAgICAgICAgICAgICAgICBhczogYXNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIHByZWxvYWRQcm9wc01hcC5zZXQoa2V5LCBocmVmKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKHByZWxvYWRTZWxlY3RvcikgfHxcbiAgICAgICAgICAgICAgICAoXCJzdHlsZVwiID09PSBhcyAmJlxuICAgICAgICAgICAgICAgICAgb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICAgICAgICkpIHx8XG4gICAgICAgICAgICAgICAgKFwic2NyaXB0XCIgPT09IGFzICYmXG4gICAgICAgICAgICAgICAgICBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSkpKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhpbnN0YW5jZSwgXCJsaW5rXCIsIGhyZWYpO1xuICAgICAgICAgICAgXCJzdHlsZVwiID09PSBhcyAmJlxuICAgICAgICAgICAgICAoKGluc3RhbmNlW2ludGVybmFsTG9hZFBlbmRpbmdLZXldID0gITApLFxuICAgICAgICAgICAgICAoaW5zdGFuY2Uub25sb2FkID0gaW5zdGFuY2Uub25lcnJvciA9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJQZW5kaW5nTG9hZE9uTm9kZShpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgI
15852H1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG06IGZ1bmN0aW9uIChocmVmLCBvcHRpb25zKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5tKGhyZWYsIG9wdGlvbnMpO1xuICAgICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBocmVmKSB7XG4gICAgICAgICAgdmFyIGFzID1cbiAgICAgICAgICAgICAgb3B0aW9ucyAmJiBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5hcyA/IG9wdGlvbnMuYXMgOiBcInNjcmlwdFwiLFxuICAgICAgICAgICAgcHJlbG9hZFNlbGVjdG9yID1cbiAgICAgICAgICAgICAgJ2xpbmtbcmVsPVwibW9kdWxlcHJlbG9hZFwiXVthcz1cIicgK1xuICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGFzKSArXG4gICAgICAgICAgICAgICdcIl1baHJlZj1cIicgK1xuICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGhyZWYpICtcbiAgICAgICAgICAgICAgJ1wiXScsXG4gICAgICAgICAgICBrZXkgPSBwcmVsb2FkU2VsZWN0b3I7XG4gICAgICAgICAgc3dpdGNoIChhcykge1xuICAgICAgICAgICAgY2FzZSBcImF1ZGlvd29ya2xldFwiOlxuICAgICAgICAgICAgY2FzZSBcInBhaW50d29ya2xldFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcnZpY2V3b3JrZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzaGFyZWR3b3JrZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ3b3JrZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICAgICAga2V5ID0gZ2V0U2NyaXB0S2V5KGhyZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcHJlbG9hZFByb3BzTWFwLmhhcyhrZXkpICYmXG4gICAgICAgICAgICAoKGhyZWYgPSBhc3NpZ24oeyByZWw6IFwibW9kdWxlcHJlbG9hZFwiLCBocmVmOiBocmVmIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByZWxvYWRQcm9wc01hcC5zZXQoa2V5LCBocmVmKSxcbiAgICAgICAgICAgIG51bGwgPT09IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihwcmVsb2FkU2VsZWN0b3IpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc3dpdGNoIChhcykge1xuICAgICAgICAgICAgICBjYXNlIFwiYXVkaW93b3JrbGV0XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJwYWludHdvcmtsZXRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNlcnZpY2V3b3JrZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNoYXJlZHdvcmtlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwid29ya2VyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICBpZiAob3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldFNjcmlwdFNlbGVjdG9yRnJvbUtleShrZXkpKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGFzLCBcImxpbmtcIiwgaHJlZik7XG4gICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGFzKTtcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgWDogZnVuY3Rpb24gKHNyYywgb3B0aW9ucykge1xuICAgICAgICBwcmV2aW91c0Rpc3BhdGNoZXIuWChzcmMsIG9wdGlvbnMpO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBzcmMpIHtcbiAgICAgICAgICB2YXIgc2NyaXB0cyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVNjcmlwdHMsXG4gICAgICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoc3JjKSxcbiAgICAgICAgICAgIHJlc291cmNlID0gc2NyaXB0cy5nZXQoa2V5KTtcbiAgICAgICAgICByZXNvdXJjZSB8fFxuICAgICAgICAgICAgKChyZXNvdXJjZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgKChzcmMgPSBhc3NpZ24oeyBzcmM6IHNyYywgYXN5bmM6ICEwIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgKG9wdGlvbnMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KGtleSkpICYmXG4gICAgICAgICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc3JjLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSxcbiAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShyZXNvdXJjZSksXG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKHJlc291cmNlLCBcImxpbmtcIiwgc3JjKSxcbiAgICAgICAgICAgICAgb3duZXJEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlc291cmNlKSksXG4gICAgICAgICAgICAocmVzb3VyY2UgPSB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic2NyaXB0XCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBudWxsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjcmlwdHMuc2V0KGtleSwgcmVzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFM6IGZ1bmN0aW9uIChocmVmLCBwcmVjZWRlbmNlLCBvcHRpb25zKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5TKGhyZWYsIHByZWNlZGVuY2UsIG9wdGlvbnMpO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBocmVmKSB7XG4gICAgICAgICAgdmFyIHN0eWxlcyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVN0eWxlcyxcbiAgICAgICAgICAgIGtleSA9IGdldFN0eWxlS2V5KGhyZWYpO1xuICAgICAgICAgIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlIHx8IFwiZGVmYXVsdFwiO1xuICAgICAgICAgIHZhciByZXNvdXJjZSA9IHN0eWxlcy5nZXQoa2V5KTtcbiAgICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB7IGxvYWRpbmc6IE5vdExvYWRlZCwgcHJlbG9hZDogbnVsbCB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAocmVzb3VyY2UgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgZ2V0U3R5bGVzaGVldFNlbGVjdG9yRnJvbUtleShrZXkpXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHN0YXRlLmxvYWRpbmcgPSBMb2FkZWQgfCBJbnNlcnRlZDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBocmVmID0gYXNzaWduKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlbDogXCJzdHlsZXNoZWV0XCIsXG4gICAgICAgICAgICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICAgICAgICAgICAgXCJkYXRhLXByZWNlZGVuY2VcIjogcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAob3B0aW9ucyA9IHByZWxvYWRQcm9wc01hcC5nZXQoa2V5KSkgJiZcbiAgICAgICAgICAgICAgICBhZG9wdFByZWxvYWRQcm9wc0ZvclN0eWxlc2hlZXQoaHJlZiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIHZhciBsaW5rID0gKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKSk7XG4gICAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUobGluayk7XG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGxpbmssIFwibGlua1wiLCBocmVmKTtcbiAgICAgICAgICAgICAgbGluay5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBsaW5rLm9ubG9hZCA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgbGluay5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUubG9hZGluZyB8PSBMb2FkZWQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUubG9hZGluZyB8PSBFcnJvcmVkO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgc3RhdGUubG9hZGluZyB8PSBJbnNlcnRlZDtcbiAgICAgICAgICAgICAgaW5zZXJ0U3R5bGVzaGVldChyZXNvdXJjZSwgcHJlY2VkZW5jZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHlsZXNoZWV0XCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHN0eWxlcy5zZXQoa2V5LCByZXNvdXJjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTTogZnVuY3Rpb24gKHNyYywgb3B0aW9ucykge1xuICAgICAgICBwcmV2aW91c0Rpc3BhdGNoZXIuTShzcmMsIG9wdGlvbnMpO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBzcmMpIHtcbiAgICAgICAgICB2YXIgc2NyaXB0cyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVNjcmlwdHMsXG4gICAgICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoc3JjKSxcbiAgICAgICAgICAgIHJlc291cmNlID0gc2NyaXB0cy5nZXQoa2V5KTtcbiAgICAgICAgICByZXNvdXJjZSB8fFxuICAgICAgICAgICAgKChyZXNvdXJjZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgKChzcmMgPSBhc3NpZ24oeyBzcmM6IHNyYywgYXN5bmM6ICEwLCB0eXBlOiBcIm1vZHVsZVwiIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgKG9wdGlvbnMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KGtleSkpICYmXG4gICAgICAgICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc3JjLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSxcbiAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShyZXNvdXJjZSksXG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKHJlc291cmNlLCBcImxpbmtcIiwgc3JjKSxcbiAgICAgICAgICAgICAgb3duZXJEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlc291cmNlKSksXG4gICAgICAgICAgICAocmVzb3VyY2UgPSB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic2NyaXB0XCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBudWxsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjcmlwdHMuc2V0KGtleSwgcmVzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGdsb2JhbERvY3VtZW50ID0gXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIGRvY3VtZW50ID8gbnVsbCA6IGRvY3VtZW50LFxuICAgICAgdGFnQ2FjaGVzID0gbnVsbCxcbiAgICAgIFNVU1BFTlNFWV9TVFlMRVNIRUVUX1RJTUVPVVQgPSA2ZTQsXG4gICAgICBTVVNQRU5TRVlfSU1BR0VfVElNRU9VVCA9IDgwMCxcbiAgICAgIFNVU1BFTlNFWV9JTUFHRV9USU1FX0VTVElNQVRFID0gNTAwLFxuICAgICAgZXN0aW1hdGVkQnl0ZXNXaXRoaW5MaW1pdCA9IDAsXG4gICAgICBMQVNUX1BSRUNFREVOQ0UgPSBudWxsLFxuICAgICAgcHJlY2VkZW5jZXNCeVJvb3QgPSBudWxsLFxuICAgICAgTm90UGVuZGluZ1RyYW5zaXRpb24gPSBOb3RQZW5kaW5nLFxuICAgICAgSG9zdFRyYW5zaXRpb25Db250ZXh0ID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgICBQcm92aWRlcjogbnVsbCxcbiAgICAgICAgQ29uc3VtZXI6IG51bGwsXG4gICAgICAgIF9jdXJyZW50VmFsdWU6IE5vdFBlbmRpbmdUcmFuc2l0aW9uLFxuICAgICAgICBfY3VycmVudFZhbHVlMjogTm90UGVuZGluZ1RyYW5zaXRpb24sXG4gICAgICAgIF90aHJlYWRDb3VudDogMFxuICAgICAgfSxcbiAgICAgIGJhZGdlRm9ybWF0ID0gXCIlYyVzJWNcIixcbiAgICAgIGJhZGdlU3R5bGUgPVxuICAgICAgICBcImJhY2tncm91bmQ6ICNlNmU2ZTY7YmFja2dyb3VuZDogbGlnaHQtZGFyayhyZ2JhKDAsMCwwLDAuMSksIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSkpO2NvbG9yOiAjMDAwMDAwO2NvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpO2JvcmRlci1yYWRpdXM6IDJweFwiLFxuICAgICAgcmVzZXRTdHlsZSA9IFwiXCIsXG4gICAgICBwYWQgPSBcIiBcIixcbiAgICAgIGJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbiAgICB2YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9ICExO1xuICAgIHZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGwsXG4gICAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBudWxsLFxuICAgICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbCxcbiAgICAgIG92ZXJyaWRlUHJvcHMgPSBudWxsLFxuICAgICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBudWxsLFxuICAgICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsLFxuICAgICAgc2NoZWR1bGVVcGRhdGUgPSBudWxsLFxuICAgICAgc2NoZWR1bGVSZXRyeSA9IG51bGwsXG4gICAgICBzZXRFcnJvckhhbmRsZXIgPSBudWxsLFxuICAgICAgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcbiAgICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgICBpZCA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG4gICAgICBudWxsICE9PSBpZCAmJlxuICAgICAgICAoKHBhdGggPSBjb3B5V2l0aFNldEltcGwoaWQubWVtb2l6ZWRTdGF0ZSwgcGF0aCwgMCwgdmFsdWUpKSxcbiAgICAgICAgKGlkLm1lbW9pemVkU3RhdGUgPSBwYXRoKSxcbiAgICAgICAgKGlkLmJhc2VTdGF0ZSA9IHBhdGgpLFxuICAgICAgICAoZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcykpLFxuICAgICAgICAocGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMikpLFxuICAgICAgICBudWxsICE9PSBwYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXRoLCBmaWJlciwgMikpO1xuICAgIH07XG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCkge1xuICAgICAgaWQgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuICAgICAgbnVsbCAhPT0gaWQgJiZcbiAgICAgICAgKChwYXRoID0gY29weVdpdGhEZWxldGVJbXBsKGlkLm1lbW9pemVkU3RhdGUsIHBhdGgsIDApKSxcbiAgICAgICAgKGlkLm1lbW9pemVkU3RhdGUgPSBwYXRoKSxcbiAgICAgICAgKGlkLmJhc2VTdGF0ZSA9IHBhdGgpLFxuICAgICAgICAoZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcykpLFxuICAgICAgICAocGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMikpLFxuICAgICAgICBudWxsICE9PSBwYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXRoLCBmaWJlciwgMikpO1xuICAgIH07XG4gICAgb3ZlcnJpZGVIb29rU3Rh
15852dGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgICAgaWQgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuICAgICAgbnVsbCAhPT0gaWQgJiZcbiAgICAgICAgKChvbGRQYXRoID0gY29weVdpdGhSZW5hbWUoaWQubWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCkpLFxuICAgICAgICAoaWQubWVtb2l6ZWRTdGF0ZSA9IG9sZFBhdGgpLFxuICAgICAgICAoaWQuYmFzZVN0YXRlID0gb2xkUGF0aCksXG4gICAgICAgIChmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKSksXG4gICAgICAgIChvbGRQYXRoID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCAyKSksXG4gICAgICAgIG51bGwgIT09IG9sZFBhdGggJiYgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKG9sZFBhdGgsIGZpYmVyLCAyKSk7XG4gICAgfTtcbiAgICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXRJbXBsKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIDAsIHZhbHVlKTtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZSAmJiAoZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcyk7XG4gICAgICBwYXRoID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCAyKTtcbiAgICAgIG51bGwgIT09IHBhdGggJiYgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHBhdGgsIGZpYmVyLCAyKTtcbiAgICB9O1xuICAgIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZUltcGwoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgMCk7XG4gICAgICBmaWJlci5hbHRlcm5hdGUgJiYgKGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHMpO1xuICAgICAgcGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMik7XG4gICAgICBudWxsICE9PSBwYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXRoLCBmaWJlciwgMik7XG4gICAgfTtcbiAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoXG4gICAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMsXG4gICAgICAgIG9sZFBhdGgsXG4gICAgICAgIG5ld1BhdGhcbiAgICAgICk7XG4gICAgICBmaWJlci5hbHRlcm5hdGUgJiYgKGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHMpO1xuICAgICAgb2xkUGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMik7XG4gICAgICBudWxsICE9PSBvbGRQYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihvbGRQYXRoLCBmaWJlciwgMik7XG4gICAgfTtcbiAgICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpO1xuICAgICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIDIpO1xuICAgIH07XG4gICAgc2NoZWR1bGVSZXRyeSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgdmFyIGxhbmUgPSBjbGFpbU5leHRSZXRyeUxhbmUoKSxcbiAgICAgICAgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG4gICAgICBudWxsICE9PSByb290ICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfTtcbiAgICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgICBzaG91bGRFcnJvckltcGwgPSBuZXdTaG91bGRFcnJvckltcGw7XG4gICAgfTtcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gICAgfTtcbiAgICB2YXIgX2VuYWJsZWQgPSAhMCxcbiAgICAgIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbCxcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSAhMSxcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbCxcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsLFxuICAgICAgcXVldWVkTW91c2UgPSBudWxsLFxuICAgICAgcXVldWVkUG9pbnRlcnMgPSBuZXcgTWFwKCksXG4gICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCksXG4gICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXSxcbiAgICAgIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9XG4gICAgICAgIFwibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0XCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgIGxhc3RTY2hlZHVsZWRSZXBsYXlRdWV1ZSA9IG51bGw7XG4gICAgUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9XG4gICAgICBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG4gICAgICAgIGlmIChudWxsID09PSByb290KSB0aHJvdyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuXCIpO1xuICAgICAgICB2Y
15852XIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYXJnc1sxXVxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBpc1ZhbGlkQ29udGFpbmVyKGFyZ3NbMV0pXG4gICAgICAgICAgICA/IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGFyZ3NbMV0gJiZcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIllvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICBhcmdzID0gY2hpbGRyZW47XG4gICAgICAgIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50LFxuICAgICAgICAgIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgICAgICAgdXBkYXRlQ29udGFpbmVySW1wbChjdXJyZW50LCBsYW5lLCBhcmdzLCByb290LCBudWxsLCBudWxsKTtcbiAgICAgIH07XG4gICAgUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID1cbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFyZ3NbMF0gJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgYXJncyA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgICAgICAgaWYgKG51bGwgIT09IGFyZ3MpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBhcmdzLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0ICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkF0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5IHJlbmRlcmluZy4gUmVhY3QgY2Fubm90IGZpbmlzaCB1bm1vdW50aW5nIHRoZSByb290IHVudGlsIHRoZSBjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lckltcGwoYXJncy5jdXJyZW50LCAyLCBudWxsLCBhcmdzLCBudWxsLCBudWxsKTtcbiAgICAgICAgICBmbHVzaFN5bmNXb3JrJDEoKTtcbiAgICAgICAgICBjb250YWluZXJbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIFJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBmdW5jdGlvbiAoXG4gICAgICB0YXJnZXRcbiAgICApIHtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gcmVzb2x2ZVVwZGF0ZVByaW9yaXR5KCk7XG4gICAgICAgIHRhcmdldCA9IHsgYmxvY2tlZE9uOiBudWxsLCB0YXJnZXQ6IHRhcmdldCwgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5IH07XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgIGkgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoICYmXG4gICAgICAgICAgMCAhPT0gdXBkYXRlUHJpb3JpdHkgJiZcbiAgICAgICAgICB1cGRhdGVQcmlvcml0eSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tpXS5wcmlvcml0eTtcbiAgICAgICAgICBpKytcbiAgICAgICAgKTtcbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCB0YXJnZXQpO1xuICAgICAgICAwID09PSBpICYmIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpc29tb3JwaGljUmVhY3RQYWNrYWdlVmVyc2lvbiA9I
15852FJlYWN0LnZlcnNpb247XG4gICAgICBpZiAoXCIxOS4zLjBcIiAhPT0gaXNvbW9ycGhpY1JlYWN0UGFja2FnZVZlcnNpb24pXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdJbmNvbXBhdGlibGUgUmVhY3QgdmVyc2lvbnM6IFRoZSBcInJlYWN0XCIgYW5kIFwicmVhY3QtZG9tXCIgcGFja2FnZXMgbXVzdCBoYXZlIHRoZSBleGFjdCBzYW1lIHZlcnNpb24uIEluc3RlYWQgZ290OlxcbiAgLSByZWFjdDogICAgICAnICtcbiAgICAgICAgICAgIChpc29tb3JwaGljUmVhY3RQYWNrYWdlVmVyc2lvbiArXG4gICAgICAgICAgICAgIFwiXFxuICAtIHJlYWN0LWRvbTogIDE5LjMuMFxcbkxlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3QuZGV2L3dhcm5pbmdzL3ZlcnNpb24tbWlzbWF0Y2hcIilcbiAgICAgICAgKTtcbiAgICB9KSgpO1xuICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBNYXAgJiZcbiAgICAgIG51bGwgIT0gTWFwLnByb3RvdHlwZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBTZXQgJiZcbiAgICAgIG51bGwgIT0gU2V0LnByb3RvdHlwZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoKSB8fFxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0LmRldi9saW5rL3JlYWN0LXBvbHlmaWxsc1wiXG4gICAgICApO1xuICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLmZpbmRET01Ob2RlID0gZnVuY3Rpb24gKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICAgICAgdmFyIGZpYmVyID0gY29tcG9uZW50T3JFbGVtZW50Ll9yZWFjdEludGVybmFscztcbiAgICAgIGlmICh2b2lkIDAgPT09IGZpYmVyKSB7XG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb21wb25lbnRPckVsZW1lbnQucmVuZGVyKVxuICAgICAgICAgIHRocm93IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlwiKTtcbiAgICAgICAgY29tcG9uZW50T3JFbGVtZW50ID0gT2JqZWN0LmtleXMoY29tcG9uZW50T3JFbGVtZW50KS5qb2luKFwiLFwiKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArXG4gICAgICAgICAgICBjb21wb25lbnRPckVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudE9yRWxlbWVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKTtcbiAgICAgIGNvbXBvbmVudE9yRWxlbWVudCA9XG4gICAgICAgIG51bGwgIT09IGNvbXBvbmVudE9yRWxlbWVudFxuICAgICAgICAgID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNvbXBvbmVudE9yRWxlbWVudClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBjb21wb25lbnRPckVsZW1lbnQgPVxuICAgICAgICBudWxsID09PSBjb21wb25lbnRPckVsZW1lbnQgPyBudWxsIDogY29tcG9uZW50T3JFbGVtZW50LnN0YXRlTm9kZTtcbiAgICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gICAgfTtcbiAgICBpZiAoXG4gICAgICAhKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGludGVybmFscyA9IHtcbiAgICAgICAgICBidW5kbGVUeXBlOiAxLFxuICAgICAgICAgIHZlcnNpb246IFwiMTkuMy4wXCIsXG4gICAgICAgICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogXCJyZWFjdC1kb21cIixcbiAgICAgICAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RTaGFyZWRJbnRlcm5hbHMsXG4gICAgICAgICAgcmVjb25jaWxlclZlcnNpb246IFwiMTkuMy4wXCJcbiAgICAgICAgfTtcbiAgICAgICAgaW50ZXJuYWxzLm92ZXJyaWRlSG9va1N0YXRlID0gb3ZlcnJpZGVIb29rU3RhdGU7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZVByb3BzID0gb3ZlcnJpZGVQcm9wcztcbiAgICAgICAgaW50ZXJuYWxzLm92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoO1xuICAgICAgICBpbnRlcm5hbHMuc2NoZWR1bGVVcGRhdGUgPSBzY2hlZHVsZVVwZGF0ZTtcbiAgICAgICAgaW50ZXJuYWxzLnNjaGVkdWxlUmV0cnkgPSBzY2hlZHVsZVJldHJ5O1xuICAgICAgICBpbnRlcm5hbHMuc2V0RXJyb3JIYW5kbGVyID0gc2V0RXJyb3JIYW5kbGVyO1xuICAgICAgICBpbnRlcm5hbHMuc2V0U3VzcGVuc2VIYW5kbGVyID0gc2V0U3VzcGVuc2VIYW5kbGVyO1xuICAgICAgICBpbnRlcm5hbHMuc2NoZWR1bGVSZWZyZXNoID0gc2NoZWR1bGVSZWZyZXNoO1xuICAgICAgICBpbnRlcm5hbHMuc2NoZWR1bGVSb290ID0gc2NoZWR1bGVSb290O1xuICAgICAgICBpbnRlcm5hbHMuc2V0UmVmcmVzaEhhbmRsZXIgPSBzZXRSZWZyZXNoSGFuZGxlcjtcbiAgICAgICAgaW50ZXJuYWxzLmdldEN1cnJlbnRGaWJlciA9IGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzO1xuICAgICAgICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscyk7XG4gICAgICB9KSgpICYmXG4gICAgICBjYW5Vc2VET00gJiZcbiAgICAgIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmICYmXG4gICAgICAoKC0xIDwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiQ2hyb21lXCIpICYmXG4gICAgICAgIC0xID09PSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJFZGdlXCIpKSB8fFxuICAgICAgICAtMSA8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIikpXG4gICAgKSB7XG4gICAgICB2Y
15852XIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7XG4gICAgICAvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkgJiZcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIFwiJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvcmVhY3QtZGV2dG9vbHNcIiArXG4gICAgICAgICAgICAoXCJmaWxlOlwiID09PSBwcm90b2NvbFxuICAgICAgICAgICAgICA/IFwiXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxXCJcbiAgICAgICAgICAgICAgOiBcIlwiKSxcbiAgICAgICAgICBcImZvbnQtd2VpZ2h0OmJvbGRcIlxuICAgICAgICApO1xuICAgIH1cbiAgICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiKTtcbiAgICAgIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcbiAgICAgIHZhciBpc1N0cmljdE1vZGUgPSAhMSxcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCA9IFwiXCIsXG4gICAgICAgIG9uVW5jYXVnaHRFcnJvciA9IGRlZmF1bHRPblVuY2F1Z2h0RXJyb3IsXG4gICAgICAgIG9uQ2F1Z2h0RXJyb3IgPSBkZWZhdWx0T25DYXVnaHRFcnJvcixcbiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICAgIG51bGwgIT09IG9wdGlvbnMgJiZcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zICYmXG4gICAgICAgIChvcHRpb25zLmh5ZHJhdGVcbiAgICAgICAgICA/IGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgXCJoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBcIm9iamVjdFwiID09PSB0eXBlb2Ygb3B0aW9ucyAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gb3B0aW9ucyAmJlxuICAgICAgICAgICAgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIllvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiBFeGFtcGxlIHVzYWdlOlxcblxcbiAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuICByb290LnJlbmRlcig8QXBwIC8+KTtcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgITAgPT09IG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSAmJiAoaXNTdHJpY3RNb2RlID0gITApLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAmJlxuICAgICAgICAgIChpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4KSxcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciAmJlxuICAgICAgICAgIChvblVuY2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciksXG4gICAgICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vbkNhdWdodEVycm9yICYmXG4gICAgICAgICAgKG9uQ2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IpLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICYmXG4gICAgICAgICAgKG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yKSk7XG4gICAgICBvcHRpb25zID0gY3JlYXRlRmliZXJSb290KFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIDEsXG4gICAgICAgICExLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgICBpc1N0cmljdE1vZGUsXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXgsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICAgICAgb25DYXVnaHRFcnJvcixcbiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yLFxuICAgICAgICBkZWZhdWx0T25EZWZhdWx0VHJhbnNpdGlvbkluZGljYXRvclxuICAgICAgKTtcbiAgICAgIGNvbnRhaW5lcltpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IG9wdGlvbnMuY3VycmVudDtcbiAgICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG4gICAgICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChvcHRpb25zKTtcbiAgICB9O1xuICAgIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgICAgIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKVxuICAgICAgICB0aHJvdyBFcnJvcihcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIpO1xuICAgICAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICAgICAgdm9pZCAwID09PSBpbml0aWFsQ2hpbGRyZW4gJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIk11c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KVwiXG4gICAgICAgICk7XG4gICAgICB2Y
15852XIgaXNTdHJpY3RNb2RlID0gITEsXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBcIlwiLFxuICAgICAgICBvblVuY2F1Z2h0RXJyb3IgPSBkZWZhdWx0T25VbmNhdWdodEVycm9yLFxuICAgICAgICBvbkNhdWdodEVycm9yID0gZGVmYXVsdE9uQ2F1Z2h0RXJyb3IsXG4gICAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICAgIGZvcm1TdGF0ZSA9IG51bGw7XG4gICAgICBudWxsICE9PSBvcHRpb25zICYmXG4gICAgICAgIHZvaWQgMCAhPT0gb3B0aW9ucyAmJlxuICAgICAgICAoITAgPT09IG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSAmJiAoaXNTdHJpY3RNb2RlID0gITApLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAmJlxuICAgICAgICAgIChpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4KSxcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciAmJlxuICAgICAgICAgIChvblVuY2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciksXG4gICAgICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vbkNhdWdodEVycm9yICYmXG4gICAgICAgICAgKG9uQ2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IpLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICYmXG4gICAgICAgICAgKG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yKSxcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zLmZvcm1TdGF0ZSAmJiAoZm9ybVN0YXRlID0gb3B0aW9ucy5mb3JtU3RhdGUpKTtcbiAgICAgIGluaXRpYWxDaGlsZHJlbiA9IGNyZWF0ZUZpYmVyUm9vdChcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAxLFxuICAgICAgICAhMCxcbiAgICAgICAgaW5pdGlhbENoaWxkcmVuLFxuICAgICAgICBudWxsICE9IG9wdGlvbnMgPyBvcHRpb25zIDogbnVsbCxcbiAgICAgICAgaXNTdHJpY3RNb2RlLFxuICAgICAgICBpZGVudGlmaWVyUHJlZml4LFxuICAgICAgICBmb3JtU3RhdGUsXG4gICAgICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICAgICAgb25DYXVnaHRFcnJvcixcbiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yLFxuICAgICAgICBkZWZhdWx0T25EZWZhdWx0VHJhbnNpdGlvbkluZGljYXRvclxuICAgICAgKTtcbiAgICAgIGluaXRpYWxDaGlsZHJlbi5jb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUobnVsbCk7XG4gICAgICBvcHRpb25zID0gaW5pdGlhbENoaWxkcmVuLmN1cnJlbnQ7XG4gICAgICBpc1N0cmljdE1vZGUgPSByZXF1ZXN0VXBkYXRlTGFuZShvcHRpb25zKTtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUoaXNTdHJpY3RNb2RlKTtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBjcmVhdGVVcGRhdGUoaXNTdHJpY3RNb2RlKTtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXguY2FsbGJhY2sgPSBudWxsO1xuICAgICAgZW5xdWV1ZVVwZGF0ZShvcHRpb25zLCBpZGVudGlmaWVyUHJlZml4LCBpc1N0cmljdE1vZGUpO1xuICAgICAgc3RhcnRVcGRhdGVUaW1lckJ5TGFuZShpc1N0cmljdE1vZGUsIFwiaHlkcmF0ZVJvb3QoKVwiLCBudWxsKTtcbiAgICAgIG9wdGlvbnMgPSBpc1N0cmljdE1vZGU7XG4gICAgICBpbml0aWFsQ2hpbGRyZW4uY3VycmVudC5sYW5lcyA9IG9wdGlvbnM7XG4gICAgICBtYXJrUm9vdFVwZGF0ZWQkMShpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKGluaXRpYWxDaGlsZHJlbik7XG4gICAgICBjb250YWluZXJbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBpbml0aWFsQ2hpbGRyZW4uY3VycmVudDtcbiAgICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG4gICAgICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbml0aWFsQ2hpbGRyZW4pO1xuICAgIH07XG4gICAgZXhwb3J0cy52ZXJzaW9uID0gXCIxOS4zLjBcIjtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20tY2xpZW50LmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0NBV0EsQ0FDRyxXQUFZO0VBQ1gsU0FBUywyQkFBMkI7R0FDbEMsYUFBYSxDQUFDO0dBQ2QsSUFBSSxzQkFBc0I7SUFDeEIsSUFBSSxjQUFjLFFBQVEsYUFBYTtJQUN2QyxZQUFZO0lBQ1osSUFBSSxjQUFjLENBQUM7SUFDbkIsSUFBSTtLQUNGLEdBQUc7TUFDRCwwQkFBMEIsQ0FBQztNQUMzQiwyQkFDSSx5QkFBeUIsQ0FBQyxHQUM1QixrQkFBa0IsYUFBYSxHQUM5QixnQkFBZ0I7TUFDbkIsbUJBQW1CLENBQUM7T
15852UFDcEIsSUFBSSx3QkFBd0I7TUFDNUIsSUFBSTtPQUNGLEdBQUc7UUFDRCxjQUFjLFdBQVc7UUFDekIsS0FDRSxjQUFjLEtBQUssU0FBUyxHQUM1QixTQUFTLGVBQ1QsRUFDRSxZQUFZLGlCQUFpQixlQUM3QixrQkFBa0IsS0FHcEI7U0FDQSxJQUFJLFdBQVcsWUFBWTtTQUMzQixJQUFJLGVBQWUsT0FBTyxVQUFVO1VBQ2xDLFlBQVksV0FBVztVQUN2Qix1QkFBdUIsWUFBWTtVQUNuQyxJQUFJLHVCQUF1QixTQUN6QixZQUFZLGtCQUFrQixXQUNoQztVQUNBLGNBQWMsUUFBUSxhQUFhO1VBQ25DLElBQUksZUFBZSxPQUFPLHNCQUFzQjtXQUM5QyxZQUFZLFdBQVc7V0FDdkIsY0FBYyxXQUFXO1dBQ3pCLGNBQWMsQ0FBQztXQUNmLE1BQU07VUFDUjtVQUNBLGdCQUFnQixLQUFLLFNBQVMsS0FBSyxJQUFJLFNBQVM7VUFDaEQsY0FBYyxXQUFXO1NBQzNCLE9BQU8sSUFBSSxTQUFTO1NBQ3BCLGNBQWMsS0FBSyxTQUFTO1FBQzlCO1FBQ0EsSUFBSSxTQUFTLGFBQWEsY0FBYyxDQUFDO2FBQ3BDO1NBQ0gsSUFBSSxhQUFhLEtBQUssVUFBVTtTQUNoQyxTQUFTLGNBQ1AsbUJBQ0UsZUFDQSxXQUFXLFlBQVksV0FDekI7U0FDRixjQUFjLENBQUM7UUFDakI7T0FDRjtPQUNBLE1BQU07TUFDUixVQUFVO09BQ1IsY0FBZSxNQUNaLHVCQUF1Qix1QkFDdkIsbUJBQW1CLENBQUM7TUFDekI7TUFDQSxjQUFjLEtBQUs7S0FDckI7SUFDRixVQUFVO0tBQ1IsY0FDSSxpQ0FBaUMsSUFDaEMsdUJBQXVCLENBQUM7SUFDL0I7R0FDRjtFQUNGO0VBQ0EsU0FBUyxLQUFLLE1BQU0sTUFBTTtHQUN4QixJQUFJLFFBQVEsS0FBSztHQUNqQixLQUFLLEtBQUssSUFBSTtHQUNkLEdBQUcsT0FBTyxJQUFJLFFBQVM7SUFDckIsSUFBSSxjQUFlLFFBQVEsTUFBTyxHQUNoQyxTQUFTLEtBQUs7SUFDaEIsSUFBSSxJQUFJLFFB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FBa0IsUUFBUSxrQkFDN0IsS0FBSyxNQUFNLFFBQVEsa0JBQ2hCLGdCQUFnQixRQUFRLGdCQUMzQixLQUFLLE1BQU0sUUFBUSx1QkFDaEIscUJBQXFCLFF
15852BQVE7R0FDbEMsVUFBVSxnQkFDUixXQUNBLEdBQ0EsQ0FBQyxHQUNELE1BQ0EsTUFDQSxjQUNBLGtCQUNBLE1BQ0EsaUJBQ0EsZUFDQSxvQkFDQSxtQ0FDRjtHQUNBLFVBQVUsZ0NBQWdDLFFBQVE7R0FDbEQsMkJBQTJCLFNBQVM7R0FDcEMsT0FBTyxJQUFJLGFBQWEsT0FBTztFQUNqQztFQUNBLFFBQVEsY0FBYyxTQUFVLFdBQVcsaUJBQWlCLFNBQVM7R0FDbkUsSUFBSSxDQUFDLGlCQUFpQixTQUFTLEdBQzdCLE1BQU0sTUFBTSx3Q0FBd0M7R0FDdEQsNkJBQTZCLFNBQVM7R0FDdEMsS0FBSyxNQUFNLG1CQUNULFFBQVEsTUFDTixvSEFDRjtHQUNGLElBQUksZUFBZSxDQUFDLEdBQ2xCLG1CQUFtQixJQUNuQixrQkFBa0Isd0JBQ2xCLGdCQUFnQixzQkFDaEIscUJBQXFCLDJCQUNyQixZQUFZO0dBQ2QsU0FBUyxXQUNQLEtBQUssTUFBTSxZQUNWLENBQUMsTUFBTSxRQUFRLHdCQUF3QixlQUFlLENBQUMsSUFDeEQsS0FBSyxNQUFNLFFBQVEscUJBQ2hCLG1CQUFtQixRQUFRLG1CQUM5QixLQUFLLE1BQU0sUUFBUSxvQkFDaEIsa0JBQWtCLFFBQVEsa0JBQzdCLEtBQUssTUFBTSxRQUFRLGtCQUNoQixnQkFBZ0IsUUFBUSxnQkFDM0IsS0FBSyxNQUFNLFFBQVEsdUJBQ2hCLHFCQUFxQixRQUFRLHFCQUNoQyxLQUFLLE1BQU0sUUFBUSxjQUFjLFlBQVksUUFBUTtHQUN2RCxrQkFBa0IsZ0JBQ2hCLFdBQ0EsR0FDQSxDQUFDLEdBQ0QsaUJBQ0EsUUFBUSxVQUFVLFVBQVUsTUFDNUIsY0FDQSxrQkFDQSxXQUNBLGlCQUNBLGVBQ0Esb0JBQ0EsbUNBQ0Y7R0FDQSxnQkFBZ0IsVUFBVSxxQkFBcUIsSUFBSTtHQUNuRCxVQUFVLGdCQUFnQjtHQUMxQixlQUFlLGtCQUFrQixPQUFPO0dBQ3hDLGVBQWUsZ0NBQWdDLFlBQVk7R0FDM0QsbUJBQW1CLGFBQWEsWUFBWTtHQUM1QyxpQkFBaUIsV0FBVztHQUM1QixjQUFjLFNBQVMsa0JBQWtCLFlBQVk7R0FDckQsdUJBQXVCLGNBQWMsaUJBQWlCLElBQUk7R0FDMUQsVUFBVTtHQUNWLGdCQUFnQixRQUFRLFFBQVE7R0FDaEMsa0JBQWtCLGlCQUFpQixPQUFPO0dBQzFDLHNCQUFzQixlQUFlO0dBQ3JDLFVBQVUsZ0NBQWdDLGdCQUFnQjtHQUMxRCwyQkFBMkIsU0FBUztHQUNwQyxPQUFPLElBQUksc0JBQXNCLGVBQWU7RUFDbEQ7RUFDQSxRQUFRLFVBQVU7RUFDbEIsZ0JBQWdCLE9BQU8sa0NBQ3JCLGVBQ0UsT0FBTywrQkFBK0IsOEJBQ3hDLCtCQUErQiwyQkFBMkIsTUFBTSxDQUFDO0NBQ3JFLEVBQUEsQ0FBRzs7Ozs7Q0M1LzhCSCxPQUFPLFVBQUEscUNBQUEiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsM119
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.