bloom-player 2.19.3 → 2.19.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"shared.es.js","sources":["../src/shared/event.ts","../src/shared/narration.ts","../src/shared/dragActivityRuntime.ts","../node_modules/jquery/dist/jquery.js","../node_modules/jquery.nicescroll/jquery.nicescroll.js","../src/shared/scrolling.ts","../src/utilities/domHelper.ts","../src/shared/animation.ts"],"sourcesContent":["// originally from http://stackoverflow.com/a/14657922/723299.\n// a Bloom Player source file shared with Bloom Desktop\n\ninterface ILiteEvent<T> {\n subscribe(handler: (data?: T) => void): void;\n unsubscribe(handler: (data?: T) => void): void;\n}\n\nexport default class LiteEvent<T> implements ILiteEvent<T> {\n private handlers: Array<(data?: T) => void> = [];\n\n public subscribe(handler: (data?: T) => void) {\n if (this.handlers.indexOf(handler) === -1) {\n this.handlers.push(handler);\n }\n }\n\n public unsubscribe(handler: (data?: T) => void) {\n this.handlers = this.handlers.filter((h) => h !== handler);\n }\n\n public raise(data?: T) {\n this.handlers.slice(0).forEach((h) => h(data));\n }\n}\n","// This file contains code for playing audio in a bloom page, including a draggable page.\n// The file is designed to be shared between Bloom Desktop and Bloom Player, with the original\n// being in the Bloom Player and provided in its package. See comments in dragActivityRuntime.ts.\n\n// It is quite difficult to know how to handle audio in a drag activity page.\n// We need to be able to play it both during \"Play\" and when showing the page in BP.\n// The code in this file so far represents a reuniting of the original Bloom Player\n// narration code with the code developed for narration in drag activities.\n// There is existing code for playing audio in Bloom Desktop, but it is entangled with the\n// code that manages audio recording and the talking book tool. I hope eventually\n// this code, or parts of it, can be used there as well as in 'Play' mode.\n// The code here has hooks and some methods which are only useful to BP, for things such as\n// autoplay and page advance, and also cases where the text being played is\n// not fully visible. It deals with pause and continue, which also interact with\n// the Bloom Player controls and with video and background music.\n// Drag activities added the need to handle situations where the audio on the page\n// should not all be played in succession, and more complicated sequencing of audio\n// and video\n\nimport LiteEvent from \"./event\";\n// Note: trying to avoid other imports, as part of the process of moving this code to a module\n// that can be shared with BloomDesktop.\n\n//----This first block is the old narrationUtils.ts. Everything here is now meant to be reusable\n// code connected with narration, not specific to Bloom Player.\nexport interface ISetHighlightParams {\n newElement: Element;\n shouldScrollToElement: boolean;\n disableHighlightIfNoAudio?: boolean;\n oldElement?: Element | null | undefined; // Optional. Provides some minor optimization if set.\n}\n\nexport enum PlaybackMode {\n NewPage, // starting a new page ready to play\n NewPageMediaPaused, // starting a new page in the \"paused\" state\n VideoPlaying, // video is playing\n VideoPaused, // video is paused\n AudioPlaying, // narration and/or animation are playing (or possibly finished)\n AudioPaused, // narration and/or animation are paused\n MediaFinished, // video, narration, and/or animation has played (possibly no media to play)\n // Note that music can be playing when the state is either AudioPlaying or MediaFinished.\n}\n\nexport let currentPlaybackMode: PlaybackMode = PlaybackMode.NewPage;\nexport function setCurrentPlaybackMode(mode: PlaybackMode) {\n currentPlaybackMode = mode;\n}\n\n// These functions support allowing a client (typically BloomPlayerCore) to register as\n// the object that wants to receive notification of how long audio was played.\n// Duration is in seconds.\nexport let durationReporter: (duration: number) => void;\nexport function listenForPlayDuration(reporter: (duration: number) => void) {\n durationReporter = reporter;\n}\n\n// A client may configure a function which can be called to find out whether a swipe\n// is in progress...in BloomPlayerCore, this is implemented by a test on SWiper.\n// It is currently only used when we need to scroll the content of a field we are\n// playing. Bloom Desktop does not need to set it.\nexport let isSwipeInProgress: () => boolean;\nexport function setTestIsSwipeInProgress(tester: () => boolean) {\n isSwipeInProgress = tester;\n}\n\n// A client may configure a function which is passed the URL of each audio file narration plays.\nexport let logNarration: (src: string) => void = () => {\n // do nothing by default\n};\nexport function setLogNarration(logger: (src: string) => void) {\n logNarration =\n logger ??\n (() => {\n // do nothing by default (so we don't have to check for null)\n });\n}\n\nlet playerUrlPrefix = \"\";\n// In bloom player, figuring the url prefix (to put before file JS needs to locate, like\n// sounds to play) is complicated. We pass it in.\n// In Bloom desktop, it's almost more tricky. If we're executing in the page iframe, we can\n// easily derive it from the page's URL. But if we're executing in the toolbox, that doesn't work.\n// So we arrange for newPageReady, called at least as often as changing book, to set it up\n// using setPlayerUrlPrefixFromWindowLocationHref\nexport function setPlayerUrlPrefix(prefix: string) {\n playerUrlPrefix = prefix;\n}\n\nexport function setPlayerUrlPrefixFromWindowLocationHref(bookSrc: string) {\n setPlayerUrlPrefix(getUrlPrefixFromWindowHref(bookSrc));\n}\n\nexport function getUrlPrefixFromWindowHref(bookSrc: string) {\n const index = bookSrc.lastIndexOf(\"/\");\n return bookSrc.substring(0, index);\n}\n\nexport function urlPrefix(): string {\n if (playerUrlPrefix) {\n return playerUrlPrefix;\n }\n return getUrlPrefixFromWindowHref(window.location.href);\n}\n\n// We need to sort these by the tabindex of the containing bloom-translationGroup element.\n// We need a stable sort, which array.sort() does not provide: elements in the same\n// bloom-translationGroup, or where the translationGroup does not have a tabindex,\n// should remain in their current order.\n// It's not obvious what should happen to TGs with no tabindex when others have it.\n// At this point we're going with the approach that no tabindex is equivalent to tabindex 999.\n// This should cause text with no tabindex to sort to the bottom, if other text has a tabindex;\n// It should also not affect order in situations where no text has a tabindex\n// (An earlier algorithm attempted to preserve document order for the no-tab-index case\n// by comparing any two elements using document order if either lacks tabindex.\n// This works well for many cases, but if there's a no-tabindex element between two\n// that get re-ordered (e.g., ABCDEF where the only tabindexes are C=2 and E=1),\n// the function is not transitive (e.g. C < D < E but E < C) which will produce\n// unpredictable results.\nexport function sortAudioElements(input: HTMLElement[]): HTMLElement[] {\n const keyedItems = input.map((item, index) => {\n return { tabindex: getTgTabIndex(item), index, item };\n });\n keyedItems.sort((x, y) => {\n // If either is not in a translation group with a tabindex,\n // order is determined by their original index.\n // Likewise if the tabindexes are the same.\n if (!x.tabindex || !y.tabindex || x.tabindex === y.tabindex) {\n return x.index - y.index;\n }\n // Otherwise, determined by the numerical order of tab indexes.\n return parseInt(x.tabindex, 10) - parseInt(y.tabindex, 10);\n });\n return keyedItems.map((x) => x.item);\n}\n\nfunction getTgTabIndex(input: HTMLElement): string | null {\n let tg: HTMLElement | null = input;\n while (tg && !tg.classList.contains(\"bloom-translationGroup\")) {\n tg = tg.parentElement;\n }\n if (!tg) {\n return \"999\";\n }\n return tg.getAttribute(\"tabindex\") || \"999\";\n}\n///---- end of the bit that ended up in narrationUtils.ts before the merge.\n\nexport const kHighlightSegmentClass = \"bloom-highlightSegment\";\n\n// Indicates that the element should be highlighted.\nconst kEnableHighlightClass = \"ui-enableHighlight\";\n\n// Indicates that the element should NOT be highlighted.\n// For example, some elements have highlighting prevented at this level\n// because its content has been broken into child elements, only some of which show the highlight\nconst kDisableHighlightClass = \"ui-disableHighlight\";\n// Indicates that highlighting is briefly/temporarily suppressed,\n// but may become highlighted later.\n// For example, audio highlighting is suppressed until the related audio starts playing (to avoid flashes)\nconst kSuppressHighlightClass = \"ui-suppressHighlight\";\n\nlet durationOfPagesWithoutNarration = 3.0; // seconds\nexport function setDurationOfPagesWithoutNarration(d: number) {\n durationOfPagesWithoutNarration = d;\n}\n\n// Even though these can now encompass more than strict sentences,\n// we continue to use this class name for backwards compatability reasons.\nexport const kAudioSentence = \"audio-sentence\";\n\nconst kImageDescriptionClass = \"bloom-imageDescription\";\n\n// The page that is currently being played (or edited, when we use this code in Bloom Desktop).\nlet currentPlayPage: HTMLElement | null = null;\n// When we have recently changed pages, stores a value returned from setTimeout, which can be used to cancel the old timeout\n// if we change pages again. After three seconds, the timerout sets it to zero. A non-zero value also prevents the code that\n// tries to scroll the currently-playing text into view from doing so in the early stages of viewing a page, when it\n// can cause problems for swiper.\nlet recentPageChange: any = 0; // any because typescript thinks we're in Nodejs and setTimeout will return an object.\n// Unused in Bloom desktop, but in Bloom player, current page might change while a series of sounds\n// is playing. This lets us avoid starting the next sound if the page has changed in the meantime.\nexport function setCurrentPage(page: HTMLElement) {\n if (page === currentPlayPage) return;\n if (recentPageChange) {\n clearTimeout(recentPageChange);\n }\n recentPageChange = setTimeout(() => {\n recentPageChange = 0;\n }, 3000);\n currentPlayPage = page;\n}\n// Get the page that the narration system thinks is current.\nexport function getCurrentNarrationPage(): HTMLElement {\n return currentPlayPage!;\n}\n\n// The time we started playing the current narration. If we pause and resume this is adjusted\n// by the length of the pause, so that \"now\" minus startPlay is always how much of the sound\n// has actually been played.\nlet startPlay: Date;\n\n// When the most recent pause happened.\nlet startPause: Date;\n\n// Timer used to raise PageNarrationComplete after a delay when there is no audio on the page.\n// Gets canceled if we pause and restarted if we resume.\nlet fakeNarrationTimer: number;\n\n// List of segments that are currently being played, or will be resumed (or restarted) when play resumes.\n// Typically the output of getPageAudioElements, but Bloom Games sometimes gives a different list.\n// Unlike elementsToPlayConsecutivelyStack, this list is not reversed, nor do we remove items from it as we play them.\nlet segmentsWeArePlaying: HTMLElement[];\n\nlet currentAudioId = \"\";\n\n// The first one to play should be at the end for both of these\nlet elementsToPlayConsecutivelyStack: HTMLElement[] = [];\nlet subElementsWithTimings: Array<[Element, number]> = [];\n\n// On a typical page with narration, these are raised at the same time, when the last narration\n// on the page finishes. But if there is no narration at all, PlayCompleted will be raised\n// immediately (useful for example to disable a pause button), but PageNarrationComplete will\n// be raised only after the standard delay for non-audio page (useful for auto-advancing to the next page).\nexport const PageNarrationComplete = new LiteEvent<HTMLElement>();\nexport const PlayCompleted = new LiteEvent<HTMLElement>();\n// Raised when we can't play narration, specifically because the browser won't allow it until\n// the user has interacted with the page.\nexport const PlayFailed = new LiteEvent<HTMLElement>();\n\n// This event allows Narration to inform its controllers when we start/stop reading\n// image descriptions. It is raised for each segment we read and passed true if the one\n// we are about to read is an image description, false otherwise.\n// Todo: wants a better name, it's not about toggling whether something is an image description,\n// but about possibly updating the UI to reflect whether we are reading one.\nexport const ToggleImageDescription = new LiteEvent<boolean>();\n\n// A Session Number that keeps track of each time playAllAudio started.\n// This might be needed to keep track of changing pages, or when we start new audio\n// that will replace something already playing.\nlet currentAudioSessionNum: number = 0;\n\nlet includeImageDescriptions: boolean = true;\nexport function setIncludeImageDescriptions(b: boolean) {\n includeImageDescriptions = b;\n}\n\n// This represents the start time of the current playing of the audio. If the user presses pause/play, it will be reset.\n// This is used for analytics reporting purposes\nlet audioPlayCurrentStartTime: number | null = null; // milliseconds (since 1970/01/01, from new Date().getTime())\n\n// Roughly equivalent to BloomDesktop's AudioRecording::listen() function.\n// As long as there is audio on the page, this method will play it.\nexport function playAllSentences(\n page: HTMLElement | null,\n canvasToExclude?: HTMLElement,\n): void {\n if (!page && !currentPlayPage) {\n return; // this shouldn't happen\n }\n const pageToPlay = page ?? currentPlayPage!;\n playAllAudio(getPageAudioElements(pageToPlay, canvasToExclude), pageToPlay);\n}\n\nexport function playAllAudio(elements: HTMLElement[], page: HTMLElement): void {\n setCurrentPage(page);\n segmentsWeArePlaying = elements;\n startPlay = new Date();\n const mediaPlayer = getPlayer();\n if (mediaPlayer) {\n // This felt like a good idea to do always. But we are about to set a new src on the media player and play that,\n // which will deal with any sound that is still playing.\n // And if we explicitly pause it now, that actually starts an async process of getting it paused, which\n // may not have completed by the time we attempt to play the new audio. And then play() fails.\n // OTOH, if there is nothing new to play, we should terminate anything that is playing\n // (perhaps from a previous page).\n if (elements.length == 0) {\n mediaPlayer.pause();\n }\n mediaPlayer.currentTime = 0;\n }\n\n // Invalidate old ID, even if there's no new audio to play.\n // (Deals with the case where you are on a page with audio, switch to a page without audio, then switch back to original page)\n ++currentAudioSessionNum;\n\n fixHighlighting(elements);\n\n // Sorted into the order we want to play them, then reversed so we\n // can more conveniently pop the next one to play from the end of the stack.\n elementsToPlayConsecutivelyStack = sortAudioElements(elements).reverse();\n\n const stackSize = elementsToPlayConsecutivelyStack.length;\n if (stackSize === 0) {\n // Nothing to play. First, raise the event that indicates nothing is playing.\n // It typically sets mode to MediaFinsished, and we want to override that.\n if (PlayCompleted) {\n PlayCompleted?.raise(page);\n }\n // Simulate playing for a fixed amount of time before raising PageNarrationComplete, in case we're autoadvancing.\n // We're not really playing, but we're pretending, so things work best if we go to that mode.\n // For example, if we leave it in MediaFinished from the previous page or from raising PlayCompleted, pause won't work.\n setCurrentPlaybackMode(PlaybackMode.AudioPlaying);\n if (PageNarrationComplete) {\n fakeNarrationTimer = window.setTimeout(() => {\n setCurrentPlaybackMode(PlaybackMode.MediaFinished);\n PageNarrationComplete?.raise(page);\n }, durationOfPagesWithoutNarration * 1000);\n }\n return;\n }\n\n const firstElementToPlay = elementsToPlayConsecutivelyStack[stackSize - 1]; // Remember to pop it when you're done playing it. (i.e., in playEnded)\n // At one point it seemed to help something to delete the media player and make a new one each time.\n // I didn't comment this at the time, but my recollection is that this could help with some cases\n // where the old one was in a bad state, such as in the middle of pausing.\n // Currently, though, we're being more careful not to pause except when there is nothing more to play currently,\n // (or when the user clicks the button),\n // since changing the src will stop any old play, but pausing right before setting a new src and calling play()\n // can cause the play() to fail. And somehow, deleting the media player here before we set up for a new play\n // was causing play to fail, reporting an abort because the media was removed from the document.\n // I don't fully understand why that was happening, but for now, things seem to be working best by just\n // continuing to use the same player as long as it can be found.\n // For sure, don't delete the player and make a new one between setting highlight and playing,\n // or the handler that removes the highlight suppression will be lost.\n //mediaPlayer.remove();\n\n setSoundAndHighlight(firstElementToPlay, true);\n // Review: do we need to do something to let the rest of the world know about this?\n setCurrentPlaybackMode(PlaybackMode.AudioPlaying);\n playCurrentInternal();\n return;\n}\n\n// Match space or &nbsp; (\\u00a0) or &ZeroWidthSpace; (\\u200b). Must have three or more in a row to match.\n// Geckofx would typically give something like `&nbsp;&nbsp;&nbsp; ` but wv2 usually gives something like `&nbsp; &nbsp; `\nconst multiSpaceRegex = /[ \\u00a0\\u200b]{3,}/;\nconst multiSpaceRegexGlobal = new RegExp(multiSpaceRegex, \"g\");\n/**\n * Finds and fixes any elements on the page that should have their audio-highlighting disabled.\n *\n * Note, all this logic is essentially duplicated from BloomDesktop where there are quite a few unit tests.\n */\nfunction fixHighlighting(audioElements: HTMLElement[]) {\n // Note: Only relevant when playing by sentence (but note, this can make Record by Text Box -> Split or Record by Sentence, Play by Sentence)\n // Play by Text Box highlights the whole paragraph and none of this really matters.\n // (the span selector won't match anyway)\n audioElements.forEach((audioElement) => {\n // FYI, don't need to process the bloom-linebreak spans. Nothing bad happens, just unnecessary.\n const matches = findAll(\n \"span[id]:not(.bloom-linebreak)\",\n audioElement,\n true,\n );\n matches.forEach((element) => {\n // Remove all existing highlight classes from element and element's descendants.\n // These shouldn't be in the dom as the editor is supposed to clean them up,\n // but we have seen at least on case where it didn't. BL-13428.\n removeHighlightClasses(element);\n\n // Simple check to help ensure that elements that don't need to be modified will remain untouched.\n // This doesn't consider whether text that shouldn't be highlighted is already in inside an\n // element with highlight disabled, but that's ok. The code down the stack checks that.\n const containsNonHighlightText =\n !!element.innerText.match(multiSpaceRegex);\n\n if (containsNonHighlightText) {\n fixHighlightingInNode(element, element);\n }\n });\n });\n}\n\n// Remove all existing highlight classes from element and element's descendants.\nfunction removeHighlightClasses(element: HTMLElement) {\n element.classList.remove(kDisableHighlightClass);\n element.classList.remove(kEnableHighlightClass);\n\n Array.from(element.children).forEach((child: HTMLElement) => {\n removeHighlightClasses(child);\n });\n}\n\n/**\n * Recursively fixes the audio-highlighting within a node (whether element node or text node)\n * @param node The node to recursively fix\n * @param startingSpan The starting span, AKA the one that will receive .ui-audioCurrent in the future.\n */\nfunction fixHighlightingInNode(node: Node, startingSpan: HTMLSpanElement) {\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n (node as Element).classList.contains(kDisableHighlightClass)\n ) {\n // No need to process bloom-highlightDisabled elements (they've already been processed)\n return;\n } else if (node.nodeType === Node.TEXT_NODE) {\n // Leaf node. Fix the highlighting, then go back up the stack.\n fixHighlightingInTextNode(node, startingSpan);\n return;\n } else {\n // Recursive case\n const childNodesCopy = Array.from(node.childNodes); // Make a copy because node.childNodes is being mutated\n childNodesCopy.forEach((childNode) => {\n fixHighlightingInNode(childNode, startingSpan);\n });\n }\n}\n\n/**\n * Analyzes a text node and fixes its highlighting.\n */\nfunction fixHighlightingInTextNode(\n textNode: Node,\n startingSpan: HTMLSpanElement,\n) {\n if (textNode.nodeType !== Node.TEXT_NODE) {\n throw new Error(\n \"Invalid argument to fixMultiSpaceInTextNode: node must be a TextNode\",\n );\n }\n\n if (!textNode.nodeValue) {\n return;\n }\n\n // string.matchAll would be cleaner, but not supported in all browsers (in particular, FF60)\n // Use RegExp.exec for greater compatibility.\n multiSpaceRegexGlobal.lastIndex = 0; // RegExp.exec is stateful! Need to reset the state.\n const matches: {\n text: string;\n startIndex: number;\n endIndex: number; // the index of the first character to exclude\n }[] = [];\n let regexResult: RegExpExecArray | null;\n while (\n (regexResult = multiSpaceRegexGlobal.exec(textNode.nodeValue)) != null\n ) {\n regexResult.forEach((matchingText) => {\n matches.push({\n text: matchingText,\n startIndex:\n multiSpaceRegexGlobal.lastIndex - matchingText.length,\n endIndex: multiSpaceRegexGlobal.lastIndex, // the index of the first character to exclude\n });\n });\n }\n\n // First, generate the new DOM elements with the fixed highlighting.\n const newNodes: Node[] = [];\n if (matches.length === 0) {\n // No matches\n newNodes.push(makeHighlightedSpan(textNode.nodeValue));\n } else {\n let lastMatchEndIndex = 0; // the index of the first character to exclude of the last match\n for (let i = 0; i < matches.length; ++i) {\n const match = matches[i];\n\n const preMatchText = textNode.nodeValue.slice(\n lastMatchEndIndex,\n match.startIndex,\n );\n lastMatchEndIndex = match.endIndex;\n if (preMatchText) newNodes.push(makeHighlightedSpan(preMatchText));\n\n newNodes.push(document.createTextNode(match.text));\n\n if (i === matches.length - 1) {\n const postMatchText = textNode.nodeValue.slice(match.endIndex);\n if (postMatchText) {\n newNodes.push(makeHighlightedSpan(postMatchText));\n }\n }\n }\n }\n\n // Next, replace the old DOM element with the new DOM elements\n const oldNode = textNode;\n if (oldNode.parentNode && newNodes && newNodes.length > 0) {\n for (let i = 0; i < newNodes.length; ++i) {\n const nodeToInsert = newNodes[i];\n oldNode.parentNode.insertBefore(nodeToInsert, oldNode);\n }\n\n oldNode.parentNode.removeChild(oldNode);\n\n // We need to set ancestor's background back to transparent (instead of highlighted),\n // and let each of the newNodes's styles control whether to be highlighted or transparent.\n // If ancestor was highlighted but one of its new descendant nodes was transparent,\n // all that would happen is the descendant would allow the ancestor's highlight color to show through,\n // which doesn't achieve what we want :(\n startingSpan.classList.add(kDisableHighlightClass);\n }\n}\n\nfunction makeHighlightedSpan(textContent: string) {\n const newSpan = document.createElement(\"span\");\n newSpan.classList.add(kEnableHighlightClass);\n newSpan.appendChild(document.createTextNode(textContent));\n return newSpan;\n}\n\nfunction playCurrentInternal() {\n if (currentPlaybackMode === PlaybackMode.AudioPlaying) {\n const mediaPlayer = getPlayer();\n if (mediaPlayer) {\n const element = getCurrentNarrationPage().querySelector(\n `#${currentAudioId}`,\n );\n if (!element || !canPlayAudio(element)) {\n playEnded();\n return;\n }\n\n // Regardless of whether we end up using timingsStr or not,\n // we should reset this now in case the previous page used it and was still playing\n // when the user flipped to the next page.\n subElementsWithTimings = [];\n\n const timingsStr: string | null = element.getAttribute(\n \"data-audioRecordingEndTimes\",\n );\n if (timingsStr) {\n const childSpanElements = element.querySelectorAll(\n `span.${kHighlightSegmentClass}`,\n );\n const fields = timingsStr.split(\" \");\n const subElementCount = Math.min(\n fields.length,\n childSpanElements.length,\n );\n\n for (let i = subElementCount - 1; i >= 0; --i) {\n const durationSecs: number = Number(fields[i]);\n if (isNaN(durationSecs)) {\n continue;\n }\n subElementsWithTimings.push([\n childSpanElements.item(i),\n durationSecs,\n ]);\n }\n } else {\n // No timings string available.\n // No need for us to do anything. The correct element is already highlighted by playAllSentences() (which needed to call setCurrent... anyway to set the audio player source).\n // We'll just proceed along, start playing the audio, and playNextSubElement() will return immediately because there are no sub-elements in this case.\n }\n\n const currentSegment = element as HTMLElement;\n if (currentSegment && ToggleImageDescription) {\n ToggleImageDescription?.raise(\n isImageDescriptionSegment(currentSegment),\n );\n }\n\n gotErrorPlaying = false;\n const promise = mediaPlayer.play();\n ++currentAudioSessionNum;\n audioPlayCurrentStartTime = new Date().getTime();\n highlightNextSubElement(currentAudioSessionNum);\n handlePlayPromise(promise);\n }\n }\n}\n\nfunction isImageDescriptionSegment(segment: HTMLElement): boolean {\n return segment.closest(\".\" + kImageDescriptionClass) !== null;\n}\n\nfunction handlePlayPromise(promise: Promise<void>, player?: HTMLMediaElement) {\n // In newer browsers, play() returns a promise which fails\n // if the browser disobeys the command to play, as some do\n // if the user hasn't 'interacted' with the page in some\n // way that makes the browser think they are OK with it\n // playing audio. In Gecko45, the return value is undefined,\n // so we mustn't call catch.\n if (promise && promise.catch) {\n promise.catch((reason: any) => {\n // The HTMLMediaElement also has an error handler (which calls playEnded()).\n // We do NOT want to call that here, both to stop it happening twice, but also because\n // we do NOT want to call playEnded (which in autoplay causes advance to next page)\n // when we get NotAllowedError. That error seems to only come here, and not to raise the\n // ended event.\n\n // This promise.catch error handler is the only one that handles NotAllowedException (that is, playback not started because user has not interacted with the page yet).\n // However, older versions of browsers don't support promise from HTMLMediaElement.play(). So this cannot be the only error handler.\n // Thus we need both the promise.catch error handler as well as the HTMLMediaElement's error handler.\n //\n // In many cases (such as NotSupportedError, which happens when the audio file isn't found), both error handlers will run.\n // That is a little annoying but if the two don't conflict with each other it's not problematic.\n\n const playingWhat = player?.getAttribute(\"src\") ?? \"unknown\";\n console.log(\"could not play sound: \" + reason + \" \" + playingWhat);\n\n if (\n reason &&\n reason\n .toString()\n .includes(\n \"The play() request was interrupted by a call to pause().\",\n )\n ) {\n // We were getting this error Aug 2020. I tried wrapping the line above which calls mediaPlayer.play()\n // (currently `promise = mediaPlayer.play();`) in a setTimeout with 0ms. This seemed to fix the bug (with\n // landscape books not having audio play initially -- BL-8887). But the root cause was actually that\n // we ended up calling playAllSentences twice when the book first loaded.\n // I fixed that in bloom-player-core. But I wanted to document the possible setTimeout fix here\n // in case this issue ever comes up for a different reason.\n console.log(\n \"See comment in narration.ts for possibly useful information regarding this error.\",\n );\n }\n\n // Don't call removeAudioCurrent() here. The HTMLMediaElement's error handler will call playEnded() and calling removeAudioCurrent() here will mess up playEnded().\n // removeAudioCurrent();\n\n // With some kinds of invalid sound file it keeps trying and plays over and over.\n // But when we move on to play another sound, a pause here will mess things up.\n // So instead I put a pause after we run out of sounds to try to play.\n //getPlayer().pause();\n // if (Pause) {\n // Pause?.raise();\n // }\n\n // Get all the state (and UI) set correctly again.\n // Not entirely sure about limiting this to NotAllowedError, but that's\n // the one kind of play error that is fixed by the user just interacting.\n // If there's some other reason we can't play, showing as paused may not\n // be useful. See comments on the similar code in music.ts\n if (reason.name === \"NotAllowedError\" && PlayFailed) {\n PlayFailed?.raise();\n }\n });\n }\n}\n\n// Moves the highlight to the next sub-element\n// originalSessionNum: The value of currentAudioSessionNum at the time when the audio file started playing.\n// This is used to check in the future if the timeouts we started are for the right session.\n// startTimeInSecs is an optional fallback that will be used in case the currentTime cannot be determined from the audio player element.\nfunction highlightNextSubElement(\n originalSessionNum: number,\n startTimeInSecs: number = 0,\n) {\n // the item should not be popped off the stack until it's completely done with.\n const subElementCount = subElementsWithTimings.length;\n\n if (subElementCount <= 0) {\n return;\n }\n\n const topTuple = subElementsWithTimings[subElementCount - 1];\n const element = topTuple[0];\n const endTimeInSecs: number = topTuple[1];\n\n setHighlightTo({\n newElement: element,\n shouldScrollToElement: true,\n disableHighlightIfNoAudio: false,\n });\n\n const mediaPlayer: HTMLMediaElement = document.getElementById(\n \"bloom-audio-player\",\n )! as HTMLMediaElement;\n let currentTimeInSecs: number = mediaPlayer.currentTime;\n if (currentTimeInSecs <= 0) {\n currentTimeInSecs = startTimeInSecs;\n }\n\n // Handle cases where the currentTime has already exceeded the nextStartTime\n // (might happen if you're unlucky in the thread queue... or if in debugger, etc.)\n // But instead of setting time to 0, set the minimum highlight time threshold to 0.1 (this threshold is arbitrary).\n const durationInSecs = Math.max(endTimeInSecs - currentTimeInSecs, 0.1);\n\n setTimeout(() => {\n onSubElementHighlightTimeEnded(originalSessionNum);\n }, durationInSecs * 1000);\n}\n\n// Handles a timeout indicating that the expected time for highlighting the current subElement has ended.\n// If we've really played to the end of that subElement, highlight the next one (if any).\n// originalSessionNum: The value of currentAudioSessionNum at the time when the audio file started playing.\n// This is used to check in the future if the timeouts we started are for the right session\nfunction onSubElementHighlightTimeEnded(originalSessionNum: number) {\n // Check if the user has changed pages since the original audio for this started playing.\n // Note: Using the timestamp allows us to detect switching to the next page and then back to this page.\n // Using playerPage (HTMLElement) does not detect that.\n if (originalSessionNum !== currentAudioSessionNum) {\n return;\n }\n // Seems to be needed to prevent jumping to the next subelement when not permitted to play by browser.\n // Not sure why the check below on mediaPlayer.currentTime does not prevent this.\n if (currentPlaybackMode === PlaybackMode.AudioPaused) {\n return;\n }\n\n const subElementCount = subElementsWithTimings.length;\n if (subElementCount <= 0) {\n return;\n }\n\n const mediaPlayer: HTMLMediaElement = document.getElementById(\n \"bloom-audio-player\",\n )! as HTMLMediaElement;\n if (mediaPlayer.ended || mediaPlayer.error) {\n // audio playback ended. No need to highlight anything else.\n // (No real need to remove the highlights either, because playEnded() is supposed to take care of that.)\n return;\n }\n const playedDurationInSecs: number | undefined | null =\n mediaPlayer.currentTime;\n\n // Peek at the next sentence and see if we're ready to start that one. (We might not be ready to play the next audio if the current audio got paused).\n const subElementWithTiming = subElementsWithTimings[subElementCount - 1];\n const nextStartTimeInSecs = subElementWithTiming[1];\n\n if (playedDurationInSecs && playedDurationInSecs < nextStartTimeInSecs) {\n // Still need to wait. Exit this function early and re-check later.\n const minRemainingDurationInSecs =\n nextStartTimeInSecs - playedDurationInSecs;\n setTimeout(() => {\n onSubElementHighlightTimeEnded(originalSessionNum);\n }, minRemainingDurationInSecs * 1000);\n\n return;\n }\n\n subElementsWithTimings.pop();\n\n highlightNextSubElement(originalSessionNum, nextStartTimeInSecs);\n}\n\n// Removes the .ui-audioCurrent class from all elements (also ui-audioCurrentImg)\n// Equivalent of removeAudioCurrentFromPageDocBody() in BloomDesktop.\n// \"around\" might be the element that has the highlight, or the one getting it;\n// the important thing is that it belongs to the right document (which is in question\n// with multiple iframes in Bloom desktop).\nfunction removeAudioCurrent(around: HTMLElement = document.body) {\n // Note that HTMLCollectionOf's length can change if you change the number of elements matching the selector.\n // For safety we get rid of all existing ones.\n const audioCurrentArray = Array.from(\n around.ownerDocument.getElementsByClassName(\"ui-audioCurrent\"),\n );\n\n for (let i = 0; i < audioCurrentArray.length; i++) {\n audioCurrentArray[i].classList.remove(\"ui-audioCurrent\");\n }\n const currentImg =\n around.ownerDocument.getElementsByClassName(\"ui-audioCurrentImg\")[0];\n if (currentImg) {\n currentImg.classList.remove(\"ui-audioCurrentImg\");\n }\n}\n\nfunction setSoundAndHighlight(\n newElement: Element,\n disableHighlightIfNoAudio: boolean,\n oldElement?: Element | null | undefined,\n) {\n setSoundFrom(newElement);\n setHighlightTo({\n newElement,\n shouldScrollToElement: true, // Always true in bloom-player version\n disableHighlightIfNoAudio,\n oldElement,\n });\n}\n\nfunction setHighlightTo({\n newElement,\n shouldScrollToElement,\n disableHighlightIfNoAudio,\n oldElement,\n}: ISetHighlightParams) {\n // This should happen even if oldElement and newElement are the same.\n if (shouldScrollToElement) {\n // Wrap it in a try/catch so that if something breaks with this minor/nice-to-have feature of scrolling,\n // the main responsibilities of this method can still proceed\n try {\n scrollElementIntoView(newElement);\n } catch (e) {\n console.error(e);\n }\n }\n\n if (oldElement === newElement) {\n // No need to do much, and better not to, so that we can avoid any temporary flashes as the highlight is removed and re-applied\n return;\n }\n\n removeAudioCurrent((oldElement || newElement) as HTMLElement);\n\n const mediaPlayer = getPlayer();\n // The \"error\" may just be that audio has not been recorded for this element.\n // If the audio is missing, then strange things happen in the interaction between\n // narration and drag activity text. See BL-14797\n const hasError = mediaPlayer.error !== null;\n if (!hasError && disableHighlightIfNoAudio) {\n const isAlreadyPlaying = mediaPlayer.currentTime > 0;\n // If it's already playing, no need to disable (Especially in the Soft Split case, where only one file is playing but multiple sentences need to be highlighted).\n if (!isAlreadyPlaying) {\n // Start off in a highlight-disabled state so we don't display any momentary highlight for cases where there is no audio for this element.\n // In react-based bloom-player, canPlayAudio() can't trivially identify whether or not audio exists,\n // so we need to incorporate a derivative of Bloom Desktop's .ui-suppressHighlight code\n newElement.classList.add(kSuppressHighlightClass);\n // When it starts playing, we know we really have such an audio file, so we can stop\n // suppressing the highlight.\n mediaPlayer.addEventListener(\"playing\", () => {\n newElement.classList.remove(kSuppressHighlightClass);\n });\n mediaPlayer.addEventListener(\"error\", () => {\n newElement.classList.remove(\"ui-audioCurrent\");\n newElement.classList.remove(kSuppressHighlightClass);\n });\n }\n }\n\n if (!hasError) newElement.classList.add(\"ui-audioCurrent\");\n // If the current audio is part of a (currently typically hidden) image description,\n // highlight the image.\n // it's important to check for imageDescription on the translationGroup;\n // we don't want to highlight the image while, for example, playing a TOP box content.\n const translationGroup = newElement.closest(\".bloom-translationGroup\");\n if (\n translationGroup &&\n translationGroup.classList.contains(kImageDescriptionClass)\n ) {\n const imgContainer = translationGroup.closest(\n \".bloom-imageContainer, .bloom-canvas\",\n );\n if (imgContainer) {\n imgContainer.classList.add(\"ui-audioCurrentImg\");\n }\n }\n}\n\n// Scrolls an element into view.\nfunction scrollElementIntoView(element: Element) {\n // In Bloom Player, scrollIntoView can interfere with page swipes,\n // so Bloom Player needs some smarts about when to call it...\n if (isSwipeInProgress?.() || recentPageChange) {\n // This alternative implementation doesn't use scrollIntoView (Which interferes with swiper).\n // Since swiping is only active at the beginning (usually while the 1st element is playing)\n // it should generally be good enough just to reset the scroll of the scroll parent to the top.\n\n // Assumption: Assumes the editable is the scrollbox.\n // If this is not the case, you can use JQuery's scrollParent() function or other equivalent\n const scrollAncestor = getEditable(element);\n if (scrollAncestor) {\n scrollAncestor.scrollTop = 0;\n }\n return;\n }\n\n let mover = element as HTMLElement; // by default make the element itself scrollIntoView\n if (window.getComputedStyle(element.parentElement!).position !== \"static\") {\n // We can make a new element absolutely positioned and it will be relative to the parent.\n // The idea is to make an element much narrower than the element we are\n // trying to make visible, since we don't want horizontal movement. Quite possibly,\n // as in BL-11038, only some white space is actually off-screen. But even if the author\n // has positioned a bubble so some text is cut off, we don't want horizontal scrolling,\n // which inside swiper will weirdly pull in part of the next page.\n // (In the pathological case that the bubble is more than half hidden, we'll do the\n // horizontal scroll, despite the ugliness of possibly showing part of the next page.)\n // Note that elt may be a span, when scrolling chunks of text into view to play.\n // I thought about using scrollWidth/Height to include any part of the element\n // that is scrolled out of view, but for some reason these are always zero for spans.\n // OffsetHeight seems to give the full height, though docs seem to indicate that it\n // should not include invisible areas.\n const elt = element as HTMLElement;\n mover = document.createElement(\"div\");\n mover.style.position = \"absolute\";\n mover.style.top = elt.offsetTop + \"px\";\n\n // now we need what for a block would be offsetLeft. However, for a span, that\n // yields the offset of the top left corner, which may be in the middle\n // of a line.\n const bounds = elt.getBoundingClientRect();\n const parent = elt.parentElement;\n const parentBounds = parent?.getBoundingClientRect();\n const scale = parentBounds!.width / parent!.offsetWidth;\n const leftRelativeToParent = (bounds.left - parentBounds!.left) / scale;\n\n mover.style.left = leftRelativeToParent + elt.offsetWidth / 2 + \"px\";\n mover.style.height = elt.offsetHeight + \"px\";\n mover.style.width = \"0\";\n element.parentElement?.insertBefore(mover, element);\n }\n\n mover.scrollIntoView({\n // Animated instead of sudden\n behavior: \"smooth\",\n\n // \"nearest\" setting does lots of smarts for us (compared to us deciding when to use \"start\" or \"end\")\n // Seems to reduce unnecessary scrolling compared to start (aka true) or end (aka false).\n // Refer to https://drafts.csswg.org/cssom-view/#scroll-an-element-into-view,\n // which seems to imply that it won't do any scrolling if the two relevant edges are already inside.\n block: \"nearest\",\n\n // horizontal alignment is controlled by \"inline\". We'll leave it as its default (\"nearest\")\n // which typically won't move things at all horizontally\n });\n if (mover !== element) {\n mover.parentElement?.removeChild(mover);\n }\n}\n\nfunction getEditable(element: Element): Element | null {\n if (element.classList.contains(\"bloom-editable\")) {\n return element;\n } else {\n return element.closest(\".bloom-editable\"); // Might be null\n }\n}\n\nfunction setSoundFrom(element: Element) {\n const firstAudioSentence = getFirstAudioSentenceWithinElement(element);\n const id: string = firstAudioSentence ? firstAudioSentence.id : element.id;\n setCurrentAudioId(id);\n}\n\nfunction getFirstAudioSentenceWithinElement(\n element: Element | null,\n): Element | null {\n const audioSentences = getAudioSegmentsWithinElement(element);\n if (!audioSentences || audioSentences.length === 0) {\n return null;\n }\n\n return audioSentences[0];\n}\n\nfunction getAudioSegmentsWithinElement(element: Element | null): Element[] {\n const audioSegments: Element[] = [];\n\n if (element) {\n if (element.classList.contains(kAudioSentence)) {\n audioSegments.push(element);\n } else {\n const collection = element.getElementsByClassName(kAudioSentence);\n for (let i = 0; i < collection.length; ++i) {\n const audioSentenceElement = collection.item(i);\n if (audioSentenceElement) {\n audioSegments.push(audioSentenceElement);\n }\n }\n }\n }\n\n return audioSegments;\n}\n\nfunction setCurrentAudioId(id: string) {\n if (!currentAudioId || currentAudioId !== id) {\n currentAudioId = id;\n updatePlayerStatus();\n }\n}\n\nfunction updatePlayerStatus() {\n const player = getPlayer();\n if (!player) {\n return;\n }\n // Any time we change the src, the player will pause.\n // So if we're playing currently, we'd better report whatever time\n // we played.\n if (player.currentTime > 0 && !player.paused && !player.ended) {\n reportPlayDuration();\n }\n const url = currentAudioUrl(currentAudioId);\n logNarration(url);\n // because this code is meant to work in both Bloom and BloomPlayer, we can't call a Bloom API to find\n // out whether we actually have a recording (as we well might not, if we just opened the talking book\n // tool and haven't recorded anything yet). So we just try to play it and see what happens.\n // The optional param tells Bloom not to report an error if the file isn't found, and is ignored in\n // other contexts.\n player.setAttribute(\n \"src\",\n url + \"?nocache=\" + new Date().getTime() + \"&optional=true\",\n );\n}\n\nfunction currentAudioUrl(id: string): string {\n const result = urlPrefix() + \"/audio/\" + id + \".mp3\";\n return result;\n}\n\nfunction getPlayer(): HTMLMediaElement {\n const audio = getAudio(\"bloom-audio-player\", (a) => {\n a.addEventListener(\"ended\", handlePlayEnded);\n a.addEventListener(\"error\", handlePlayError);\n });\n return audio;\n}\n\nfunction handlePlayEnded() {\n playEnded();\n}\n\n// Stop any audio that is currently playing.\n// This will also raise the PlayCompleted and PageNarrationComplete events\nexport function abortNarrationPlayback() {\n if (currentPlaybackMode !== PlaybackMode.AudioPlaying) {\n return; // no need to abort\n }\n\n // I hesitated to put this comment here because I'm afraid it won't make any sense.\n // But I also don't feel right about not attempting to capture what happened.\n // Previously, we didn't have this \"keepPlayingTheStack\" parameter, and we just\n // modified the stack to have only the top element in it.\n // But for no reason we can explain, in BloomPUB Viewer, and only there,\n // even if we weren't calling this code, referencing elementsToPlayConsecutivelyStack\n // caused an error to be thrown and a black screen to result.\n // So if you're tempted to modify this code, especially if you need to\n // reference elementsToPlayConsecutivelyStack, be sure to test in BloomPUB Viewer.\n\n playEnded(false);\n}\n\n// Handles ending the current playback. If there are more things stacked to play, it plays the next one.\n// otherwise, it reports that play ended. Note that the latter raises the PlayCompleted and PageNarrationComplete events.\nfunction playEnded(keepPlayingTheStack = true): void {\n // Not sure if this is necessary, since both 'playCurrentInternal()' and 'reportPlayEnded()'\n // will toggle image description already, but if we've just gotten to the end of our \"stack\",\n // it may be needed.\n if (ToggleImageDescription) {\n ToggleImageDescription?.raise(false);\n }\n reportPlayDuration();\n if (\n elementsToPlayConsecutivelyStack &&\n elementsToPlayConsecutivelyStack.length > 0\n ) {\n const elementJustPlayed = elementsToPlayConsecutivelyStack.pop(); // get rid of the last one we played\n const newStackCount = elementsToPlayConsecutivelyStack.length;\n if (newStackCount > 0 && keepPlayingTheStack) {\n // More items to play\n const nextElement =\n elementsToPlayConsecutivelyStack[newStackCount - 1];\n setSoundAndHighlight(nextElement, true);\n playCurrentInternal();\n } else {\n reportPlayEnded();\n removeAudioCurrent(elementJustPlayed);\n // In some error conditions, we need to stop repeating attempts to play.\n getPlayer().pause();\n }\n }\n}\n\nfunction reportPlayEnded() {\n elementsToPlayConsecutivelyStack = [];\n subElementsWithTimings = [];\n\n removeAudioCurrent();\n PageNarrationComplete?.raise(currentPlayPage!);\n PlayCompleted?.raise();\n}\n\nfunction reportPlayDuration() {\n if (!audioPlayCurrentStartTime || !durationReporter) {\n return;\n }\n const currentTime = new Date().getTime();\n const duration = (currentTime - audioPlayCurrentStartTime) / 1000;\n durationReporter(duration);\n}\n\nfunction getAudio(id: string, init: (audio: HTMLAudioElement) => void) {\n let player: HTMLAudioElement | null = document.querySelector(\n \"#\" + id,\n ) as HTMLAudioElement;\n // If (somehow?) it exists but is not a valid HTMLAudioElement, remove it.\n if (player && !player.play) {\n player.remove();\n player = null;\n }\n if (!player) {\n player = document.createElement(\"audio\") as HTMLAudioElement;\n player.setAttribute(\"id\", id);\n document.body.appendChild(player);\n init(player);\n }\n return player as HTMLMediaElement;\n}\n\nfunction canPlayAudio(current: Element): boolean {\n return true; // currently no way to check\n}\n\n// If something goes wrong playing a media element, typically that we don't actually have a recording\n// for a particular one, we seem to sometimes get an error event, while other times, the promise returned\n// by play() is rejected. Both cases call handlePlayError, which calls playEnded, but in case we get both,\n// we don't want to call playEnded twice.\nlet gotErrorPlaying = false;\n\nfunction handlePlayError() {\n if (gotErrorPlaying) {\n console.log(\"Already got error playing, not handling again\");\n return;\n }\n gotErrorPlaying = true;\n console.log(\"Error playing, handling\");\n setTimeout(() => {\n playEnded();\n }, 100);\n}\n\n// Returns all elements that match CSS selector {expr} as an array.\n// Querying can optionally be restricted to {container}'s descendants\n// If includeSelf is true, it includes both itself as well as its descendants.\n// Otherwise, it only includes descendants.\n// Also filters out imageDescriptions if we aren't supposed to be reading them.\nfunction findAll(\n expr: string,\n container: HTMLElement,\n includeSelf: boolean = false,\n): HTMLElement[] {\n // querySelectorAll checks all the descendants\n const allMatches: HTMLElement[] = [].slice.call(\n (container || document).querySelectorAll(expr),\n );\n\n // Now check itself\n if (includeSelf && container && container.matches(expr)) {\n allMatches.push(container);\n }\n\n return includeImageDescriptions\n ? allMatches\n : allMatches.filter((match) => !isImageDescriptionSegment(match));\n}\n\nfunction getPlayableDivs(\n container: HTMLElement,\n canvasToExclude?: HTMLElement,\n) {\n // We want to play any audio we have from divs the user can see.\n // This is a crude test, but currently we always use display:none to hide unwanted languages.\n var results = findAll(\".bloom-editable\", container).filter(\n (e) => window.getComputedStyle(e).display !== \"none\",\n );\n if (canvasToExclude) {\n results = results.filter((e) => !canvasToExclude.contains(e));\n }\n return results;\n}\n\n// Optional param is for use when 'playerPage' has NOT been initialized.\n// Not using the optional param assumes 'playerPage' has been initialized\nfunction getPagePlayableDivs(\n page?: HTMLElement,\n canvasToExclude?: HTMLElement,\n): HTMLElement[] {\n return getPlayableDivs(page ? page : currentPlayPage!, canvasToExclude);\n}\n\n// Optional param is for use when 'playerPage' has NOT been initialized.\n// Not using the optional param assumes 'playerPage' has been initialized\nfunction getPageAudioElements(\n page?: HTMLElement,\n canvasToExclude?: HTMLElement,\n): HTMLElement[] {\n return [].concat.apply(\n [],\n getPagePlayableDivs(page, canvasToExclude).map((x) =>\n findAll(\".audio-sentence\", x, true),\n ),\n );\n}\n\nexport function pageHasAudio(page: HTMLElement): boolean {\n return getPageAudioElements(page).length ? true : false;\n}\n\n// Called when the user clicks the play/pause button, and we want to resume playing.\n// If we're in the middle of playing, we resume it.\n// If we have finished playing, we start over.\n// If the page nas no audio, we assume the user paused as long as wanted on\n// the page, and raise the PageNarrationComplete event at once (to move to the\n// next page if we are in autoplay).\nexport function playNarration() {\n if (currentPlaybackMode === PlaybackMode.AudioPlaying) {\n return; // no change.\n }\n setCurrentPlaybackMode(PlaybackMode.AudioPlaying);\n // I'm not sure how getPlayer() can return null/undefined, but have seen it happen\n // typically when doing something odd like trying to go back from the first page.\n if (segmentsWeArePlaying.length && getPlayer()) {\n if (elementsToPlayConsecutivelyStack.length) {\n handlePlayPromise(getPlayer().play());\n\n // Resuming play. Only currentStartTime needs to be adjusted, but originalStartTime shouldn't be changed.\n audioPlayCurrentStartTime = new Date().getTime();\n // in case we're resuming play, we need a new timout when the current subelement is finished\n highlightNextSubElement(currentAudioSessionNum);\n return;\n } else {\n // Pressing the play button in this case is triggering a replay of the current page,\n // so we need to reset the highlighting.\n playAllSentences(null);\n return;\n }\n }\n // Nothing real to play on this page, so PageNarrationComplete depends on a timeout.\n // We only get here following a pause, so assume the reader has paused as long as wanted,\n // and move on.\n PageNarrationComplete?.raise(currentPlayPage!);\n}\n\nexport function pauseNarration() {\n if (currentPlaybackMode === PlaybackMode.AudioPaused) {\n return;\n }\n pausePlaying();\n startPause = new Date();\n\n // Note that neither music.pause() nor animations.PauseAnimations() check the state.\n // If that changes, then this state setting might need attention.\n setCurrentPlaybackMode(PlaybackMode.AudioPaused);\n}\n\n// This pauses the current player without setting the \"AudioPaused\" state or setting the\n// startPause timestamp. If this method is called when resumption is possible, the calling\n// method must take care of these values (as in the pause method directly above).\n// Note that there's no \"stop\" method on player, only a \"pause\" method. This method is\n// used both when \"pausing\" the narration while viewing a page and when stopping narration\n// when changing pages.\nfunction pausePlaying() {\n const player = getPlayer();\n // We're paused, so if we have a timer running to switch pages after a certain time, cancel it.\n clearTimeout(fakeNarrationTimer);\n if (segmentsWeArePlaying && segmentsWeArePlaying.length && player) {\n // Before reporting duration, try to check that we really are playing.\n // a separate report is sent if play ends.\n if (player.currentTime > 0 && !player.paused && !player.ended) {\n reportPlayDuration();\n }\n player.pause();\n }\n}\n\n// Figure out the total duration of the audio on the page.\n// An earlier version of this code (see narration.ts around November 2023)\n// was designed to run asnychronously so that if we don't have audio\n// durations in the file, it would try to get the actual duration of the audio\n// from the server. However, comments indicated that this approach did not\n// work in mobile apps, and bloompubs have now long shipped with the durations.\n// So I decided to simplify.\nexport function computeDuration(page: HTMLElement): number {\n let pageDuration = 0.0;\n getPageAudioElements(page).forEach((segment) => {\n const attrDuration = segment.getAttribute(\"data-duration\");\n if (attrDuration) {\n pageDuration += parseFloat(attrDuration);\n }\n });\n if (pageDuration < durationOfPagesWithoutNarration) {\n pageDuration = durationOfPagesWithoutNarration;\n }\n return pageDuration;\n}\n\nexport function hidingPage() {\n // This causes problems. When we're hiding one page, we immediately show another.\n // If that page has no audio, we pause the player then.\n // If it DOES have audio, a pause here can interfere with playing it.\n //pausePlaying(); // Doesn't set AudioPaused state. Caller sets NewPage state.\n clearTimeout(fakeNarrationTimer);\n}\n\n// Play the specified elements, one after the other. When the last completes (or at once if the array is empty),\n// perform the 'then' action (typically used to play narration, which we put after videos).\n//\n// Note, there is a very similar function in video.ts. It would be nice to combine them, but\n// there are various reasons that is difficult at the moment. e.g.:\n// 1. See comment below about sharing code with Bloom Desktop.\n// 2. The other version handles play/pause which doesn't apply in BloomDesktop.\n//\n// (This function would be more natural in video.ts. But at least for now I'm trying to minimize the\n// number of source files shared with Bloom Desktop, and we need this for Bloom Games.)\nexport function playAllVideo(elements: HTMLVideoElement[], then: () => void) {\n if (elements.length === 0) {\n then();\n return;\n }\n const video = elements[0];\n\n // If there is an error, try to continue with the next video.\n if (\n video.networkState === HTMLMediaElement.NETWORK_NO_SOURCE &&\n video.readyState === HTMLMediaElement.HAVE_NOTHING\n ) {\n showVideoError(video);\n playAllVideo(elements.slice(1), then);\n } else {\n hideVideoError(video);\n setCurrentPlaybackMode(PlaybackMode.VideoPlaying);\n const promise = video.play();\n promise\n .then(() => {\n // The promise resolves when the video starts playing. We want to know when it ends.\n // Note: in Bloom Desktop, sometimes this event does not fire normally, even when the video is\n // played to the end. I have not figured out why. It may be something to do with how we are\n // trimming the videos.\n // In Bloom Desktop, this is worked around by raising the ended event when we detect that it has\n // paused past the end point in resetToStartAfterPlayingToEndPoint.\n // In BloomPlayer,I don't think this is a problem. Videos are trimmed when published, so we always\n // play to the real end (unless the user pauses). So one way or another, we should get the ended\n // event.\n video.addEventListener(\n \"ended\",\n () => {\n playAllVideo(elements.slice(1), then);\n },\n { once: true },\n );\n })\n .catch((reason) => {\n console.error(\"Video play failed\", reason);\n showVideoError(video);\n playAllVideo(elements.slice(1), then);\n });\n }\n}\n\n// These methods live here instead of video.ts because video.ts is already importing\n// from narration.ts, and we don't want to create a circular dependency.\n\n// We're living with this message not being localized.\nconst badVideoMessage = \"Sorry, this video cannot be played in this browser.\";\n\nexport function showVideoError(video: HTMLVideoElement): void {\n const parent = video.parentElement;\n if (parent) {\n const divs = parent.getElementsByClassName(\"video-error-message\");\n if (divs.length === 0) {\n const msgDiv = parent.ownerDocument.createElement(\"div\");\n msgDiv.className = \"video-error-message normal-style\";\n msgDiv.textContent = badVideoMessage;\n msgDiv.style.display = \"block\";\n msgDiv.style.color = \"black\";\n msgDiv.style.backgroundColor = \"rgba(255, 255, 255, 0.5)\"; // semi-transparent white\n msgDiv.style.position = \"absolute\";\n msgDiv.style.left = \"10%\";\n msgDiv.style.top = \"10%\";\n msgDiv.style.width = \"80%\";\n msgDiv.style.fontSize = \"x-large\";\n parent.appendChild(msgDiv);\n }\n }\n}\nexport function hideVideoError(video: HTMLVideoElement): void {\n const parent = video.parentElement;\n if (parent) {\n const divs = parent.getElementsByClassName(\"video-error-message\");\n while (divs.length > 1) parent.removeChild(divs[0]);\n }\n}\n","// This is the code that is shared between the Play tab of the bloom games\n// (also known as drag activities) and bloom-player. The code originates in\n// the bloom-player repo and is shared by the bloom-player package.\n// It wants to live in the dragActivity folder because it is specific to drag activities.\n// However, it also wants to live in the same place relative to narration.ts both in\n// bloom player and bloom desktop. For now that's a stronger requirement.\n// For now, in Bloom desktop, this file is only used in the Play tab of drag activities,\n// so both live there. In Bloom player, both live in the root src directory.\n// In the long run, the answer is probably a folder, or even an npm package, for all\n// the stuff that the two programs share...or maybe we can make bloom player publish\n// these files along with the output bundle and have bloom desktop use them from there.\n// For now, though, it's much easier to just edit them and have them built automatically\n// than to have this code in another repo.\n\nimport { ActivityManager } from \"../activities/activityManager\";\nimport {\n kAudioSentence,\n playAllAudio,\n playAllVideo,\n urlPrefix,\n} from \"./narration\";\n\n// Probably not the most logical place to define this constant, but this file needs it,\n// and if we define it here we don't have to share another file with bloom editor.\nexport const kLegacyCanvasElementSelector =\n \".bloom-textOverPicture, .bloom-canvas-element\";\nlet targetPositions: {\n x: number;\n y: number;\n width: number;\n height: number;\n}[] = [];\nlet originalPositions = new Map<HTMLElement, { x: number; y: number }>();\nlet currentPage: HTMLElement | undefined;\n// Action to invoke if the user clicks a change page button.\n// Our latest templates don't have their own change page buttons, just encourage the user\n// to leave room for the player to add them.\nlet currentChangePageAction: (next: boolean) => void | undefined;\nlet positionsToRestore: { x: string; y: string; elt: HTMLElement }[] = [];\n\n// Save the current positions of all draggables (when entering Play tab, so we can restore them when leaving).\nconst savePositions = (page: HTMLElement) => {\n positionsToRestore = [];\n page.querySelectorAll(\"[data-draggable-id]\").forEach((elt: HTMLElement) => {\n positionsToRestore.push({\n x: elt.style.left,\n y: elt.style.top,\n elt,\n });\n });\n};\n// Restore the positions saved by savePositions (when leaving the Play tab, or leaving this page altogether\n// after being in that tab or when clicking the retry button during play).\nconst restorePositions = () => {\n positionsToRestore.forEach((p) => {\n p.elt.style.left = p.x;\n p.elt.style.top = p.y;\n p.elt.classList.remove(\"bloom-draggedToTarget\");\n });\n};\n\n// This method may be specific to BloomDesktop.\nexport function adjustDraggablesForLanguage(page: HTMLElement) {\n if (page.getAttribute(\"data-activity\") !== \"drag-letter-to-target\") {\n return;\n }\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n draggables.shift(); // The first one is always visible.\n draggables.forEach((draggable: HTMLElement) => {\n const shouldBeVisible = !!(\n draggable.getElementsByClassName(\n \"bloom-visibility-code-on\",\n )[0] as HTMLElement\n )?.innerText.trim();\n draggable.classList.toggle(\"bloom-unused-in-lang\", !shouldBeVisible);\n const target = getTarget(draggable);\n\n if (target) {\n target.classList.toggle(\"bloom-unused-in-lang\", !shouldBeVisible);\n }\n });\n}\nexport function IsRunningOnBloomDesktop(bloomPage: Element): boolean {\n // REVIEW: is there a better way to detect this?\n return bloomPage.closest(\"#page-scaling-container\") !== null;\n // not reliable: in BE, document might be the toolbox doc.\n //return document.body.querySelector(\"div#page-scaling-container\") !== null;\n}\n\n// Function to call to get everything ready for playing the game.\n// Things that get done here should usually be undone in undoPrepareActivity.\nexport function prepareActivity(\n page: HTMLElement,\n // Possibly obsolete: an action to take when the user clicks a change page button.\n // Current plan is to just let BP add its own change page buttons.\n changePageAction: (next: boolean) => void,\n) {\n currentPage = page;\n adjustDraggablesForLanguage(page);\n currentChangePageAction = changePageAction;\n doShowAnswersInTargets(\n page.getAttribute(\"data-show-answers-in-targets\") === \"true\" ||\n page.getAttribute(\"data-show-target-as-shadow\") === \"true\",\n page,\n );\n // not sure we need this in BP, but definitely for when Bloom desktop goes to another tab.\n savePositions(page);\n\n // Set up event listeners for any change page buttons.\n const changePageButtons = Array.from(\n page.getElementsByClassName(\"bloom-change-page-button\"),\n );\n changePageButtons.forEach((b) =>\n b.addEventListener(\"click\", changePageButtonClicked),\n );\n\n // Hide image titles, which might give too much away, or distract.\n Array.from(document.getElementsByClassName(\"bloom-canvas\")).forEach(\n (container) => {\n (container as HTMLElement).title = \"\";\n },\n );\n Array.from(document.getElementsByClassName(\"bloom-imageContainer\")).forEach(\n (container) => {\n (container as HTMLElement).title = \"\";\n },\n );\n\n // By default, a shadow of any image can be dragged (e.g., to a paint program).\n // We want only dragging that is part of the game to be possible.\n Array.from(page.getElementsByTagName(\"img\")).forEach((img: HTMLElement) => {\n img.setAttribute(\"draggable\", \"false\");\n });\n\n // Record the positions of targets as snap locations and the original positions of draggables.\n // Add event listeners to draggables to start dragging.\n targetPositions = [];\n originalPositions = new Map<HTMLElement, { x: number; y: number }>();\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n const targets: HTMLElement[] = [];\n draggables.forEach((elt: HTMLElement) => {\n const targetId = elt.getAttribute(\"data-draggable-id\");\n const target = page.querySelector(\n `[data-target-of=\"${targetId}\"]`,\n ) as HTMLElement;\n if (target) {\n const x = target.offsetLeft;\n const y = target.offsetTop;\n targetPositions.push({\n x,\n y,\n width: target.offsetWidth,\n height: target.offsetHeight,\n });\n targets.push(target);\n }\n // if it has data-draggable-id, it should be draggable, just not needed\n // for the right answer.\n originalPositions.set(elt, { x: elt.offsetLeft, y: elt.offsetTop });\n // Allow pointermove events even on touch devices. See BL-14502.\n elt.style.touchAction = \"none\";\n elt.addEventListener(\"pointerdown\", startDrag, { capture: true });\n });\n\n const videos = Array.from(page.getElementsByTagName(\"video\"));\n videos.forEach((video) => {\n if (\n video\n .closest(kLegacyCanvasElementSelector)\n ?.hasAttribute(\"data-draggable-id\")\n ) {\n // don't want to show controls on these, because they are typically too small,\n // and the play time is short enough that just click-to-play is fine\n video.classList.add(\"bloom-ui-no-controls\");\n // non-draggable video click detectors are handled separately, see handleVideoClick in video.ts,\n // and in BloomDesktop handleVideoClick in bloomVideo.ts.\n video.addEventListener(\"pointerdown\", playVideo);\n }\n });\n\n // Add event listeners to (other) text items that should play audio when clicked.\n const dontPlayWhenClicked = draggables.concat(targets);\n const otherTextItems = Array.from(\n page.getElementsByClassName(\"bloom-visibility-code-on\"),\n ).filter((e) => {\n var top = e.closest(kLegacyCanvasElementSelector) as HTMLElement;\n if (!top) {\n // don't think this can happen with current game templates,\n // but if there's some other text on the page, may as well play when clicked\n // if it can.\n return true;\n }\n // draggables play as well as doing more complex things when clicked.\n // targets don't need to play.\n return dontPlayWhenClicked.indexOf(top) < 0;\n });\n otherTextItems.forEach((e) => {\n e.addEventListener(\"pointerdown\", playAudioOfTarget);\n });\n\n // Add event listeners to check, try again, and show correct buttons.\n const checkButtons = Array.from(\n page.getElementsByClassName(\"check-button\"),\n );\n const tryAgainButtons = Array.from(\n page.getElementsByClassName(\"try-again-button\"),\n );\n const showCorrectButtons = Array.from(\n page.getElementsByClassName(\"show-correct-button\"),\n );\n\n checkButtons.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", performCheck);\n });\n tryAgainButtons.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", performTryAgain);\n });\n showCorrectButtons.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", showCorrect);\n });\n\n const soundItems = Array.from(page.querySelectorAll(\"[data-sound]\"));\n soundItems.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", playSoundOf);\n });\n\n prepareOrderSentenceActivity(page);\n\n // Slider: // for drag-word-chooser-slider\n // setupWordChooserSlider(page);\n // setSlideablesVisibility(page, false);\n // // We may not want to immediately play the first word, because we may want to play some\n // // other stuff first. So we call this (before playInitialElements, so the word is given\n // // the bloom-activeTextBox class) but tell it not to play.\n // // The element with bloom-activeTextBox is put into the list of things that playInitialElements\n // // will play, after everything else that should happen initially.\n\n // showARandomWord(page, false);\n // setupSliderImageEvents(page);\n}\n\n// Break any order-sentence element into words and\n// randomize word order in sentence for reader to sort\nconst prepareOrderSentenceActivity = (page: HTMLElement) => {\n Array.from(page.getElementsByClassName(\"drag-item-order-sentence\")).forEach(\n (elt: HTMLElement) => {\n const contentElt = elt.getElementsByClassName(\n \"bloom-content1 bloom-visibility-code-on\",\n )[0] as HTMLElement;\n const content = contentElt?.textContent?.trim();\n if (!content) return;\n const words = content.split(\" \");\n const shuffledWords = shuffle(words);\n const container = page.ownerDocument.createElement(\"div\");\n container.classList.add(\"drag-item-random-sentence\");\n container.setAttribute(\"data-answer\", content);\n makeWordItems(page, shuffledWords, container, contentElt, true);\n container.style.left = elt.style.left;\n container.style.top = elt.style.top;\n container.style.width = elt.style.width;\n elt.parentElement?.insertBefore(container, elt);\n },\n );\n};\n\nconst playVideo = (e: MouseEvent) => {\n const video = e.currentTarget as HTMLVideoElement;\n video.play();\n};\n\n// Cleans up whatever prepareActivity() did, especially when switching to another tab.\n// May also be useful to do when switching pages in player. If not, we may want to move\n// this out of this runtime file; but it's nice to keep it with prepareActivity.\nexport function undoPrepareActivity(page: HTMLElement) {\n restorePositions();\n // In case we do more editing after leaving the Play tab, we don't want to restore the same positions again\n // if we leave the page completely.\n positionsToRestore = [];\n\n const changePageButtons = Array.from(\n page.getElementsByClassName(\"bloom-change-page-button\"),\n );\n changePageButtons.forEach((b) =>\n b.removeEventListener(\"click\", changePageButtonClicked),\n );\n\n Array.from(page.getElementsByClassName(\"bloom-visibility-code-on\")).forEach(\n (e) => {\n e.removeEventListener(\"pointerdown\", playAudioOfTarget);\n },\n );\n\n page.querySelectorAll(\"[data-draggable-id]\").forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"pointerdown\", startDrag, { capture: true });\n });\n\n Array.from(page.getElementsByTagName(\"img\")).forEach((img: HTMLElement) => {\n img.removeAttribute(\"draggable\");\n });\n\n const videos = Array.from(page.getElementsByTagName(\"video\"));\n videos.forEach((video) => {\n video.removeEventListener(\"pointerdown\", playVideo);\n video.classList.remove(\"bloom-ui-no-controls\");\n });\n const checkButtons = Array.from(\n page.getElementsByClassName(\"check-button\"),\n );\n const tryAgainButtons = Array.from(\n page.getElementsByClassName(\"try-again-button\"),\n );\n const showCorrectButtons = Array.from(\n page.getElementsByClassName(\"show-correct-button\"),\n );\n\n checkButtons.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", performCheck);\n });\n showCorrectButtons.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", showCorrect);\n });\n tryAgainButtons.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", performTryAgain);\n });\n\n // In Bloom Player, this will have been done by other play code, since data-sound is not\n // specific to games. But we're adding a listener for the same function, so it doesn't matter.\n // In Bloom desktop, we need this to make clicking data-sound elements work in Play mode.\n const soundItems = Array.from(page.querySelectorAll(\"[data-sound]\"));\n soundItems.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", playSoundOf);\n });\n\n Array.from(\n page.getElementsByClassName(\"drag-item-random-sentence\"),\n ).forEach((elt: HTMLElement) => {\n elt.parentElement?.removeChild(elt);\n });\n const inPlayer = page.closest(\".swiper-slide\") !== null;\n doShowAnswersInTargets(!inPlayer, page);\n //Slider: setSlideablesVisibility(page, true);\n // Array.from(page.getElementsByTagName(\"img\")).forEach((img: HTMLElement) => {\n // img.removeEventListener(\"click\", clickSliderImage);\n // });\n}\n\nexport const playSoundOf = (e: MouseEvent) => {\n const elt = e.currentTarget as HTMLElement;\n const soundFile = elt.getAttribute(\"data-sound\");\n if (soundFile) {\n playSound(elt, soundFile);\n }\n // Not needed in Play tab, but in Bloom Player, the click would otherwise cause\n // a toggle between full screen and showing toolbars.\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst playAudioOfTarget = (e: PointerEvent) => {\n const target = e.currentTarget as HTMLElement;\n playAudioOf(target);\n};\n\nconst playAudioOf = (element: HTMLElement) => {\n const playables = getAudioSentencesOfVisibleEditables(element);\n playAllAudio(playables, element.closest(\".bloom-page\") as HTMLElement);\n};\n\nexport function getAudioSentencesOfVisibleEditables(\n element: HTMLElement,\n): HTMLElement[] {\n const possibleElements = getVisibleEditables(element);\n return getAudioSentences(possibleElements);\n}\n\nfunction makeWordItems(\n page: HTMLElement,\n words: string[],\n container: HTMLElement,\n // Something that has the right user-defined style class to apply to the words.\n // May be a bloom-content1 child of the original sentence, or a word item\n // previously created by this function.\n contentElt: HTMLElement,\n // Should the reader be able to drag the words? Not when we're using this\n // to show the correct answer.\n makeDraggable: boolean,\n) {\n const userStyle =\n Array.from(contentElt?.classList)?.find((c) => c.endsWith(\"-style\")) ??\n \"Normal-style\";\n // We need to set the lang attribute on the words to get the right default font. See BL-14885.\n const lang = contentElt?.getAttribute(\"lang\");\n words.forEach((word) => {\n const wordItem = page.ownerDocument.createElement(\"div\");\n wordItem.classList.add(\"drag-item-order-word\");\n wordItem.textContent = word;\n container.appendChild(wordItem);\n wordItem.classList.add(userStyle);\n if (lang) {\n wordItem.setAttribute(\"lang\", lang);\n }\n if (makeDraggable) {\n wordItem.addEventListener(\"pointerdown\", startDragWordInSentence);\n }\n });\n}\n\nfunction changePageButtonClicked(e: MouseEvent) {\n const next = (e.currentTarget as HTMLElement).classList.contains(\n \"bloom-next-page\",\n );\n currentChangePageAction?.(next);\n}\n\nexport function playInitialElements(page: HTMLElement, playVideos: boolean) {\n const initialFilter = (e) => {\n const ce = e.closest(kLegacyCanvasElementSelector) as HTMLElement;\n if (!ce) {\n // not a canvas element at all. Maybe not possible in a drag-activity, but just in case\n return false;\n }\n if (ce.classList.contains(\"draggable-text\")) {\n return false; // draggable items are played only when clicked\n }\n if (ce.hasAttribute(\"data-draggable-id\")) {\n return false; // another indication of a draggable item; in fact, the one above might be obsolete\n }\n if (ce.classList.contains(\"drag-item-order-sentence\")) {\n return false; // This would give away the answer\n }\n if (ce.classList.contains(\"bloom-wordChoice\")) {\n return false; // Only one of these should be played, after any instructions\n }\n // This might be redundant since they are not visible, but just in case\n if (\n ce.classList.contains(\"drag-item-correct\") ||\n ce.classList.contains(\"drag-item-wrong\")\n ) {\n return false; // These are only played after they become visible\n }\n return true;\n };\n const audioElements = getVisibleEditables(page).filter(initialFilter);\n\n //Slider: // This is used in drag-word-chooser-slider to mark the text item the user is currently\n // // finding a matching image for. In that activity, it should be played last (after\n // // the instructions.)\n // const activeTextBox = page.getElementsByClassName(\n // \"bloom-activeTextBox\"\n // )[0] as HTMLElement;\n // if (activeTextBox) {\n // audioElements.push(activeTextBox);\n // }\n const playables = getAudioSentences(audioElements);\n if (playVideos) {\n const videoElements = Array.from(\n page.getElementsByTagName(\"video\"),\n ).filter(initialFilter);\n playAllVideo(videoElements, () => playAllAudio(playables, page));\n } else {\n playAllAudio(playables, page);\n }\n}\n\n// Allows a client (currently BloomPlayer) to insert a function that will be called\n// when the user checks the correctness of a page. It should be called every time\n// they check, though currently only the first time on each page counts.\nlet reportScore: (possible: number, actual: number) => void = (\n possible,\n actual,\n) => {};\n\nexport function setReportScore(\n reportScoreFunction: (possible: number, actual: number) => void,\n) {\n reportScore = reportScoreFunction;\n}\n\nfunction getAudioSentences(editables: HTMLElement[]) {\n // Could be done more cleanly with flatMap or flat() but not ready to switch to es2019 yet.\n const result: HTMLElement[] = [];\n editables.forEach((e) => {\n if (e.classList.contains(kAudioSentence)) {\n result.push(e);\n }\n result.push(\n ...(Array.from(\n e.getElementsByClassName(kAudioSentence),\n ) as HTMLElement[]),\n );\n });\n return result;\n}\n\nfunction getVisibleEditables(container: HTMLElement) {\n // We want to play any audio we have from divs the user can see.\n // This is a crude test, but currently we always use display:none to hide unwanted languages.\n const result = Array.from(\n container.getElementsByClassName(\"bloom-editable\"),\n ).filter(\n (e) => window.getComputedStyle(e).display !== \"none\",\n ) as HTMLElement[];\n if (\n container.classList.contains(\"bloom-editable\") &&\n window.getComputedStyle(container).display !== \"none\"\n ) {\n result.push(container);\n }\n return result;\n}\n\nexport function shuffle<T>(\n array: T[],\n areItemsTheSame?: (a: T, b: T) => boolean,\n): T[] {\n // something Copilot came up with. Otherwise known as the Fisher–Yates Shuffle as discussed\n // at https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array.\n // Getting the output to always be visibly different when input items can visually be the same (as for\n // letters in a word that are repeated) adds complications before and after the guts of the computation.\n // See BL-14446.\n\n // simplify code below by providing a default function\n if (!areItemsTheSame)\n areItemsTheSame = (a: T, b: T) => {\n return a === b;\n };\n let allItemsAreTheSame = true;\n for (let i = 1; i < array.length; ++i) {\n if (!areItemsTheSame(array[0], array[i])) {\n allItemsAreTheSame = false;\n break;\n }\n }\n if (allItemsAreTheSame) return array; // shuffling not needed, wouldn't work anyway\n\n const originalArray = array.slice();\n let bestChanges = 0;\n let bestResult = originalArray;\n let loopCount = 0;\n // Note that each time through the loop uses the output of the previous iteration\n // as its input.\n while (loopCount++ < 10) {\n // BEGIN Fisher-Yates shuffle\n let currentIndex = array.length,\n randomIndex;\n while (0 !== currentIndex) {\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n [array[currentIndex], array[randomIndex]] = [\n array[randomIndex],\n array[currentIndex],\n ];\n }\n // END Fisher-Yates shuffle\n\n // Check whether the shuffling has had an actual visible effect.\n // Save the array with the largest number of changes while the\n // loop is processing.\n let changes = 0;\n for (let i = 0; i < array.length; ++i) {\n if (!areItemsTheSame(array[i], originalArray[i])) ++changes;\n }\n if (changes === array.length) return array; // It can't get better on this simplistic measure.\n if (changes > bestChanges) {\n bestChanges = changes;\n bestResult = array.slice();\n }\n }\n // callers may depend on the array being modified in place.\n for (let i = 0; i < array.length; ++i) array[i] = bestResult[i];\n return array;\n}\n\n// This method can be passed to shuffle to test letters embedded in draggable HTML elements.\nexport function isTheTextInDraggablesTheSame(\n a: HTMLElement,\n b: HTMLElement,\n): boolean {\n return a.innerText.trim() === b.innerText.trim();\n}\n\n// Put the page into the mode that shows the correct answers.\nconst showCorrect = (e: MouseEvent) => {\n if (!currentPage) {\n return; // huh?? but makes TS happy\n }\n restorePositions(); // any distractors return to start positions.\n currentPage\n .querySelectorAll(\"[data-draggable-id]\")\n .forEach((elt: HTMLElement) => {\n const targetId = elt.getAttribute(\"data-draggable-id\");\n const target = currentPage?.querySelector(\n `[data-target-of=\"${targetId}\"]`,\n ) as HTMLElement;\n if (!target) {\n return; // this one is not required to be in a right place\n }\n // IF the element has not been moved to a target, elt is showing up here with\n // an offsetWidth of 0 and an offsetHeight of 0 because the element has been\n // made invisible by the check answer response. So we'll fall back to getting\n // the width and height from the style attribute. See BL-14600\n let eltWidth = elt.offsetWidth;\n if (!eltWidth) {\n const w = elt.style.width.replace(\"px\", \"\");\n eltWidth = Number.parseInt(w, 10);\n }\n let eltHeight = elt.offsetHeight;\n if (!eltHeight) {\n const h = elt.style.height.replace(\"px\", \"\");\n eltHeight = Number.parseInt(h, 10);\n }\n const x = target.offsetLeft + (target.offsetWidth - eltWidth) / 2;\n const y = target.offsetTop + (target.offsetHeight - eltHeight) / 2;\n elt.style.left = x + \"px\";\n elt.style.top = y + \"px\";\n });\n Array.from(\n currentPage.getElementsByClassName(\"drag-item-random-sentence\"),\n ).forEach((container: HTMLElement) => {\n const correctAnswer =\n container.getAttribute(\"data-answer\")?.split(\" \") ?? [];\n const userStyleSource = container.children[0] as HTMLElement; // before we wipe them!\n container.innerHTML = \"\";\n makeWordItems(\n currentPage!,\n correctAnswer,\n container,\n userStyleSource,\n false,\n );\n });\n classSetter(currentPage!, \"drag-activity-wrong\", false);\n classSetter(currentPage!, \"drag-activity-solution\", true);\n};\n\n// where the mouse started the drag, relative to the top left of dragTarget\nlet dragStartX = 0;\nlet dragStartY = 0;\nlet dragTarget: HTMLElement;\nlet snapped = false;\n\n// Bloom desktop has a function getScale, but we do NOT want to use that here\n// because it is not available in Bloom Reader and we don't want to add a dependency.\n// So we define our own.\nconst getScale = (page: HTMLElement) =>\n page.getBoundingClientRect().width / page.offsetWidth;\n\nconst startDrag = (e: PointerEvent) => {\n if (e.button !== 0) return; // only left button\n if (e.ctrlKey) return; // ignore ctrl+click\n e.preventDefault(); // e.g., don't do default drag of child image\n const target = e.currentTarget as HTMLElement;\n dragTarget = target;\n const page = target.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n // get the mouse cursor position at startup relative to the top left.\n dragStartX = e.clientX / scale - target.offsetLeft;\n dragStartY = e.clientY / scale - target.offsetTop;\n target.setPointerCapture(e.pointerId);\n target.addEventListener(\"pointerup\", stopDrag);\n target.addEventListener(\"pointermove\", elementDrag);\n playAudioOf(target);\n target.classList.add(\"bloom-ui-dragging\");\n dragTarget.classList.remove(\"bloom-draggedToTarget\");\n};\n\nconst elementDrag = (e: PointerEvent) => {\n const page = dragTarget.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n e.preventDefault();\n let x = e.clientX / scale - dragStartX;\n let y = e.clientY / scale - dragStartY;\n let deltaMin = Number.MAX_VALUE;\n snapped = false;\n let xBest = x;\n let yBest = y;\n for (const slot of targetPositions) {\n const offsetX = (slot.width - dragTarget.offsetWidth) / 2;\n const offsetY = (slot.height - dragTarget.offsetHeight) / 2;\n // if this target were centered in this slot, it would be at slot.x + offsetX, slot.y + offsetY\n const deltaX = slot.x + offsetX - x;\n const deltaY = slot.y + offsetY - y;\n const delta = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n if (delta < deltaMin) {\n deltaMin = delta;\n xBest = slot.x + offsetX;\n yBest = slot.y + offsetY;\n }\n }\n if (deltaMin < 50) {\n // review: how close do we want?\n x = xBest;\n y = yBest;\n snapped = true;\n }\n dragTarget.style.top = y + \"px\";\n dragTarget.style.left = x + \"px\";\n};\n\nconst stopDrag = (e: PointerEvent) => {\n // If they let go at a place that isn't a snap position at all, put it back where it was.\n if (!snapped) {\n const oldPosition = originalPositions.get(dragTarget);\n dragTarget.style.top = oldPosition?.y + \"px\";\n dragTarget.style.left = oldPosition?.x + \"px\";\n dragTarget.classList.remove(\"bloom-draggedToTarget\");\n } else {\n dragTarget.classList.add(\"bloom-draggedToTarget\");\n }\n dragTarget.classList.remove(\"bloom-ui-dragging\");\n dragTarget.removeEventListener(\"pointerup\", stopDrag);\n dragTarget.removeEventListener(\"pointermove\", elementDrag);\n\n // If there was already a draggable in that slot, move the one we are replacing\n // back to its original position.\n // Enhance: animate?\n const page = dragTarget.closest(\".bloom-page\") as HTMLElement;\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n draggables.forEach((elt: HTMLElement) => {\n if (elt === dragTarget) {\n return;\n }\n if (rightPosition(elt, dragTarget)) {\n const originalPosition = originalPositions.get(elt);\n if (originalPosition) {\n elt.style.left = originalPosition.x + \"px\";\n elt.style.top = originalPosition.y + \"px\";\n elt.classList.remove(\"bloom-draggedToTarget\");\n }\n }\n });\n};\n\nconst getVisibleText = (elt: HTMLElement): string => {\n const visibleDivs = getVisibleEditables(elt);\n return Array.from(visibleDivs)\n .map((elt: HTMLElement) => elt.textContent)\n .join(\" \");\n};\n\nconst rightPosition = (draggableToCheck: HTMLElement, target: HTMLElement) => {\n // Note: in some cases, some of the draggables and their targets are hidden (e.g.,\n // the word spelling game keeps letter draggables that are not needed for the\n // current word in case they are needed in another language.)\n // These automatically register as correct, because offsetLeft and offsetTop return zero\n // for display:none elements, so the position we get for the draggable and the target are\n // both (0,0). This is what we want, since the user can't be faulted for not dragging\n // invisible elements to the right place.\n const actualX = draggableToCheck.offsetLeft;\n const actualY = draggableToCheck.offsetTop;\n const correctX =\n target.offsetLeft +\n (target.offsetWidth - draggableToCheck.offsetWidth) / 2;\n const correctY =\n target.offsetTop +\n (target.offsetHeight - draggableToCheck.offsetHeight) / 2;\n return (\n // At least a half-pixel error can occur just from centering the draggable in the target.\n Math.abs(correctX - actualX) < 0.6 && Math.abs(correctY - actualY) < 0.6\n );\n};\n\nexport const performCheck = (e: MouseEvent) => {\n const target = e.currentTarget as HTMLElement;\n const page = target.closest(\".bloom-page\") as HTMLElement;\n const allCorrect = checkDraggables(page) && checkRandomSentences(page);\n\n showCorrectOrWrongItems(page, allCorrect);\n // Enhance: plausibly we could count the targets and report the total\n // number and the number that contain the right draggable, but it's more\n // consistent with older games to just report success or failure.\n reportScore(1, allCorrect ? 1 : 0);\n\n return allCorrect;\n};\n\nexport const performTryAgain = (e: MouseEvent) => {\n const target = e.currentTarget as HTMLElement;\n const page = target.closest(\".bloom-page\") as HTMLElement;\n classSetter(page, \"drag-activity-correct\", false);\n classSetter(page, \"drag-activity-wrong\", false);\n //currently I don't think it could be set here, but make sure.\n classSetter(page, \"drag-activity-solution\", false);\n // Restore everything to the starting positions. BL-14482.\n restorePositions();\n};\n\nexport const classSetter = (\n page: HTMLElement,\n className: string,\n wanted: boolean,\n) => {\n if (wanted) {\n page.parentElement?.classList.add(className);\n } else {\n page.parentElement?.classList.remove(className);\n }\n};\n\nlet draggableReposition: HTMLElement;\nlet wordBeingRepositioned: HTMLElement;\n\n// The default sounds have to be found in different ways depending on whether we are running\n// in Bloom desktop or Bloom Player. Conditional code is particularly tricky because bloom-player\n// imports these sounds using a vite trick that results in a URL with a hash in it that changes\n// each version. The simplest thing is for this code to just have a way the host can initialize\n// what it wants.\nlet defaultCorrectSoundUrl: string | undefined;\nlet defaultWrongSoundUrl: string | undefined;\n\nexport function setDefaultSoundUrls(\n correctSoundUrl: string | undefined,\n wrongSoundUrl: string | undefined,\n) {\n defaultCorrectSoundUrl = correctSoundUrl;\n defaultWrongSoundUrl = wrongSoundUrl;\n}\n\nfunction showCorrectOrWrongItems(page: HTMLElement, correct: boolean) {\n classSetter(page, \"drag-activity-correct\", correct);\n classSetter(page, \"drag-activity-wrong\", !correct);\n\n // play sound\n let soundFile = page.getAttribute(\n correct ? \"data-correct-sound\" : \"data-wrong-sound\",\n );\n const playOtherStuff = () => {\n const elementsMadeVisible = Array.from(\n page.getElementsByClassName(\n correct ? \"drag-item-correct\" : \"drag-item-wrong\",\n ),\n ) as HTMLElement[];\n const possibleNarrationElements: HTMLElement[] = [];\n const videoElements: HTMLVideoElement[] = [];\n elementsMadeVisible.forEach((e) => {\n possibleNarrationElements.push(...getVisibleEditables(e));\n videoElements.push(...Array.from(e.getElementsByTagName(\"video\")));\n });\n const playables = getAudioSentences(possibleNarrationElements);\n playAllVideo(videoElements, () => playAllAudio(playables, page));\n };\n // if the attribute is not there at all, use the default sound, if one has been set.\n // This is not in relative to the audio folder in the book, so we won't add a prefix\n // in that case.\n const addPrefix = soundFile !== null;\n if (soundFile === null) {\n soundFile = correct ? defaultCorrectSoundUrl : defaultWrongSoundUrl;\n } else if (soundFile === \"none\") {\n // explicity no sound, go straight to other stuff if any\n soundFile = undefined;\n }\n if (soundFile) {\n playSound(page, soundFile, addPrefix);\n } else {\n playOtherStuff();\n }\n}\n\nfunction playSound(someElt: HTMLElement, soundFile: string, addPrefix = true) {\n const audio = new Audio(\n (addPrefix ? urlPrefix() + \"/audio/\" : \"\") + soundFile,\n );\n if (IsRunningOnBloomDesktop(someElt)) {\n audio.classList.add(\"bloom-ui\"); // in case remove code fails, should make sure it doesn't get saved.\n }\n audio.style.visibility = \"hidden\";\n // To my surprise, in BP storybook it works without adding the audio to any document.\n // But in Bloom proper, it does not. I think it is because this code is part of the toolbox,\n // so the audio element doesn't have the right context to interpret the relative URL.\n someElt.append(audio);\n audio.play();\n // It feels cleaner if we remove it when done. This could fail, e.g., if the user\n // switches tabs or pages before we get done playing. Removing it immediately\n // prevents the sound being played. It's not a big deal if it doesn't get removed.\n audio.addEventListener(\n \"ended\",\n () => {\n someElt.removeChild(audio);\n },\n { once: true },\n );\n}\n\nfunction checkDraggables(page: HTMLElement) {\n let allCorrect = true;\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n draggables.forEach((draggableToCheck: HTMLElement) => {\n const targetId = draggableToCheck.getAttribute(\"data-draggable-id\");\n const target = page.querySelector(\n `[data-target-of=\"${targetId}\"]`,\n ) as HTMLElement;\n if (!target) {\n // this one is not required to be in a right place.\n // Possibly we might one day need to check that it has NOT been dragged to a target.\n // But for now, we only allow one draggable per target, so if this has been wrongly\n // used some other one will not be in the right place.\n return;\n }\n\n if (!rightPosition(draggableToCheck, target)) {\n // It's not in the expected place. But perhaps one with the same text is?\n // This only applies if it's a text item.\n // (don't use getElementsByClassName here...there could be a TG on an image description of\n // a picture. To be a text item it must have a direct child that is a TG.)\n if (\n !Array.from(draggableToCheck.children).some((x) =>\n x.classList.contains(\"bloom-translationGroup\"),\n )\n ) {\n // not a text item. Two images or videos with the same (empty) text are not equivalent.\n allCorrect = false;\n return;\n }\n const visibleText = getVisibleText(draggableToCheck);\n if (\n !draggables.some((otherDraggable: HTMLElement) => {\n if (otherDraggable === draggableToCheck) {\n return false; // already know this draggable is not at the right place\n }\n if (getVisibleText(otherDraggable) !== visibleText) {\n return false; // only interested in ones with the same text\n }\n return rightPosition(otherDraggable, target);\n })\n ) {\n allCorrect = false;\n }\n }\n });\n return allCorrect;\n}\n\nlet placeHolder: HTMLElement | undefined;\nlet startWidth = 0;\nconst draggableWordMargin = 5; // enhance: compute from element\n\nfunction startDragWordInSentence(e: PointerEvent) {\n if (e.button !== 0) return; // only left button\n if (e.ctrlKey) return; // ignore ctrl+click\n\n // get the pointer position etc. at startup:\n wordBeingRepositioned = e.currentTarget as HTMLElement;\n startWidth = wordBeingRepositioned.offsetWidth; // includes original padding but not margin\n const page = wordBeingRepositioned.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n dragStartX = e.clientX / scale - wordBeingRepositioned.offsetLeft;\n dragStartY = e.clientY / scale - wordBeingRepositioned.offsetTop;\n\n // Leave the original where it was and make a copy to drag around.\n draggableReposition =\n wordBeingRepositioned.ownerDocument.createElement(\"div\");\n wordBeingRepositioned.classList.forEach((c) =>\n draggableReposition.classList.add(c),\n );\n //draggableReposition.classList.add(\"drag-item-order-word\");\n draggableReposition.textContent = wordBeingRepositioned.textContent;\n draggableReposition.style.position = \"absolute\";\n draggableReposition.style.left = wordBeingRepositioned.offsetLeft + \"px\";\n draggableReposition.style.top = wordBeingRepositioned.offsetTop + \"px\";\n draggableReposition.setAttribute(\n \"lang\",\n wordBeingRepositioned.getAttribute(\"lang\")!,\n );\n // We don't want it to show while we're dragging the clone. We need something to take up the space,\n // though, until we decide it has moved. We could mess with its own properties, but then we have\n // to put everything back. Also, we want to move it in the paragraph, and if we move the thing\n // itself, we seem to lose our mouse capture. So we make a placeholder to take up the space.\n placeHolder = makeAnimationPlaceholder(wordBeingRepositioned);\n // don't add padding here, target still has it. Capture this before we hide it.\n placeHolder.style.width = startWidth + draggableWordMargin + \"px\";\n wordBeingRepositioned.parentElement?.insertBefore(\n placeHolder,\n wordBeingRepositioned,\n );\n wordBeingRepositioned.style.display = \"none\";\n\n // It's bizarre to put the listeners and pointer capture on the target, which is NOT being dragged,\n // rather than the draggableReposition, which is. But it doesn't work to setPointerCapture on\n // the draggableReposition. I think it's because the draggableReposition is not the object clicked.\n // And once the mouse events are captured by the target, all mouse events go to that, so we get\n // them properly while dragging, and can use them to move the draggableReposition.\n wordBeingRepositioned.setPointerCapture(e.pointerId);\n wordBeingRepositioned.addEventListener(\"pointerup\", stopDragWordInSentence);\n wordBeingRepositioned.addEventListener(\"pointermove\", dragWordInSentence);\n // not sure we need this.\n // recommended by https://www.redblobgames.com/making-of/draggable/ to prevent touch movement\n // dragging the page behind the draggable element.\n wordBeingRepositioned.addEventListener(\"touchstart\", preventTouchDefault);\n wordBeingRepositioned.parentElement?.appendChild(draggableReposition);\n}\n\nconst preventTouchDefault = (e: TouchEvent) => {\n e.preventDefault();\n};\n\nlet lastItemDraggedOver: HTMLElement | undefined;\n\nconst dragWordInSentence = (e: PointerEvent) => {\n const page = draggableReposition.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n e.preventDefault();\n const x = e.clientX / scale - dragStartX;\n const y = e.clientY / scale - dragStartY;\n\n draggableReposition.style.top = y + \"px\";\n draggableReposition.style.left = x + \"px\";\n\n if (animationInProgress) {\n return;\n }\n const container = wordBeingRepositioned.parentElement!;\n const itemDraggedOver = Array.from(container.children).find((c) => {\n const rect = c.getBoundingClientRect();\n return (\n c !== wordBeingRepositioned &&\n c !== placeHolder &&\n c !== draggableReposition &&\n e.clientX > rect.left &&\n e.clientX < rect.right &&\n e.clientY > rect.top &&\n e.clientY < rect.bottom\n );\n });\n\n // If we don't check for a different item, then when we drag a short word over a long one, the mouse\n // may still be over the long word when the animation finishes, at which point it unhelpfully moves\n // back.\n if (itemDraggedOver && itemDraggedOver !== lastItemDraggedOver) {\n const children = Array.from(container.children);\n if (\n children.indexOf(itemDraggedOver) > children.indexOf(placeHolder!)\n ) {\n // moving right; it wants to go after the thing we dragged onto.\n // (It's OK if nextSibling is null; gets inserted at end, which is what we want.)\n animateMove(() => {\n container.insertBefore(\n placeHolder!,\n itemDraggedOver.nextSibling,\n );\n });\n } else {\n // moving left; it wants to go before the thing we dragged onto.\n animateMove(() => {\n container.insertBefore(placeHolder!, itemDraggedOver);\n });\n }\n } else {\n // moved outside the sentence altogether. If we're below or to the right of the last item,\n // move to the end. Enhance: should we move to the front if we're above or to the left?\n const relatedItems = Array.from(\n wordBeingRepositioned.parentElement!.getElementsByClassName(\n \"drag-item-order-word\",\n ),\n ).filter(\n (x) =>\n x !== wordBeingRepositioned &&\n x !== placeHolder &&\n x !== draggableReposition,\n ) as HTMLElement[];\n const lastItem = relatedItems[relatedItems.length - 1];\n const bounds = lastItem.getBoundingClientRect();\n if (\n e.clientY > bounds.bottom ||\n (e.clientX > bounds.right && e.clientY > bounds.top)\n ) {\n animateMove(() => {\n container.appendChild(placeHolder!);\n });\n }\n }\n lastItemDraggedOver = itemDraggedOver as HTMLElement;\n};\n\nconst stopDragWordInSentence = (e: PointerEvent) => {\n e.preventDefault();\n wordBeingRepositioned.style.visibility = \"visible\";\n wordBeingRepositioned.removeEventListener(\n \"pointerup\",\n stopDragWordInSentence,\n );\n wordBeingRepositioned.removeEventListener(\n \"pointermove\",\n dragWordInSentence,\n );\n wordBeingRepositioned.releasePointerCapture(e.pointerId); // redundant I think\n wordBeingRepositioned.removeEventListener(\n \"touchstart\",\n preventTouchDefault,\n );\n // We're getting rid of this, so we don't need to remove the event handlers it has.\n draggableReposition.parentElement?.removeChild(draggableReposition);\n\n wordBeingRepositioned.parentElement?.insertBefore(\n wordBeingRepositioned,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n placeHolder!,\n );\n wordBeingRepositioned.parentElement?.removeChild(placeHolder!);\n placeHolder = undefined;\n wordBeingRepositioned.style.display = \"\"; // show it again\n};\n\nfunction makeAnimationPlaceholder(itemBeingRepositioned: HTMLElement) {\n const placeholder = itemBeingRepositioned.cloneNode(true) as HTMLElement;\n placeholder.style.overflowX = \"hidden\";\n placeholder.style.marginRight = \"0\"; // clear all these so it can shrink to taking up no space at all.\n placeholder.style.paddingLeft = \"0\";\n placeholder.style.paddingRight = \"0\";\n placeholder.style.display = \"\"; // in case it was display:none\n placeholder.style.visibility = \"hidden\"; //just takes up space for animation\n return placeholder;\n}\n\nlet animationInProgress = false;\n\nfunction animateMove(movePlaceholder: () => void) {\n animationInProgress = true;\n const duration = 200;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const container = wordBeingRepositioned.parentElement!;\n const duplicate = makeAnimationPlaceholder(wordBeingRepositioned);\n container.insertBefore(duplicate, placeHolder!);\n movePlaceholder();\n const start = Date.now();\n\n const step = () => {\n const elapsed = Date.now() - start;\n const fraction = Math.min(elapsed / duration, 1);\n // This width includes the original padding and margin, so that it takes up the original space\n // to begin with, but can drop to zero.\n const originalWordWidth = startWidth + draggableWordMargin;\n if (!placeHolder) {\n // terminated by mouseUp\n container.removeChild(duplicate);\n animationInProgress = false;\n return;\n }\n placeHolder.style.width = originalWordWidth * fraction + \"px\";\n duplicate.style.width = originalWordWidth * (1 - fraction) + \"px\";\n if (fraction < 1) {\n requestAnimationFrame(step);\n } else {\n // animation is over, clean up.\n container.removeChild(duplicate);\n placeHolder.style.width = originalWordWidth + \"px\"; // previous step might not have reached full size\n animationInProgress = false;\n }\n };\n requestAnimationFrame(step);\n}\nfunction checkRandomSentences(page: HTMLElement) {\n const sentences = page.getElementsByClassName(\"drag-item-random-sentence\");\n for (let i = 0; i < sentences.length; i++) {\n const sentence = sentences[i];\n // We check the expected text rather than the expected order of the child\n // elements, because it automatically handles the possibility of repeated words.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const correctAnswerWords = sentence\n .getAttribute(\"data-answer\")!\n .split(\" \");\n const actualWordElements = Array.from(sentence.children);\n for (let j = 0; j < actualWordElements.length; j++) {\n const item = actualWordElements[j];\n if (item.textContent !== correctAnswerWords[j]) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport const doShowAnswersInTargets = (showNow: boolean, page: HTMLElement) => {\n // Restrict the search to the current page, so that we don't accidentally find a target on another page.\n // This is important because the targetId is not necessarily unique across pages if users use the default\n // draggables that come with the page.\n const draggables = page.querySelectorAll(\":scope [data-draggable-id]\");\n if (showNow) {\n draggables.forEach((draggable) => {\n copyContentToTarget(draggable as HTMLElement);\n });\n } else {\n draggables.forEach((draggable) => {\n removeContentFromTarget(draggable as HTMLElement);\n });\n }\n};\n\nexport function copyContentToTarget(draggable: HTMLElement) {\n const target = getTarget(draggable);\n if (!target) {\n return;\n }\n // We want to copy the content of the draggable, with several exceptions.\n // To reduce flicker, we do the manipulations on a temporary element, and\n // only copy into the actual target if there is actually a change.\n // (Flicker is particularly likely with changes that don't affect the\n // target, like adding and removing the image editing buttons.)\n let throwAway = target.ownerDocument.createElement(\"div\");\n throwAway.innerHTML = draggable.innerHTML;\n\n // Don't need the bubble controls\n Array.from(throwAway.getElementsByClassName(\"bloom-ui\")).forEach((e) => {\n e.remove();\n });\n // Nor the image editing controls.\n Array.from(throwAway.getElementsByClassName(\"imageOverlayButton\")).forEach(\n (e) => {\n e.remove();\n },\n );\n Array.from(throwAway.getElementsByClassName(\"imageButton\")).forEach((e) => {\n e.remove();\n });\n // Bloom has integrity checks for duplicate ids, and we don't need them in the duplicate content.\n Array.from(throwAway.querySelectorAll(\"[id]\")).forEach((e) => {\n e.removeAttribute(\"id\");\n });\n Array.from(throwAway.getElementsByClassName(\"hoverUp\")).forEach((e) => {\n // Produces at least a change in background color that we don't want.\n e.classList.remove(\"hoverUp\");\n });\n // Content is not editable inside the target.\n Array.from(throwAway.querySelectorAll(\"[contenteditable]\")).forEach((e) => {\n e.removeAttribute(\"contenteditable\");\n });\n // Content is not recordable inside the target.\n Array.from(throwAway.getElementsByClassName(\"ui-audioCurrent\")).forEach(\n (e) => {\n e.classList.remove(\"ui-audioCurrent\");\n },\n );\n // Nor should we able to tab to it, or focus it.\n Array.from(throwAway.querySelectorAll(\"[tabindex]\")).forEach((e) => {\n e.removeAttribute(\"tabindex\");\n });\n let imageContainer = throwAway.getElementsByClassName(\n \"bloom-canvas\",\n )[0] as HTMLElement;\n if (!imageContainer)\n imageContainer = throwAway.getElementsByClassName(\n \"bloom-imageContainer\",\n )[0] as HTMLElement;\n if (imageContainer) {\n // We need another layer to manage clipping and centering. The one we were going to\n // throw away becomes the wrapper, and we add a new throwAway outside it\n const wrapper = throwAway;\n throwAway = target.ownerDocument.createElement(\"div\");\n throwAway.appendChild(wrapper);\n wrapper.classList.add(\"bloom-targetWrapper\");\n // We need the image container size to match the draggable size so that we get the\n // same cropping.\n imageContainer.style.width = draggable.style.width;\n imageContainer.style.height = draggable.style.height;\n // The swiper lazy loading code converts the data-background attribute to the style\n // attribute's backgroundImage property for the draggable element. If this hasn't\n // happened yet, we need to adjust the target to match what the draggable will become.\n let background = imageContainer.getAttribute(\"data-background\");\n if (background && !imageContainer.style.backgroundImage) {\n // See BL-15007 and https://www.w3schools.com/jsref/prop_style_backgroundimage.asp\n if (!background.startsWith(\"url(\"))\n background = \"url(\" + background + \")\";\n imageContainer.style.backgroundImage = background;\n imageContainer.removeAttribute(\"data-background\");\n }\n }\n if (target.innerHTML !== throwAway.innerHTML) {\n target.innerHTML = throwAway.innerHTML;\n }\n}\n\nexport const getTarget = (draggable: HTMLElement): HTMLElement | undefined => {\n const targetId = draggable.getAttribute(\"data-draggable-id\");\n if (!targetId) {\n return undefined;\n }\n // Restrict the search to the current page, so that we don't accidentally find a target on another page.\n // This is important because the targetId is not necessarily unique across pages if users use the default\n // draggables that come with the page.\n return draggable\n .closest(\".bloom-page\")\n .querySelector(`[data-target-of=\"${targetId}\"]`) as HTMLElement;\n};\n\nfunction removeContentFromTarget(draggable: HTMLElement) {\n const target = getTarget(draggable);\n if (target) {\n target.innerHTML = \"\";\n }\n}\n\nexport let draggingSlider = false;\n\n// Setup that is common to Play and design time\nexport function setupWordChooserSlider(page: HTMLElement) {\n //Slider: const wrapper = page.getElementsByClassName(\n // \"bloom-activity-slider\"\n // )[0] as HTMLElement;\n // if (!wrapper) {\n // return; // panic?\n // }\n // wrapper.innerHTML = \"\"; // clear out any existing content.\n // const slider = page.ownerDocument.createElement(\"div\");\n // slider.classList.add(\"bloom-activity-slider-content\");\n // slider.style.left = 0 + \"px\";\n // wrapper.appendChild(slider);\n // dragStartX = 0;\n // const scale = getScale(page);\n // // Review: maybe we should use some sort of fancier slider? This one, for example,\n // // won't have fancy effects like continuing to slide if you flick it.\n // // But it's also possible this is good enough. Not really expecting a lot more items\n // // than will fit.\n // const moveHandler = (e: PointerEvent) => {\n // let x = e.clientX / scale - dragStartX;\n // if (Math.abs(x) > 4) {\n // draggingSlider = true;\n // }\n // if (x > 0) {\n // x = 0;\n // }\n // const maxScroll = Math.max(slider.offsetWidth - wrapper.offsetWidth, 0);\n // if (x < -maxScroll) {\n // x = -maxScroll;\n // }\n // slider.style.left = x + \"px\";\n // };\n // const upHandler = (e: PointerEvent) => {\n // slider.removeEventListener(\"pointermove\", moveHandler);\n // page.ownerDocument.body.removeEventListener(\"pointerup\", upHandler);\n // setTimeout(() => {\n // draggingSlider = false;\n // }, 50);\n // };\n // slider.addEventListener(\"pointerdown\", e => {\n // if (e.button !== 0) return; // only left button\n // if (e.ctrlKey) return; // ignore ctrl+click\n // dragStartX = e.clientX / scale - slider.offsetLeft;\n // slider.addEventListener(\"pointermove\", moveHandler);\n // // We'd like to capture the pointer, and then we could put the up handler on the slider.\n // // But then a click on an image inside the slider never gets the mouse up event, so never\n // // gets a click. So we put the up handler on the body (so that it will get called even if\n // // the up happens outside the slider).\n // //slider.setPointerCapture(e.pointerId);\n // page.ownerDocument.body.addEventListener(\"pointerup\", upHandler);\n // });\n // const imagesToPlace = shuffle(\n // Array.from(page.querySelectorAll(\"[data-img-txt]\"))\n // );\n // imagesToPlace.forEach((imgTop: HTMLElement) => {\n // const img = imgTop.getElementsByTagName(\"img\")[0];\n // let sliderImgSrc = \"\";\n // if (img) {\n // // An older comment said:\n // // Not just img.src: that yields a full URL, which will show the image, but will not match\n // // when we are later trying to find the corresponding original image.\n // // I'm not finding anything that works that way, and the code below finds a full URL\n // sliderImgSrc = img.getAttribute(\"src\")!;\n // } else {\n // WOULD THIS NEED ADJUSTING FOR .bloom-canvas IF THIS CODE WERE RESURRECTED?\n // // In bloom-player, for a forgotten and possibly obsolete reason, we use a background image\n // // on the container. (I vaguely recall it may be important when animating the main image.)\n // const imgContainer = imgTop.getElementsByClassName(\n // \"bloom-imageContainer\"\n // )[0] as HTMLElement;\n // if (!imgContainer) {\n // return; // weird\n // }\n // const bgImg = imgContainer.style.backgroundImage;\n // if (!bgImg) {\n // return; // weird\n // }\n // const start = bgImg.indexOf('\"');\n // const end = bgImg.lastIndexOf('\"');\n // sliderImgSrc = bgImg.substring(start + 1, end);\n // }\n // // not using cloneNode here because I don't want to bring along any alt text that might provide a clue\n // const sliderImg = imgTop.ownerDocument.createElement(\"img\");\n // sliderImg.src = sliderImgSrc;\n // sliderImg.ondragstart = () => false;\n // sliderImg.setAttribute(\n // \"data-img\",\n // imgTop.getAttribute(\"data-img-txt\")!\n // );\n // const sliderItem = imgTop.ownerDocument.createElement(\"div\");\n // sliderItem.classList.add(\"bloom-activity-slider-item\");\n // sliderItem.appendChild(sliderImg);\n // slider.appendChild(sliderItem);\n // });\n // if (slider.offsetWidth > wrapper.offsetWidth) {\n // // We need a slider effect. We want one of the images to be partly visible as a clue that\n // // sliding is possible.\n // const avWidth = slider.offsetWidth / imagesToPlace.length;\n // let indexNearBorder = Math.floor(wrapper.offsetWidth / avWidth);\n // let sliderItem = slider.children[indexNearBorder] as HTMLElement;\n // if (sliderItem.offsetLeft > wrapper.offsetWidth - 30) {\n // // The item we initially selected is mostly off the right edge.\n // // Stretch things to make the previous item half-off-screen.\n // indexNearBorder--;\n // sliderItem = slider.children[indexNearBorder] as HTMLElement;\n // }\n // if (\n // sliderItem.offsetLeft + sliderItem.offsetWidth <\n // wrapper.offsetWidth + 30\n // ) {\n // const oldMarginPx =\n // sliderItem.ownerDocument.defaultView?.getComputedStyle(\n // sliderItem\n // ).marginLeft ?? \"22px\";\n // const oldMargin = parseInt(\n // oldMarginPx.substring(0, oldMarginPx.length - 2)\n // );\n // const desiredLeft =\n // wrapper.offsetWidth - sliderItem.offsetWidth / 2;\n // const newMargin =\n // oldMargin +\n // (desiredLeft - sliderItem.offsetLeft) / indexNearBorder / 2;\n // Array.from(slider.children).forEach((elt: HTMLElement) => {\n // elt.style.marginLeft = newMargin + \"px\";\n // elt.style.marginRight = newMargin + \"px\";\n // });\n // }\n // }\n}\n\n//Slider: const clickSliderImage = (e: MouseEvent) => {\n// if (draggingSlider) {\n// return;\n// }\n// const img = e.currentTarget as HTMLElement;\n// const page = img.closest(\".bloom-page\") as HTMLElement;\n// const activeTextBox = page.getElementsByClassName(\"bloom-activeTextBox\")[0];\n// if (!activeTextBox) {\n// return; // weird\n// }\n// var activeId = activeTextBox.getAttribute(\"data-txt-img\");\n// const imgId = img.getAttribute(\"data-img\");\n// if (activeId === imgId) {\n// const imgTop = page.querySelector(`[data-img-txt=\"${imgId}\"]`);\n// if (!imgTop) {\n// return; // weird\n// }\n// imgTop.classList.remove(\"bloom-hideSliderImage\");\n// setTimeout(() => {\n// if (!showARandomWord(page, true)) {\n// showCorrectOrWrongItems(page, true);\n// }\n// }, 1000); // should roughly correspond to the css transition showing the item\n// } else {\n// showCorrectOrWrongItems(page, false);\n// }\n// };\n\n// function setupSliderImageEvents(page: HTMLElement) {\n// const slider = page.getElementsByClassName(\"bloom-activity-slider\")[0];\n// if (!slider) {\n// return; // panic?\n// }\n// const sliderImages = Array.from(slider.getElementsByTagName(\"img\"));\n// sliderImages.forEach((img: HTMLElement) => {\n// img.addEventListener(\"click\", clickSliderImage);\n// });\n// }\n\n// export function setSlideablesVisibility(page: HTMLElement, visible: boolean) {\n// const slideables = Array.from(page.querySelectorAll(\"[data-img-txt]\"));\n// slideables.forEach((elt: HTMLElement) => {\n// if (visible) {\n// elt.classList.remove(\"bloom-hideSliderImage\");\n// } else {\n// elt.classList.add(\"bloom-hideSliderImage\");\n// }\n// });\n// }\n\n// function showARandomWord(page: HTMLElement, playAudio: boolean) {\n// const possibleWords = Array.from(page.querySelectorAll(\"[data-txt-img]\"));\n// const targetWords = possibleWords.filter(w => {\n// const imgId = w.getAttribute(\"data-txt-img\");\n// const img = page.querySelector(`[data-img-txt=\"${imgId}\"]`);\n// return img?.classList.contains(\"bloom-hideSliderImage\");\n// });\n// possibleWords.forEach(w => {\n// w.classList.remove(\"bloom-activeTextBox\");\n// });\n// if (targetWords.length === 0) {\n// return false;\n// }\n\n// const randomIndex = Math.floor(Math.random() * targetWords.length);\n// targetWords[randomIndex].classList.add(\"bloom-activeTextBox\");\n// if (playAudio) {\n// const playables = getAudioSentences([\n// targetWords[randomIndex] as HTMLElement\n// ]);\n// playAllAudio(playables);\n// }\n// return true;\n// }\n","/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/* jquery.nicescroll\r\n-- version 3.7.6\r\n-- copyright 2017-07-19 InuYaksa*2017\r\n-- licensed under the MIT\r\n--\r\n-- https://nicescroll.areaaperta.com/\r\n-- https://github.com/inuyaksa/jquery.nicescroll\r\n--\r\n*/\r\n\r\n/* jshint expr: true */\r\n\r\n(function (factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as anonymous module.\r\n define(['jquery'], factory);\r\n } else if (typeof exports === 'object') {\r\n // Node/CommonJS.\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n // Browser globals.\r\n factory(jQuery);\r\n }\r\n}(function (jQuery) {\r\n\r\n \"use strict\";\r\n\r\n // globals\r\n var domfocus = false,\r\n mousefocus = false,\r\n tabindexcounter = 0,\r\n ascrailcounter = 2000,\r\n globalmaxzindex = 0;\r\n\r\n var $ = jQuery, // sandbox\r\n _doc = document,\r\n _win = window,\r\n $window = $(_win);\r\n\r\n var delegatevents = [];\r\n\r\n // http://stackoverflow.com/questions/2161159/get-script-path\r\n function getScriptPath() {\r\n var scripts = _doc.currentScript || (function () { var s = _doc.getElementsByTagName('script'); return (s.length) ? s[s.length - 1] : false; })();\r\n var path = scripts ? scripts.src.split('?')[0] : '';\r\n return (path.split('/').length > 0) ? path.split('/').slice(0, -1).join('/') + '/' : '';\r\n }\r\n\r\n // based on code by Paul Irish https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ \r\n var setAnimationFrame = _win.requestAnimationFrame || _win.webkitRequestAnimationFrame || _win.mozRequestAnimationFrame || false;\r\n var clearAnimationFrame = _win.cancelAnimationFrame || _win.webkitCancelAnimationFrame || _win.mozCancelAnimationFrame || false;\r\n\r\n if (!setAnimationFrame) {\r\n var anilasttime = 0;\r\n setAnimationFrame = function (callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - anilasttime));\r\n var id = _win.setTimeout(function () { callback(currTime + timeToCall); },\r\n timeToCall);\r\n anilasttime = currTime + timeToCall;\r\n return id;\r\n };\r\n clearAnimationFrame = function (id) {\r\n _win.clearTimeout(id);\r\n };\r\n } else {\r\n if (!_win.cancelAnimationFrame) clearAnimationFrame = function (id) { };\r\n }\r\n\r\n var ClsMutationObserver = _win.MutationObserver || _win.WebKitMutationObserver || false;\r\n\r\n var now = Date.now || function () { return new Date().getTime(); };\r\n\r\n var _globaloptions = {\r\n zindex: \"auto\",\r\n cursoropacitymin: 0,\r\n cursoropacitymax: 1,\r\n cursorcolor: \"#424242\",\r\n cursorwidth: \"6px\",\r\n cursorborder: \"1px solid #fff\",\r\n cursorborderradius: \"5px\",\r\n scrollspeed: 40,\r\n mousescrollstep: 9 * 3,\r\n touchbehavior: false, // deprecated\r\n emulatetouch: false, // replacing touchbehavior\r\n hwacceleration: true,\r\n usetransition: true,\r\n boxzoom: false,\r\n dblclickzoom: true,\r\n gesturezoom: true,\r\n grabcursorenabled: true,\r\n autohidemode: true,\r\n background: \"\",\r\n iframeautoresize: true,\r\n cursorminheight: 32,\r\n preservenativescrolling: true,\r\n railoffset: false,\r\n railhoffset: false,\r\n bouncescroll: true,\r\n spacebarenabled: true,\r\n railpadding: {\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0\r\n },\r\n disableoutline: true,\r\n horizrailenabled: true,\r\n railalign: \"right\",\r\n railvalign: \"bottom\",\r\n enabletranslate3d: true,\r\n enablemousewheel: true,\r\n enablekeyboard: true,\r\n smoothscroll: true,\r\n sensitiverail: true,\r\n enablemouselockapi: true,\r\n // cursormaxheight:false,\r\n cursorfixedheight: false,\r\n directionlockdeadzone: 6,\r\n hidecursordelay: 400,\r\n nativeparentscrolling: true,\r\n enablescrollonselection: true,\r\n overflowx: true,\r\n overflowy: true,\r\n cursordragspeed: 0.3,\r\n rtlmode: \"auto\",\r\n cursordragontouch: false,\r\n oneaxismousemode: \"auto\",\r\n scriptpath: getScriptPath(),\r\n preventmultitouchscrolling: true,\r\n disablemutationobserver: false,\r\n enableobserver: true,\r\n scrollbarid: false\r\n };\r\n\r\n var browserdetected = false;\r\n\r\n var getBrowserDetection = function () {\r\n\r\n if (browserdetected) return browserdetected;\r\n\r\n var _el = _doc.createElement('DIV'),\r\n _style = _el.style,\r\n _agent = navigator.userAgent,\r\n _platform = navigator.platform,\r\n d = {};\r\n\r\n d.haspointerlock = \"pointerLockElement\" in _doc || \"webkitPointerLockElement\" in _doc || \"mozPointerLockElement\" in _doc;\r\n\r\n d.isopera = (\"opera\" in _win); // 12-\r\n d.isopera12 = (d.isopera && (\"getUserMedia\" in navigator));\r\n d.isoperamini = (Object.prototype.toString.call(_win.operamini) === \"[object OperaMini]\");\r\n\r\n d.isie = ((\"all\" in _doc) && (\"attachEvent\" in _el) && !d.isopera); //IE10-\r\n d.isieold = (d.isie && !(\"msInterpolationMode\" in _style)); // IE6 and older\r\n d.isie7 = d.isie && !d.isieold && (!(\"documentMode\" in _doc) || (_doc.documentMode === 7));\r\n d.isie8 = d.isie && (\"documentMode\" in _doc) && (_doc.documentMode === 8);\r\n d.isie9 = d.isie && (\"performance\" in _win) && (_doc.documentMode === 9);\r\n d.isie10 = d.isie && (\"performance\" in _win) && (_doc.documentMode === 10);\r\n d.isie11 = (\"msRequestFullscreen\" in _el) && (_doc.documentMode >= 11); // IE11+\r\n\r\n d.ismsedge = (\"msCredentials\" in _win); // MS Edge 14+\r\n\r\n d.ismozilla = (\"MozAppearance\" in _style);\r\n\r\n d.iswebkit = !d.ismsedge && (\"WebkitAppearance\" in _style);\r\n\r\n d.ischrome = d.iswebkit && (\"chrome\" in _win);\r\n d.ischrome38 = (d.ischrome && (\"touchAction\" in _style)); // behavior changed in touch emulation \r\n d.ischrome22 = (!d.ischrome38) && (d.ischrome && d.haspointerlock);\r\n d.ischrome26 = (!d.ischrome38) && (d.ischrome && (\"transition\" in _style)); // issue with transform detection (maintain prefix)\r\n\r\n d.cantouch = (\"ontouchstart\" in _doc.documentElement) || (\"ontouchstart\" in _win); // with detection for Chrome Touch Emulation \r\n d.hasw3ctouch = (_win.PointerEvent || false) && ((navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)); //IE11 pointer events, following W3C Pointer Events spec\r\n d.hasmstouch = (!d.hasw3ctouch) && (_win.MSPointerEvent || false); // IE10 pointer events\r\n\r\n d.ismac = /^mac$/i.test(_platform);\r\n\r\n d.isios = d.cantouch && /iphone|ipad|ipod/i.test(_platform);\r\n d.isios4 = d.isios && !(\"seal\" in Object);\r\n d.isios7 = d.isios && (\"webkitHidden\" in _doc); //iOS 7+\r\n d.isios8 = d.isios && (\"hidden\" in _doc); //iOS 8+\r\n d.isios10 = d.isios && _win.Proxy; //iOS 10+\r\n\r\n d.isandroid = (/android/i.test(_agent));\r\n\r\n d.haseventlistener = (\"addEventListener\" in _el);\r\n\r\n d.trstyle = false;\r\n d.hastransform = false;\r\n d.hastranslate3d = false;\r\n d.transitionstyle = false;\r\n d.hastransition = false;\r\n d.transitionend = false;\r\n\r\n d.trstyle = \"transform\";\r\n d.hastransform = (\"transform\" in _style) || (function () {\r\n var check = ['msTransform', 'webkitTransform', 'MozTransform', 'OTransform'];\r\n for (var a = 0, c = check.length; a < c; a++) {\r\n if (_style[check[a]] !== undefined) {\r\n d.trstyle = check[a];\r\n break;\r\n }\r\n }\r\n d.hastransform = (!!d.trstyle);\r\n })();\r\n\r\n if (d.hastransform) {\r\n _style[d.trstyle] = \"translate3d(1px,2px,3px)\";\r\n d.hastranslate3d = /translate3d/.test(_style[d.trstyle]);\r\n }\r\n\r\n d.transitionstyle = \"transition\";\r\n d.prefixstyle = '';\r\n d.transitionend = \"transitionend\";\r\n\r\n d.hastransition = (\"transition\" in _style) || (function () {\r\n\r\n d.transitionend = false;\r\n var check = ['webkitTransition', 'msTransition', 'MozTransition', 'OTransition', 'OTransition', 'KhtmlTransition'];\r\n var prefix = ['-webkit-', '-ms-', '-moz-', '-o-', '-o', '-khtml-'];\r\n var evs = ['webkitTransitionEnd', 'msTransitionEnd', 'transitionend', 'otransitionend', 'oTransitionEnd', 'KhtmlTransitionEnd'];\r\n for (var a = 0, c = check.length; a < c; a++) {\r\n if (check[a] in _style) {\r\n d.transitionstyle = check[a];\r\n d.prefixstyle = prefix[a];\r\n d.transitionend = evs[a];\r\n break;\r\n }\r\n }\r\n if (d.ischrome26) d.prefixstyle = prefix[1]; // always use prefix\r\n\r\n d.hastransition = (d.transitionstyle);\r\n\r\n })();\r\n\r\n function detectCursorGrab() {\r\n var lst = ['grab', '-webkit-grab', '-moz-grab'];\r\n if ((d.ischrome && !d.ischrome38) || d.isie) lst = []; // force setting for IE returns false positive and chrome cursor bug\r\n for (var a = 0, l = lst.length; a < l; a++) {\r\n var p = lst[a];\r\n _style.cursor = p;\r\n if (_style.cursor == p) return p;\r\n }\r\n return 'url(https://cdnjs.cloudflare.com/ajax/libs/slider-pro/1.3.0/css/images/openhand.cur),n-resize'; // thanks to https://cdnjs.com/ for the openhand cursor!\r\n }\r\n d.cursorgrabvalue = detectCursorGrab();\r\n\r\n d.hasmousecapture = (\"setCapture\" in _el);\r\n\r\n d.hasMutationObserver = (ClsMutationObserver !== false);\r\n\r\n _el = null; //memory released\r\n\r\n browserdetected = d;\r\n\r\n return d;\r\n };\r\n\r\n var NiceScrollClass = function (myopt, me) {\r\n\r\n var self = this;\r\n\r\n this.version = '3.7.6';\r\n this.name = 'nicescroll';\r\n\r\n this.me = me;\r\n\r\n var $body = $(\"body\");\r\n\r\n var opt = this.opt = {\r\n doc: $body,\r\n win: false\r\n };\r\n\r\n $.extend(opt, _globaloptions); // clone opts\r\n\r\n // Options for internal use\r\n opt.snapbackspeed = 80;\r\n\r\n if (myopt || false) {\r\n for (var a in opt) {\r\n if (myopt[a] !== undefined) opt[a] = myopt[a];\r\n }\r\n }\r\n\r\n if (opt.disablemutationobserver) ClsMutationObserver = false;\r\n\r\n this.doc = opt.doc;\r\n this.iddoc = (this.doc && this.doc[0]) ? this.doc[0].id || '' : '';\r\n this.ispage = /^BODY|HTML/.test((opt.win) ? opt.win[0].nodeName : this.doc[0].nodeName);\r\n this.haswrapper = (opt.win !== false);\r\n this.win = opt.win || (this.ispage ? $window : this.doc);\r\n this.docscroll = (this.ispage && !this.haswrapper) ? $window : this.win;\r\n this.body = $body;\r\n this.viewport = false;\r\n\r\n this.isfixed = false;\r\n\r\n this.iframe = false;\r\n this.isiframe = ((this.doc[0].nodeName == 'IFRAME') && (this.win[0].nodeName == 'IFRAME'));\r\n\r\n this.istextarea = (this.win[0].nodeName == 'TEXTAREA');\r\n\r\n this.forcescreen = false; //force to use screen position on events\r\n\r\n this.canshowonmouseevent = (opt.autohidemode != \"scroll\");\r\n\r\n // Events jump table \r\n this.onmousedown = false;\r\n this.onmouseup = false;\r\n this.onmousemove = false;\r\n this.onmousewheel = false;\r\n this.onkeypress = false;\r\n this.ongesturezoom = false;\r\n this.onclick = false;\r\n\r\n // Nicescroll custom events\r\n this.onscrollstart = false;\r\n this.onscrollend = false;\r\n this.onscrollcancel = false;\r\n\r\n this.onzoomin = false;\r\n this.onzoomout = false;\r\n\r\n // Let's start! \r\n this.view = false;\r\n this.page = false;\r\n\r\n this.scroll = {\r\n x: 0,\r\n y: 0\r\n };\r\n this.scrollratio = {\r\n x: 0,\r\n y: 0\r\n };\r\n this.cursorheight = 20;\r\n this.scrollvaluemax = 0;\r\n\r\n // http://dev.w3.org/csswg/css-writing-modes-3/#logical-to-physical\r\n // http://dev.w3.org/csswg/css-writing-modes-3/#svg-writing-mode\r\n if (opt.rtlmode == \"auto\") {\r\n var target = this.win[0] == _win ? this.body : this.win;\r\n var writingMode = target.css(\"writing-mode\") || target.css(\"-webkit-writing-mode\") || target.css(\"-ms-writing-mode\") || target.css(\"-moz-writing-mode\");\r\n\r\n if (writingMode == \"horizontal-tb\" || writingMode == \"lr-tb\" || writingMode === \"\") {\r\n this.isrtlmode = (target.css(\"direction\") == \"rtl\");\r\n this.isvertical = false;\r\n } else {\r\n this.isrtlmode = (writingMode == \"vertical-rl\" || writingMode == \"tb\" || writingMode == \"tb-rl\" || writingMode == \"rl-tb\");\r\n this.isvertical = (writingMode == \"vertical-rl\" || writingMode == \"tb\" || writingMode == \"tb-rl\");\r\n }\r\n } else {\r\n this.isrtlmode = (opt.rtlmode === true);\r\n this.isvertical = false;\r\n }\r\n // this.checkrtlmode = false;\r\n\r\n this.scrollrunning = false;\r\n\r\n this.scrollmom = false;\r\n\r\n this.observer = false; // observer div changes\r\n this.observerremover = false; // observer on parent for remove detection\r\n this.observerbody = false; // observer on body for position change\r\n\r\n if (opt.scrollbarid !== false) {\r\n this.id = opt.scrollbarid;\r\n } else {\r\n do {\r\n this.id = \"ascrail\" + (ascrailcounter++);\r\n } while (_doc.getElementById(this.id));\r\n }\r\n\r\n this.rail = false;\r\n this.cursor = false;\r\n this.cursorfreezed = false;\r\n this.selectiondrag = false;\r\n\r\n this.zoom = false;\r\n this.zoomactive = false;\r\n\r\n this.hasfocus = false;\r\n this.hasmousefocus = false;\r\n\r\n //this.visibility = true;\r\n this.railslocked = false; // locked by resize\r\n this.locked = false; // prevent lost of locked status sets by user\r\n this.hidden = false; // rails always hidden\r\n this.cursoractive = true; // user can interact with cursors\r\n\r\n this.wheelprevented = false; //prevent mousewheel event\r\n\r\n this.overflowx = opt.overflowx;\r\n this.overflowy = opt.overflowy;\r\n\r\n this.nativescrollingarea = false;\r\n this.checkarea = 0;\r\n\r\n this.events = []; // event list for unbind\r\n\r\n this.saved = {}; // style saved\r\n\r\n this.delaylist = {};\r\n this.synclist = {};\r\n\r\n this.lastdeltax = 0;\r\n this.lastdeltay = 0;\r\n\r\n this.detected = getBrowserDetection();\r\n\r\n var cap = $.extend({}, this.detected);\r\n\r\n this.canhwscroll = (cap.hastransform && opt.hwacceleration);\r\n this.ishwscroll = (this.canhwscroll && self.haswrapper);\r\n\r\n if (!this.isrtlmode) {\r\n this.hasreversehr = false;\r\n } else if (this.isvertical) { // RTL mode with reverse horizontal axis\r\n this.hasreversehr = !(cap.iswebkit || cap.isie || cap.isie11);\r\n } else {\r\n this.hasreversehr = !(cap.iswebkit || (cap.isie && !cap.isie10 && !cap.isie11));\r\n }\r\n\r\n this.istouchcapable = false; // desktop devices with touch screen support\r\n\r\n //## Check WebKit-based desktop with touch support\r\n //## + Firefox 18 nightly build (desktop) false positive (or desktop with touch support)\r\n\r\n if (!cap.cantouch && (cap.hasw3ctouch || cap.hasmstouch)) { // desktop device with multiple input\r\n this.istouchcapable = true;\r\n } else if (cap.cantouch && !cap.isios && !cap.isandroid && (cap.iswebkit || cap.ismozilla)) {\r\n this.istouchcapable = true;\r\n }\r\n\r\n //## disable MouseLock API on user request\r\n if (!opt.enablemouselockapi) {\r\n cap.hasmousecapture = false;\r\n cap.haspointerlock = false;\r\n }\r\n\r\n this.debounced = function (name, fn, tm) {\r\n if (!self) return;\r\n var dd = self.delaylist[name] || false;\r\n if (!dd) {\r\n self.delaylist[name] = {\r\n h: setAnimationFrame(function () {\r\n self.delaylist[name].fn.call(self);\r\n self.delaylist[name] = false;\r\n }, tm)\r\n };\r\n fn.call(self);\r\n }\r\n self.delaylist[name].fn = fn;\r\n };\r\n\r\n\r\n this.synched = function (name, fn) {\r\n if (self.synclist[name]) self.synclist[name] = fn;\r\n else {\r\n self.synclist[name] = fn;\r\n setAnimationFrame(function () {\r\n if (!self) return;\r\n self.synclist[name] && self.synclist[name].call(self);\r\n self.synclist[name] = null;\r\n });\r\n }\r\n };\r\n\r\n this.unsynched = function (name) {\r\n if (self.synclist[name]) self.synclist[name] = false;\r\n };\r\n\r\n this.css = function (el, pars) { // save & set\r\n for (var n in pars) {\r\n self.saved.css.push([el, n, el.css(n)]);\r\n el.css(n, pars[n]);\r\n }\r\n };\r\n\r\n this.scrollTop = function (val) {\r\n return (val === undefined) ? self.getScrollTop() : self.setScrollTop(val);\r\n };\r\n\r\n this.scrollLeft = function (val) {\r\n return (val === undefined) ? self.getScrollLeft() : self.setScrollLeft(val);\r\n };\r\n\r\n // derived by by Dan Pupius www.pupius.net\r\n var BezierClass = function (st, ed, spd, p1, p2, p3, p4) {\r\n\r\n this.st = st;\r\n this.ed = ed;\r\n this.spd = spd;\r\n\r\n this.p1 = p1 || 0;\r\n this.p2 = p2 || 1;\r\n this.p3 = p3 || 0;\r\n this.p4 = p4 || 1;\r\n\r\n this.ts = now();\r\n this.df = ed - st;\r\n };\r\n BezierClass.prototype = {\r\n B2: function (t) {\r\n return 3 * (1 - t) * (1 - t) * t;\r\n },\r\n B3: function (t) {\r\n return 3 * (1 - t) * t * t;\r\n },\r\n B4: function (t) {\r\n return t * t * t;\r\n },\r\n getPos: function () {\r\n return (now() - this.ts) / this.spd;\r\n },\r\n getNow: function () {\r\n var pc = (now() - this.ts) / this.spd;\r\n var bz = this.B2(pc) + this.B3(pc) + this.B4(pc);\r\n return (pc >= 1) ? this.ed : this.st + (this.df * bz) | 0;\r\n },\r\n update: function (ed, spd) {\r\n this.st = this.getNow();\r\n this.ed = ed;\r\n this.spd = spd;\r\n this.ts = now();\r\n this.df = this.ed - this.st;\r\n return this;\r\n }\r\n };\r\n\r\n //derived from http://stackoverflow.com/questions/11236090/\r\n function getMatrixValues() {\r\n var tr = self.doc.css(cap.trstyle);\r\n if (tr && (tr.substr(0, 6) == \"matrix\")) {\r\n return tr.replace(/^.*\\((.*)\\)$/g, \"$1\").replace(/px/g, '').split(/, +/);\r\n }\r\n return false;\r\n }\r\n\r\n if (this.ishwscroll) { // hw accelerated scroll\r\n\r\n this.doc.translate = {\r\n x: 0,\r\n y: 0,\r\n tx: \"0px\",\r\n ty: \"0px\"\r\n };\r\n\r\n //this one can help to enable hw accel on ios6 http://indiegamr.com/ios6-html-hardware-acceleration-changes-and-how-to-fix-them/\r\n if (cap.hastranslate3d && cap.isios) this.doc.css(\"-webkit-backface-visibility\", \"hidden\"); // prevent flickering http://stackoverflow.com/questions/3461441/ \r\n\r\n this.getScrollTop = function (last) {\r\n if (!last) {\r\n var mtx = getMatrixValues();\r\n if (mtx) return (mtx.length == 16) ? -mtx[13] : -mtx[5]; //matrix3d 16 on IE10\r\n if (self.timerscroll && self.timerscroll.bz) return self.timerscroll.bz.getNow();\r\n }\r\n return self.doc.translate.y;\r\n };\r\n\r\n this.getScrollLeft = function (last) {\r\n if (!last) {\r\n var mtx = getMatrixValues();\r\n if (mtx) return (mtx.length == 16) ? -mtx[12] : -mtx[4]; //matrix3d 16 on IE10\r\n if (self.timerscroll && self.timerscroll.bh) return self.timerscroll.bh.getNow();\r\n }\r\n return self.doc.translate.x;\r\n };\r\n\r\n this.notifyScrollEvent = function (el) {\r\n var e = _doc.createEvent(\"UIEvents\");\r\n e.initUIEvent(\"scroll\", false, false, _win, 1);\r\n e.niceevent = true;\r\n el.dispatchEvent(e);\r\n };\r\n\r\n var cxscrollleft = (this.isrtlmode) ? 1 : -1;\r\n\r\n if (cap.hastranslate3d && opt.enabletranslate3d) {\r\n this.setScrollTop = function (val, silent) {\r\n self.doc.translate.y = val;\r\n self.doc.translate.ty = (val * -1) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate3d(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \",0)\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n this.setScrollLeft = function (val, silent) {\r\n self.doc.translate.x = val;\r\n self.doc.translate.tx = (val * cxscrollleft) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate3d(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \",0)\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n } else {\r\n this.setScrollTop = function (val, silent) {\r\n self.doc.translate.y = val;\r\n self.doc.translate.ty = (val * -1) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \")\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n this.setScrollLeft = function (val, silent) {\r\n self.doc.translate.x = val;\r\n self.doc.translate.tx = (val * cxscrollleft) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \")\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n }\r\n } else { // native scroll\r\n\r\n this.getScrollTop = function () {\r\n return self.docscroll.scrollTop();\r\n };\r\n this.setScrollTop = function (val) {\r\n self.docscroll.scrollTop(val);\r\n };\r\n\r\n this.getScrollLeft = function () {\r\n var val;\r\n if (!self.hasreversehr) {\r\n val = self.docscroll.scrollLeft();\r\n } else if (self.detected.ismozilla) {\r\n val = self.page.maxw - Math.abs(self.docscroll.scrollLeft());\r\n } else {\r\n val = self.page.maxw - self.docscroll.scrollLeft();\r\n }\r\n return val;\r\n };\r\n this.setScrollLeft = function (val) {\r\n return setTimeout(function () {\r\n if (!self) return;\r\n if (self.hasreversehr) {\r\n if (self.detected.ismozilla) {\r\n val = -(self.page.maxw - val);\r\n } else {\r\n val = self.page.maxw - val;\r\n }\r\n }\r\n return self.docscroll.scrollLeft(val);\r\n }, 1);\r\n };\r\n }\r\n\r\n this.getTarget = function (e) {\r\n if (!e) return false;\r\n if (e.target) return e.target;\r\n if (e.srcElement) return e.srcElement;\r\n return false;\r\n };\r\n\r\n this.hasParent = function (e, id) {\r\n if (!e) return false;\r\n var el = e.target || e.srcElement || e || false;\r\n while (el && el.id != id) {\r\n el = el.parentNode || false;\r\n }\r\n return (el !== false);\r\n };\r\n\r\n function getZIndex() {\r\n var dom = self.win;\r\n if (\"zIndex\" in dom) return dom.zIndex(); // use jQuery UI method when available\r\n while (dom.length > 0) {\r\n if (dom[0].nodeType == 9) return false;\r\n var zi = dom.css('zIndex');\r\n if (!isNaN(zi) && zi !== 0) return parseInt(zi);\r\n dom = dom.parent();\r\n }\r\n return false;\r\n }\r\n\r\n //inspired by http://forum.jquery.com/topic/width-includes-border-width-when-set-to-thin-medium-thick-in-ie\r\n var _convertBorderWidth = {\r\n \"thin\": 1,\r\n \"medium\": 3,\r\n \"thick\": 5\r\n };\r\n\r\n function getWidthToPixel(dom, prop, chkheight) {\r\n var wd = dom.css(prop);\r\n var px = parseFloat(wd);\r\n if (isNaN(px)) {\r\n px = _convertBorderWidth[wd] || 0;\r\n var brd = (px == 3) ? ((chkheight) ? (self.win.outerHeight() - self.win.innerHeight()) : (self.win.outerWidth() - self.win.innerWidth())) : 1; //DON'T TRUST CSS\r\n if (self.isie8 && px) px += 1;\r\n return (brd) ? px : 0;\r\n }\r\n return px;\r\n }\r\n\r\n this.getDocumentScrollOffset = function () {\r\n return {\r\n top: _win.pageYOffset || _doc.documentElement.scrollTop,\r\n left: _win.pageXOffset || _doc.documentElement.scrollLeft\r\n };\r\n };\r\n\r\n this.getOffset = function () {\r\n if (self.isfixed) {\r\n var ofs = self.win.offset(); // fix Chrome auto issue (when right/bottom props only)\r\n var scrl = self.getDocumentScrollOffset();\r\n ofs.top -= scrl.top;\r\n ofs.left -= scrl.left;\r\n return ofs;\r\n }\r\n var ww = self.win.offset();\r\n if (!self.viewport) return ww;\r\n var vp = self.viewport.offset();\r\n return {\r\n top: ww.top - vp.top,\r\n left: ww.left - vp.left\r\n };\r\n };\r\n\r\n this.updateScrollBar = function (len) {\r\n var pos, off;\r\n if (self.ishwscroll) {\r\n self.rail.css({\r\n height: self.win.innerHeight() - (opt.railpadding.top + opt.railpadding.bottom)\r\n });\r\n if (self.railh) self.railh.css({\r\n width: self.win.innerWidth() - (opt.railpadding.left + opt.railpadding.right)\r\n });\r\n } else {\r\n var wpos = self.getOffset();\r\n pos = {\r\n top: wpos.top,\r\n left: wpos.left - (opt.railpadding.left + opt.railpadding.right)\r\n };\r\n pos.top += getWidthToPixel(self.win, 'border-top-width', true);\r\n pos.left += (self.rail.align) ? self.win.outerWidth() - getWidthToPixel(self.win, 'border-right-width') - self.rail.width : getWidthToPixel(self.win, 'border-left-width');\r\n\r\n off = opt.railoffset;\r\n if (off) {\r\n if (off.top) pos.top += off.top;\r\n if (off.left) pos.left += off.left;\r\n }\r\n\r\n if (!self.railslocked) self.rail.css({\r\n top: pos.top,\r\n left: pos.left,\r\n height: ((len) ? len.h : self.win.innerHeight()) - (opt.railpadding.top + opt.railpadding.bottom)\r\n });\r\n\r\n if (self.zoom) {\r\n self.zoom.css({\r\n top: pos.top + 1,\r\n left: (self.rail.align == 1) ? pos.left - 20 : pos.left + self.rail.width + 4\r\n });\r\n }\r\n\r\n if (self.railh && !self.railslocked) {\r\n pos = {\r\n top: wpos.top,\r\n left: wpos.left\r\n };\r\n off = opt.railhoffset;\r\n if (off) {\r\n if (off.top) pos.top += off.top;\r\n if (off.left) pos.left += off.left;\r\n }\r\n var y = (self.railh.align) ? pos.top + getWidthToPixel(self.win, 'border-top-width', true) + self.win.innerHeight() - self.railh.height : pos.top + getWidthToPixel(self.win, 'border-top-width', true);\r\n var x = pos.left + getWidthToPixel(self.win, 'border-left-width');\r\n self.railh.css({\r\n top: y - (opt.railpadding.top + opt.railpadding.bottom),\r\n left: x,\r\n width: self.railh.width\r\n });\r\n }\r\n\r\n }\r\n };\r\n\r\n this.doRailClick = function (e, dbl, hr) {\r\n var fn, pg, cur, pos;\r\n\r\n if (self.railslocked) return;\r\n\r\n self.cancelEvent(e);\r\n\r\n if (!(\"pageY\" in e)) {\r\n e.pageX = e.clientX + _doc.documentElement.scrollLeft;\r\n e.pageY = e.clientY + _doc.documentElement.scrollTop;\r\n }\r\n\r\n if (dbl) {\r\n fn = (hr) ? self.doScrollLeft : self.doScrollTop;\r\n cur = (hr) ? ((e.pageX - self.railh.offset().left - (self.cursorwidth / 2)) * self.scrollratio.x) : ((e.pageY - self.rail.offset().top - (self.cursorheight / 2)) * self.scrollratio.y);\r\n self.unsynched(\"relativexy\");\r\n fn(cur|0);\r\n } else {\r\n fn = (hr) ? self.doScrollLeftBy : self.doScrollBy;\r\n cur = (hr) ? self.scroll.x : self.scroll.y;\r\n pos = (hr) ? e.pageX - self.railh.offset().left : e.pageY - self.rail.offset().top;\r\n pg = (hr) ? self.view.w : self.view.h;\r\n fn((cur >= pos) ? pg : -pg);\r\n }\r\n\r\n };\r\n\r\n self.newscrolly = self.newscrollx = 0;\r\n\r\n self.hasanimationframe = (\"requestAnimationFrame\" in _win);\r\n self.hascancelanimationframe = (\"cancelAnimationFrame\" in _win);\r\n\r\n self.hasborderbox = false;\r\n\r\n this.init = function () {\r\n\r\n self.saved.css = [];\r\n\r\n if (cap.isoperamini) return true; // SORRY, DO NOT WORK!\r\n if (cap.isandroid && !(\"hidden\" in _doc)) return true; // Android 3- SORRY, DO NOT WORK!\r\n\r\n opt.emulatetouch = opt.emulatetouch || opt.touchbehavior; // mantain compatibility with \"touchbehavior\" \r\n\r\n self.hasborderbox = _win.getComputedStyle && (_win.getComputedStyle(_doc.body)['box-sizing'] === \"border-box\");\r\n\r\n var _scrollyhidden = { 'overflow-y': 'hidden' };\r\n if (cap.isie11 || cap.isie10) _scrollyhidden['-ms-overflow-style'] = 'none'; // IE 10 & 11 is always a world apart!\r\n\r\n if (self.ishwscroll) {\r\n this.doc.css(cap.transitionstyle, cap.prefixstyle + 'transform 0ms ease-out');\r\n if (cap.transitionend) self.bind(self.doc, cap.transitionend, self.onScrollTransitionEnd, false); //I have got to do something usefull!!\r\n }\r\n\r\n self.zindex = \"auto\";\r\n if (!self.ispage && opt.zindex == \"auto\") {\r\n self.zindex = getZIndex() || \"auto\";\r\n } else {\r\n self.zindex = opt.zindex;\r\n }\r\n\r\n if (!self.ispage && self.zindex != \"auto\" && self.zindex > globalmaxzindex) {\r\n globalmaxzindex = self.zindex;\r\n }\r\n\r\n if (self.isie && self.zindex === 0 && opt.zindex == \"auto\") { // fix IE auto == 0\r\n self.zindex = \"auto\";\r\n }\r\n\r\n if (!self.ispage || !cap.isieold) {\r\n\r\n var cont = self.docscroll;\r\n if (self.ispage) cont = (self.haswrapper) ? self.win : self.doc;\r\n\r\n self.css(cont, _scrollyhidden);\r\n\r\n if (self.ispage && (cap.isie11 || cap.isie)) { // IE 7-11\r\n self.css($(\"html\"), _scrollyhidden);\r\n }\r\n\r\n if (cap.isios && !self.ispage && !self.haswrapper) self.css($body, {\r\n \"-webkit-overflow-scrolling\": \"touch\"\r\n }); //force hw acceleration\r\n\r\n var cursor = $(_doc.createElement('div'));\r\n cursor.css({\r\n position: \"relative\",\r\n top: 0,\r\n \"float\": \"right\",\r\n width: opt.cursorwidth,\r\n height: 0,\r\n 'background-color': opt.cursorcolor,\r\n border: opt.cursorborder,\r\n 'background-clip': 'padding-box',\r\n '-webkit-border-radius': opt.cursorborderradius,\r\n '-moz-border-radius': opt.cursorborderradius,\r\n 'border-radius': opt.cursorborderradius\r\n });\r\n\r\n cursor.addClass('nicescroll-cursors');\r\n\r\n self.cursor = cursor;\r\n\r\n var rail = $(_doc.createElement('div'));\r\n rail.attr('id', self.id);\r\n rail.addClass('nicescroll-rails nicescroll-rails-vr');\r\n\r\n var v, a, kp = [\"left\", \"right\", \"top\", \"bottom\"]; //**\r\n for (var n in kp) {\r\n a = kp[n];\r\n v = opt.railpadding[a] || 0;\r\n v && rail.css(\"padding-\" + a, v + \"px\");\r\n }\r\n\r\n rail.append(cursor);\r\n\r\n rail.width = Math.max(parseFloat(opt.cursorwidth), cursor.outerWidth());\r\n rail.css({\r\n width: rail.width + \"px\",\r\n zIndex: self.zindex,\r\n background: opt.background,\r\n cursor: \"default\"\r\n });\r\n\r\n rail.visibility = true;\r\n rail.scrollable = true;\r\n\r\n rail.align = (opt.railalign == \"left\") ? 0 : 1;\r\n\r\n self.rail = rail;\r\n\r\n self.rail.drag = false;\r\n\r\n var zoom = false;\r\n if (opt.boxzoom && !self.ispage && !cap.isieold) {\r\n zoom = _doc.createElement('div');\r\n\r\n self.bind(zoom, \"click\", self.doZoom);\r\n self.bind(zoom, \"mouseenter\", function () {\r\n self.zoom.css('opacity', opt.cursoropacitymax);\r\n });\r\n self.bind(zoom, \"mouseleave\", function () {\r\n self.zoom.css('opacity', opt.cursoropacitymin);\r\n });\r\n\r\n self.zoom = $(zoom);\r\n self.zoom.css({\r\n cursor: \"pointer\",\r\n zIndex: self.zindex,\r\n backgroundImage: 'url(' + opt.scriptpath + 'zoomico.png)',\r\n height: 18,\r\n width: 18,\r\n backgroundPosition: '0 0'\r\n });\r\n if (opt.dblclickzoom) self.bind(self.win, \"dblclick\", self.doZoom);\r\n if (cap.cantouch && opt.gesturezoom) {\r\n self.ongesturezoom = function (e) {\r\n if (e.scale > 1.5) self.doZoomIn(e);\r\n if (e.scale < 0.8) self.doZoomOut(e);\r\n return self.cancelEvent(e);\r\n };\r\n self.bind(self.win, \"gestureend\", self.ongesturezoom);\r\n }\r\n }\r\n\r\n // init HORIZ\r\n\r\n self.railh = false;\r\n var railh;\r\n\r\n if (opt.horizrailenabled) {\r\n\r\n self.css(cont, {\r\n overflowX: 'hidden'\r\n });\r\n\r\n cursor = $(_doc.createElement('div'));\r\n cursor.css({\r\n position: \"absolute\",\r\n top: 0,\r\n height: opt.cursorwidth,\r\n width: 0,\r\n backgroundColor: opt.cursorcolor,\r\n border: opt.cursorborder,\r\n backgroundClip: 'padding-box',\r\n '-webkit-border-radius': opt.cursorborderradius,\r\n '-moz-border-radius': opt.cursorborderradius,\r\n 'border-radius': opt.cursorborderradius\r\n });\r\n\r\n if (cap.isieold) cursor.css('overflow', 'hidden'); //IE6 horiz scrollbar issue\r\n\r\n cursor.addClass('nicescroll-cursors');\r\n\r\n self.cursorh = cursor;\r\n\r\n railh = $(_doc.createElement('div'));\r\n railh.attr('id', self.id + '-hr');\r\n railh.addClass('nicescroll-rails nicescroll-rails-hr');\r\n railh.height = Math.max(parseFloat(opt.cursorwidth), cursor.outerHeight());\r\n railh.css({\r\n height: railh.height + \"px\",\r\n 'zIndex': self.zindex,\r\n \"background\": opt.background\r\n });\r\n\r\n railh.append(cursor);\r\n\r\n railh.visibility = true;\r\n railh.scrollable = true;\r\n\r\n railh.align = (opt.railvalign == \"top\") ? 0 : 1;\r\n\r\n self.railh = railh;\r\n\r\n self.railh.drag = false;\r\n\r\n }\r\n\r\n if (self.ispage) {\r\n\r\n rail.css({\r\n position: \"fixed\",\r\n top: 0,\r\n height: \"100%\"\r\n });\r\n\r\n rail.css((rail.align) ? { right: 0 } : { left: 0 });\r\n\r\n self.body.append(rail);\r\n if (self.railh) {\r\n railh.css({\r\n position: \"fixed\",\r\n left: 0,\r\n width: \"100%\"\r\n });\r\n\r\n railh.css((railh.align) ? { bottom: 0 } : { top: 0 });\r\n\r\n self.body.append(railh);\r\n }\r\n } else {\r\n if (self.ishwscroll) {\r\n if (self.win.css('position') == 'static') self.css(self.win, { 'position': 'relative' });\r\n var bd = (self.win[0].nodeName == 'HTML') ? self.body : self.win;\r\n $(bd).scrollTop(0).scrollLeft(0); // fix rail position if content already scrolled\r\n if (self.zoom) {\r\n self.zoom.css({\r\n position: \"absolute\",\r\n top: 1,\r\n right: 0,\r\n \"margin-right\": rail.width + 4\r\n });\r\n bd.append(self.zoom);\r\n }\r\n rail.css({\r\n position: \"absolute\",\r\n top: 0\r\n });\r\n rail.css((rail.align) ? { right: 0 } : { left: 0 });\r\n bd.append(rail);\r\n if (railh) {\r\n railh.css({\r\n position: \"absolute\",\r\n left: 0,\r\n bottom: 0\r\n });\r\n railh.css((railh.align) ? { bottom: 0 } : { top: 0 });\r\n bd.append(railh);\r\n }\r\n } else {\r\n self.isfixed = (self.win.css(\"position\") == \"fixed\");\r\n var rlpos = (self.isfixed) ? \"fixed\" : \"absolute\";\r\n\r\n if (!self.isfixed) self.viewport = self.getViewport(self.win[0]);\r\n if (self.viewport) {\r\n self.body = self.viewport;\r\n if (!(/fixed|absolute/.test(self.viewport.css(\"position\")))) self.css(self.viewport, {\r\n \"position\": \"relative\"\r\n });\r\n }\r\n\r\n rail.css({\r\n position: rlpos\r\n });\r\n if (self.zoom) self.zoom.css({\r\n position: rlpos\r\n });\r\n self.updateScrollBar();\r\n self.body.append(rail);\r\n if (self.zoom) self.body.append(self.zoom);\r\n if (self.railh) {\r\n railh.css({\r\n position: rlpos\r\n });\r\n self.body.append(railh);\r\n }\r\n }\r\n\r\n if (cap.isios) self.css(self.win, {\r\n '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\r\n '-webkit-touch-callout': 'none'\r\n }); // prevent grey layer on click\r\n\r\n if (opt.disableoutline) {\r\n if (cap.isie) self.win.attr(\"hideFocus\", \"true\"); // IE, prevent dotted rectangle on focused div\r\n if (cap.iswebkit) self.win.css('outline', 'none'); // Webkit outline\r\n }\r\n\r\n }\r\n\r\n if (opt.autohidemode === false) {\r\n self.autohidedom = false;\r\n self.rail.css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n if (self.railh) self.railh.css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n } else if ((opt.autohidemode === true) || (opt.autohidemode === \"leave\")) {\r\n self.autohidedom = $().add(self.rail);\r\n if (cap.isie8) self.autohidedom = self.autohidedom.add(self.cursor);\r\n if (self.railh) self.autohidedom = self.autohidedom.add(self.railh);\r\n if (self.railh && cap.isie8) self.autohidedom = self.autohidedom.add(self.cursorh);\r\n } else if (opt.autohidemode == \"scroll\") {\r\n self.autohidedom = $().add(self.rail);\r\n if (self.railh) self.autohidedom = self.autohidedom.add(self.railh);\r\n } else if (opt.autohidemode == \"cursor\") {\r\n self.autohidedom = $().add(self.cursor);\r\n if (self.railh) self.autohidedom = self.autohidedom.add(self.cursorh);\r\n } else if (opt.autohidemode == \"hidden\") {\r\n self.autohidedom = false;\r\n self.hide();\r\n self.railslocked = false;\r\n }\r\n\r\n if (cap.cantouch || self.istouchcapable || opt.emulatetouch || cap.hasmstouch) {\r\n\r\n self.scrollmom = new ScrollMomentumClass2D(self);\r\n\r\n var delayedclick = null;\r\n\r\n self.ontouchstart = function (e) {\r\n\r\n if (self.locked) return false;\r\n\r\n //if (e.pointerType && e.pointerType != 2 && e.pointerType != \"touch\") return false;\r\n if (e.pointerType && (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE)) return false; // need test on surface!!\r\n\r\n self.hasmoving = false;\r\n\r\n if (self.scrollmom.timer) {\r\n self.triggerScrollEnd();\r\n self.scrollmom.stop();\r\n }\r\n\r\n if (!self.railslocked) {\r\n var tg = self.getTarget(e);\r\n\r\n if (tg) {\r\n var skp = (/INPUT/i.test(tg.nodeName)) && (/range/i.test(tg.type));\r\n if (skp) return self.stopPropagation(e);\r\n }\r\n\r\n var ismouse = (e.type === \"mousedown\");\r\n\r\n if (!(\"clientX\" in e) && (\"changedTouches\" in e)) {\r\n e.clientX = e.changedTouches[0].clientX;\r\n e.clientY = e.changedTouches[0].clientY;\r\n }\r\n\r\n if (self.forcescreen) {\r\n var le = e;\r\n e = {\r\n \"original\": (e.original) ? e.original : e\r\n };\r\n e.clientX = le.screenX;\r\n e.clientY = le.screenY;\r\n }\r\n\r\n self.rail.drag = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n sx: self.scroll.x,\r\n sy: self.scroll.y,\r\n st: self.getScrollTop(),\r\n sl: self.getScrollLeft(),\r\n pt: 2,\r\n dl: false,\r\n tg: tg\r\n };\r\n\r\n if (self.ispage || !opt.directionlockdeadzone) {\r\n\r\n self.rail.drag.dl = \"f\";\r\n\r\n } else {\r\n\r\n var view = {\r\n w: $window.width(),\r\n h: $window.height()\r\n };\r\n\r\n var page = self.getContentSize();\r\n\r\n var maxh = page.h - view.h;\r\n var maxw = page.w - view.w;\r\n\r\n if (self.rail.scrollable && !self.railh.scrollable) self.rail.drag.ck = (maxh > 0) ? \"v\" : false;\r\n else if (!self.rail.scrollable && self.railh.scrollable) self.rail.drag.ck = (maxw > 0) ? \"h\" : false;\r\n else self.rail.drag.ck = false;\r\n\r\n }\r\n\r\n if (opt.emulatetouch && self.isiframe && cap.isie) {\r\n var wp = self.win.position();\r\n self.rail.drag.x += wp.left;\r\n self.rail.drag.y += wp.top;\r\n }\r\n\r\n self.hasmoving = false;\r\n self.lastmouseup = false;\r\n self.scrollmom.reset(e.clientX, e.clientY);\r\n\r\n if (tg&&ismouse) {\r\n\r\n var ip = /INPUT|SELECT|BUTTON|TEXTAREA/i.test(tg.nodeName);\r\n if (!ip) {\r\n if (cap.hasmousecapture) tg.setCapture();\r\n if (opt.emulatetouch) {\r\n if (tg.onclick && !(tg._onclick || false)) { // intercept DOM0 onclick event\r\n tg._onclick = tg.onclick;\r\n tg.onclick = function (e) {\r\n if (self.hasmoving) return false;\r\n tg._onclick.call(this, e);\r\n };\r\n }\r\n return self.cancelEvent(e);\r\n }\r\n return self.stopPropagation(e);\r\n }\r\n\r\n if (/SUBMIT|CANCEL|BUTTON/i.test($(tg).attr('type'))) {\r\n self.preventclick = {\r\n \"tg\": tg,\r\n \"click\": false\r\n };\r\n }\r\n\r\n }\r\n }\r\n\r\n };\r\n\r\n self.ontouchend = function (e) {\r\n\r\n if (!self.rail.drag) return true;\r\n\r\n if (self.rail.drag.pt == 2) {\r\n //if (e.pointerType && e.pointerType != 2 && e.pointerType != \"touch\") return false;\r\n if (e.pointerType && (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE)) return false;\r\n\r\n self.rail.drag = false;\r\n\r\n var ismouse = (e.type === \"mouseup\");\r\n\r\n if (self.hasmoving) {\r\n self.scrollmom.doMomentum();\r\n self.lastmouseup = true;\r\n self.hideCursor();\r\n if (cap.hasmousecapture) _doc.releaseCapture();\r\n if (ismouse) return self.cancelEvent(e);\r\n }\r\n\r\n }\r\n else if (self.rail.drag.pt == 1) {\r\n return self.onmouseup(e);\r\n }\r\n\r\n };\r\n\r\n var moveneedoffset = (opt.emulatetouch && self.isiframe && !cap.hasmousecapture);\r\n\r\n var locktollerance = opt.directionlockdeadzone * 0.3 | 0;\r\n\r\n self.ontouchmove = function (e, byiframe) {\r\n\r\n if (!self.rail.drag) return true;\r\n\r\n if (e.targetTouches && opt.preventmultitouchscrolling) {\r\n if (e.targetTouches.length > 1) return true; // multitouch\r\n }\r\n\r\n //if (e.pointerType && e.pointerType != 2 && e.pointerType != \"touch\") return false;\r\n if (e.pointerType && (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE)) return true;\r\n\r\n if (self.rail.drag.pt == 2) {\r\n\r\n if ((\"changedTouches\" in e)) {\r\n e.clientX = e.changedTouches[0].clientX;\r\n e.clientY = e.changedTouches[0].clientY;\r\n }\r\n\r\n var ofy, ofx;\r\n ofx = ofy = 0;\r\n\r\n if (moveneedoffset && !byiframe) {\r\n var wp = self.win.position();\r\n ofx = -wp.left;\r\n ofy = -wp.top;\r\n }\r\n\r\n var fy = e.clientY + ofy;\r\n var my = (fy - self.rail.drag.y);\r\n var fx = e.clientX + ofx;\r\n var mx = (fx - self.rail.drag.x);\r\n\r\n var ny = self.rail.drag.st - my;\r\n\r\n if (self.ishwscroll && opt.bouncescroll) {\r\n if (ny < 0) {\r\n ny = Math.round(ny / 2);\r\n } else if (ny > self.page.maxh) {\r\n ny = self.page.maxh + Math.round((ny - self.page.maxh) / 2);\r\n }\r\n } else {\r\n if (ny < 0) {\r\n ny = 0;\r\n fy = 0;\r\n }\r\n else if (ny > self.page.maxh) {\r\n ny = self.page.maxh;\r\n fy = 0;\r\n }\r\n if (fy === 0 && !self.hasmoving) {\r\n if (!self.ispage) self.rail.drag = false;\r\n return true;\r\n }\r\n }\r\n\r\n var nx = self.getScrollLeft();\r\n\r\n if (self.railh && self.railh.scrollable) {\r\n nx = (self.isrtlmode) ? mx - self.rail.drag.sl : self.rail.drag.sl - mx;\r\n\r\n if (self.ishwscroll && opt.bouncescroll) {\r\n if (nx < 0) {\r\n nx = Math.round(nx / 2);\r\n } else if (nx > self.page.maxw) {\r\n nx = self.page.maxw + Math.round((nx - self.page.maxw) / 2);\r\n }\r\n } else {\r\n if (nx < 0) {\r\n nx = 0;\r\n fx = 0;\r\n }\r\n if (nx > self.page.maxw) {\r\n nx = self.page.maxw;\r\n fx = 0;\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n if (!self.hasmoving) {\r\n\r\n if (self.rail.drag.y === e.clientY && self.rail.drag.x === e.clientX) return self.cancelEvent(e); // prevent first useless move event \r\n\r\n var ay = Math.abs(my);\r\n var ax = Math.abs(mx);\r\n var dz = opt.directionlockdeadzone;\r\n\r\n if (!self.rail.drag.ck) {\r\n if (ay > dz && ax > dz) self.rail.drag.dl = \"f\";\r\n else if (ay > dz) self.rail.drag.dl = (ax > locktollerance) ? \"f\" : \"v\";\r\n else if (ax > dz) self.rail.drag.dl = (ay > locktollerance) ? \"f\" : \"h\";\r\n }\r\n else if (self.rail.drag.ck == \"v\") {\r\n if (ax > dz && ay <= locktollerance) {\r\n self.rail.drag = false;\r\n }\r\n else if (ay > dz) self.rail.drag.dl = \"v\";\r\n\r\n }\r\n else if (self.rail.drag.ck == \"h\") {\r\n\r\n if (ay > dz && ax <= locktollerance) {\r\n self.rail.drag = false;\r\n }\r\n else if (ax > dz) self.rail.drag.dl = \"h\";\r\n\r\n }\r\n\r\n if (!self.rail.drag.dl) return self.cancelEvent(e);\r\n\r\n self.triggerScrollStart(e.clientX, e.clientY, 0, 0, 0);\r\n self.hasmoving = true;\r\n }\r\n\r\n if (self.preventclick && !self.preventclick.click) {\r\n self.preventclick.click = self.preventclick.tg.onclick || false;\r\n self.preventclick.tg.onclick = self.onpreventclick;\r\n }\r\n\r\n if (self.rail.drag.dl) {\r\n if (self.rail.drag.dl == \"v\") nx = self.rail.drag.sl;\r\n else if (self.rail.drag.dl == \"h\") ny = self.rail.drag.st;\r\n }\r\n\r\n self.synched(\"touchmove\", function () {\r\n if (self.rail.drag && (self.rail.drag.pt == 2)) {\r\n if (self.prepareTransition) self.resetTransition();\r\n if (self.rail.scrollable) self.setScrollTop(ny);\r\n self.scrollmom.update(fx, fy);\r\n if (self.railh && self.railh.scrollable) {\r\n self.setScrollLeft(nx);\r\n self.showCursor(ny, nx);\r\n } else {\r\n self.showCursor(ny);\r\n }\r\n if (cap.isie10) _doc.selection.clear();\r\n }\r\n });\r\n\r\n return self.cancelEvent(e);\r\n\r\n }\r\n else if (self.rail.drag.pt == 1) { // drag on cursor\r\n return self.onmousemove(e);\r\n }\r\n\r\n };\r\n\r\n self.ontouchstartCursor = function (e, hronly) {\r\n if (self.rail.drag && self.rail.drag.pt != 3) return;\r\n if (self.locked) return self.cancelEvent(e);\r\n self.cancelScroll();\r\n self.rail.drag = {\r\n x: e.touches[0].clientX,\r\n y: e.touches[0].clientY,\r\n sx: self.scroll.x,\r\n sy: self.scroll.y,\r\n pt: 3,\r\n hr: (!!hronly)\r\n };\r\n var tg = self.getTarget(e);\r\n if (!self.ispage && cap.hasmousecapture) tg.setCapture();\r\n if (self.isiframe && !cap.hasmousecapture) {\r\n self.saved.csspointerevents = self.doc.css(\"pointer-events\");\r\n self.css(self.doc, { \"pointer-events\": \"none\" });\r\n }\r\n return self.cancelEvent(e);\r\n };\r\n\r\n self.ontouchendCursor = function (e) {\r\n if (self.rail.drag) {\r\n if (cap.hasmousecapture) _doc.releaseCapture();\r\n if (self.isiframe && !cap.hasmousecapture) self.doc.css(\"pointer-events\", self.saved.csspointerevents);\r\n if (self.rail.drag.pt != 3) return;\r\n self.rail.drag = false;\r\n return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n self.ontouchmoveCursor = function (e) {\r\n if (self.rail.drag) {\r\n if (self.rail.drag.pt != 3) return;\r\n\r\n self.cursorfreezed = true;\r\n\r\n if (self.rail.drag.hr) {\r\n self.scroll.x = self.rail.drag.sx + (e.touches[0].clientX - self.rail.drag.x);\r\n if (self.scroll.x < 0) self.scroll.x = 0;\r\n var mw = self.scrollvaluemaxw;\r\n if (self.scroll.x > mw) self.scroll.x = mw;\r\n } else {\r\n self.scroll.y = self.rail.drag.sy + (e.touches[0].clientY - self.rail.drag.y);\r\n if (self.scroll.y < 0) self.scroll.y = 0;\r\n var my = self.scrollvaluemax;\r\n if (self.scroll.y > my) self.scroll.y = my;\r\n }\r\n\r\n self.synched('touchmove', function () {\r\n if (self.rail.drag && (self.rail.drag.pt == 3)) {\r\n self.showCursor();\r\n if (self.rail.drag.hr) self.doScrollLeft(Math.round(self.scroll.x * self.scrollratio.x), opt.cursordragspeed);\r\n else self.doScrollTop(Math.round(self.scroll.y * self.scrollratio.y), opt.cursordragspeed);\r\n }\r\n });\r\n\r\n return self.cancelEvent(e);\r\n }\r\n\r\n };\r\n\r\n }\r\n\r\n self.onmousedown = function (e, hronly) {\r\n if (self.rail.drag && self.rail.drag.pt != 1) return;\r\n if (self.railslocked) return self.cancelEvent(e);\r\n self.cancelScroll();\r\n self.rail.drag = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n sx: self.scroll.x,\r\n sy: self.scroll.y,\r\n pt: 1,\r\n hr: hronly || false\r\n };\r\n var tg = self.getTarget(e);\r\n\r\n if (cap.hasmousecapture) tg.setCapture();\r\n if (self.isiframe && !cap.hasmousecapture) {\r\n self.saved.csspointerevents = self.doc.css(\"pointer-events\");\r\n self.css(self.doc, {\r\n \"pointer-events\": \"none\"\r\n });\r\n }\r\n self.hasmoving = false;\r\n return self.cancelEvent(e);\r\n };\r\n\r\n self.onmouseup = function (e) {\r\n if (self.rail.drag) {\r\n if (self.rail.drag.pt != 1) return true;\r\n\r\n if (cap.hasmousecapture) _doc.releaseCapture();\r\n if (self.isiframe && !cap.hasmousecapture) self.doc.css(\"pointer-events\", self.saved.csspointerevents);\r\n self.rail.drag = false;\r\n self.cursorfreezed = false;\r\n if (self.hasmoving) self.triggerScrollEnd();\r\n return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n self.onmousemove = function (e) {\r\n if (self.rail.drag) {\r\n if (self.rail.drag.pt !== 1) return;\r\n\r\n if (cap.ischrome && e.which === 0) return self.onmouseup(e);\r\n\r\n self.cursorfreezed = true;\r\n\r\n if (!self.hasmoving) self.triggerScrollStart(e.clientX, e.clientY, 0, 0, 0);\r\n\r\n self.hasmoving = true;\r\n\r\n if (self.rail.drag.hr) {\r\n self.scroll.x = self.rail.drag.sx + (e.clientX - self.rail.drag.x);\r\n if (self.scroll.x < 0) self.scroll.x = 0;\r\n var mw = self.scrollvaluemaxw;\r\n if (self.scroll.x > mw) self.scroll.x = mw;\r\n } else {\r\n self.scroll.y = self.rail.drag.sy + (e.clientY - self.rail.drag.y);\r\n if (self.scroll.y < 0) self.scroll.y = 0;\r\n var my = self.scrollvaluemax;\r\n if (self.scroll.y > my) self.scroll.y = my;\r\n }\r\n\r\n self.synched('mousemove', function () {\r\n\r\n if (self.cursorfreezed) {\r\n self.showCursor();\r\n\r\n if (self.rail.drag.hr) {\r\n self.scrollLeft(Math.round(self.scroll.x * self.scrollratio.x));\r\n } else {\r\n self.scrollTop(Math.round(self.scroll.y * self.scrollratio.y));\r\n }\r\n\r\n }\r\n });\r\n\r\n return self.cancelEvent(e);\r\n }\r\n else {\r\n self.checkarea = 0;\r\n }\r\n };\r\n\r\n if (cap.cantouch || opt.emulatetouch) {\r\n\r\n self.onpreventclick = function (e) {\r\n if (self.preventclick) {\r\n self.preventclick.tg.onclick = self.preventclick.click;\r\n self.preventclick = false;\r\n return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n self.onclick = (cap.isios) ? false : function (e) { // it needs to check IE11 ???\r\n if (self.lastmouseup) {\r\n self.lastmouseup = false;\r\n return self.cancelEvent(e);\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n if (opt.grabcursorenabled && cap.cursorgrabvalue) {\r\n self.css((self.ispage) ? self.doc : self.win, {\r\n 'cursor': cap.cursorgrabvalue\r\n });\r\n self.css(self.rail, {\r\n 'cursor': cap.cursorgrabvalue\r\n });\r\n }\r\n\r\n } else {\r\n\r\n var checkSelectionScroll = function (e) {\r\n if (!self.selectiondrag) return;\r\n\r\n if (e) {\r\n var ww = self.win.outerHeight();\r\n var df = (e.pageY - self.selectiondrag.top);\r\n if (df > 0 && df < ww) df = 0;\r\n if (df >= ww) df -= ww;\r\n self.selectiondrag.df = df;\r\n }\r\n if (self.selectiondrag.df === 0) return;\r\n\r\n var rt = -(self.selectiondrag.df*2/6)|0;\r\n self.doScrollBy(rt);\r\n\r\n self.debounced(\"doselectionscroll\", function () {\r\n checkSelectionScroll();\r\n }, 50);\r\n };\r\n\r\n if (\"getSelection\" in _doc) { // A grade - Major browsers\r\n self.hasTextSelected = function () {\r\n return (_doc.getSelection().rangeCount > 0);\r\n };\r\n } else if (\"selection\" in _doc) { //IE9-\r\n self.hasTextSelected = function () {\r\n return (_doc.selection.type != \"None\");\r\n };\r\n } else {\r\n self.hasTextSelected = function () { // no support\r\n return false;\r\n };\r\n }\r\n\r\n self.onselectionstart = function (e) {\r\n // More testing - severe chrome issues \r\n /* \r\n if (!self.haswrapper&&(e.which&&e.which==2)) { // fool browser to manage middle button scrolling\r\n self.win.css({'overflow':'auto'});\r\n setTimeout(function(){\r\n self.win.css({'overflow':'hidden'});\r\n },10); \r\n return true;\r\n } \r\n */\r\n if (self.ispage) return;\r\n self.selectiondrag = self.win.offset();\r\n };\r\n\r\n self.onselectionend = function (e) {\r\n self.selectiondrag = false;\r\n };\r\n self.onselectiondrag = function (e) {\r\n if (!self.selectiondrag) return;\r\n if (self.hasTextSelected()) self.debounced(\"selectionscroll\", function () {\r\n checkSelectionScroll(e);\r\n }, 250);\r\n };\r\n }\r\n\r\n if (cap.hasw3ctouch) { //IE11+\r\n self.css((self.ispage) ? $(\"html\") : self.win, { 'touch-action': 'none' });\r\n self.css(self.rail, {\r\n 'touch-action': 'none'\r\n });\r\n self.css(self.cursor, {\r\n 'touch-action': 'none'\r\n });\r\n self.bind(self.win, \"pointerdown\", self.ontouchstart);\r\n self.bind(_doc, \"pointerup\", self.ontouchend);\r\n self.delegate(_doc, \"pointermove\", self.ontouchmove);\r\n } else if (cap.hasmstouch) { //IE10\r\n self.css((self.ispage) ? $(\"html\") : self.win, { '-ms-touch-action': 'none' });\r\n self.css(self.rail, {\r\n '-ms-touch-action': 'none'\r\n });\r\n self.css(self.cursor, {\r\n '-ms-touch-action': 'none'\r\n });\r\n self.bind(self.win, \"MSPointerDown\", self.ontouchstart);\r\n self.bind(_doc, \"MSPointerUp\", self.ontouchend);\r\n self.delegate(_doc, \"MSPointerMove\", self.ontouchmove);\r\n self.bind(self.cursor, \"MSGestureHold\", function (e) {\r\n e.preventDefault();\r\n });\r\n self.bind(self.cursor, \"contextmenu\", function (e) {\r\n e.preventDefault();\r\n });\r\n } else if (cap.cantouch) { // smartphones/touch devices\r\n self.bind(self.win, \"touchstart\", self.ontouchstart, false, true);\r\n self.bind(_doc, \"touchend\", self.ontouchend, false, true);\r\n self.bind(_doc, \"touchcancel\", self.ontouchend, false, true);\r\n self.delegate(_doc, \"touchmove\", self.ontouchmove, false, true);\r\n }\r\n\r\n if (opt.emulatetouch) {\r\n self.bind(self.win, \"mousedown\", self.ontouchstart, false, true);\r\n self.bind(_doc, \"mouseup\", self.ontouchend, false, true);\r\n self.bind(_doc, \"mousemove\", self.ontouchmove, false, true);\r\n }\r\n\r\n if (opt.cursordragontouch || (!cap.cantouch && !opt.emulatetouch)) {\r\n\r\n self.rail.css({\r\n cursor: \"default\"\r\n });\r\n self.railh && self.railh.css({\r\n cursor: \"default\"\r\n });\r\n\r\n self.jqbind(self.rail, \"mouseenter\", function () {\r\n if (!self.ispage && !self.win.is(\":visible\")) return false;\r\n if (self.canshowonmouseevent) self.showCursor();\r\n self.rail.active = true;\r\n });\r\n self.jqbind(self.rail, \"mouseleave\", function () {\r\n self.rail.active = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n\r\n if (opt.sensitiverail) {\r\n self.bind(self.rail, \"click\", function (e) {\r\n self.doRailClick(e, false, false);\r\n });\r\n self.bind(self.rail, \"dblclick\", function (e) {\r\n self.doRailClick(e, true, false);\r\n });\r\n self.bind(self.cursor, \"click\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n self.bind(self.cursor, \"dblclick\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n }\r\n\r\n if (self.railh) {\r\n self.jqbind(self.railh, \"mouseenter\", function () {\r\n if (!self.ispage && !self.win.is(\":visible\")) return false;\r\n if (self.canshowonmouseevent) self.showCursor();\r\n self.rail.active = true;\r\n });\r\n self.jqbind(self.railh, \"mouseleave\", function () {\r\n self.rail.active = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n\r\n if (opt.sensitiverail) {\r\n self.bind(self.railh, \"click\", function (e) {\r\n self.doRailClick(e, false, true);\r\n });\r\n self.bind(self.railh, \"dblclick\", function (e) {\r\n self.doRailClick(e, true, true);\r\n });\r\n self.bind(self.cursorh, \"click\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n self.bind(self.cursorh, \"dblclick\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n if (opt.cursordragontouch && (this.istouchcapable || cap.cantouch)) {\r\n self.bind(self.cursor, \"touchstart\", self.ontouchstartCursor);\r\n self.bind(self.cursor, \"touchmove\", self.ontouchmoveCursor);\r\n self.bind(self.cursor, \"touchend\", self.ontouchendCursor);\r\n self.cursorh && self.bind(self.cursorh, \"touchstart\", function (e) {\r\n self.ontouchstartCursor(e, true);\r\n });\r\n self.cursorh && self.bind(self.cursorh, \"touchmove\", self.ontouchmoveCursor);\r\n self.cursorh && self.bind(self.cursorh, \"touchend\", self.ontouchendCursor);\r\n }\r\n\r\n// if (!cap.cantouch && !opt.emulatetouch) {\r\n if (!opt.emulatetouch && !cap.isandroid && !cap.isios) {\r\n\r\n self.bind((cap.hasmousecapture) ? self.win : _doc, \"mouseup\", self.onmouseup);\r\n self.bind(_doc, \"mousemove\", self.onmousemove);\r\n if (self.onclick) self.bind(_doc, \"click\", self.onclick);\r\n\r\n self.bind(self.cursor, \"mousedown\", self.onmousedown);\r\n self.bind(self.cursor, \"mouseup\", self.onmouseup);\r\n\r\n if (self.railh) {\r\n self.bind(self.cursorh, \"mousedown\", function (e) {\r\n self.onmousedown(e, true);\r\n });\r\n self.bind(self.cursorh, \"mouseup\", self.onmouseup);\r\n }\r\n\r\n if (!self.ispage && opt.enablescrollonselection) {\r\n self.bind(self.win[0], \"mousedown\", self.onselectionstart);\r\n self.bind(_doc, \"mouseup\", self.onselectionend);\r\n self.bind(self.cursor, \"mouseup\", self.onselectionend);\r\n if (self.cursorh) self.bind(self.cursorh, \"mouseup\", self.onselectionend);\r\n self.bind(_doc, \"mousemove\", self.onselectiondrag);\r\n }\r\n\r\n if (self.zoom) {\r\n self.jqbind(self.zoom, \"mouseenter\", function () {\r\n if (self.canshowonmouseevent) self.showCursor();\r\n self.rail.active = true;\r\n });\r\n self.jqbind(self.zoom, \"mouseleave\", function () {\r\n self.rail.active = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n }\r\n\r\n } else {\r\n\r\n self.bind((cap.hasmousecapture) ? self.win : _doc, \"mouseup\", self.ontouchend);\r\n if (self.onclick) self.bind(_doc, \"click\", self.onclick);\r\n\r\n if (opt.cursordragontouch) {\r\n self.bind(self.cursor, \"mousedown\", self.onmousedown);\r\n self.bind(self.cursor, \"mouseup\", self.onmouseup);\r\n self.cursorh && self.bind(self.cursorh, \"mousedown\", function (e) {\r\n self.onmousedown(e, true);\r\n });\r\n self.cursorh && self.bind(self.cursorh, \"mouseup\", self.onmouseup);\r\n } else {\r\n self.bind(self.rail, \"mousedown\", function (e) { e.preventDefault(); }); // prevent text selection \r\n self.railh && self.bind(self.railh, \"mousedown\", function (e) { e.preventDefault(); });\r\n }\r\n\r\n }\r\n\r\n\r\n if (opt.enablemousewheel) {\r\n if (!self.isiframe) self.mousewheel((cap.isie && self.ispage) ? _doc : self.win, self.onmousewheel);\r\n self.mousewheel(self.rail, self.onmousewheel);\r\n if (self.railh) self.mousewheel(self.railh, self.onmousewheelhr);\r\n }\r\n\r\n if (!self.ispage && !cap.cantouch && !(/HTML|^BODY/.test(self.win[0].nodeName))) {\r\n if (!self.win.attr(\"tabindex\")) self.win.attr({\r\n \"tabindex\": ++tabindexcounter\r\n });\r\n\r\n self.bind(self.win, \"focus\", function (e) { // better using native events\r\n domfocus = (self.getTarget(e)).id || self.getTarget(e) || false;\r\n self.hasfocus = true;\r\n if (self.canshowonmouseevent) self.noticeCursor();\r\n });\r\n self.bind(self.win, \"blur\", function (e) { // *\r\n domfocus = false;\r\n self.hasfocus = false;\r\n });\r\n\r\n self.bind(self.win, \"mouseenter\", function (e) { // *\r\n mousefocus = (self.getTarget(e)).id || self.getTarget(e) || false;\r\n self.hasmousefocus = true;\r\n if (self.canshowonmouseevent) self.noticeCursor();\r\n });\r\n self.bind(self.win, \"mouseleave\", function (e) { // * \r\n mousefocus = false;\r\n self.hasmousefocus = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n\r\n }\r\n\r\n\r\n //Thanks to http://www.quirksmode.org !!\r\n self.onkeypress = function (e) {\r\n if (self.railslocked && self.page.maxh === 0) return true;\r\n\r\n e = e || _win.event;\r\n var tg = self.getTarget(e);\r\n if (tg && /INPUT|TEXTAREA|SELECT|OPTION/.test(tg.nodeName)) {\r\n var tp = tg.getAttribute('type') || tg.type || false;\r\n if ((!tp) || !(/submit|button|cancel/i.tp)) return true;\r\n }\r\n\r\n if ($(tg).attr('contenteditable')) return true;\r\n\r\n if (self.hasfocus || (self.hasmousefocus && !domfocus) || (self.ispage && !domfocus && !mousefocus)) {\r\n var key = e.keyCode;\r\n\r\n if (self.railslocked && key != 27) return self.cancelEvent(e);\r\n\r\n var ctrl = e.ctrlKey || false;\r\n var shift = e.shiftKey || false;\r\n\r\n var ret = false;\r\n switch (key) {\r\n case 38:\r\n case 63233: //safari\r\n self.doScrollBy(24 * 3);\r\n ret = true;\r\n break;\r\n case 40:\r\n case 63235: //safari\r\n self.doScrollBy(-24 * 3);\r\n ret = true;\r\n break;\r\n case 37:\r\n case 63232: //safari\r\n if (self.railh) {\r\n (ctrl) ? self.doScrollLeft(0) : self.doScrollLeftBy(24 * 3);\r\n ret = true;\r\n }\r\n break;\r\n case 39:\r\n case 63234: //safari\r\n if (self.railh) {\r\n (ctrl) ? self.doScrollLeft(self.page.maxw) : self.doScrollLeftBy(-24 * 3);\r\n ret = true;\r\n }\r\n break;\r\n case 33:\r\n case 63276: // safari\r\n self.doScrollBy(self.view.h);\r\n ret = true;\r\n break;\r\n case 34:\r\n case 63277: // safari\r\n self.doScrollBy(-self.view.h);\r\n ret = true;\r\n break;\r\n case 36:\r\n case 63273: // safari \r\n (self.railh && ctrl) ? self.doScrollPos(0, 0) : self.doScrollTo(0);\r\n ret = true;\r\n break;\r\n case 35:\r\n case 63275: // safari\r\n (self.railh && ctrl) ? self.doScrollPos(self.page.maxw, self.page.maxh) : self.doScrollTo(self.page.maxh);\r\n ret = true;\r\n break;\r\n case 32:\r\n if (opt.spacebarenabled) {\r\n (shift) ? self.doScrollBy(self.view.h) : self.doScrollBy(-self.view.h);\r\n ret = true;\r\n }\r\n break;\r\n case 27: // ESC\r\n if (self.zoomactive) {\r\n self.doZoom();\r\n ret = true;\r\n }\r\n break;\r\n }\r\n if (ret) return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n if (opt.enablekeyboard) self.bind(_doc, (cap.isopera && !cap.isopera12) ? \"keypress\" : \"keydown\", self.onkeypress);\r\n\r\n self.bind(_doc, \"keydown\", function (e) {\r\n var ctrl = e.ctrlKey || false;\r\n if (ctrl) self.wheelprevented = true;\r\n });\r\n self.bind(_doc, \"keyup\", function (e) {\r\n var ctrl = e.ctrlKey || false;\r\n if (!ctrl) self.wheelprevented = false;\r\n });\r\n self.bind(_win, \"blur\", function (e) {\r\n self.wheelprevented = false;\r\n });\r\n\r\n self.bind(_win, 'resize', self.onscreenresize);\r\n self.bind(_win, 'orientationchange', self.onscreenresize);\r\n\r\n self.bind(_win, \"load\", self.lazyResize);\r\n\r\n if (cap.ischrome && !self.ispage && !self.haswrapper) { //chrome void scrollbar bug - it persists in version 26\r\n var tmp = self.win.attr(\"style\");\r\n var ww = parseFloat(self.win.css(\"width\")) + 1;\r\n self.win.css('width', ww);\r\n self.synched(\"chromefix\", function () {\r\n self.win.attr(\"style\", tmp);\r\n });\r\n }\r\n\r\n\r\n // Trying a cross-browser implementation - good luck!\r\n\r\n self.onAttributeChange = function (e) {\r\n self.lazyResize(self.isieold ? 250 : 30);\r\n };\r\n\r\n if (opt.enableobserver) {\r\n\r\n if ((!self.isie11) && (ClsMutationObserver !== false)) { // IE11 crashes #568\r\n self.observerbody = new ClsMutationObserver(function (mutations) {\r\n mutations.forEach(function (mut) {\r\n if (mut.type == \"attributes\") {\r\n return ($body.hasClass(\"modal-open\") && $body.hasClass(\"modal-dialog\") && !$.contains($('.modal-dialog')[0], self.doc[0])) ? self.hide() : self.show(); // Support for Bootstrap modal; Added check if the nice scroll element is inside a modal\r\n }\r\n });\r\n if (self.me.clientWidth != self.page.width || self.me.clientHeight != self.page.height) return self.lazyResize(30);\r\n });\r\n self.observerbody.observe(_doc.body, {\r\n childList: true,\r\n subtree: true,\r\n characterData: false,\r\n attributes: true,\r\n attributeFilter: ['class']\r\n });\r\n }\r\n\r\n if (!self.ispage && !self.haswrapper) {\r\n\r\n var _dom = self.win[0];\r\n\r\n // redesigned MutationObserver for Chrome18+/Firefox14+/iOS6+ with support for: remove div, add/remove content\r\n if (ClsMutationObserver !== false) {\r\n self.observer = new ClsMutationObserver(function (mutations) {\r\n mutations.forEach(self.onAttributeChange);\r\n });\r\n self.observer.observe(_dom, {\r\n childList: true,\r\n characterData: false,\r\n attributes: true,\r\n subtree: false\r\n });\r\n self.observerremover = new ClsMutationObserver(function (mutations) {\r\n mutations.forEach(function (mo) {\r\n if (mo.removedNodes.length > 0) {\r\n for (var dd in mo.removedNodes) {\r\n if (!!self && (mo.removedNodes[dd] === _dom)) return self.remove();\r\n }\r\n }\r\n });\r\n });\r\n self.observerremover.observe(_dom.parentNode, {\r\n childList: true,\r\n characterData: false,\r\n attributes: false,\r\n subtree: false\r\n });\r\n } else {\r\n self.bind(_dom, (cap.isie && !cap.isie9) ? \"propertychange\" : \"DOMAttrModified\", self.onAttributeChange);\r\n if (cap.isie9) _dom.attachEvent(\"onpropertychange\", self.onAttributeChange); //IE9 DOMAttrModified bug\r\n self.bind(_dom, \"DOMNodeRemoved\", function (e) {\r\n if (e.target === _dom) self.remove();\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n //\r\n\r\n if (!self.ispage && opt.boxzoom) self.bind(_win, \"resize\", self.resizeZoom);\r\n if (self.istextarea) {\r\n self.bind(self.win, \"keydown\", self.lazyResize);\r\n self.bind(self.win, \"mouseup\", self.lazyResize);\r\n }\r\n\r\n self.lazyResize(30);\r\n\r\n }\r\n\r\n if (this.doc[0].nodeName == 'IFRAME') {\r\n var oniframeload = function () {\r\n self.iframexd = false;\r\n var doc;\r\n try {\r\n doc = 'contentDocument' in this ? this.contentDocument : this.contentWindow._doc;\r\n var a = doc.domain;\r\n } catch (e) {\r\n self.iframexd = true;\r\n doc = false;\r\n }\r\n\r\n if (self.iframexd) {\r\n if (\"console\" in _win) console.log('NiceScroll error: policy restriced iframe');\r\n return true; //cross-domain - I can't manage this \r\n }\r\n\r\n self.forcescreen = true;\r\n\r\n if (self.isiframe) {\r\n self.iframe = {\r\n \"doc\": $(doc),\r\n \"html\": self.doc.contents().find('html')[0],\r\n \"body\": self.doc.contents().find('body')[0]\r\n };\r\n self.getContentSize = function () {\r\n return {\r\n w: Math.max(self.iframe.html.scrollWidth, self.iframe.body.scrollWidth),\r\n h: Math.max(self.iframe.html.scrollHeight, self.iframe.body.scrollHeight)\r\n };\r\n };\r\n self.docscroll = $(self.iframe.body);\r\n }\r\n\r\n if (!cap.isios && opt.iframeautoresize && !self.isiframe) {\r\n self.win.scrollTop(0); // reset position\r\n self.doc.height(\"\"); //reset height to fix browser bug\r\n var hh = Math.max(doc.getElementsByTagName('html')[0].scrollHeight, doc.body.scrollHeight);\r\n self.doc.height(hh);\r\n }\r\n self.lazyResize(30);\r\n\r\n self.css($(self.iframe.body), _scrollyhidden);\r\n\r\n if (cap.isios && self.haswrapper) {\r\n self.css($(doc.body), {\r\n '-webkit-transform': 'translate3d(0,0,0)'\r\n }); // avoid iFrame content clipping - thanks to http://blog.derraab.com/2012/04/02/avoid-iframe-content-clipping-with-css-transform-on-ios/\r\n }\r\n\r\n if ('contentWindow' in this) {\r\n self.bind(this.contentWindow, \"scroll\", self.onscroll); //IE8 & minor\r\n } else {\r\n self.bind(doc, \"scroll\", self.onscroll);\r\n }\r\n\r\n if (opt.enablemousewheel) {\r\n self.mousewheel(doc, self.onmousewheel);\r\n }\r\n\r\n if (opt.enablekeyboard) self.bind(doc, (cap.isopera) ? \"keypress\" : \"keydown\", self.onkeypress);\r\n\r\n if (cap.cantouch) {\r\n self.bind(doc, \"touchstart\", self.ontouchstart);\r\n self.bind(doc, \"touchmove\", self.ontouchmove);\r\n }\r\n else if (opt.emulatetouch) {\r\n self.bind(doc, \"mousedown\", self.ontouchstart);\r\n self.bind(doc, \"mousemove\", function (e) {\r\n return self.ontouchmove(e, true);\r\n });\r\n if (opt.grabcursorenabled && cap.cursorgrabvalue) self.css($(doc.body), {\r\n 'cursor': cap.cursorgrabvalue\r\n });\r\n }\r\n\r\n self.bind(doc, \"mouseup\", self.ontouchend);\r\n\r\n if (self.zoom) {\r\n if (opt.dblclickzoom) self.bind(doc, 'dblclick', self.doZoom);\r\n if (self.ongesturezoom) self.bind(doc, \"gestureend\", self.ongesturezoom);\r\n }\r\n };\r\n\r\n if (this.doc[0].readyState && this.doc[0].readyState === \"complete\") {\r\n setTimeout(function () {\r\n oniframeload.call(self.doc[0], false);\r\n }, 500);\r\n }\r\n self.bind(this.doc, \"load\", oniframeload);\r\n\r\n }\r\n\r\n };\r\n\r\n this.showCursor = function (py, px) {\r\n if (self.cursortimeout) {\r\n clearTimeout(self.cursortimeout);\r\n self.cursortimeout = 0;\r\n }\r\n if (!self.rail) return;\r\n if (self.autohidedom) {\r\n self.autohidedom.stop().css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n self.cursoractive = true;\r\n }\r\n\r\n if (!self.rail.drag || self.rail.drag.pt != 1) {\r\n if (py !== undefined && py !== false) {\r\n self.scroll.y = (py / self.scrollratio.y) | 0;\r\n }\r\n if (px !== undefined) {\r\n self.scroll.x = (px / self.scrollratio.x) | 0;\r\n }\r\n }\r\n\r\n self.cursor.css({\r\n height: self.cursorheight,\r\n top: self.scroll.y\r\n });\r\n if (self.cursorh) {\r\n var lx = (self.hasreversehr) ? self.scrollvaluemaxw - self.scroll.x : self.scroll.x;\r\n self.cursorh.css({\r\n width: self.cursorwidth,\r\n left: (!self.rail.align && self.rail.visibility) ? lx + self.rail.width : lx\r\n });\r\n self.cursoractive = true;\r\n }\r\n\r\n if (self.zoom) self.zoom.stop().css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n };\r\n\r\n this.hideCursor = function (tm) {\r\n if (self.cursortimeout) return;\r\n if (!self.rail) return;\r\n if (!self.autohidedom) return;\r\n\r\n if (self.hasmousefocus && opt.autohidemode === \"leave\") return;\r\n self.cursortimeout = setTimeout(function () {\r\n if (!self.rail.active || !self.showonmouseevent) {\r\n self.autohidedom.stop().animate({\r\n opacity: opt.cursoropacitymin\r\n });\r\n if (self.zoom) self.zoom.stop().animate({\r\n opacity: opt.cursoropacitymin\r\n });\r\n self.cursoractive = false;\r\n }\r\n self.cursortimeout = 0;\r\n }, tm || opt.hidecursordelay);\r\n };\r\n\r\n this.noticeCursor = function (tm, py, px) {\r\n self.showCursor(py, px);\r\n if (!self.rail.active) self.hideCursor(tm);\r\n };\r\n\r\n this.getContentSize =\r\n (self.ispage) ?\r\n function () {\r\n return {\r\n w: Math.max(_doc.body.scrollWidth, _doc.documentElement.scrollWidth),\r\n h: Math.max(_doc.body.scrollHeight, _doc.documentElement.scrollHeight)\r\n };\r\n } : (self.haswrapper) ?\r\n function () {\r\n return {\r\n w: self.doc[0].offsetWidth,\r\n h: self.doc[0].offsetHeight\r\n };\r\n } : function () {\r\n return {\r\n w: self.docscroll[0].scrollWidth,\r\n h: self.docscroll[0].scrollHeight\r\n };\r\n };\r\n\r\n this.onResize = function (e, page) {\r\n\r\n if (!self || !self.win) return false;\r\n\r\n var premaxh = self.page.maxh,\r\n premaxw = self.page.maxw,\r\n previewh = self.view.h,\r\n previeww = self.view.w;\r\n\r\n self.view = {\r\n w: (self.ispage) ? self.win.width() : self.win[0].clientWidth,\r\n h: (self.ispage) ? self.win.height() : self.win[0].clientHeight\r\n };\r\n\r\n self.page = (page) ? page : self.getContentSize();\r\n\r\n self.page.maxh = Math.max(0, self.page.h - self.view.h);\r\n self.page.maxw = Math.max(0, self.page.w - self.view.w);\r\n\r\n if ((self.page.maxh == premaxh) && (self.page.maxw == premaxw) && (self.view.w == previeww) && (self.view.h == previewh)) {\r\n // test position \r\n if (!self.ispage) {\r\n var pos = self.win.offset();\r\n if (self.lastposition) {\r\n var lst = self.lastposition;\r\n if ((lst.top == pos.top) && (lst.left == pos.left)) return self; //nothing to do \r\n }\r\n self.lastposition = pos;\r\n } else {\r\n return self; //nothing to do\r\n }\r\n }\r\n\r\n if (self.page.maxh === 0) {\r\n self.hideRail();\r\n self.scrollvaluemax = 0;\r\n self.scroll.y = 0;\r\n self.scrollratio.y = 0;\r\n self.cursorheight = 0;\r\n self.setScrollTop(0);\r\n if (self.rail) self.rail.scrollable = false;\r\n } else {\r\n self.page.maxh -= (opt.railpadding.top + opt.railpadding.bottom);\r\n self.rail.scrollable = true;\r\n }\r\n\r\n if (self.page.maxw === 0) {\r\n self.hideRailHr();\r\n self.scrollvaluemaxw = 0;\r\n self.scroll.x = 0;\r\n self.scrollratio.x = 0;\r\n self.cursorwidth = 0;\r\n self.setScrollLeft(0);\r\n if (self.railh) {\r\n self.railh.scrollable = false;\r\n }\r\n } else {\r\n self.page.maxw -= (opt.railpadding.left + opt.railpadding.right);\r\n if (self.railh) self.railh.scrollable = (opt.horizrailenabled);\r\n }\r\n\r\n self.railslocked = (self.locked) || ((self.page.maxh === 0) && (self.page.maxw === 0));\r\n if (self.railslocked) {\r\n if (!self.ispage) self.updateScrollBar(self.view);\r\n return false;\r\n }\r\n\r\n if (!self.hidden) {\r\n if (!self.rail.visibility) self.showRail();\r\n if (self.railh && !self.railh.visibility) self.showRailHr();\r\n }\r\n\r\n if (self.istextarea && self.win.css('resize') && self.win.css('resize') != 'none') self.view.h -= 20;\r\n\r\n self.cursorheight = Math.min(self.view.h, Math.round(self.view.h * (self.view.h / self.page.h)));\r\n self.cursorheight = (opt.cursorfixedheight) ? opt.cursorfixedheight : Math.max(opt.cursorminheight, self.cursorheight);\r\n\r\n self.cursorwidth = Math.min(self.view.w, Math.round(self.view.w * (self.view.w / self.page.w)));\r\n self.cursorwidth = (opt.cursorfixedheight) ? opt.cursorfixedheight : Math.max(opt.cursorminheight, self.cursorwidth);\r\n\r\n self.scrollvaluemax = self.view.h - self.cursorheight - (opt.railpadding.top + opt.railpadding.bottom);\r\n if (!self.hasborderbox) self.scrollvaluemax -= self.cursor[0].offsetHeight - self.cursor[0].clientHeight;\r\n\r\n if (self.railh) {\r\n self.railh.width = (self.page.maxh > 0) ? (self.view.w - self.rail.width) : self.view.w;\r\n self.scrollvaluemaxw = self.railh.width - self.cursorwidth - (opt.railpadding.left + opt.railpadding.right);\r\n }\r\n\r\n if (!self.ispage) self.updateScrollBar(self.view);\r\n\r\n self.scrollratio = {\r\n x: (self.page.maxw / self.scrollvaluemaxw),\r\n y: (self.page.maxh / self.scrollvaluemax)\r\n };\r\n\r\n var sy = self.getScrollTop();\r\n if (sy > self.page.maxh) {\r\n self.doScrollTop(self.page.maxh);\r\n } else {\r\n self.scroll.y = (self.getScrollTop() / self.scrollratio.y) | 0;\r\n self.scroll.x = (self.getScrollLeft() / self.scrollratio.x) | 0;\r\n if (self.cursoractive) self.noticeCursor();\r\n }\r\n\r\n if (self.scroll.y && (self.getScrollTop() === 0)) self.doScrollTo((self.scroll.y * self.scrollratio.y)|0);\r\n\r\n return self;\r\n };\r\n\r\n this.resize = self.onResize;\r\n\r\n var hlazyresize = 0;\r\n\r\n this.onscreenresize = function(e) {\r\n clearTimeout(hlazyresize);\r\n\r\n var hiderails = (!self.ispage && !self.haswrapper);\r\n if (hiderails) self.hideRails();\r\n\r\n hlazyresize = setTimeout(function () {\r\n if (self) {\r\n if (hiderails) self.showRails();\r\n self.resize();\r\n }\r\n hlazyresize=0;\r\n }, 120);\r\n };\r\n\r\n this.lazyResize = function (tm) { // event debounce\r\n\r\n clearTimeout(hlazyresize);\r\n\r\n tm = isNaN(tm) ? 240 : tm;\r\n\r\n hlazyresize = setTimeout(function () {\r\n self && self.resize();\r\n hlazyresize=0;\r\n }, tm);\r\n\r\n return self;\r\n\r\n };\r\n\r\n // derived by MDN https://developer.mozilla.org/en-US/docs/DOM/Mozilla_event_reference/wheel\r\n function _modernWheelEvent(dom, name, fn, bubble) {\r\n self._bind(dom, name, function (e) {\r\n e = e || _win.event;\r\n var event = {\r\n original: e,\r\n target: e.target || e.srcElement,\r\n type: \"wheel\",\r\n deltaMode: e.type == \"MozMousePixelScroll\" ? 0 : 1,\r\n deltaX: 0,\r\n deltaZ: 0,\r\n preventDefault: function () {\r\n e.preventDefault ? e.preventDefault() : e.returnValue = false;\r\n return false;\r\n },\r\n stopImmediatePropagation: function () {\r\n (e.stopImmediatePropagation) ? e.stopImmediatePropagation() : e.cancelBubble = true;\r\n }\r\n };\r\n\r\n if (name == \"mousewheel\") {\r\n e.wheelDeltaX && (event.deltaX = -1 / 40 * e.wheelDeltaX);\r\n e.wheelDeltaY && (event.deltaY = -1 / 40 * e.wheelDeltaY);\r\n !event.deltaY && !event.deltaX && (event.deltaY = -1 / 40 * e.wheelDelta);\r\n } else {\r\n event.deltaY = e.detail;\r\n }\r\n\r\n return fn.call(dom, event);\r\n }, bubble);\r\n }\r\n\r\n\r\n\r\n this.jqbind = function (dom, name, fn) { // use jquery bind for non-native events (mouseenter/mouseleave)\r\n self.events.push({\r\n e: dom,\r\n n: name,\r\n f: fn,\r\n q: true\r\n });\r\n $(dom).on(name, fn);\r\n };\r\n\r\n this.mousewheel = function (dom, fn, bubble) { // bind mousewheel\r\n var el = (\"jquery\" in dom) ? dom[0] : dom;\r\n if (\"onwheel\" in _doc.createElement(\"div\")) { // Modern browsers support \"wheel\"\r\n self._bind(el, \"wheel\", fn, bubble || false);\r\n } else {\r\n var wname = (_doc.onmousewheel !== undefined) ? \"mousewheel\" : \"DOMMouseScroll\"; // older Webkit+IE support or older Firefox \r\n _modernWheelEvent(el, wname, fn, bubble || false);\r\n if (wname == \"DOMMouseScroll\") _modernWheelEvent(el, \"MozMousePixelScroll\", fn, bubble || false); // Firefox legacy\r\n }\r\n };\r\n\r\n var passiveSupported = false;\r\n\r\n if (cap.haseventlistener) { // W3C standard event model\r\n\r\n // thanks to https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\r\n try { var options = Object.defineProperty({}, \"passive\", { get: function () { passiveSupported = !0; } }); _win.addEventListener(\"test\", null, options); } catch (err) { }\r\n\r\n this.stopPropagation = function (e) {\r\n if (!e) return false;\r\n e = (e.original) ? e.original : e;\r\n e.stopPropagation();\r\n return false;\r\n };\r\n\r\n this.cancelEvent = function(e) {\r\n if (e.cancelable) e.preventDefault();\r\n e.stopImmediatePropagation();\r\n if (e.preventManipulation) e.preventManipulation(); // IE10+\r\n return false;\r\n }; \r\n\r\n } else {\r\n\r\n // inspired from https://gist.github.com/jonathantneal/2415137 \r\n\r\n Event.prototype.preventDefault = function () {\r\n this.returnValue = false;\r\n };\r\n\r\n Event.prototype.stopPropagation = function () {\r\n this.cancelBubble = true;\r\n };\r\n\r\n _win.constructor.prototype.addEventListener = _doc.constructor.prototype.addEventListener = Element.prototype.addEventListener = function (type, listener, useCapture) {\r\n this.attachEvent(\"on\" + type, listener);\r\n };\r\n _win.constructor.prototype.removeEventListener = _doc.constructor.prototype.removeEventListener = Element.prototype.removeEventListener = function (type, listener, useCapture) {\r\n this.detachEvent(\"on\" + type, listener);\r\n };\r\n\r\n // Thanks to http://www.switchonthecode.com !!\r\n this.cancelEvent = function (e) {\r\n e = e || _win.event;\r\n if (e) { \r\n e.cancelBubble = true;\r\n e.cancel = true;\r\n e.returnValue = false;\r\n } \r\n return false;\r\n };\r\n\r\n this.stopPropagation = function (e) {\r\n e = e || _win.event;\r\n if (e) e.cancelBubble = true;\r\n return false;\r\n };\r\n\r\n }\r\n\r\n this.delegate = function (dom, name, fn, bubble, active) {\r\n\r\n var de = delegatevents[name] || false;\r\n\r\n if (!de) {\r\n\r\n de = {\r\n a: [],\r\n l: [],\r\n f: function (e) {\r\n var lst = de.l, l = lst.length - 1;\r\n var r = false;\r\n for (var a = l; a >= 0; a--) {\r\n r = lst[a].call(e.target, e);\r\n if (r === false) return false;\r\n }\r\n return r;\r\n }\r\n };\r\n\r\n self.bind(dom, name, de.f, bubble, active);\r\n\r\n delegatevents[name] = de;\r\n\r\n }\r\n\r\n if (self.ispage) {\r\n de.a = [self.id].concat(de.a);\r\n de.l = [fn].concat(de.l);\r\n } else {\r\n de.a.push(self.id);\r\n de.l.push(fn); \r\n }\r\n\r\n };\r\n\r\n this.undelegate = function (dom, name, fn, bubble, active) {\r\n var de = delegatevents[name]||false;\r\n if (de&&de.l) { // quick fix #683\r\n for (var a=0,l=de.l.length;a<l;a++) {\r\n if (de.a[a] === self.id) {\r\n de.a.splice(a);\r\n de.l.splice(a);\r\n if (de.a.length===0) {\r\n self._unbind(dom,name,de.l.f);\r\n delegatevents[name] = null;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n this.bind = function (dom, name, fn, bubble, active) {\r\n var el = (\"jquery\" in dom) ? dom[0] : dom;\r\n self._bind(el, name, fn, bubble || false, active || false);\r\n };\r\n\r\n this._bind = function (el, name, fn, bubble, active) { // primitive bind\r\n\r\n self.events.push({\r\n e: el,\r\n n: name,\r\n f: fn,\r\n b: bubble,\r\n q: false\r\n });\r\n\r\n (passiveSupported && active) ? el.addEventListener(name, fn, { passive: false, capture: bubble }) : el.addEventListener(name, fn, bubble || false);\r\n };\r\n\r\n this._unbind = function (el, name, fn, bub) { // primitive unbind\r\n if (delegatevents[name]) self.undelegate(el, name, fn, bub);\r\n else el.removeEventListener(name, fn, bub);\r\n };\r\n\r\n this.unbindAll = function () {\r\n for (var a = 0; a < self.events.length; a++) {\r\n var r = self.events[a];\r\n (r.q) ? r.e.unbind(r.n, r.f) : self._unbind(r.e, r.n, r.f, r.b);\r\n }\r\n };\r\n\r\n this.showRails = function () {\r\n return self.showRail().showRailHr();\r\n };\r\n\r\n this.showRail = function () {\r\n if ((self.page.maxh !== 0) && (self.ispage || self.win.css('display') != 'none')) {\r\n //self.visibility = true;\r\n self.rail.visibility = true;\r\n self.rail.css('display', 'block');\r\n }\r\n return self;\r\n };\r\n\r\n this.showRailHr = function () {\r\n if (self.railh) {\r\n if ((self.page.maxw !== 0) && (self.ispage || self.win.css('display') != 'none')) {\r\n self.railh.visibility = true;\r\n self.railh.css('display', 'block');\r\n }\r\n }\r\n return self;\r\n };\r\n\r\n this.hideRails = function () {\r\n return self.hideRail().hideRailHr();\r\n };\r\n\r\n this.hideRail = function () {\r\n //self.visibility = false;\r\n self.rail.visibility = false;\r\n self.rail.css('display', 'none');\r\n return self;\r\n };\r\n\r\n this.hideRailHr = function () {\r\n if (self.railh) {\r\n self.railh.visibility = false;\r\n self.railh.css('display', 'none');\r\n }\r\n return self;\r\n };\r\n\r\n this.show = function () {\r\n self.hidden = false;\r\n self.railslocked = false;\r\n return self.showRails();\r\n };\r\n\r\n this.hide = function () {\r\n self.hidden = true;\r\n self.railslocked = true;\r\n return self.hideRails();\r\n };\r\n\r\n this.toggle = function () {\r\n return (self.hidden) ? self.show() : self.hide();\r\n };\r\n\r\n this.remove = function () {\r\n self.stop();\r\n if (self.cursortimeout) clearTimeout(self.cursortimeout);\r\n for (var n in self.delaylist) if (self.delaylist[n]) clearAnimationFrame(self.delaylist[n].h);\r\n self.doZoomOut();\r\n self.unbindAll();\r\n\r\n if (cap.isie9) self.win[0].detachEvent(\"onpropertychange\", self.onAttributeChange); //IE9 DOMAttrModified bug\r\n\r\n if (self.observer !== false) self.observer.disconnect();\r\n if (self.observerremover !== false) self.observerremover.disconnect();\r\n if (self.observerbody !== false) self.observerbody.disconnect();\r\n\r\n self.events = null;\r\n\r\n if (self.cursor) {\r\n self.cursor.remove();\r\n }\r\n if (self.cursorh) {\r\n self.cursorh.remove();\r\n }\r\n if (self.rail) {\r\n self.rail.remove();\r\n }\r\n if (self.railh) {\r\n self.railh.remove();\r\n }\r\n if (self.zoom) {\r\n self.zoom.remove();\r\n }\r\n for (var a = 0; a < self.saved.css.length; a++) {\r\n var d = self.saved.css[a];\r\n d[0].css(d[1], (d[2] === undefined) ? '' : d[2]);\r\n }\r\n self.saved = false;\r\n self.me.data('__nicescroll', ''); //erase all traces\r\n\r\n // memory leak fixed by GianlucaGuarini - thanks a lot!\r\n // remove the current nicescroll from the $.nicescroll array & normalize array\r\n var lst = $.nicescroll;\r\n lst.each(function (i) {\r\n if (!this) return;\r\n if (this.id === self.id) {\r\n delete lst[i];\r\n for (var b = ++i; b < lst.length; b++ , i++) lst[i] = lst[b];\r\n lst.length--;\r\n if (lst.length) delete lst[lst.length];\r\n }\r\n });\r\n\r\n for (var i in self) {\r\n self[i] = null;\r\n delete self[i];\r\n }\r\n\r\n self = null;\r\n\r\n };\r\n\r\n this.scrollstart = function (fn) {\r\n this.onscrollstart = fn;\r\n return self;\r\n };\r\n this.scrollend = function (fn) {\r\n this.onscrollend = fn;\r\n return self;\r\n };\r\n this.scrollcancel = function (fn) {\r\n this.onscrollcancel = fn;\r\n return self;\r\n };\r\n\r\n this.zoomin = function (fn) {\r\n this.onzoomin = fn;\r\n return self;\r\n };\r\n this.zoomout = function (fn) {\r\n this.onzoomout = fn;\r\n return self;\r\n };\r\n\r\n this.isScrollable = function (e) {\r\n var dom = (e.target) ? e.target : e;\r\n if (dom.nodeName == 'OPTION') return true;\r\n while (dom && (dom.nodeType == 1) && (dom !== this.me[0]) && !(/^BODY|HTML/.test(dom.nodeName))) {\r\n var dd = $(dom);\r\n var ov = dd.css('overflowY') || dd.css('overflowX') || dd.css('overflow') || '';\r\n if (/scroll|auto/.test(ov)) return (dom.clientHeight != dom.scrollHeight);\r\n dom = (dom.parentNode) ? dom.parentNode : false;\r\n }\r\n return false;\r\n };\r\n\r\n this.getViewport = function (me) {\r\n var dom = (me && me.parentNode) ? me.parentNode : false;\r\n while (dom && (dom.nodeType == 1) && !(/^BODY|HTML/.test(dom.nodeName))) {\r\n var dd = $(dom);\r\n if (/fixed|absolute/.test(dd.css(\"position\"))) return dd;\r\n var ov = dd.css('overflowY') || dd.css('overflowX') || dd.css('overflow') || '';\r\n if ((/scroll|auto/.test(ov)) && (dom.clientHeight != dom.scrollHeight)) return dd;\r\n if (dd.getNiceScroll().length > 0) return dd;\r\n dom = (dom.parentNode) ? dom.parentNode : false;\r\n }\r\n return false;\r\n };\r\n\r\n this.triggerScrollStart = function (cx, cy, rx, ry, ms) {\r\n\r\n if (self.onscrollstart) {\r\n var info = {\r\n type: \"scrollstart\",\r\n current: {\r\n x: cx,\r\n y: cy\r\n },\r\n request: {\r\n x: rx,\r\n y: ry\r\n },\r\n end: {\r\n x: self.newscrollx,\r\n y: self.newscrolly\r\n },\r\n speed: ms\r\n };\r\n self.onscrollstart.call(self, info);\r\n }\r\n\r\n };\r\n\r\n this.triggerScrollEnd = function () {\r\n if (self.onscrollend) {\r\n\r\n var px = self.getScrollLeft();\r\n var py = self.getScrollTop();\r\n\r\n var info = {\r\n type: \"scrollend\",\r\n current: {\r\n x: px,\r\n y: py\r\n },\r\n end: {\r\n x: px,\r\n y: py\r\n }\r\n };\r\n\r\n self.onscrollend.call(self, info);\r\n\r\n }\r\n\r\n };\r\n\r\n var scrolldiry = 0, scrolldirx = 0, scrolltmr = 0, scrollspd = 1;\r\n\r\n function doScrollRelative(px, py, chkscroll, iswheel) {\r\n\r\n if (!self.scrollrunning) {\r\n self.newscrolly = self.getScrollTop();\r\n self.newscrollx = self.getScrollLeft();\r\n scrolltmr = now();\r\n }\r\n\r\n var gap = (now() - scrolltmr);\r\n scrolltmr = now();\r\n\r\n if (gap > 350) {\r\n scrollspd = 1;\r\n } else {\r\n scrollspd += (2 - scrollspd) / 10;\r\n }\r\n\r\n px = px * scrollspd | 0;\r\n py = py * scrollspd | 0;\r\n\r\n if (px) {\r\n\r\n if (iswheel) { // mouse-only\r\n if (px < 0) { // fix apple magic mouse swipe back/forward\r\n if (self.getScrollLeft() >= self.page.maxw) return true;\r\n } else {\r\n if (self.getScrollLeft() <= 0) return true;\r\n }\r\n }\r\n\r\n var dx = px > 0 ? 1 : -1;\r\n\r\n if (scrolldirx !== dx) {\r\n if (self.scrollmom) self.scrollmom.stop();\r\n self.newscrollx = self.getScrollLeft();\r\n scrolldirx = dx;\r\n }\r\n\r\n self.lastdeltax -= px;\r\n\r\n }\r\n\r\n if (py) {\r\n\r\n var chk = (function () {\r\n var top = self.getScrollTop();\r\n if (py < 0) {\r\n if (top >= self.page.maxh) return true;\r\n } else {\r\n if (top <= 0) return true;\r\n }\r\n })();\r\n\r\n if (chk) {\r\n if (opt.nativeparentscrolling && chkscroll && !self.ispage && !self.zoomactive) return true;\r\n var ny = self.view.h >> 1;\r\n if (self.newscrolly < -ny) { self.newscrolly = -ny; py = -1; }\r\n else if (self.newscrolly > self.page.maxh + ny) { self.newscrolly = self.page.maxh + ny; py = 1; }\r\n else py = 0;\r\n }\r\n\r\n var dy = py > 0 ? 1 : -1;\r\n\r\n if (scrolldiry !== dy) {\r\n if (self.scrollmom) self.scrollmom.stop();\r\n self.newscrolly = self.getScrollTop();\r\n scrolldiry = dy;\r\n }\r\n\r\n self.lastdeltay -= py;\r\n\r\n }\r\n\r\n if (py || px) {\r\n self.synched(\"relativexy\", function () {\r\n\r\n var dty = self.lastdeltay + self.newscrolly;\r\n self.lastdeltay = 0;\r\n\r\n var dtx = self.lastdeltax + self.newscrollx;\r\n self.lastdeltax = 0;\r\n\r\n if (!self.rail.drag) self.doScrollPos(dtx, dty);\r\n\r\n });\r\n }\r\n\r\n }\r\n\r\n var hasparentscrollingphase = false;\r\n\r\n function execScrollWheel(e, hr, chkscroll) {\r\n var px, py;\r\n\r\n if (!chkscroll && hasparentscrollingphase) return true;\r\n\r\n if (e.deltaMode === 0) { // PIXEL\r\n px = -(e.deltaX * (opt.mousescrollstep / (18 * 3))) | 0;\r\n py = -(e.deltaY * (opt.mousescrollstep / (18 * 3))) | 0;\r\n } else if (e.deltaMode === 1) { // LINE\r\n px = -(e.deltaX * opt.mousescrollstep * 50 / 80) | 0;\r\n py = -(e.deltaY * opt.mousescrollstep * 50 / 80) | 0;\r\n }\r\n\r\n if (hr && opt.oneaxismousemode && (px === 0) && py) { // classic vertical-only mousewheel + browser with x/y support \r\n px = py;\r\n py = 0;\r\n\r\n if (chkscroll) {\r\n var hrend = (px < 0) ? (self.getScrollLeft() >= self.page.maxw) : (self.getScrollLeft() <= 0);\r\n if (hrend) { // preserve vertical scrolling\r\n py = px;\r\n px = 0;\r\n }\r\n }\r\n\r\n }\r\n\r\n // invert horizontal direction for rtl mode\r\n if (self.isrtlmode) px = -px;\r\n\r\n var chk = doScrollRelative(px, py, chkscroll, true);\r\n\r\n if (chk) {\r\n if (chkscroll) hasparentscrollingphase = true;\r\n } else {\r\n hasparentscrollingphase = false;\r\n e.stopImmediatePropagation();\r\n return e.preventDefault();\r\n }\r\n\r\n }\r\n\r\n this.onmousewheel = function (e) {\r\n if (self.wheelprevented||self.locked) return false;\r\n if (self.railslocked) {\r\n self.debounced(\"checkunlock\", self.resize, 250);\r\n return false;\r\n }\r\n if (self.rail.drag) return self.cancelEvent(e);\r\n\r\n if (opt.oneaxismousemode === \"auto\" && e.deltaX !== 0) opt.oneaxismousemode = false; // check two-axis mouse support (not very elegant)\r\n\r\n if (opt.oneaxismousemode && e.deltaX === 0) {\r\n if (!self.rail.scrollable) {\r\n if (self.railh && self.railh.scrollable) {\r\n return self.onmousewheelhr(e);\r\n } else {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n var nw = now();\r\n var chk = false;\r\n if (opt.preservenativescrolling && ((self.checkarea + 600) < nw)) {\r\n self.nativescrollingarea = self.isScrollable(e);\r\n chk = true;\r\n }\r\n self.checkarea = nw;\r\n if (self.nativescrollingarea) return true; // this isn't my business\r\n var ret = execScrollWheel(e, false, chk);\r\n if (ret) self.checkarea = 0;\r\n return ret;\r\n };\r\n\r\n this.onmousewheelhr = function (e) {\r\n if (self.wheelprevented) return;\r\n if (self.railslocked || !self.railh.scrollable) return true;\r\n if (self.rail.drag) return self.cancelEvent(e);\r\n\r\n var nw = now();\r\n var chk = false;\r\n if (opt.preservenativescrolling && ((self.checkarea + 600) < nw)) {\r\n self.nativescrollingarea = self.isScrollable(e);\r\n chk = true;\r\n }\r\n self.checkarea = nw;\r\n if (self.nativescrollingarea) return true; // this is not my business\r\n if (self.railslocked) return self.cancelEvent(e);\r\n\r\n return execScrollWheel(e, true, chk);\r\n };\r\n\r\n this.stop = function () {\r\n self.cancelScroll();\r\n if (self.scrollmon) self.scrollmon.stop();\r\n self.cursorfreezed = false;\r\n self.scroll.y = Math.round(self.getScrollTop() * (1 / self.scrollratio.y));\r\n self.noticeCursor();\r\n return self;\r\n };\r\n\r\n this.getTransitionSpeed = function (dif) {\r\n\r\n return 80 + (dif / 72) * opt.scrollspeed |0;\r\n\r\n };\r\n\r\n if (!opt.smoothscroll) {\r\n this.doScrollLeft = function (x, spd) { //direct\r\n var y = self.getScrollTop();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n this.doScrollTop = function (y, spd) { //direct\r\n var x = self.getScrollLeft();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n this.doScrollPos = function (x, y, spd) { //direct\r\n var nx = (x > self.page.maxw) ? self.page.maxw : x;\r\n if (nx < 0) nx = 0;\r\n var ny = (y > self.page.maxh) ? self.page.maxh : y;\r\n if (ny < 0) ny = 0;\r\n self.synched('scroll', function () {\r\n self.setScrollTop(ny);\r\n self.setScrollLeft(nx);\r\n });\r\n };\r\n this.cancelScroll = function () { }; // direct\r\n\r\n } else if (self.ishwscroll && cap.hastransition && opt.usetransition && !!opt.smoothscroll) {\r\n\r\n var lasttransitionstyle = '';\r\n\r\n this.resetTransition = function () {\r\n lasttransitionstyle = '';\r\n self.doc.css(cap.prefixstyle + 'transition-duration', '0ms');\r\n };\r\n\r\n this.prepareTransition = function (dif, istime) {\r\n var ex = (istime) ? dif : self.getTransitionSpeed(dif);\r\n var trans = ex + 'ms';\r\n if (lasttransitionstyle !== trans) {\r\n lasttransitionstyle = trans;\r\n self.doc.css(cap.prefixstyle + 'transition-duration', trans);\r\n }\r\n return ex;\r\n };\r\n\r\n this.doScrollLeft = function (x, spd) { //trans\r\n var y = (self.scrollrunning) ? self.newscrolly : self.getScrollTop();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.doScrollTop = function (y, spd) { //trans\r\n var x = (self.scrollrunning) ? self.newscrollx : self.getScrollLeft();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.cursorupdate = {\r\n running: false,\r\n start: function () {\r\n var m = this;\r\n\r\n if (m.running) return;\r\n m.running = true;\r\n\r\n var loop = function () {\r\n if (m.running) setAnimationFrame(loop);\r\n self.showCursor(self.getScrollTop(), self.getScrollLeft());\r\n self.notifyScrollEvent(self.win[0]);\r\n };\r\n\r\n setAnimationFrame(loop);\r\n },\r\n stop: function () {\r\n this.running = false;\r\n }\r\n };\r\n\r\n this.doScrollPos = function (x, y, spd) { //trans\r\n\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n\r\n if (((self.newscrolly - py) * (y - py) < 0) || ((self.newscrollx - px) * (x - px) < 0)) self.cancelScroll(); //inverted movement detection \r\n\r\n if (!opt.bouncescroll) {\r\n if (y < 0) y = 0;\r\n else if (y > self.page.maxh) y = self.page.maxh;\r\n if (x < 0) x = 0;\r\n else if (x > self.page.maxw) x = self.page.maxw;\r\n } else {\r\n if (y < 0) y = y / 2 | 0;\r\n else if (y > self.page.maxh) y = self.page.maxh + (y - self.page.maxh) / 2 | 0;\r\n if (x < 0) x = x / 2 | 0;\r\n else if (x > self.page.maxw) x = self.page.maxw + (x - self.page.maxw) / 2 | 0;\r\n }\r\n\r\n if (self.scrollrunning && x == self.newscrollx && y == self.newscrolly) return false;\r\n\r\n self.newscrolly = y;\r\n self.newscrollx = x;\r\n\r\n var top = self.getScrollTop();\r\n var lft = self.getScrollLeft();\r\n\r\n var dst = {};\r\n dst.x = x - lft;\r\n dst.y = y - top;\r\n\r\n var dd = Math.sqrt((dst.x * dst.x) + (dst.y * dst.y)) | 0;\r\n\r\n var ms = self.prepareTransition(dd);\r\n\r\n if (!self.scrollrunning) {\r\n self.scrollrunning = true;\r\n self.triggerScrollStart(lft, top, x, y, ms);\r\n self.cursorupdate.start();\r\n }\r\n\r\n self.scrollendtrapped = true;\r\n\r\n if (!cap.transitionend) {\r\n if (self.scrollendtrapped) clearTimeout(self.scrollendtrapped);\r\n self.scrollendtrapped = setTimeout(self.onScrollTransitionEnd, ms); // simulate transitionend event\r\n }\r\n\r\n self.setScrollTop(self.newscrolly);\r\n self.setScrollLeft(self.newscrollx);\r\n\r\n };\r\n\r\n this.cancelScroll = function () {\r\n if (!self.scrollendtrapped) return true;\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n self.scrollrunning = false;\r\n if (!cap.transitionend) clearTimeout(cap.transitionend);\r\n self.scrollendtrapped = false;\r\n self.resetTransition();\r\n self.setScrollTop(py); // fire event onscroll\r\n if (self.railh) self.setScrollLeft(px);\r\n if (self.timerscroll && self.timerscroll.tm) clearInterval(self.timerscroll.tm);\r\n self.timerscroll = false;\r\n\r\n self.cursorfreezed = false;\r\n\r\n self.cursorupdate.stop();\r\n self.showCursor(py, px);\r\n return self;\r\n };\r\n\r\n this.onScrollTransitionEnd = function () {\r\n\r\n if (!self.scrollendtrapped) return;\r\n\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n\r\n if (py < 0) py = 0;\r\n else if (py > self.page.maxh) py = self.page.maxh;\r\n if (px < 0) px = 0;\r\n else if (px > self.page.maxw) px = self.page.maxw;\r\n if ((py != self.newscrolly) || (px != self.newscrollx)) return self.doScrollPos(px, py, opt.snapbackspeed);\r\n\r\n if (self.scrollrunning) self.triggerScrollEnd();\r\n self.scrollrunning = false;\r\n\r\n self.scrollendtrapped = false;\r\n self.resetTransition();\r\n self.timerscroll = false;\r\n self.setScrollTop(py); // fire event onscroll \r\n if (self.railh) self.setScrollLeft(px); // fire event onscroll left\r\n\r\n self.cursorupdate.stop();\r\n self.noticeCursor(false, py, px);\r\n\r\n self.cursorfreezed = false;\r\n\r\n };\r\n\r\n } else {\r\n\r\n this.doScrollLeft = function (x, spd) { //no-trans\r\n var y = (self.scrollrunning) ? self.newscrolly : self.getScrollTop();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.doScrollTop = function (y, spd) { //no-trans\r\n var x = (self.scrollrunning) ? self.newscrollx : self.getScrollLeft();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.doScrollPos = function (x, y, spd) { //no-trans\r\n\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n\r\n if (((self.newscrolly - py) * (y - py) < 0) || ((self.newscrollx - px) * (x - px) < 0)) self.cancelScroll(); //inverted movement detection\r\n\r\n var clipped = false;\r\n\r\n if (!self.bouncescroll || !self.rail.visibility) {\r\n if (y < 0) {\r\n y = 0;\r\n clipped = true;\r\n } else if (y > self.page.maxh) {\r\n y = self.page.maxh;\r\n clipped = true;\r\n }\r\n }\r\n if (!self.bouncescroll || !self.railh.visibility) {\r\n if (x < 0) {\r\n x = 0;\r\n clipped = true;\r\n } else if (x > self.page.maxw) {\r\n x = self.page.maxw;\r\n clipped = true;\r\n }\r\n }\r\n\r\n if (self.scrollrunning && (self.newscrolly === y) && (self.newscrollx === x)) return true;\r\n\r\n self.newscrolly = y;\r\n self.newscrollx = x;\r\n\r\n self.dst = {};\r\n self.dst.x = x - px;\r\n self.dst.y = y - py;\r\n self.dst.px = px;\r\n self.dst.py = py;\r\n\r\n var dd = Math.sqrt((self.dst.x * self.dst.x) + (self.dst.y * self.dst.y)) | 0;\r\n var ms = self.getTransitionSpeed(dd);\r\n\r\n self.bzscroll = {};\r\n\r\n var p3 = (clipped) ? 1 : 0.58;\r\n self.bzscroll.x = new BezierClass(px, self.newscrollx, ms, 0, 0, p3, 1);\r\n self.bzscroll.y = new BezierClass(py, self.newscrolly, ms, 0, 0, p3, 1);\r\n\r\n var loopid = now();\r\n\r\n var loop = function () {\r\n\r\n if (!self.scrollrunning) return;\r\n var x = self.bzscroll.y.getPos();\r\n\r\n self.setScrollLeft(self.bzscroll.x.getNow());\r\n self.setScrollTop(self.bzscroll.y.getNow());\r\n\r\n if (x <= 1) {\r\n self.timer = setAnimationFrame(loop);\r\n } else {\r\n self.scrollrunning = false;\r\n self.timer = 0;\r\n self.triggerScrollEnd();\r\n }\r\n\r\n };\r\n\r\n if (!self.scrollrunning) {\r\n self.triggerScrollStart(px, py, x, y, ms);\r\n self.scrollrunning = true;\r\n self.timer = setAnimationFrame(loop);\r\n }\r\n\r\n };\r\n\r\n this.cancelScroll = function () {\r\n if (self.timer) clearAnimationFrame(self.timer);\r\n self.timer = 0;\r\n self.bzscroll = false;\r\n self.scrollrunning = false;\r\n return self;\r\n };\r\n\r\n }\r\n\r\n this.doScrollBy = function (stp, relative) {\r\n doScrollRelative(0, stp);\r\n };\r\n\r\n this.doScrollLeftBy = function (stp, relative) {\r\n doScrollRelative(stp, 0);\r\n };\r\n\r\n this.doScrollTo = function (pos, relative) {\r\n var ny = (relative) ? Math.round(pos * self.scrollratio.y) : pos;\r\n if (ny < 0) ny = 0;\r\n else if (ny > self.page.maxh) ny = self.page.maxh;\r\n self.cursorfreezed = false;\r\n self.doScrollTop(pos);\r\n };\r\n\r\n this.checkContentSize = function () {\r\n var pg = self.getContentSize();\r\n if ((pg.h != self.page.h) || (pg.w != self.page.w)) self.resize(false, pg);\r\n };\r\n\r\n self.onscroll = function (e) {\r\n if (self.rail.drag) return;\r\n if (!self.cursorfreezed) {\r\n self.synched('scroll', function () {\r\n self.scroll.y = Math.round(self.getScrollTop() / self.scrollratio.y);\r\n if (self.railh) self.scroll.x = Math.round(self.getScrollLeft() / self.scrollratio.x);\r\n self.noticeCursor();\r\n });\r\n }\r\n };\r\n self.bind(self.docscroll, \"scroll\", self.onscroll);\r\n\r\n this.doZoomIn = function (e) {\r\n if (self.zoomactive) return;\r\n self.zoomactive = true;\r\n\r\n self.zoomrestore = {\r\n style: {}\r\n };\r\n var lst = ['position', 'top', 'left', 'zIndex', 'backgroundColor', 'marginTop', 'marginBottom', 'marginLeft', 'marginRight'];\r\n var win = self.win[0].style;\r\n for (var a in lst) {\r\n var pp = lst[a];\r\n self.zoomrestore.style[pp] = (win[pp] !== undefined) ? win[pp] : '';\r\n }\r\n\r\n self.zoomrestore.style.width = self.win.css('width');\r\n self.zoomrestore.style.height = self.win.css('height');\r\n\r\n self.zoomrestore.padding = {\r\n w: self.win.outerWidth() - self.win.width(),\r\n h: self.win.outerHeight() - self.win.height()\r\n };\r\n\r\n if (cap.isios4) {\r\n self.zoomrestore.scrollTop = $window.scrollTop();\r\n $window.scrollTop(0);\r\n }\r\n\r\n self.win.css({\r\n position: (cap.isios4) ? \"absolute\" : \"fixed\",\r\n top: 0,\r\n left: 0,\r\n zIndex: globalmaxzindex + 100,\r\n margin: 0\r\n });\r\n var bkg = self.win.css(\"backgroundColor\");\r\n if (\"\" === bkg || /transparent|rgba\\(0, 0, 0, 0\\)|rgba\\(0,0,0,0\\)/.test(bkg)) self.win.css(\"backgroundColor\", \"#fff\");\r\n self.rail.css({\r\n zIndex: globalmaxzindex + 101\r\n });\r\n self.zoom.css({\r\n zIndex: globalmaxzindex + 102\r\n });\r\n self.zoom.css('backgroundPosition', '0 -18px');\r\n self.resizeZoom();\r\n\r\n if (self.onzoomin) self.onzoomin.call(self);\r\n\r\n return self.cancelEvent(e);\r\n };\r\n\r\n this.doZoomOut = function (e) {\r\n if (!self.zoomactive) return;\r\n self.zoomactive = false;\r\n\r\n self.win.css(\"margin\", \"\");\r\n self.win.css(self.zoomrestore.style);\r\n\r\n if (cap.isios4) {\r\n $window.scrollTop(self.zoomrestore.scrollTop);\r\n }\r\n\r\n self.rail.css({\r\n \"z-index\": self.zindex\r\n });\r\n self.zoom.css({\r\n \"z-index\": self.zindex\r\n });\r\n self.zoomrestore = false;\r\n self.zoom.css('backgroundPosition', '0 0');\r\n self.onResize();\r\n\r\n if (self.onzoomout) self.onzoomout.call(self);\r\n\r\n return self.cancelEvent(e);\r\n };\r\n\r\n this.doZoom = function (e) {\r\n return (self.zoomactive) ? self.doZoomOut(e) : self.doZoomIn(e);\r\n };\r\n\r\n this.resizeZoom = function () {\r\n if (!self.zoomactive) return;\r\n\r\n var py = self.getScrollTop(); //preserve scrolling position\r\n self.win.css({\r\n width: $window.width() - self.zoomrestore.padding.w + \"px\",\r\n height: $window.height() - self.zoomrestore.padding.h + \"px\"\r\n });\r\n self.onResize();\r\n\r\n self.setScrollTop(Math.min(self.page.maxh, py));\r\n };\r\n\r\n this.init();\r\n\r\n $.nicescroll.push(this);\r\n\r\n };\r\n\r\n // Inspired by the work of Kin Blas\r\n // http://webpro.host.adobe.com/people/jblas/momentum/includes/jquery.momentum.0.7.js \r\n var ScrollMomentumClass2D = function (nc) {\r\n var self = this;\r\n this.nc = nc;\r\n\r\n this.lastx = 0;\r\n this.lasty = 0;\r\n this.speedx = 0;\r\n this.speedy = 0;\r\n this.lasttime = 0;\r\n this.steptime = 0;\r\n this.snapx = false;\r\n this.snapy = false;\r\n this.demulx = 0;\r\n this.demuly = 0;\r\n\r\n this.lastscrollx = -1;\r\n this.lastscrolly = -1;\r\n\r\n this.chkx = 0;\r\n this.chky = 0;\r\n\r\n this.timer = 0;\r\n\r\n this.reset = function (px, py) {\r\n self.stop();\r\n self.steptime = 0;\r\n self.lasttime = now();\r\n self.speedx = 0;\r\n self.speedy = 0;\r\n self.lastx = px;\r\n self.lasty = py;\r\n self.lastscrollx = -1;\r\n self.lastscrolly = -1;\r\n };\r\n\r\n this.update = function (px, py) {\r\n var tm = now();\r\n self.steptime = tm - self.lasttime;\r\n self.lasttime = tm;\r\n var dy = py - self.lasty;\r\n var dx = px - self.lastx;\r\n var sy = self.nc.getScrollTop();\r\n var sx = self.nc.getScrollLeft();\r\n var newy = sy + dy;\r\n var newx = sx + dx;\r\n self.snapx = (newx < 0) || (newx > self.nc.page.maxw);\r\n self.snapy = (newy < 0) || (newy > self.nc.page.maxh);\r\n self.speedx = dx;\r\n self.speedy = dy;\r\n self.lastx = px;\r\n self.lasty = py;\r\n };\r\n\r\n this.stop = function () {\r\n self.nc.unsynched(\"domomentum2d\");\r\n if (self.timer) clearTimeout(self.timer);\r\n self.timer = 0;\r\n self.lastscrollx = -1;\r\n self.lastscrolly = -1;\r\n };\r\n\r\n this.doSnapy = function (nx, ny) {\r\n var snap = false;\r\n\r\n if (ny < 0) {\r\n ny = 0;\r\n snap = true;\r\n } else if (ny > self.nc.page.maxh) {\r\n ny = self.nc.page.maxh;\r\n snap = true;\r\n }\r\n\r\n if (nx < 0) {\r\n nx = 0;\r\n snap = true;\r\n } else if (nx > self.nc.page.maxw) {\r\n nx = self.nc.page.maxw;\r\n snap = true;\r\n }\r\n\r\n (snap) ? self.nc.doScrollPos(nx, ny, self.nc.opt.snapbackspeed) : self.nc.triggerScrollEnd();\r\n };\r\n\r\n this.doMomentum = function (gp) {\r\n var t = now();\r\n var l = (gp) ? t + gp : self.lasttime;\r\n\r\n var sl = self.nc.getScrollLeft();\r\n var st = self.nc.getScrollTop();\r\n\r\n var pageh = self.nc.page.maxh;\r\n var pagew = self.nc.page.maxw;\r\n\r\n self.speedx = (pagew > 0) ? Math.min(60, self.speedx) : 0;\r\n self.speedy = (pageh > 0) ? Math.min(60, self.speedy) : 0;\r\n\r\n var chk = l && (t - l) <= 60;\r\n\r\n if ((st < 0) || (st > pageh) || (sl < 0) || (sl > pagew)) chk = false;\r\n\r\n var sy = (self.speedy && chk) ? self.speedy : false;\r\n var sx = (self.speedx && chk) ? self.speedx : false;\r\n\r\n if (sy || sx) {\r\n var tm = Math.max(16, self.steptime); //timeout granularity\r\n\r\n if (tm > 50) { // do smooth\r\n var xm = tm / 50;\r\n self.speedx *= xm;\r\n self.speedy *= xm;\r\n tm = 50;\r\n }\r\n\r\n self.demulxy = 0;\r\n\r\n self.lastscrollx = self.nc.getScrollLeft();\r\n self.chkx = self.lastscrollx;\r\n self.lastscrolly = self.nc.getScrollTop();\r\n self.chky = self.lastscrolly;\r\n\r\n var nx = self.lastscrollx;\r\n var ny = self.lastscrolly;\r\n\r\n var onscroll = function () {\r\n var df = ((now() - t) > 600) ? 0.04 : 0.02;\r\n\r\n if (self.speedx) {\r\n nx = Math.floor(self.lastscrollx - (self.speedx * (1 - self.demulxy)));\r\n self.lastscrollx = nx;\r\n if ((nx < 0) || (nx > pagew)) df = 0.10;\r\n }\r\n\r\n if (self.speedy) {\r\n ny = Math.floor(self.lastscrolly - (self.speedy * (1 - self.demulxy)));\r\n self.lastscrolly = ny;\r\n if ((ny < 0) || (ny > pageh)) df = 0.10;\r\n }\r\n\r\n self.demulxy = Math.min(1, self.demulxy + df);\r\n\r\n self.nc.synched(\"domomentum2d\", function () {\r\n\r\n if (self.speedx) {\r\n var scx = self.nc.getScrollLeft();\r\n // if (scx != self.chkx) self.stop();\r\n self.chkx = nx;\r\n self.nc.setScrollLeft(nx);\r\n }\r\n\r\n if (self.speedy) {\r\n var scy = self.nc.getScrollTop();\r\n // if (scy != self.chky) self.stop();\r\n self.chky = ny;\r\n self.nc.setScrollTop(ny);\r\n }\r\n\r\n if (!self.timer) {\r\n self.nc.hideCursor();\r\n self.doSnapy(nx, ny);\r\n }\r\n\r\n });\r\n\r\n if (self.demulxy < 1) {\r\n self.timer = setTimeout(onscroll, tm);\r\n } else {\r\n self.stop();\r\n self.nc.hideCursor();\r\n self.doSnapy(nx, ny);\r\n }\r\n };\r\n\r\n onscroll();\r\n\r\n } else {\r\n self.doSnapy(self.nc.getScrollLeft(), self.nc.getScrollTop());\r\n }\r\n\r\n };\r\n\r\n };\r\n\r\n\r\n // override jQuery scrollTop\r\n var _scrollTop = jQuery.fn.scrollTop; // preserve original function\r\n\r\n jQuery.cssHooks.pageYOffset = {\r\n get: function (elem, computed, extra) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollTop() : _scrollTop.call(elem);\r\n },\r\n set: function (elem, value) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollTop(parseInt(value)) : _scrollTop.call(elem, value);\r\n return this;\r\n }\r\n };\r\n\r\n jQuery.fn.scrollTop = function (value) {\r\n if (value === undefined) {\r\n var nice = (this[0]) ? $.data(this[0], '__nicescroll') || false : false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollTop() : _scrollTop.call(this);\r\n } else {\r\n return this.each(function () {\r\n var nice = $.data(this, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollTop(parseInt(value)) : _scrollTop.call($(this), value);\r\n });\r\n }\r\n };\r\n\r\n // override jQuery scrollLeft\r\n var _scrollLeft = jQuery.fn.scrollLeft; // preserve original function\r\n\r\n $.cssHooks.pageXOffset = {\r\n get: function (elem, computed, extra) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollLeft() : _scrollLeft.call(elem);\r\n },\r\n set: function (elem, value) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call(elem, value);\r\n return this;\r\n }\r\n };\r\n\r\n jQuery.fn.scrollLeft = function (value) {\r\n if (value === undefined) {\r\n var nice = (this[0]) ? $.data(this[0], '__nicescroll') || false : false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollLeft() : _scrollLeft.call(this);\r\n } else {\r\n return this.each(function () {\r\n var nice = $.data(this, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call($(this), value);\r\n });\r\n }\r\n };\r\n\r\n var NiceScrollArray = function (doms) {\r\n var self = this;\r\n this.length = 0;\r\n this.name = \"nicescrollarray\";\r\n\r\n this.each = function (fn) {\r\n $.each(self, fn);\r\n return self;\r\n };\r\n\r\n this.push = function (nice) {\r\n self[self.length] = nice;\r\n self.length++;\r\n };\r\n\r\n this.eq = function (idx) {\r\n return self[idx];\r\n };\r\n\r\n if (doms) {\r\n for (var a = 0; a < doms.length; a++) {\r\n var nice = $.data(doms[a], '__nicescroll') || false;\r\n if (nice) {\r\n this[this.length] = nice;\r\n this.length++;\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n function mplex(el, lst, fn) {\r\n for (var a = 0, l = lst.length; a < l; a++) fn(el, lst[a]);\r\n }\r\n mplex(\r\n NiceScrollArray.prototype, ['show', 'hide', 'toggle', 'onResize', 'resize', 'remove', 'stop', 'doScrollPos'],\r\n function (e, n) {\r\n e[n] = function () {\r\n var args = arguments;\r\n return this.each(function () {\r\n this[n].apply(this, args);\r\n });\r\n };\r\n }\r\n );\r\n\r\n jQuery.fn.getNiceScroll = function (index) {\r\n if (index === undefined) {\r\n return new NiceScrollArray(this);\r\n } else {\r\n return this[index] && $.data(this[index], '__nicescroll') || false;\r\n }\r\n };\r\n\r\n var pseudos = jQuery.expr.pseudos || jQuery.expr[':']; // jQuery 3 migration\r\n pseudos.nicescroll = function (a) {\r\n return $.data(a, '__nicescroll') !== undefined;\r\n };\r\n\r\n $.fn.niceScroll = function (wrapper, _opt) {\r\n if (_opt === undefined && typeof wrapper == \"object\" && !(\"jquery\" in wrapper)) {\r\n _opt = wrapper;\r\n wrapper = false;\r\n }\r\n\r\n var ret = new NiceScrollArray();\r\n\r\n this.each(function () {\r\n var $this = $(this);\r\n\r\n var opt = $.extend({}, _opt); // cloning\r\n\r\n if (wrapper || false) {\r\n var wrp = $(wrapper);\r\n opt.doc = (wrp.length > 1) ? $(wrapper, $this) : wrp;\r\n opt.win = $this;\r\n }\r\n var docundef = !(\"doc\" in opt);\r\n if (!docundef && !(\"win\" in opt)) opt.win = $this;\r\n\r\n var nice = $this.data('__nicescroll') || false;\r\n if (!nice) {\r\n opt.doc = opt.doc || $this;\r\n nice = new NiceScrollClass(opt, $this);\r\n $this.data('__nicescroll', nice);\r\n }\r\n ret.push(nice);\r\n });\r\n\r\n return (ret.length === 1) ? ret[0] : ret;\r\n };\r\n\r\n _win.NiceScroll = {\r\n getjQuery: function () {\r\n return jQuery;\r\n }\r\n };\r\n\r\n if (!$.nicescroll) {\r\n $.nicescroll = new NiceScrollArray();\r\n $.nicescroll.options = _globaloptions;\r\n }\r\n\r\n}));","import $ from \"jquery\";\nimport \"jquery.nicescroll\";\nimport {\n IsRunningOnBloomDesktop,\n kLegacyCanvasElementSelector,\n} from \"./dragActivityRuntime\";\n\nexport const kSelectorForPotentialNiceScrollElements =\n \".bloom-translationGroup:not(.bloom-imageDescription) .bloom-editable.bloom-visibility-code-on, \" +\n \".scrollable\"; // we added .scrollable for branding cases where the boilerplate text also needs to scroll\n\n// Add a \"nice\" scrollbar to the page if the content overflows.\nexport function addScrollbarsToPage(\n bloomPage: Element,\n pointerEventHandler?: (e: PointerEvent) => void,\n): void {\n // Expected behavior for cover: \"on the cover, which is has a very dynamic layout, we just don't do scrollbars\"\n if (bloomPage.classList.contains(\"cover\")) {\n return;\n }\n const isRunningOnBloomDesktop = IsRunningOnBloomDesktop(bloomPage);\n\n // on a browser so obsolete that it doesn't have IntersectionObserver (e.g., IE or Safari before 12.2),\n // we just won't get scrolling.\n if (\"IntersectionObserver\" in window) {\n // Attach overlaid scrollbar to all editables except canvas elements (e.g. comics)\n // Expected behavior for comic bubbles: \"we want overflow to show, but not generate scroll bars\"\n let scrollBlocks: HTMLElement[] = [];\n let countOfObserversExpectedToReport = 0;\n let countOfObserversThatHaveReported = 0;\n $(bloomPage)\n .find(kSelectorForPotentialNiceScrollElements)\n .each((index, elt) => {\n // Process the blocks that are possibly overflowing.\n // Blocks that are overflowing will be configured to use niceScroll\n // so the user can scroll and see everything. That is costly, because\n // niceScroll leaks event listeners every time it is called. So we don't\n // want to use it any more than we need to. (Is this true?) Also, niceScroll\n // somehow fails to work when our vertical alignment classes are applied;\n // probably something to do with the bloom-editables being display:flex\n // to achieve vertical positioning. We can safely remove those classes\n // if the block is overflowing, because there's no excess white space\n // to distribute.\n // Note: there are complications Bloom desktop handles in determining\n // accurately whether a block is overflowing. We don't handle those here.\n // If it is close enough to overflow to get a scroll bar, it's close\n // enough not to care whether extra white space is at the top, bottom,\n // or split (hence we can safely remove classes used for that).\n // And we'll risk sometimes adding niceScroll when we could (just)\n // have done without it. Using the same code in Bloom Desktop and bloom-player\n // ensures consistent scrollbar behavior between the two.\n const firstChild = elt.firstElementChild;\n const lastChild = elt.lastElementChild;\n if (!firstChild || !lastChild) {\n // no children, can't be overflowing\n return;\n }\n\n // We need to know the scale of the page, because nicescroll doesn't handle\n // scaling when it comes to the padding that we add to the top and left of\n // the translationGroup element. See BL-13796.\n let scale = 1;\n // bloom-player approach to setting the scale\n const scaleStyle = document.querySelector(\n \"style#scale-style-sheet\",\n );\n if (scaleStyle) {\n const match = scaleStyle.innerHTML.match(\n /transform:[a-z0-9, ()]* scale\\((\\d+(\\.\\d+)?)\\)/,\n );\n if (match) {\n scale = parseFloat(match[1]);\n }\n } else {\n // Bloom Desktop approach to setting the scale\n const scaleContainer = elt.closest(\n \"#page-scaling-container\",\n ) as HTMLElement;\n if (scaleContainer) {\n const scaleValue = scaleContainer.style.transform;\n if (scaleValue && scaleValue.startsWith(\"scale(\")) {\n scale = parseFloat(\n scaleValue.substring(6, scaleValue.length - 1),\n );\n }\n }\n }\n // nicescroll doesn't provide a way to adjust the height of the scrollbar\n // (\"rail\"). Adjusting the height of the thumb (\"cursor\") is counterproductive\n // if the scrollbar height doesn't change, so we don't try to adjust that\n // aspect of the thumb.\n const { topAdjust, leftAdjust, thumbWidth } =\n ComputeNiceScrollOffsets(scale, elt as HTMLElement);\n\n // We don't really want continuous observation, but this is an elegant\n // way to find out whether each child is entirely contained within its\n // parent. Unlike computations involving coordinates, we don't have to\n // worry about whether borders, margins, and padding are included in\n // various measurements. We do need to check the first as well as the\n // last child, because if text is aligned bottom, any overflow will be\n // at the top.\n const observer = new IntersectionObserver(\n (entries, ob) => {\n // called more-or-less immediately for each child, but after the\n // loop creates them all.\n entries.forEach((entry) => {\n countOfObserversThatHaveReported++;\n ob.unobserve(entry.target); // don't want to keep getting them, or leak observers\n if (!entry.target.parentElement) {\n // We can't do anything with this target. It must be in another DOM. (BL-15508)\n // I'm not sure how that can happen, but with iframes around, who knows?\n return;\n }\n const isBubble = !!entry.target.closest(\n kLegacyCanvasElementSelector,\n );\n // In bloom desktop preview, we set width to 200% and then scale down by 50%.\n // This can lead to intersection ratios very slightly less than 1, probably due\n // to pixel rounding of some sort, when in fact the content fits comfortably.\n // For example, in one case we got a boundingClientRect 72.433 high\n // and an intersectionRect 72.416, for a ratio of 0.9998.\n // If a block is 1000 pixels high and really overflowing by 1 pixel, the ratio\n // will be 0.999. I think it's safe to take anything closer to 1 than that as\n // 'not overflowing'.\n let overflowing = entry.intersectionRatio < 0.999;\n\n if (overflowing && isBubble) {\n // We want to be less aggressive about putting scroll bars on bubbles.\n // Most of the time, a bubble is very carefully sized to just fit the\n // text. But the intersection observer wants it to fit a certain amount\n // of white space as well. We want a scroll bar if it's overflowing\n // really badly for some reason, but that's much more the exception\n // than the rule, so better a little clipping when the bubble is badly\n // sized than a scroll bar that isn't needed in one that is just right.\n // Example: a bubble which appears to fit perfectly, 3 lines high:\n // its clientHeight is 72; containing bloom-editable's is 59;\n // lineHeight is 24px. IntersectionRatio computes to 59/72,\n // which makes the 'overflow' 13. A ratio of 0.5 as we originally\n // proposed would give us a scroll bar we don't want.\n let maxBubbleOverflowLineFraction = 0.6;\n if (\n entry.target !=\n entry.target.parentElement\n ?.firstElementChild ||\n entry.target !=\n entry.target.parentElement!\n .lastElementChild\n ) {\n // Bubbles are center-aligned vertically. If this is not the only\n // child,the first and last will overflow above and below by about the\n // same amount. So we're only really looking at half the overflow on this para,\n // and should reduce the threshold.\n maxBubbleOverflowLineFraction /= 2;\n }\n const overflow =\n (1 - entry.intersectionRatio) *\n entry.target.clientHeight;\n const lineHeightPx = window.getComputedStyle(\n entry.target,\n ).lineHeight;\n const lineHeight = parseFloat(\n // remove the trailing \"px\"\n lineHeightPx.substring(\n 0,\n lineHeightPx.length - 2,\n ),\n );\n overflowing =\n overflow >\n lineHeight * maxBubbleOverflowLineFraction;\n }\n if (\n overflowing &&\n scrollBlocks.indexOf(\n entry.target.parentElement!,\n ) < 0\n ) {\n scrollBlocks.push(entry.target.parentElement!);\n // remove classes incompatible with niceScroll\n const group =\n entry.target.parentElement!.parentElement!;\n if (\n group.classList.contains(\n \"bloom-vertical-align-center\",\n )\n ) {\n group.classList.remove(\n \"bloom-vertical-align-center\",\n );\n if (isRunningOnBloomDesktop)\n group.classList.add(\n \"bloom-vertical-align-center-removed\",\n );\n }\n if (\n group.classList.contains(\n \"bloom-vertical-align-bottom\",\n )\n ) {\n group.classList.remove(\n \"bloom-vertical-align-bottom\",\n );\n if (isRunningOnBloomDesktop)\n group.classList.add(\n \"bloom-vertical-align-bottom-removed\",\n );\n }\n if (isBubble) {\n // This is a way of forcing it not to be display-flex, which doesn't\n // work with the nice-scroll-bar library we're using.\n // That library messes with the element style, so it seemed safer\n // not to do that myself.\n entry.target.parentElement!.classList.add(\n \"scrolling-bubble\",\n );\n }\n }\n if (\n countOfObserversThatHaveReported ===\n countOfObserversExpectedToReport\n ) {\n // configure nicescroll...ideally only once for all of them\n $(scrollBlocks).niceScroll({\n autohidemode: false,\n railoffset: {\n top: -topAdjust,\n left: -leftAdjust,\n },\n cursorwidth: thumbWidth,\n cursorcolor: \"#000000\",\n cursoropacitymax: 0.1,\n cursorborderradius: thumbWidth, // Make the corner more rounded than the 5px default.\n });\n setupSpecialMouseTrackingForNiceScroll(\n bloomPage,\n pointerEventHandler,\n );\n scrollBlocks = []; // Just in case it's possible to get callbacks before we created them all.\n }\n });\n },\n { root: elt },\n );\n countOfObserversExpectedToReport++;\n observer.observe(firstChild);\n if (firstChild !== lastChild) {\n countOfObserversExpectedToReport++;\n observer.observe(lastChild);\n }\n });\n }\n}\n\n// This method is copied from the nicescroll source code, albeit with some renamings and\n// getting rid of jquery as much as possible. This is how nicescroll determines the parent\n// element that should have the inserted scrollbar elements. If nothing is found by this\n// method, nicescroll uses the body element. Since the nicescroll release hasn't been updated\n// since 2017, I feel safe in copying this method here in January 2025.\nfunction getNiceScrollParent(elt: HTMLElement): HTMLElement | null {\n var parentElt =\n elt && elt.parentNode ? (elt.parentNode as HTMLElement) : null;\n while (\n parentElt &&\n parentElt.nodeType === Node.ELEMENT_NODE &&\n !/^BODY|HTML/.test(parentElt.nodeName)\n ) {\n const computed = window.getComputedStyle(parentElt);\n const position = computed.getPropertyValue(\"position\");\n if (/fixed|absolute/.test(position)) return parentElt;\n const ov =\n computed.getPropertyValue(\"overflow-y\") ||\n computed.getPropertyValue(\"overflow-x\") ||\n computed.getPropertyValue(\"overflow\") ||\n \"\";\n if (\n /scroll|auto/.test(ov) &&\n parentElt.clientHeight != parentElt.scrollHeight\n )\n return parentElt;\n if (($(parentElt).getNiceScroll() as any).length > 0) return parentElt;\n parentElt = parentElt.parentNode\n ? (parentElt.parentNode as HTMLElement)\n : null;\n }\n return null;\n}\n\n// nicescroll doesn't properly scale the padding at the top and left of the\n// scrollable area of the languageGroup divs when the page is scaled. This\n// method computes offset values to correct for this. See BL-13796.\n// nicescroll also doesn't scale at all when nicescroll cannot find a scrollable\n// area containing the element under the scaling div. See BL-14112.\nfunction ComputeNiceScrollOffsets(\n scale: number,\n elt: HTMLElement,\n): { topAdjust: number; leftAdjust: number; thumbWidth: string } {\n let topAdjust = 0;\n let leftAdjust = 0;\n let thumbWidth = \"12px\"; // nicescroll calls the thumb a \"cursor\", but it's really a thumb\n if (scale !== 1) {\n const translationGroupDiv = elt.parentElement;\n if (\n !translationGroupDiv ||\n !translationGroupDiv.classList.contains(\"bloom-translationGroup\")\n ) {\n // We don't know how to deal with this case, so we'll just return the default values.\n return { topAdjust, leftAdjust, thumbWidth };\n }\n const whereToPutTheScrollbars = getNiceScrollParent(elt);\n if (whereToPutTheScrollbars) {\n // The nicescroll elements are added somewhere in the DOM that is presumably inside\n // the element that sets the scaling.\n const compStyles = window.getComputedStyle(translationGroupDiv);\n const topPadding =\n compStyles.getPropertyValue(\"padding-top\") || \"0\";\n const leftPadding =\n compStyles.getPropertyValue(\"padding-left\") || \"0\";\n topAdjust = parseFloat(topPadding) * (scale - 1);\n leftAdjust = parseFloat(leftPadding) * (scale - 1);\n } else {\n // The nicescroll elements are added directly under the body element, which is presumably\n // outside the element that sets the scaling. We need to adjust for the scaling of the\n // scrollbar position and size ourselves. See BL-14112.\n const splitPageComponentInner = translationGroupDiv.parentElement;\n if (!splitPageComponentInner) {\n // This should never happen, but if it does, we'll just return the default values.\n return { topAdjust, leftAdjust, thumbWidth };\n }\n // This seems to apply only to text-only pages which don't have any additional padding\n // to worry about: only the basic page dimensions given by the splitPageComponentInner\n // element.\n thumbWidth = `${12 * scale}px`;\n const top = splitPageComponentInner?.offsetTop;\n const right =\n splitPageComponentInner.offsetLeft +\n splitPageComponentInner.offsetWidth;\n topAdjust = -(top * (scale - 1));\n leftAdjust = -(right * (scale - 1));\n }\n }\n return { topAdjust, leftAdjust, thumbWidth };\n}\n\nexport function setupSpecialMouseTrackingForNiceScroll(\n bloomPage: Element,\n pointerEventHandler?: (e: PointerEvent) => void,\n) {\n bloomPage.removeEventListener(\"pointerdown\", listenForPointerDown); // only want one!\n bloomPage.addEventListener(\"pointerdown\", listenForPointerDown);\n if (!pointerEventHandler) {\n return;\n }\n // The purpose of this is to prevent Swiper causing the page to be moved or\n // flicked when the user is trying to scroll on the page. See BL-14079.\n for (const eventName of [\"pointermove\", \"pointerup\"]) {\n bloomPage.ownerDocument.body.addEventListener(\n eventName,\n pointerEventHandler,\n {\n capture: true,\n },\n );\n }\n}\n\n// nicescroll doesn't properly scale the padding at the top and left of the\n// scrollable area of the languageGroup divs when the page is scaled. This\n// method sets offset values to correct for this. It is called whenever the\n// entire window resizes, which also scales the page before this is called.\n// See BL-13796.\nexport function fixNiceScrollOffsets(page: HTMLElement, scale: number) {\n page.querySelectorAll(kSelectorForPotentialNiceScrollElements).forEach(\n (group) => {\n // The type definition is not correct for getNiceScroll; we expect it to return an array.\n const groupNiceScroll = $(group).getNiceScroll() as any;\n if (groupNiceScroll && groupNiceScroll.length > 0) {\n let { topAdjust, leftAdjust, thumbWidth } =\n ComputeNiceScrollOffsets(scale, group as HTMLElement);\n groupNiceScroll[0].opt.railoffset.top = -topAdjust;\n groupNiceScroll[0].opt.railoffset.left = -leftAdjust;\n groupNiceScroll[0].opt.cursorwidth = thumbWidth;\n groupNiceScroll[0].resize();\n }\n },\n );\n}\n\n// If the mouse down is in the thumb of a NiceScroll, we don't want to get a click\n// event later even if the mouse up is outside that element. Also, we want the\n// scrolling to follow the mouse movement even if the mouse cursor leaves the thumb\n// before the mouse button is released.\nfunction listenForPointerDown(ev: PointerEvent) {\n if (\n ev.target instanceof HTMLDivElement &&\n (ev.target as HTMLDivElement).classList.contains(\"nicescroll-cursors\")\n ) {\n (ev.target as HTMLDivElement).setPointerCapture(ev.pointerId);\n if (ev.pointerType === \"mouse\") {\n // Investigation shows that Swiper uses pointer event handlers and NiceScroll\n // uses mouse event handlers, so stopping the propagation of pointer events\n // doesn't effect the scrolling, but does stop the swiping. See BL-14079.\n // Pointer capture affects mouse events as well as pointer events.\n ev.stopPropagation();\n }\n }\n}\n\nexport function cleanupNiceScroll() {\n // Doing this cleanup is unfortunate overhead, but niceScrolls stick around too much,\n // including when the page divs they are on are removed because the page is not the\n // current page. This leads to performance issues, including the scrollbar getting darker\n // and darker as the nicescroll elements build up in the HTML. This may also be the source\n // of the event listener leaks that was mentioned in an earlier comment.\n $(\"div.bloom-page\")[0]\n ?.querySelectorAll(kSelectorForPotentialNiceScrollElements)\n .forEach((group) => {\n // The \"as\" cast is crucial here for this code to work. For some reason,\n // the type returned by getNiceScroll() is not interpreted correctly and\n // the code silently fails to work, with length always being 0.\n // (bloom-player uses \"as any\" in this context, but \"as JQuery\" seems to\n // work as well and doesn't trigger an eslint warning.)\n const groupNiceScroll = $(\n group,\n ).getNiceScroll() as unknown as JQuery;\n if (groupNiceScroll && groupNiceScroll.length > 0) {\n groupNiceScroll.remove();\n }\n // Remove classes added to make the niceScroll work, and restore\n // classes that were removed to make the niceScroll work.\n if (group.classList.contains(\"scrolling-bubble\")) {\n group.classList.remove(\"scrolling-bubble\");\n }\n const groupParent = group.parentElement;\n if (!groupParent) return; // this should never happen, but just in case\n if (\n groupParent.classList.contains(\n \"bloom-vertical-align-center-removed\",\n )\n ) {\n groupParent.classList.remove(\n \"bloom-vertical-align-center-removed\",\n );\n groupParent.classList.add(\"bloom-vertical-align-center\");\n }\n if (\n groupParent.classList.contains(\n \"bloom-vertical-align-bottom-removed\",\n )\n ) {\n groupParent.classList.remove(\n \"bloom-vertical-align-bottom-removed\",\n );\n groupParent.classList.add(\"bloom-vertical-align-bottom\");\n }\n // Remove more debris left by niceScroll. See BL-14052.\n (group as HTMLElement).style.overflow = \"\";\n (group as HTMLElement).style.outline = \"\";\n (group as HTMLElement).style.width = \"\";\n });\n}\n","export class DomHelper {\n public static getActualUrlFromCSSPropertyValue(cssPropertyValue: string) {\n const match = cssPropertyValue.match(/.*url\\((['\"])(.*?)\\1\\).*/i);\n if (!match) {\n return \"\";\n }\n return match[2];\n }\n}\n","import { AspectRatio } from \"@material-ui/icons\";\nimport { DomHelper } from \"../utilities/domHelper\";\nimport { easing } from \"jquery\";\nimport { request } from \"http\";\n\n// class Animation captures the logic needed to produce the Ken Burns effect\n// of panning and zooming as specified in Bloom's motion tool.\n\n// Defines the extra fields we expect to find in the dataset of an HTMLElement\n// that has animation specified (to make TypeScript and TSLint happy).\ninterface IAnimation {\n initialrect: string;\n finalrect: string;\n}\n\n//NOTE: this class is functionally a singleton. There is NOT a separate instance created to animate each page of a bloom book.\nexport class Animation {\n public static pageHasAnimation(page: HTMLDivElement): boolean {\n return !!Animation.getAnimatableCanvas(page);\n }\n\n // Get the animatable clone of the animatable bloom canvas, if we already made it.\n public static getAnimationCanvas(page: HTMLElement): HTMLElement | null {\n if (\n page.firstElementChild &&\n page.firstElementChild.classList.contains(\n \"bloom-animationBackground\",\n )\n ) {\n const animationBackground = page.firstElementChild;\n if (\n animationBackground.firstElementChild &&\n animationBackground.firstElementChild.classList.contains(\n Animation.wrapperClassName,\n )\n ) {\n const wrapperDiv = animationBackground.firstElementChild;\n if (\n wrapperDiv.firstElementChild &&\n wrapperDiv.firstElementChild.hasAttribute(\n \"data-initialrect\",\n )\n ) {\n return wrapperDiv.firstElementChild as HTMLElement;\n }\n }\n }\n return null; // not made yet, or no image to make it from\n }\n\n // Search for a bloom-canvas that has the properties we need for animation.\n public static getAnimatableCanvas(page: HTMLElement): HTMLElement {\n const animatedCanvas = [].slice\n .call(page.getElementsByClassName(\"bloom-canvas\"))\n .find(\n (v) =>\n !v.closest(\".bloom-animationBackground\") &&\n !!(v.dataset as IAnimation).initialrect,\n ) as HTMLElement;\n if (animatedCanvas) return animatedCanvas;\n return [].slice\n .call(page.getElementsByClassName(\"bloom-imageContainer\"))\n .find(\n (v) => !!(v.dataset as IAnimation).initialrect,\n ) as HTMLElement;\n }\n\n private animationEngine: TransformBasedAnimator; // The animator for the most recently loaded page. This.createAndPlayAnimation stops any exisiting animation and overwrites the variable.\n public PlayAnimations: boolean; // true if animation should occur (only set by bloom-player core based on bookInfo)\n private currentPage: HTMLElement; // one we're currently showing\n private lastDurationPage: HTMLElement; // one we most recently obtained a duration for\n private static wrapperClassName = \"bloom-ui-animationWrapper\";\n private animationDuration: number = 3000; // ms (3000 ifs default)\n\n constructor() {\n // 200 is designed to make sure this happens AFTER we adjust the scale.\n // Note that if we are not currently animating, this.currentPage may be null or\n // obsolete. It is only used if we need to turn OFF the animation.\n window.addEventListener(\"orientationchange\", () =>\n window.setTimeout(\n () => this.adjustAnimationWrapper(this.currentPage),\n 200,\n ),\n );\n }\n\n public HandlePageBeforeVisible(page: HTMLElement) {\n if (!this.shouldAnimate(page)) {\n // may have left-over wrappers from when page previously played.\n this.removeAnimationWrappers(page);\n }\n }\n\n // What we need to do when the page becomes visible (possibly start the animation,\n // if we already have the duration and are not paused).\n public HandlePageVisible(page: HTMLElement, paused: boolean) {\n if (this.shouldAnimate(page)) {\n //if we've already gotten this page's duration, set up the animation\n this.currentPage = page;\n this.animatableCanvas = Animation.getAnimatableCanvas(page);\n if (this.currentPage === this.lastDurationPage) {\n // already got the corresponding durationAvailable event\n this.setupAnimation(page, paused);\n }\n }\n }\n\n // What we need to do when we get the duration of a page (possibly start the animation,\n // if the page is already visible and we are not paused).\n public HandlePageDurationAvailable(\n page: HTMLElement,\n duration: number,\n paused: boolean,\n ) {\n if (this.shouldAnimate(page)) {\n this.animationDuration = duration;\n //if the page is already visible, set up the animation\n this.lastDurationPage = page;\n if (this.currentPage === this.lastDurationPage) {\n // already got the corresponding pageVisible event\n this.setupAnimation(page, paused);\n }\n }\n }\n\n // Only applicable to resuming paused animation\n // May be called when we are not paused;should do nothing if so.\n public resumeAnimation() {\n if (!this.PlayAnimations || !this.animationEngine) {\n return;\n }\n this.animationEngine.resume();\n }\n\n // May be called when already paused;if so do nothing.\n // Not yet tested in bloom preview context;have not yet decided affordance for pausing\n public PauseAnimation() {\n if (!this.PlayAnimations || !this.animationEngine) {\n return;\n }\n this.animationEngine.pause();\n }\n\n public animatableCanvas: HTMLElement | null = null;\n\n private setupAnimation(page: HTMLElement, paused: boolean): void {\n if (!this.PlayAnimations) {\n return;\n }\n\n if (!this.animatableCanvas) {\n return; // no image to animate\n }\n\n // We expect to see something like this:\n // <div class=\"bloom-canvas bloom-leadingElement bloom-has-canvas-element bloom-background-image-in-style-attr swiper-lazy swiper-lazy-loaded\"\n // data-imgsizebasedon=\"320,180\"\n // style=\"background-image:url('1.jpg')\"\n // data-title=\"...\"\n // data-initialrect=\"0.3615 0.0977 0.6120 0.6149\"\n // data-finalrect=\"0.0000 0.0800 0.7495 0.7526\"\n // data-duration=\"5\" />\n // ... children with\n // </div>\n //\n // We want to make something like this:\n // <div class=\"bloom-canvas bloom-leadingElement bloom-has-canvas-element bloom-background-image-in-style-attr swiper-lazy swiper-lazy-loaded bloom-animationBackground\">\n // <div class=\"bloom-ui-animationWrapper\" style = \"width: 100%;height: 100%;overflow: hidden;background-color: white;\">\n // <div ... the entire bloom-canvas (as outlined above) or bloom-ImageContainer (if running an obsolete book)/>\n // </div>\n // </div>\n // and insert it into the bloom-page div as the first element.\n\n let animationBackground = page.firstElementChild as HTMLDivElement;\n let animationWrapper: HTMLElement | null = null;\n\n // We don't already have an animationBackground and need to make it.\n if (\n !animationBackground ||\n !animationBackground.classList.contains(\"bloom-animationBackground\")\n ) {\n // Note that this copies all the classes, so we need to be careful that css based\n // on the classes works as expected\n // It's of particular note that properly hiding the page's regular contents depends on\n // the bloom-animationBackground class in ./src/bloom-player-content.less\n animationBackground = document.createElement(\"div\");\n for (let i = 0; i < this.animatableCanvas.classList.length; i++) {\n animationBackground.classList.add(\n this.animatableCanvas.classList[i],\n );\n }\n animationBackground.classList.add(\"bloom-animationBackground\");\n\n const animationCanvas = this.animatableCanvas.cloneNode(\n true,\n ) as HTMLDivElement;\n\n //in old books, if you change pages very quickly, the animationCanvas will be cloned before the animatableCanvas has its background image style applied.\n //in that case, keep asking for url of the animatableCanvas's background image until it's present.\n //I'm unsure why this is happening at all, but my best guess is it's related to swiper's handling of lazy-load.\n //Enhance: consider disabling swiper's lazy-load. It's likely unnecessary anyway, as our code never makes it possible to load more than three pages at a time anyway\n const checkForBackgroundImage = () => {\n const backgroundImage =\n this.animatableCanvas.style.backgroundImage;\n if (backgroundImage) {\n animationCanvas.style.backgroundImage = backgroundImage;\n } else {\n requestAnimationFrame(checkForBackgroundImage);\n }\n };\n if (!animationCanvas.hasAttribute(\"data-imgsizebasedon\")) {\n requestAnimationFrame(checkForBackgroundImage);\n }\n\n animationWrapper = document.createElement(\"div\");\n animationWrapper.classList.add(Animation.wrapperClassName);\n animationWrapper.appendChild(animationCanvas);\n // hide it until we can set its size and the transform rule for its child properly.\n animationWrapper.style.visibility = \"hidden\";\n animationBackground.appendChild(animationWrapper);\n\n page.insertBefore(animationBackground, page.firstChild);\n\n //calculates the aspect ratio of the canvas, sets the animationWrapper's aspect ratio field to that value, calls placeAnimationWrapper, then calls createAndPlayAnimation\n this.applyCanvasAspectRatioToAnimationWrapper(\n page,\n animationWrapper,\n animationCanvas,\n paused,\n );\n } else {\n // We already made the animation div, just retrieve the animationWrapper from inside it.\n animationWrapper =\n animationBackground.firstElementChild as HTMLElement;\n\n if (animationWrapper.hasAttribute(\"data-aspectRatio\")) {\n // if we have the animation wrapper and have already determined its aspect ratio,\n // it might still be wrongly positioned if we changed orientation\n // since it was computed.\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n } else {\n //we haven't yet determined its aspect ratio.\n this.applyCanvasAspectRatioToAnimationWrapper(\n page,\n animationWrapper,\n animationWrapper.firstElementChild as HTMLElement,\n paused,\n );\n }\n }\n }\n\n private createAndPlayAnimation(page: HTMLElement, paused: boolean) {\n const animationCanvas = Animation.getAnimationCanvas(page);\n\n //stop the old engine's animation so it doesn't compete with the new animation\n if (this.animationEngine) this.animationEngine.endAnimation();\n\n if (animationCanvas) {\n const initialRect =\n animationCanvas.getAttribute(\"data-initialrect\");\n const finalRect = animationCanvas.getAttribute(\"data-finalrect\");\n this.animationEngine = new TransformBasedAnimator(\n initialRect,\n finalRect,\n this.animationDuration,\n animationCanvas,\n );\n if (paused) {\n // Just advance to the initial frame.\n // The animation engine is created in the paused state with totalElapsedTime = 0,\n // so we just need to set the transform to correspond.\n this.animationEngine.setCurrentAnimationFrame();\n } else {\n this.animationEngine.startAnimation();\n }\n }\n }\n\n private applyCanvasAspectRatioToAnimationWrapper(\n page: HTMLElement,\n animationWrapper: HTMLElement,\n canvas: HTMLElement,\n paused: boolean,\n ): void {\n if (page.hasAttribute(\"data-aspectRatio\")) {\n //if the task we started before loading has already found the aspect ratio:\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n }\n //if the canvas has this attribute, it's trivial to find the aspect ratio\n else if (canvas.hasAttribute(\"data-imgsizebasedon\")) {\n const canvasDimensions = canvas\n .getAttribute(\"data-imgsizebasedon\")\n .split(\",\")\n .map(parseFloat);\n animationWrapper.setAttribute(\n \"data-aspectRatio\",\n (canvasDimensions[0] / canvasDimensions[1]).toString(),\n );\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n }\n //if there's no imgSizeBasedOn attribute, default to the old method of looking at the background image\n //however, the animation canvas's background image may not have been loaded yet. In that case, wait until it exists.\n //This is a consequence of checkForBackgroundImage within setupAnimation, which appears to be a consequence of swiper's lazy loading\n else {\n const waitForImageAndSetAspectRatio = () => {\n if (canvas.style.backgroundImage) {\n const virtualImage = new Image();\n virtualImage.addEventListener(\"load\", () => {\n animationWrapper.setAttribute(\n \"data-aspectRatio\",\n (\n virtualImage.naturalWidth /\n virtualImage.naturalHeight\n ).toString(),\n );\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n });\n virtualImage.src =\n DomHelper.getActualUrlFromCSSPropertyValue(\n canvas.style.backgroundImage,\n );\n } else {\n requestAnimationFrame(waitForImageAndSetAspectRatio);\n }\n };\n requestAnimationFrame(waitForImageAndSetAspectRatio);\n }\n }\n\n // Enhance: some of the calculations here may require adjustment if we ever do\n // animation while scaled. Currently we use a different system to make the\n // bloom canvas fill the viewport when animating, and suppress scaling.\n // So we can ignore that factor.\n private placeAnimationWrapper(animationWrapper: HTMLElement) {\n const imageAspectRatio = parseFloat(\n animationWrapper.getAttribute(\"data-aspectRatio\")!,\n );\n const animationBackground = animationWrapper.parentElement;\n const viewWidth = animationBackground.clientWidth; // getBoundingClientRect().width;\n const viewHeight = animationBackground.clientHeight; // getBoundingClientRect().height;\n const viewAspectRatio = viewWidth / viewHeight;\n if (imageAspectRatio < viewAspectRatio) {\n // black bars on side\n const imageWidth = viewHeight * imageAspectRatio;\n animationWrapper.style.height = \"100%\";\n animationWrapper.style.width = `${imageWidth}px`;\n animationWrapper.style.left = `${(viewWidth - imageWidth) / 2}px`;\n } else {\n // black bars top and bottom\n const imageHeight = viewWidth / imageAspectRatio;\n animationWrapper.style.width = \"100%\";\n animationWrapper.style.height = `${imageHeight}px`;\n animationWrapper.style.top = `${(viewHeight - imageHeight) / 2}px`;\n }\n animationWrapper.style.overflow = \"hidden\";\n animationWrapper.style.visibility = \"visible\";\n\n this.placeCanvasByScale(\n animationWrapper,\n animationWrapper.firstElementChild as HTMLElement,\n );\n }\n\n //the SVGs and text boxes from an overlay are positioned by absolute pixel values.\n //By default, our canvas size is 100% of the animation wrapper. That doesn't rescale the overlays to fit the canvas.\n //Instead, we want to start the canvas at the size those overlays expect, and then rescale everything to the size of the animation wrapper\n private placeCanvasByScale(\n animationWrapper: HTMLElement,\n canvas: HTMLElement,\n ): void {\n if (canvas.hasAttribute(\"data-imgsizebasedon\")) {\n const originalDimensions = canvas\n .getAttribute(\"data-imgsizebasedon\")\n .split(\",\")\n .map(parseFloat);\n const animationWrapperDimensions = [\n animationWrapper.clientWidth,\n animationWrapper.clientHeight,\n ];\n\n canvas.style.width = `${originalDimensions[0]}px`;\n canvas.style.height = `${originalDimensions[1]}px`;\n canvas.style.scale = `${animationWrapperDimensions[0] / originalDimensions[0]}`;\n\n //after applying the scale, the canvas will be centered in the same place. Move its top left corner to coincide with the canvas's top left corner.\n //our top left corner moved half the difference between the original canvas's dimensions and the animation wrapper's dimensions\n canvas.style.top = `${(animationWrapperDimensions[1] - originalDimensions[1]) / 2}px`;\n canvas.style.left = `${(animationWrapperDimensions[0] - originalDimensions[0]) / 2}px`;\n }\n }\n\n // Adjust the animation wrapper for a change of orientation. The name is slightly obsolete\n // since currently we don't continue the animation if we change to portrait mode,\n // where animation is disabled. And if we change to landscape mode, we don't try\n // to start up the animation in the middle of the narration. So all it really\n // has to do currently is REMOVE the animation stuff if changing to portrait.\n // However, since everything else is built around shouldAnimatePage, it seemed\n // worth keeping the logic that adjusts things if we ever go from one animated\n // orientation to another. Note, however, that the 'page' argument passed is not\n // currently valid if turning ON animation. Thus, we will need to do more to get\n // the right page if we want to turn animation ON while switching to horizontal.\n private adjustAnimationWrapper(page: HTMLElement): void {\n if (!page) {\n return;\n }\n if (!this.shouldAnimate(page)) {\n // we may have a left-over animationWrapper from animating in the other orientation,\n // which could confuse things.\n this.removeAnimationWrappers(page);\n return;\n }\n // Nothing to do if we don't have an animation wrapper currently.\n const animationWrapper = this.getAnimationWrapper(page);\n if (!animationWrapper) {\n return;\n }\n this.placeAnimationWrapper(animationWrapper);\n }\n\n private getAnimationWrapper(page: HTMLElement): HTMLElement | null {\n if (!page) {\n return null;\n }\n const animationDiv = Animation.getAnimationCanvas(page);\n if (!animationDiv || animationDiv.children.length !== 1) {\n return null;\n }\n const animationWrapper = animationDiv.firstElementChild as HTMLElement;\n if (!animationWrapper.classList.contains(Animation.wrapperClassName)) {\n return null;\n }\n return animationWrapper;\n }\n\n private removeAnimationWrappers(page: HTMLElement) {\n if (\n page.firstElementChild &&\n page.firstElementChild.classList.contains(\n \"bloom-animationBackground\",\n )\n ) {\n page.removeChild(page.firstElementChild);\n }\n }\n\n //returns true if:\n // bloom player core has set this.PlayAnimations to true (this.PlayAnimations = bookInfo.playAnimations)\n // AND the page in question is in landscape orientation\n // Notably, this is NOT a check for whether the animation is currently paused, just whether an animation should be applied to the page.\n public shouldAnimate(page: HTMLElement): boolean {\n return (\n this.PlayAnimations &&\n page.getAttribute(\"class\")!.indexOf(\"Landscape\") >= 0\n );\n }\n}\n\n//Important note: the HTML element sent to this class's constructor must have a parent with overflow set to hidden.\n// The parent must be the desired size and shape of the image to be displayed, and the element sent in should start at that same size and shape.\n//Also note that the aspect ratio is determined by that parent container. Therefore, only one of the height or width on (intitial/final)rect will have an effect: the one which requires a higher level of zoom.\nexport class TransformBasedAnimator {\n private initialScale: number;\n private finalScale: number;\n private initialLeft: number;\n private finalLeft: number;\n private initialTop: number;\n private finalTop: number;\n\n private canvasToAnimate: HTMLElement;\n\n private lastFrameTime: number;\n private totalElapsedTime: number;\n private duration: number; //stored in milliseconds\n\n private paused: boolean;\n\n //initial and final rect strings come in as space-separated \"left top width height\"\n // all four of these parameters are reperesented as fractions of the canvas\n //duration is the length of the animation in seconds\n //canvasToAnimate is the whole canvas containing the images to be animated.\n // note that canvasToAnimate needs to be the child of an element that has the correct aspect ratio, has overflow set to hidden, AND has a transform applied\n // the parent's transform can just be translateZ(0), but it needs to be moved out of the page stacking context in the same way as its child in order for overflow:hidden to have any effect\n constructor(\n initialRect: string,\n finalRect: string,\n duration: number,\n canvasToAnimate: HTMLElement,\n ) {\n this.duration = duration * 1000; //this.duration is stored in milliseconds\n this.totalElapsedTime = 0;\n this.lastFrameTime = Date.now();\n\n this.paused = true;\n\n this.canvasToAnimate = canvasToAnimate;\n\n const initialVals = initialRect.split(\" \").map(parseFloat);\n const finalVals = finalRect.split(\" \").map(parseFloat);\n\n //error handling: if any inputs attempt to do anything that will result in any part of the animation box being blank at any time,\n //set class variables such that no animation plays.\n // JT November 2025: The book in BL-15408 has initialVals[1] + initialVals[3] adding up to 1.0003, probably because\n // of a rounding error. I'm not sure I fully understand what problem it causes when this sum is much larger than 1,\n // but it doesn't seem to cause any problem when it's just a tiny bit over, so I added some tolerance here.\n if (\n initialVals.length != 4 ||\n finalVals.length != 4 ||\n Math.min(...finalVals) < 0 ||\n Math.min(...initialVals) < 0 ||\n initialVals[0] + initialVals[2] > 1.01 ||\n initialVals[1] + initialVals[3] > 1.01 ||\n finalVals[0] + finalVals[2] > 1.01 ||\n finalVals[1] + finalVals[3] > 1.01\n ) {\n this.initialScale = 1;\n this.finalScale = 1;\n this.initialLeft = 0;\n this.finalLeft = 0;\n this.initialTop = 0;\n this.finalTop = 0;\n } else {\n const initialLeftFrac = initialVals[0];\n const finalLeftFrac = finalVals[0];\n const initialTopFrac = initialVals[1];\n const finalTopFrac = finalVals[1];\n //for now, we'll let scale default to the more zoomed-in of width or height.\n //By just changing scale, we maintain the original aspect ratio.\n this.initialScale = 1 / Math.min(initialVals[2], initialVals[3]);\n if (this.initialScale == 1) this.initialScale = 1.0001; //avoid edge case where scale=1 and we divide by zero below\n this.finalScale = 1 / Math.min(finalVals[2], finalVals[3]);\n if (this.finalScale == 1) this.finalScale = 1.0001;\n\n //the amount we need to move the top left corner relative to the center is 50% - (1/2 width + position)\n this.initialLeft =\n this.initialScale *\n 100 *\n (0.5 - (0.5 * initialVals[2] + initialVals[0]));\n this.initialTop =\n this.initialScale *\n 100 *\n (0.5 - (0.5 * initialVals[3] + initialVals[1]));\n this.finalLeft =\n this.finalScale *\n 100 *\n (0.5 - (0.5 * finalVals[2] + finalVals[0]));\n this.finalTop =\n this.finalScale *\n 100 *\n (0.5 - (0.5 * finalVals[3] + finalVals[1]));\n }\n }\n\n //Enhance: changing scale while changing left/top can result in slightly choppy motion if the direction of apparent motion from scaling is opposite the direction of motion from left and/or top\n //this is noticeable at low speeds.\n //consider coordinating scale with left/top somehow\n private getScaleAndPosition(): {\n scale: number;\n left: number;\n top: number;\n } {\n let fractionComplete = this.totalElapsedTime / this.duration;\n fractionComplete = Math.min(1, Math.max(0, fractionComplete)); //paranoia\n const easingFactor = this.easingFunction(fractionComplete);\n const currentScale =\n this.initialScale +\n (this.finalScale - this.initialScale) * easingFactor;\n const currentLeft =\n this.initialLeft +\n (this.finalLeft - this.initialLeft) * easingFactor;\n const currentTop =\n this.initialTop + (this.finalTop - this.initialTop) * easingFactor;\n\n return {\n scale: currentScale,\n left: currentLeft,\n top: currentTop,\n };\n }\n\n //make the animation smoother by applying a non-linear transformation.\n //progress must be between 0 and 1, and this function returns a number between 0 and 1\n private easingFunction(progress: number): number {\n //ease in and out with a cosine function\n return (-1 * (Math.cos(progress * Math.PI) - 1)) / 2;\n }\n\n private advanceAnimation() {\n //only advance the animation if we aren't paused.\n if (this.paused) return;\n\n const currentTime = Date.now();\n this.totalElapsedTime += currentTime - this.lastFrameTime;\n\n // Only advance the animation until the duration is up.\n // The endAnimation method relies on this guard statement to prevent changes to the canvas state after the animation is done.\n // That's necessary because there can still be one more call to this method after endAnimation has been called.\n if (this.totalElapsedTime >= this.duration) return;\n\n this.setCurrentAnimationFrame();\n\n this.lastFrameTime = currentTime;\n\n requestAnimationFrame(() => this.advanceAnimation());\n }\n\n public setCurrentAnimationFrame() {\n const { scale, left, top } = this.getScaleAndPosition();\n this.canvasToAnimate.style.transform = `translate(${left}%, ${top}%) scale(${scale})`;\n }\n\n public pause() {\n this.paused = true;\n }\n\n public resume() {\n this.paused = false;\n this.lastFrameTime = Date.now();\n this.advanceAnimation();\n }\n\n public startAnimation() {\n this.paused = false;\n this.totalElapsedTime = 0;\n this.lastFrameTime = Date.now();\n this.advanceAnimation();\n }\n\n //After end animation is called, there may be one more call to advanceAnimation,\n // which will see that the duration has been exceeded and do nothing.\n public endAnimation() {\n this.totalElapsedTime = this.duration + 1;\n }\n}\n"],"names":["LiteEvent","handler","data","PlaybackMode","PlaybackMode2","currentPlaybackMode","setCurrentPlaybackMode","mode","durationReporter","listenForPlayDuration","reporter","isSwipeInProgress","setTestIsSwipeInProgress","tester","logNarration","setLogNarration","logger","playerUrlPrefix","setPlayerUrlPrefix","prefix","setPlayerUrlPrefixFromWindowLocationHref","bookSrc","getUrlPrefixFromWindowHref","index","urlPrefix","sortAudioElements","input","keyedItems","item","getTgTabIndex","x","y","tg","kHighlightSegmentClass","kEnableHighlightClass","kDisableHighlightClass","kSuppressHighlightClass","durationOfPagesWithoutNarration","setDurationOfPagesWithoutNarration","d","kAudioSentence","kImageDescriptionClass","currentPlayPage","recentPageChange","setCurrentPage","page","getCurrentNarrationPage","fakeNarrationTimer","segmentsWeArePlaying","currentAudioId","elementsToPlayConsecutivelyStack","subElementsWithTimings","PageNarrationComplete","PlayCompleted","PlayFailed","ToggleImageDescription","currentAudioSessionNum","includeImageDescriptions","setIncludeImageDescriptions","b","audioPlayCurrentStartTime","playAllSentences","canvasToExclude","pageToPlay","playAllAudio","getPageAudioElements","elements","mediaPlayer","getPlayer","fixHighlighting","stackSize","firstElementToPlay","setSoundAndHighlight","playCurrentInternal","multiSpaceRegex","multiSpaceRegexGlobal","audioElements","audioElement","findAll","element","removeHighlightClasses","fixHighlightingInNode","child","node","startingSpan","fixHighlightingInTextNode","childNode","textNode","matches","regexResult","matchingText","newNodes","makeHighlightedSpan","lastMatchEndIndex","i","match","preMatchText","postMatchText","oldNode","nodeToInsert","textContent","newSpan","canPlayAudio","playEnded","timingsStr","childSpanElements","fields","subElementCount","durationSecs","currentSegment","isImageDescriptionSegment","gotErrorPlaying","promise","highlightNextSubElement","handlePlayPromise","segment","player","reason","originalSessionNum","startTimeInSecs","topTuple","endTimeInSecs","setHighlightTo","currentTimeInSecs","durationInSecs","onSubElementHighlightTimeEnded","playedDurationInSecs","nextStartTimeInSecs","minRemainingDurationInSecs","removeAudioCurrent","around","audioCurrentArray","currentImg","newElement","disableHighlightIfNoAudio","oldElement","setSoundFrom","shouldScrollToElement","scrollElementIntoView","e","hasError","translationGroup","imgContainer","_a","_b","scrollAncestor","getEditable","mover","elt","bounds","parent","parentBounds","scale","leftRelativeToParent","firstAudioSentence","getFirstAudioSentenceWithinElement","id","setCurrentAudioId","audioSentences","getAudioSegmentsWithinElement","audioSegments","collection","audioSentenceElement","updatePlayerStatus","reportPlayDuration","url","currentAudioUrl","getAudio","a","handlePlayEnded","handlePlayError","abortNarrationPlayback","keepPlayingTheStack","elementJustPlayed","newStackCount","nextElement","reportPlayEnded","duration","init","current","expr","container","includeSelf","allMatches","getPlayableDivs","results","getPagePlayableDivs","pageHasAudio","playNarration","pauseNarration","pausePlaying","computeDuration","pageDuration","attrDuration","hidingPage","playAllVideo","then","video","showVideoError","hideVideoError","badVideoMessage","msgDiv","divs","kLegacyCanvasElementSelector","targetPositions","originalPositions","currentPage","currentChangePageAction","positionsToRestore","savePositions","restorePositions","p","adjustDraggablesForLanguage","draggables","draggable","shouldBeVisible","target","getTarget","IsRunningOnBloomDesktop","bloomPage","prepareActivity","changePageAction","doShowAnswersInTargets","changePageButtonClicked","img","targets","targetId","startDrag","playVideo","dontPlayWhenClicked","top","playAudioOfTarget","checkButtons","tryAgainButtons","showCorrectButtons","performCheck","performTryAgain","showCorrect","playSoundOf","prepareOrderSentenceActivity","contentElt","content","words","shuffledWords","shuffle","makeWordItems","undoPrepareActivity","inPlayer","soundFile","playSound","playAudioOf","playables","getAudioSentencesOfVisibleEditables","possibleElements","getVisibleEditables","getAudioSentences","makeDraggable","userStyle","c","lang","word","wordItem","startDragWordInSentence","next","playInitialElements","playVideos","initialFilter","ce","videoElements","reportScore","possible","actual","setReportScore","reportScoreFunction","editables","result","array","areItemsTheSame","allItemsAreTheSame","originalArray","bestChanges","bestResult","loopCount","currentIndex","randomIndex","changes","isTheTextInDraggablesTheSame","eltWidth","w","eltHeight","h","correctAnswer","userStyleSource","classSetter","dragStartX","dragStartY","dragTarget","snapped","getScale","stopDrag","elementDrag","deltaMin","xBest","yBest","slot","offsetX","offsetY","deltaX","deltaY","delta","oldPosition","rightPosition","originalPosition","getVisibleText","visibleDivs","draggableToCheck","actualX","actualY","correctX","correctY","allCorrect","checkDraggables","checkRandomSentences","showCorrectOrWrongItems","className","wanted","draggableReposition","wordBeingRepositioned","defaultCorrectSoundUrl","defaultWrongSoundUrl","setDefaultSoundUrls","correctSoundUrl","wrongSoundUrl","correct","playOtherStuff","elementsMadeVisible","possibleNarrationElements","addPrefix","someElt","audio","visibleText","otherDraggable","placeHolder","startWidth","draggableWordMargin","makeAnimationPlaceholder","stopDragWordInSentence","dragWordInSentence","preventTouchDefault","lastItemDraggedOver","animationInProgress","itemDraggedOver","rect","children","animateMove","relatedItems","_c","itemBeingRepositioned","placeholder","movePlaceholder","duplicate","start","step","elapsed","fraction","originalWordWidth","sentences","sentence","correctAnswerWords","actualWordElements","j","showNow","copyContentToTarget","removeContentFromTarget","throwAway","imageContainer","wrapper","background","draggingSlider","setupWordChooserSlider","global","factory","module","this","window","noGlobal","arr","getProto","slice","flat","push","indexOf","class2type","toString","hasOwn","fnToString","ObjectFunctionString","support","isFunction","obj","isWindow","document","preservedScriptAttributes","DOMEval","code","doc","val","script","toType","version","jQuery","selector","context","num","elems","ret","callback","elem","_elem","len","options","name","src","copy","copyIsArray","clone","length","deep","msg","proto","Ctor","isArrayLike","first","second","invert","callbackInverse","callbackExpect","arg","value","_i","type","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","expando","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","rcssescape","fcssescape","ch","asCodePoint","unloadHandler","inDisabledFieldset","addCombinator","els","seed","m","nid","groups","newSelector","newContext","nodeType","testContext","toSelector","keys","cache","key","markFunction","fn","assert","el","addHandle","attrs","siblingCheck","cur","diff","createInputPseudo","createButtonPseudo","createDisabledPseudo","disabled","createPositionalPseudo","argument","matchIndexes","namespace","hasCompare","subWindow","attrId","tag","tmp","adown","bup","compare","aup","ap","bp","sel","duplicates","excess","unquoted","nodeNameSelector","nodeName","pattern","operator","check","what","_argument","last","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","dir","useCache","pseudo","args","idx","matched","matcher","unmatched","text","elemLang","hash","attr","_matchIndexes","setFilters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","filter","newUnmatched","mapped","setMatcher","preFilter","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","find","compiled","_name","until","truncate","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","not","self","rootjQuery","root","rparentsprev","guaranteedUnique","l","selectors","sibling","rnothtmlwhite","createOptions","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","add","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","func","tuples","state","deferred","fns","newDefer","tuple","returned","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","process","stateString","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","error","stack","readyList","wait","completed","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","camelCase","string","acceptData","owner","Data","prop","dataPriv","dataUser","rbrace","rmultiDash","getData","dataAttr","startLength","hooks","setter","count","defer","pnum","rcssNum","cssExpand","documentElement","isAttached","composed","isHiddenWithinTree","adjustCSS","valueParts","tween","adjusted","maxIterations","currentValue","initial","unit","initialInUnit","defaultDisplayMap","getDefaultDisplay","display","showHide","show","values","rcheckableType","rtagName","rscriptType","fragment","div","wrapMap","getAll","setGlobalEval","refElements","buildFragment","scripts","selection","ignored","wrap","attached","nodes","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","safeActiveElement","on","types","one","origFn","event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","mappedTypes","origCount","nativeEvent","handlerQueue","matchedHandlers","matchedSelectors","delegateCount","hook","originalEvent","leverageNative","notAsync","saved","handle","props","button","delegateType","orig","fix","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","udataOld","udataCur","fixInput","domManip","hasScripts","iNoClone","valueIsFunction","remove","keepData","html","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","original","insert","rnumnonpx","getStyles","view","swap","old","rboxStyle","computeStyleTests","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","measure","reliableTrDimensionsVal","table","tr","trChild","trStyle","curCSS","computed","width","minWidth","maxWidth","style","addGetHookIf","conditionFn","hookFn","cssPrefixes","emptyStyle","vendorProps","vendorPropName","capName","finalPropName","final","rdisplayswap","rcustomProp","cssShow","cssNormalTransform","setPositiveNumber","subtract","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","getWidthOrHeight","boxSizingNeeded","valueIsBorderBox","offsetProp","origName","isCustomProp","scrollboxSizeBuggy","suffix","expanded","parts","Tween","end","easing","percent","eased","fxNow","inProgress","rfxtypes","rrun","schedule","createFxNow","genFx","includeWidth","which","createTween","animation","Animation","defaultPrefilter","opts","toggle","oldfire","propTween","restoreDisplay","isBox","anim","hidden","dataShow","propFilter","specialEasing","properties","stopped","tick","currentTime","gotoEnd","prepend","speed","opt","to","empty","optall","doAnimation","clearQueue","stopQueue","stop","dequeue","timers","cssFn","timer","time","timeout","boolHook","attrHandle","nType","attrNames","getter","lowercaseName","rfocusable","rclickable","tabindex","stripAndCollapse","getClass","classesToArray","classes","curValue","clazz","finalValue","stateVal","isValidValue","classNames","rreturn","option","max","optionSet","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","attaches","location","nonce","rquery","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","s","valueOrFunction","r20","rhash","rantiCache","rheaders","rlocalProtocol","rnoContent","rprotocol","prefilters","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","selected","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxHandleResponses","responses","ct","finalDataType","firstDataType","contents","ajaxConvert","response","isSuccess","conv2","conv","prev","converters","settings","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","statusText","finalText","status","nativeStatusText","headers","success","modified","htmlIsFunction","xhrSuccessStatus","xhrSupported","errorCallback","complete","xhr","evt","oldCallbacks","rjsonp","originalSettings","callbackName","overwritten","responseContainer","jsonProp","body","keepScripts","parsed","params","off","responseText","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","position","curElem","win","offsetParent","offset","parentOffset","defaultExtra","funcName","margin","fnOver","fnOut","proxy","hold","_jQuery","_$","require$$0","domfocus","mousefocus","tabindexcounter","ascrailcounter","globalmaxzindex","$","_doc","_win","$window","delegatevents","getScriptPath","path","setAnimationFrame","clearAnimationFrame","anilasttime","currTime","timeToCall","ClsMutationObserver","now","_globaloptions","browserdetected","getBrowserDetection","_el","_style","_agent","_platform","evs","detectCursorGrab","lst","NiceScrollClass","myopt","me","$body","writingMode","cap","tm","dd","pars","BezierClass","st","ed","spd","p1","p2","p3","p4","pc","bz","getMatrixValues","mtx","cxscrollleft","silent","getZIndex","dom","zi","_convertBorderWidth","getWidthToPixel","chkheight","wd","px","brd","ofs","scrl","ww","vp","pos","wpos","dbl","hr","pg","_scrollyhidden","cont","cursor","rail","kp","zoom","railh","bd","rlpos","ScrollMomentumClass2D","skp","ismouse","le","maxh","maxw","wp","ip","moveneedoffset","locktollerance","byiframe","ofy","ofx","fy","my","fx","mx","ny","nx","ay","ax","dz","hronly","mw","checkSelectionScroll","df","rt","tp","ctrl","shift","mutations","mut","_dom","mo","oniframeload","hh","py","lx","premaxh","premaxw","previewh","previeww","sy","hlazyresize","hiderails","_modernWheelEvent","bubble","wname","passiveSupported","listener","useCapture","active","de","r","bub","ov","cx","cy","rx","ry","ms","info","scrolldiry","scrolldirx","scrolltmr","scrollspd","doScrollRelative","chkscroll","iswheel","gap","dx","chk","dy","dty","dtx","hasparentscrollingphase","execScrollWheel","hrend","nw","dif","lasttransitionstyle","istime","trans","loop","lft","dst","clipped","stp","relative","pp","bkg","nc","sx","newy","newx","snap","gp","sl","pageh","pagew","xm","onscroll","_scrollTop","nice","_scrollLeft","NiceScrollArray","doms","mplex","_opt","$this","wrp","docundef","kSelectorForPotentialNiceScrollElements","addScrollbarsToPage","pointerEventHandler","isRunningOnBloomDesktop","scrollBlocks","countOfObserversExpectedToReport","countOfObserversThatHaveReported","firstChild","lastChild","scaleStyle","scaleContainer","scaleValue","topAdjust","leftAdjust","thumbWidth","ComputeNiceScrollOffsets","observer","entries","ob","entry","isBubble","overflowing","maxBubbleOverflowLineFraction","overflow","lineHeightPx","lineHeight","group","setupSpecialMouseTrackingForNiceScroll","getNiceScrollParent","parentElt","translationGroupDiv","compStyles","topPadding","leftPadding","splitPageComponentInner","right","listenForPointerDown","eventName","fixNiceScrollOffsets","groupNiceScroll","ev","cleanupNiceScroll","groupParent","DomHelper","cssPropertyValue","_Animation","animationBackground","wrapperDiv","animatedCanvas","paused","animationWrapper","animationCanvas","checkForBackgroundImage","backgroundImage","initialRect","finalRect","TransformBasedAnimator","canvas","canvasDimensions","waitForImageAndSetAspectRatio","virtualImage","imageAspectRatio","viewWidth","viewHeight","viewAspectRatio","imageWidth","imageHeight","originalDimensions","animationWrapperDimensions","animationDiv","canvasToAnimate","initialVals","finalVals","fractionComplete","easingFactor","currentScale","currentLeft","currentTop","progress","left"],"mappings":"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","x_google_ignoreList":[3,4]}
1
+ {"version":3,"file":"shared.es.js","sources":["../src/shared/event.ts","../src/shared/narration.ts","../src/shared/dragActivityRuntime.ts","../node_modules/jquery/dist/jquery.js","../node_modules/jquery.nicescroll/jquery.nicescroll.js","../src/shared/scrolling.ts","../src/utilities/domHelper.ts","../src/shared/animation.ts"],"sourcesContent":["// originally from http://stackoverflow.com/a/14657922/723299.\n// a Bloom Player source file shared with Bloom Desktop\n\ninterface ILiteEvent<T> {\n subscribe(handler: (data?: T) => void): void;\n unsubscribe(handler: (data?: T) => void): void;\n}\n\nexport default class LiteEvent<T> implements ILiteEvent<T> {\n private handlers: Array<(data?: T) => void> = [];\n\n public subscribe(handler: (data?: T) => void) {\n if (this.handlers.indexOf(handler) === -1) {\n this.handlers.push(handler);\n }\n }\n\n public unsubscribe(handler: (data?: T) => void) {\n this.handlers = this.handlers.filter((h) => h !== handler);\n }\n\n public raise(data?: T) {\n this.handlers.slice(0).forEach((h) => h(data));\n }\n}\n","// This file contains code for playing audio in a bloom page, including a draggable page.\n// The file is designed to be shared between Bloom Desktop and Bloom Player, with the original\n// being in the Bloom Player and provided in its package. See comments in dragActivityRuntime.ts.\n\n// It is quite difficult to know how to handle audio in a drag activity page.\n// We need to be able to play it both during \"Play\" and when showing the page in BP.\n// The code in this file so far represents a reuniting of the original Bloom Player\n// narration code with the code developed for narration in drag activities.\n// There is existing code for playing audio in Bloom Desktop, but it is entangled with the\n// code that manages audio recording and the talking book tool. I hope eventually\n// this code, or parts of it, can be used there as well as in 'Play' mode.\n// The code here has hooks and some methods which are only useful to BP, for things such as\n// autoplay and page advance, and also cases where the text being played is\n// not fully visible. It deals with pause and continue, which also interact with\n// the Bloom Player controls and with video and background music.\n// Drag activities added the need to handle situations where the audio on the page\n// should not all be played in succession, and more complicated sequencing of audio\n// and video\n\nimport LiteEvent from \"./event\";\n// Note: trying to avoid other imports, as part of the process of moving this code to a module\n// that can be shared with BloomDesktop.\n\n//----This first block is the old narrationUtils.ts. Everything here is now meant to be reusable\n// code connected with narration, not specific to Bloom Player.\nexport interface ISetHighlightParams {\n newElement: Element;\n shouldScrollToElement: boolean;\n disableHighlightIfNoAudio?: boolean;\n oldElement?: Element | null | undefined; // Optional. Provides some minor optimization if set.\n}\n\nexport enum PlaybackMode {\n NewPage, // starting a new page ready to play\n NewPageMediaPaused, // starting a new page in the \"paused\" state\n VideoPlaying, // video is playing\n VideoPaused, // video is paused\n AudioPlaying, // narration and/or animation are playing (or possibly finished)\n AudioPaused, // narration and/or animation are paused\n MediaFinished, // video, narration, and/or animation has played (possibly no media to play)\n // Note that music can be playing when the state is either AudioPlaying or MediaFinished.\n}\n\nexport let currentPlaybackMode: PlaybackMode = PlaybackMode.NewPage;\nexport function setCurrentPlaybackMode(mode: PlaybackMode) {\n currentPlaybackMode = mode;\n}\n\n// These functions support allowing a client (typically BloomPlayerCore) to register as\n// the object that wants to receive notification of how long audio was played.\n// Duration is in seconds.\nexport let durationReporter: (duration: number) => void;\nexport function listenForPlayDuration(reporter: (duration: number) => void) {\n durationReporter = reporter;\n}\n\n// A client may configure a function which can be called to find out whether a swipe\n// is in progress...in BloomPlayerCore, this is implemented by a test on SWiper.\n// It is currently only used when we need to scroll the content of a field we are\n// playing. Bloom Desktop does not need to set it.\nexport let isSwipeInProgress: () => boolean;\nexport function setTestIsSwipeInProgress(tester: () => boolean) {\n isSwipeInProgress = tester;\n}\n\n// A client may configure a function which is passed the URL of each audio file narration plays.\nexport let logNarration: (src: string) => void = () => {\n // do nothing by default\n};\nexport function setLogNarration(logger: (src: string) => void) {\n logNarration =\n logger ??\n (() => {\n // do nothing by default (so we don't have to check for null)\n });\n}\n\nlet playerUrlPrefix = \"\";\n// In bloom player, figuring the url prefix (to put before file JS needs to locate, like\n// sounds to play) is complicated. We pass it in.\n// In Bloom desktop, it's almost more tricky. If we're executing in the page iframe, we can\n// easily derive it from the page's URL. But if we're executing in the toolbox, that doesn't work.\n// So we arrange for newPageReady, called at least as often as changing book, to set it up\n// using setPlayerUrlPrefixFromWindowLocationHref\nexport function setPlayerUrlPrefix(prefix: string) {\n playerUrlPrefix = prefix;\n}\n\nexport function setPlayerUrlPrefixFromWindowLocationHref(bookSrc: string) {\n setPlayerUrlPrefix(getUrlPrefixFromWindowHref(bookSrc));\n}\n\nexport function getUrlPrefixFromWindowHref(bookSrc: string) {\n const index = bookSrc.lastIndexOf(\"/\");\n return bookSrc.substring(0, index);\n}\n\nexport function urlPrefix(): string {\n if (playerUrlPrefix) {\n return playerUrlPrefix;\n }\n return getUrlPrefixFromWindowHref(window.location.href);\n}\n\n// We need to sort these by the tabindex of the containing bloom-translationGroup element.\n// We need a stable sort, which array.sort() does not provide: elements in the same\n// bloom-translationGroup, or where the translationGroup does not have a tabindex,\n// should remain in their current order.\n// It's not obvious what should happen to TGs with no tabindex when others have it.\n// At this point we're going with the approach that no tabindex is equivalent to tabindex 999.\n// This should cause text with no tabindex to sort to the bottom, if other text has a tabindex;\n// It should also not affect order in situations where no text has a tabindex\n// (An earlier algorithm attempted to preserve document order for the no-tab-index case\n// by comparing any two elements using document order if either lacks tabindex.\n// This works well for many cases, but if there's a no-tabindex element between two\n// that get re-ordered (e.g., ABCDEF where the only tabindexes are C=2 and E=1),\n// the function is not transitive (e.g. C < D < E but E < C) which will produce\n// unpredictable results.\nexport function sortAudioElements(input: HTMLElement[]): HTMLElement[] {\n const keyedItems = input.map((item, index) => {\n return { tabindex: getTgTabIndex(item), index, item };\n });\n keyedItems.sort((x, y) => {\n // If either is not in a translation group with a tabindex,\n // order is determined by their original index.\n // Likewise if the tabindexes are the same.\n if (!x.tabindex || !y.tabindex || x.tabindex === y.tabindex) {\n return x.index - y.index;\n }\n // Otherwise, determined by the numerical order of tab indexes.\n return parseInt(x.tabindex, 10) - parseInt(y.tabindex, 10);\n });\n return keyedItems.map((x) => x.item);\n}\n\nfunction getTgTabIndex(input: HTMLElement): string | null {\n let tg: HTMLElement | null = input;\n while (tg && !tg.classList.contains(\"bloom-translationGroup\")) {\n tg = tg.parentElement;\n }\n if (!tg) {\n return \"999\";\n }\n return tg.getAttribute(\"tabindex\") || \"999\";\n}\n///---- end of the bit that ended up in narrationUtils.ts before the merge.\n\nexport const kHighlightSegmentClass = \"bloom-highlightSegment\";\n\n// Indicates that the element should be highlighted.\nconst kEnableHighlightClass = \"ui-enableHighlight\";\n\n// Indicates that the element should NOT be highlighted.\n// For example, some elements have highlighting prevented at this level\n// because its content has been broken into child elements, only some of which show the highlight\nconst kDisableHighlightClass = \"ui-disableHighlight\";\n// Indicates that highlighting is briefly/temporarily suppressed,\n// but may become highlighted later.\n// For example, audio highlighting is suppressed until the related audio starts playing (to avoid flashes)\nconst kSuppressHighlightClass = \"ui-suppressHighlight\";\n\nlet durationOfPagesWithoutNarration = 3.0; // seconds\nexport function setDurationOfPagesWithoutNarration(d: number) {\n durationOfPagesWithoutNarration = d;\n}\n\n// Even though these can now encompass more than strict sentences,\n// we continue to use this class name for backwards compatability reasons.\nexport const kAudioSentence = \"audio-sentence\";\n\nconst kImageDescriptionClass = \"bloom-imageDescription\";\n\n// The page that is currently being played (or edited, when we use this code in Bloom Desktop).\nlet currentPlayPage: HTMLElement | null = null;\n// When we have recently changed pages, stores a value returned from setTimeout, which can be used to cancel the old timeout\n// if we change pages again. After three seconds, the timerout sets it to zero. A non-zero value also prevents the code that\n// tries to scroll the currently-playing text into view from doing so in the early stages of viewing a page, when it\n// can cause problems for swiper.\nlet recentPageChange: any = 0; // any because typescript thinks we're in Nodejs and setTimeout will return an object.\n// Unused in Bloom desktop, but in Bloom player, current page might change while a series of sounds\n// is playing. This lets us avoid starting the next sound if the page has changed in the meantime.\nexport function setCurrentPage(page: HTMLElement) {\n if (page === currentPlayPage) return;\n if (recentPageChange) {\n clearTimeout(recentPageChange);\n }\n recentPageChange = setTimeout(() => {\n recentPageChange = 0;\n }, 3000);\n currentPlayPage = page;\n}\n// Get the page that the narration system thinks is current.\nexport function getCurrentNarrationPage(): HTMLElement {\n return currentPlayPage!;\n}\n\n// The time we started playing the current narration. If we pause and resume this is adjusted\n// by the length of the pause, so that \"now\" minus startPlay is always how much of the sound\n// has actually been played.\nlet startPlay: Date;\n\n// When the most recent pause happened.\nlet startPause: Date;\n\n// Timer used to raise PageNarrationComplete after a delay when there is no audio on the page.\n// Gets canceled if we pause and restarted if we resume.\nlet fakeNarrationTimer: number;\n\n// List of segments that are currently being played, or will be resumed (or restarted) when play resumes.\n// Typically the output of getPageAudioElements, but Bloom Games sometimes gives a different list.\n// Unlike elementsToPlayConsecutivelyStack, this list is not reversed, nor do we remove items from it as we play them.\nlet segmentsWeArePlaying: HTMLElement[];\n\nlet currentAudioId = \"\";\n\n// The first one to play should be at the end for both of these\nlet elementsToPlayConsecutivelyStack: HTMLElement[] = [];\nlet subElementsWithTimings: Array<[Element, number]> = [];\n\n// On a typical page with narration, these are raised at the same time, when the last narration\n// on the page finishes. But if there is no narration at all, PlayCompleted will be raised\n// immediately (useful for example to disable a pause button), but PageNarrationComplete will\n// be raised only after the standard delay for non-audio page (useful for auto-advancing to the next page).\nexport const PageNarrationComplete = new LiteEvent<HTMLElement>();\nexport const PlayCompleted = new LiteEvent<HTMLElement>();\n// Raised when we can't play narration, specifically because the browser won't allow it until\n// the user has interacted with the page.\nexport const PlayFailed = new LiteEvent<HTMLElement>();\n\n// This event allows Narration to inform its controllers when we start/stop reading\n// image descriptions. It is raised for each segment we read and passed true if the one\n// we are about to read is an image description, false otherwise.\n// Todo: wants a better name, it's not about toggling whether something is an image description,\n// but about possibly updating the UI to reflect whether we are reading one.\nexport const ToggleImageDescription = new LiteEvent<boolean>();\n\n// A Session Number that keeps track of each time playAllAudio started.\n// This might be needed to keep track of changing pages, or when we start new audio\n// that will replace something already playing.\nlet currentAudioSessionNum: number = 0;\n\nlet includeImageDescriptions: boolean = true;\nexport function setIncludeImageDescriptions(b: boolean) {\n includeImageDescriptions = b;\n}\n\n// This represents the start time of the current playing of the audio. If the user presses pause/play, it will be reset.\n// This is used for analytics reporting purposes\nlet audioPlayCurrentStartTime: number | null = null; // milliseconds (since 1970/01/01, from new Date().getTime())\n\n// Roughly equivalent to BloomDesktop's AudioRecording::listen() function.\n// As long as there is audio on the page, this method will play it.\nexport function playAllSentences(\n page: HTMLElement | null,\n canvasToExclude?: HTMLElement,\n): void {\n if (!page && !currentPlayPage) {\n return; // this shouldn't happen\n }\n const pageToPlay = page ?? currentPlayPage!;\n playAllAudio(getPageAudioElements(pageToPlay, canvasToExclude), pageToPlay);\n}\n\nexport function playAllAudio(elements: HTMLElement[], page: HTMLElement): void {\n setCurrentPage(page);\n segmentsWeArePlaying = elements;\n startPlay = new Date();\n const mediaPlayer = getPlayer();\n if (mediaPlayer) {\n // This felt like a good idea to do always. But we are about to set a new src on the media player and play that,\n // which will deal with any sound that is still playing.\n // And if we explicitly pause it now, that actually starts an async process of getting it paused, which\n // may not have completed by the time we attempt to play the new audio. And then play() fails.\n // OTOH, if there is nothing new to play, we should terminate anything that is playing\n // (perhaps from a previous page).\n if (elements.length == 0) {\n mediaPlayer.pause();\n }\n mediaPlayer.currentTime = 0;\n }\n\n // Invalidate old ID, even if there's no new audio to play.\n // (Deals with the case where you are on a page with audio, switch to a page without audio, then switch back to original page)\n ++currentAudioSessionNum;\n\n fixHighlighting(elements);\n\n // Sorted into the order we want to play them, then reversed so we\n // can more conveniently pop the next one to play from the end of the stack.\n elementsToPlayConsecutivelyStack = sortAudioElements(elements).reverse();\n\n const stackSize = elementsToPlayConsecutivelyStack.length;\n if (stackSize === 0) {\n // Nothing to play. First, raise the event that indicates nothing is playing.\n // It typically sets mode to MediaFinsished, and we want to override that.\n if (PlayCompleted) {\n PlayCompleted?.raise(page);\n }\n // Simulate playing for a fixed amount of time before raising PageNarrationComplete, in case we're autoadvancing.\n // We're not really playing, but we're pretending, so things work best if we go to that mode.\n // For example, if we leave it in MediaFinished from the previous page or from raising PlayCompleted, pause won't work.\n setCurrentPlaybackMode(PlaybackMode.AudioPlaying);\n if (PageNarrationComplete) {\n fakeNarrationTimer = window.setTimeout(() => {\n setCurrentPlaybackMode(PlaybackMode.MediaFinished);\n PageNarrationComplete?.raise(page);\n }, durationOfPagesWithoutNarration * 1000);\n }\n return;\n }\n\n const firstElementToPlay = elementsToPlayConsecutivelyStack[stackSize - 1]; // Remember to pop it when you're done playing it. (i.e., in playEnded)\n // At one point it seemed to help something to delete the media player and make a new one each time.\n // I didn't comment this at the time, but my recollection is that this could help with some cases\n // where the old one was in a bad state, such as in the middle of pausing.\n // Currently, though, we're being more careful not to pause except when there is nothing more to play currently,\n // (or when the user clicks the button),\n // since changing the src will stop any old play, but pausing right before setting a new src and calling play()\n // can cause the play() to fail. And somehow, deleting the media player here before we set up for a new play\n // was causing play to fail, reporting an abort because the media was removed from the document.\n // I don't fully understand why that was happening, but for now, things seem to be working best by just\n // continuing to use the same player as long as it can be found.\n // For sure, don't delete the player and make a new one between setting highlight and playing,\n // or the handler that removes the highlight suppression will be lost.\n //mediaPlayer.remove();\n\n setSoundAndHighlight(firstElementToPlay, true);\n // Review: do we need to do something to let the rest of the world know about this?\n setCurrentPlaybackMode(PlaybackMode.AudioPlaying);\n playCurrentInternal();\n return;\n}\n\n// Match space or &nbsp; (\\u00a0) or &ZeroWidthSpace; (\\u200b). Must have three or more in a row to match.\n// Geckofx would typically give something like `&nbsp;&nbsp;&nbsp; ` but wv2 usually gives something like `&nbsp; &nbsp; `\nconst multiSpaceRegex = /[ \\u00a0\\u200b]{3,}/;\nconst multiSpaceRegexGlobal = new RegExp(multiSpaceRegex, \"g\");\n/**\n * Finds and fixes any elements on the page that should have their audio-highlighting disabled.\n *\n * Note, all this logic is essentially duplicated from BloomDesktop where there are quite a few unit tests.\n */\nfunction fixHighlighting(audioElements: HTMLElement[]) {\n // Note: Only relevant when playing by sentence (but note, this can make Record by Text Box -> Split or Record by Sentence, Play by Sentence)\n // Play by Text Box highlights the whole paragraph and none of this really matters.\n // (the span selector won't match anyway)\n audioElements.forEach((audioElement) => {\n // FYI, don't need to process the bloom-linebreak spans. Nothing bad happens, just unnecessary.\n const matches = findAll(\n \"span[id]:not(.bloom-linebreak)\",\n audioElement,\n true,\n );\n matches.forEach((element) => {\n // Remove all existing highlight classes from element and element's descendants.\n // These shouldn't be in the dom as the editor is supposed to clean them up,\n // but we have seen at least on case where it didn't. BL-13428.\n removeHighlightClasses(element);\n\n // Simple check to help ensure that elements that don't need to be modified will remain untouched.\n // This doesn't consider whether text that shouldn't be highlighted is already in inside an\n // element with highlight disabled, but that's ok. The code down the stack checks that.\n const containsNonHighlightText =\n !!element.innerText.match(multiSpaceRegex);\n\n if (containsNonHighlightText) {\n fixHighlightingInNode(element, element);\n }\n });\n });\n}\n\n// Remove all existing highlight classes from element and element's descendants.\nfunction removeHighlightClasses(element: HTMLElement) {\n element.classList.remove(kDisableHighlightClass);\n element.classList.remove(kEnableHighlightClass);\n\n Array.from(element.children).forEach((child: HTMLElement) => {\n removeHighlightClasses(child);\n });\n}\n\n/**\n * Recursively fixes the audio-highlighting within a node (whether element node or text node)\n * @param node The node to recursively fix\n * @param startingSpan The starting span, AKA the one that will receive .ui-audioCurrent in the future.\n */\nfunction fixHighlightingInNode(node: Node, startingSpan: HTMLSpanElement) {\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n (node as Element).classList.contains(kDisableHighlightClass)\n ) {\n // No need to process bloom-highlightDisabled elements (they've already been processed)\n return;\n } else if (node.nodeType === Node.TEXT_NODE) {\n // Leaf node. Fix the highlighting, then go back up the stack.\n fixHighlightingInTextNode(node, startingSpan);\n return;\n } else {\n // Recursive case\n const childNodesCopy = Array.from(node.childNodes); // Make a copy because node.childNodes is being mutated\n childNodesCopy.forEach((childNode) => {\n fixHighlightingInNode(childNode, startingSpan);\n });\n }\n}\n\n/**\n * Analyzes a text node and fixes its highlighting.\n */\nfunction fixHighlightingInTextNode(\n textNode: Node,\n startingSpan: HTMLSpanElement,\n) {\n if (textNode.nodeType !== Node.TEXT_NODE) {\n throw new Error(\n \"Invalid argument to fixMultiSpaceInTextNode: node must be a TextNode\",\n );\n }\n\n if (!textNode.nodeValue) {\n return;\n }\n\n // string.matchAll would be cleaner, but not supported in all browsers (in particular, FF60)\n // Use RegExp.exec for greater compatibility.\n multiSpaceRegexGlobal.lastIndex = 0; // RegExp.exec is stateful! Need to reset the state.\n const matches: {\n text: string;\n startIndex: number;\n endIndex: number; // the index of the first character to exclude\n }[] = [];\n let regexResult: RegExpExecArray | null;\n while (\n (regexResult = multiSpaceRegexGlobal.exec(textNode.nodeValue)) != null\n ) {\n regexResult.forEach((matchingText) => {\n matches.push({\n text: matchingText,\n startIndex:\n multiSpaceRegexGlobal.lastIndex - matchingText.length,\n endIndex: multiSpaceRegexGlobal.lastIndex, // the index of the first character to exclude\n });\n });\n }\n\n // First, generate the new DOM elements with the fixed highlighting.\n const newNodes: Node[] = [];\n if (matches.length === 0) {\n // No matches\n newNodes.push(makeHighlightedSpan(textNode.nodeValue));\n } else {\n let lastMatchEndIndex = 0; // the index of the first character to exclude of the last match\n for (let i = 0; i < matches.length; ++i) {\n const match = matches[i];\n\n const preMatchText = textNode.nodeValue.slice(\n lastMatchEndIndex,\n match.startIndex,\n );\n lastMatchEndIndex = match.endIndex;\n if (preMatchText) newNodes.push(makeHighlightedSpan(preMatchText));\n\n newNodes.push(document.createTextNode(match.text));\n\n if (i === matches.length - 1) {\n const postMatchText = textNode.nodeValue.slice(match.endIndex);\n if (postMatchText) {\n newNodes.push(makeHighlightedSpan(postMatchText));\n }\n }\n }\n }\n\n // Next, replace the old DOM element with the new DOM elements\n const oldNode = textNode;\n if (oldNode.parentNode && newNodes && newNodes.length > 0) {\n for (let i = 0; i < newNodes.length; ++i) {\n const nodeToInsert = newNodes[i];\n oldNode.parentNode.insertBefore(nodeToInsert, oldNode);\n }\n\n oldNode.parentNode.removeChild(oldNode);\n\n // We need to set ancestor's background back to transparent (instead of highlighted),\n // and let each of the newNodes's styles control whether to be highlighted or transparent.\n // If ancestor was highlighted but one of its new descendant nodes was transparent,\n // all that would happen is the descendant would allow the ancestor's highlight color to show through,\n // which doesn't achieve what we want :(\n startingSpan.classList.add(kDisableHighlightClass);\n }\n}\n\nfunction makeHighlightedSpan(textContent: string) {\n const newSpan = document.createElement(\"span\");\n newSpan.classList.add(kEnableHighlightClass);\n newSpan.appendChild(document.createTextNode(textContent));\n return newSpan;\n}\n\nfunction playCurrentInternal() {\n if (currentPlaybackMode === PlaybackMode.AudioPlaying) {\n const mediaPlayer = getPlayer();\n if (mediaPlayer) {\n const element = getCurrentNarrationPage().querySelector(\n `#${currentAudioId}`,\n );\n if (!element || !canPlayAudio(element)) {\n playEnded();\n return;\n }\n\n // Regardless of whether we end up using timingsStr or not,\n // we should reset this now in case the previous page used it and was still playing\n // when the user flipped to the next page.\n subElementsWithTimings = [];\n\n const timingsStr: string | null = element.getAttribute(\n \"data-audioRecordingEndTimes\",\n );\n if (timingsStr) {\n const childSpanElements = element.querySelectorAll(\n `span.${kHighlightSegmentClass}`,\n );\n const fields = timingsStr.split(\" \");\n const subElementCount = Math.min(\n fields.length,\n childSpanElements.length,\n );\n\n for (let i = subElementCount - 1; i >= 0; --i) {\n const durationSecs: number = Number(fields[i]);\n if (isNaN(durationSecs)) {\n continue;\n }\n subElementsWithTimings.push([\n childSpanElements.item(i),\n durationSecs,\n ]);\n }\n } else {\n // No timings string available.\n // No need for us to do anything. The correct element is already highlighted by playAllSentences() (which needed to call setCurrent... anyway to set the audio player source).\n // We'll just proceed along, start playing the audio, and playNextSubElement() will return immediately because there are no sub-elements in this case.\n }\n\n const currentSegment = element as HTMLElement;\n if (currentSegment && ToggleImageDescription) {\n ToggleImageDescription?.raise(\n isImageDescriptionSegment(currentSegment),\n );\n }\n\n gotErrorPlaying = false;\n const promise = mediaPlayer.play();\n ++currentAudioSessionNum;\n audioPlayCurrentStartTime = new Date().getTime();\n highlightNextSubElement(currentAudioSessionNum);\n handlePlayPromise(promise);\n }\n }\n}\n\nfunction isImageDescriptionSegment(segment: HTMLElement): boolean {\n return segment.closest(\".\" + kImageDescriptionClass) !== null;\n}\n\nfunction handlePlayPromise(promise: Promise<void>, player?: HTMLMediaElement) {\n // In newer browsers, play() returns a promise which fails\n // if the browser disobeys the command to play, as some do\n // if the user hasn't 'interacted' with the page in some\n // way that makes the browser think they are OK with it\n // playing audio. In Gecko45, the return value is undefined,\n // so we mustn't call catch.\n if (promise && promise.catch) {\n promise.catch((reason: any) => {\n // The HTMLMediaElement also has an error handler (which calls playEnded()).\n // We do NOT want to call that here, both to stop it happening twice, but also because\n // we do NOT want to call playEnded (which in autoplay causes advance to next page)\n // when we get NotAllowedError. That error seems to only come here, and not to raise the\n // ended event.\n\n // This promise.catch error handler is the only one that handles NotAllowedException (that is, playback not started because user has not interacted with the page yet).\n // However, older versions of browsers don't support promise from HTMLMediaElement.play(). So this cannot be the only error handler.\n // Thus we need both the promise.catch error handler as well as the HTMLMediaElement's error handler.\n //\n // In many cases (such as NotSupportedError, which happens when the audio file isn't found), both error handlers will run.\n // That is a little annoying but if the two don't conflict with each other it's not problematic.\n\n const playingWhat = player?.getAttribute(\"src\") ?? \"unknown\";\n console.log(\"could not play sound: \" + reason + \" \" + playingWhat);\n\n if (\n reason &&\n reason\n .toString()\n .includes(\n \"The play() request was interrupted by a call to pause().\",\n )\n ) {\n // We were getting this error Aug 2020. I tried wrapping the line above which calls mediaPlayer.play()\n // (currently `promise = mediaPlayer.play();`) in a setTimeout with 0ms. This seemed to fix the bug (with\n // landscape books not having audio play initially -- BL-8887). But the root cause was actually that\n // we ended up calling playAllSentences twice when the book first loaded.\n // I fixed that in bloom-player-core. But I wanted to document the possible setTimeout fix here\n // in case this issue ever comes up for a different reason.\n console.log(\n \"See comment in narration.ts for possibly useful information regarding this error.\",\n );\n }\n\n // Don't call removeAudioCurrent() here. The HTMLMediaElement's error handler will call playEnded() and calling removeAudioCurrent() here will mess up playEnded().\n // removeAudioCurrent();\n\n // With some kinds of invalid sound file it keeps trying and plays over and over.\n // But when we move on to play another sound, a pause here will mess things up.\n // So instead I put a pause after we run out of sounds to try to play.\n //getPlayer().pause();\n // if (Pause) {\n // Pause?.raise();\n // }\n\n // Get all the state (and UI) set correctly again.\n // Not entirely sure about limiting this to NotAllowedError, but that's\n // the one kind of play error that is fixed by the user just interacting.\n // If there's some other reason we can't play, showing as paused may not\n // be useful. See comments on the similar code in music.ts\n if (reason.name === \"NotAllowedError\" && PlayFailed) {\n PlayFailed?.raise();\n }\n });\n }\n}\n\n// Moves the highlight to the next sub-element\n// originalSessionNum: The value of currentAudioSessionNum at the time when the audio file started playing.\n// This is used to check in the future if the timeouts we started are for the right session.\n// startTimeInSecs is an optional fallback that will be used in case the currentTime cannot be determined from the audio player element.\nfunction highlightNextSubElement(\n originalSessionNum: number,\n startTimeInSecs: number = 0,\n) {\n // the item should not be popped off the stack until it's completely done with.\n const subElementCount = subElementsWithTimings.length;\n\n if (subElementCount <= 0) {\n return;\n }\n\n const topTuple = subElementsWithTimings[subElementCount - 1];\n const element = topTuple[0];\n const endTimeInSecs: number = topTuple[1];\n\n setHighlightTo({\n newElement: element,\n shouldScrollToElement: true,\n disableHighlightIfNoAudio: false,\n });\n\n const mediaPlayer: HTMLMediaElement = document.getElementById(\n \"bloom-audio-player\",\n )! as HTMLMediaElement;\n let currentTimeInSecs: number = mediaPlayer.currentTime;\n if (currentTimeInSecs <= 0) {\n currentTimeInSecs = startTimeInSecs;\n }\n\n // Handle cases where the currentTime has already exceeded the nextStartTime\n // (might happen if you're unlucky in the thread queue... or if in debugger, etc.)\n // But instead of setting time to 0, set the minimum highlight time threshold to 0.1 (this threshold is arbitrary).\n const durationInSecs = Math.max(endTimeInSecs - currentTimeInSecs, 0.1);\n\n setTimeout(() => {\n onSubElementHighlightTimeEnded(originalSessionNum);\n }, durationInSecs * 1000);\n}\n\n// Handles a timeout indicating that the expected time for highlighting the current subElement has ended.\n// If we've really played to the end of that subElement, highlight the next one (if any).\n// originalSessionNum: The value of currentAudioSessionNum at the time when the audio file started playing.\n// This is used to check in the future if the timeouts we started are for the right session\nfunction onSubElementHighlightTimeEnded(originalSessionNum: number) {\n // Check if the user has changed pages since the original audio for this started playing.\n // Note: Using the timestamp allows us to detect switching to the next page and then back to this page.\n // Using playerPage (HTMLElement) does not detect that.\n if (originalSessionNum !== currentAudioSessionNum) {\n return;\n }\n // Seems to be needed to prevent jumping to the next subelement when not permitted to play by browser.\n // Not sure why the check below on mediaPlayer.currentTime does not prevent this.\n if (currentPlaybackMode === PlaybackMode.AudioPaused) {\n return;\n }\n\n const subElementCount = subElementsWithTimings.length;\n if (subElementCount <= 0) {\n return;\n }\n\n const mediaPlayer: HTMLMediaElement = document.getElementById(\n \"bloom-audio-player\",\n )! as HTMLMediaElement;\n if (mediaPlayer.ended || mediaPlayer.error) {\n // audio playback ended. No need to highlight anything else.\n // (No real need to remove the highlights either, because playEnded() is supposed to take care of that.)\n return;\n }\n const playedDurationInSecs: number | undefined | null =\n mediaPlayer.currentTime;\n\n // Peek at the next sentence and see if we're ready to start that one. (We might not be ready to play the next audio if the current audio got paused).\n const subElementWithTiming = subElementsWithTimings[subElementCount - 1];\n const nextStartTimeInSecs = subElementWithTiming[1];\n\n if (playedDurationInSecs && playedDurationInSecs < nextStartTimeInSecs) {\n // Still need to wait. Exit this function early and re-check later.\n const minRemainingDurationInSecs =\n nextStartTimeInSecs - playedDurationInSecs;\n setTimeout(() => {\n onSubElementHighlightTimeEnded(originalSessionNum);\n }, minRemainingDurationInSecs * 1000);\n\n return;\n }\n\n subElementsWithTimings.pop();\n\n highlightNextSubElement(originalSessionNum, nextStartTimeInSecs);\n}\n\n// Removes the .ui-audioCurrent class from all elements (also ui-audioCurrentImg)\n// Equivalent of removeAudioCurrentFromPageDocBody() in BloomDesktop.\n// \"around\" might be the element that has the highlight, or the one getting it;\n// the important thing is that it belongs to the right document (which is in question\n// with multiple iframes in Bloom desktop).\nfunction removeAudioCurrent(around: HTMLElement = document.body) {\n // Note that HTMLCollectionOf's length can change if you change the number of elements matching the selector.\n // For safety we get rid of all existing ones.\n const audioCurrentArray = Array.from(\n around.ownerDocument.getElementsByClassName(\"ui-audioCurrent\"),\n );\n\n for (let i = 0; i < audioCurrentArray.length; i++) {\n audioCurrentArray[i].classList.remove(\"ui-audioCurrent\");\n }\n const currentImg =\n around.ownerDocument.getElementsByClassName(\"ui-audioCurrentImg\")[0];\n if (currentImg) {\n currentImg.classList.remove(\"ui-audioCurrentImg\");\n }\n}\n\nfunction setSoundAndHighlight(\n newElement: Element,\n disableHighlightIfNoAudio: boolean,\n oldElement?: Element | null | undefined,\n) {\n setSoundFrom(newElement);\n setHighlightTo({\n newElement,\n shouldScrollToElement: true, // Always true in bloom-player version\n disableHighlightIfNoAudio,\n oldElement,\n });\n}\n\nfunction setHighlightTo({\n newElement,\n shouldScrollToElement,\n disableHighlightIfNoAudio,\n oldElement,\n}: ISetHighlightParams) {\n // This should happen even if oldElement and newElement are the same.\n if (shouldScrollToElement) {\n // Wrap it in a try/catch so that if something breaks with this minor/nice-to-have feature of scrolling,\n // the main responsibilities of this method can still proceed\n try {\n scrollElementIntoView(newElement);\n } catch (e) {\n console.error(e);\n }\n }\n\n if (oldElement === newElement) {\n // No need to do much, and better not to, so that we can avoid any temporary flashes as the highlight is removed and re-applied\n return;\n }\n\n removeAudioCurrent((oldElement || newElement) as HTMLElement);\n\n const mediaPlayer = getPlayer();\n // The \"error\" may just be that audio has not been recorded for this element.\n // If the audio is missing, then strange things happen in the interaction between\n // narration and drag activity text. See BL-14797\n const hasError = mediaPlayer.error !== null;\n if (!hasError && disableHighlightIfNoAudio) {\n const isAlreadyPlaying = mediaPlayer.currentTime > 0;\n // If it's already playing, no need to disable (Especially in the Soft Split case, where only one file is playing but multiple sentences need to be highlighted).\n if (!isAlreadyPlaying) {\n // Start off in a highlight-disabled state so we don't display any momentary highlight for cases where there is no audio for this element.\n // In react-based bloom-player, canPlayAudio() can't trivially identify whether or not audio exists,\n // so we need to incorporate a derivative of Bloom Desktop's .ui-suppressHighlight code\n newElement.classList.add(kSuppressHighlightClass);\n // When it starts playing, we know we really have such an audio file, so we can stop\n // suppressing the highlight.\n mediaPlayer.addEventListener(\"playing\", () => {\n newElement.classList.remove(kSuppressHighlightClass);\n });\n mediaPlayer.addEventListener(\"error\", () => {\n newElement.classList.remove(\"ui-audioCurrent\");\n newElement.classList.remove(kSuppressHighlightClass);\n });\n }\n }\n\n if (!hasError) newElement.classList.add(\"ui-audioCurrent\");\n // If the current audio is part of a (currently typically hidden) image description,\n // highlight the image.\n // it's important to check for imageDescription on the translationGroup;\n // we don't want to highlight the image while, for example, playing a TOP box content.\n const translationGroup = newElement.closest(\".bloom-translationGroup\");\n if (\n translationGroup &&\n translationGroup.classList.contains(kImageDescriptionClass)\n ) {\n const imgContainer = translationGroup.closest(\n \".bloom-imageContainer, .bloom-canvas\",\n );\n if (imgContainer) {\n imgContainer.classList.add(\"ui-audioCurrentImg\");\n }\n }\n}\n\n// Scrolls an element into view.\nfunction scrollElementIntoView(element: Element) {\n // In Bloom Player, scrollIntoView can interfere with page swipes,\n // so Bloom Player needs some smarts about when to call it...\n if (isSwipeInProgress?.() || recentPageChange) {\n // This alternative implementation doesn't use scrollIntoView (Which interferes with swiper).\n // Since swiping is only active at the beginning (usually while the 1st element is playing)\n // it should generally be good enough just to reset the scroll of the scroll parent to the top.\n\n // Assumption: Assumes the editable is the scrollbox.\n // If this is not the case, you can use JQuery's scrollParent() function or other equivalent\n const scrollAncestor = getEditable(element);\n if (scrollAncestor) {\n scrollAncestor.scrollTop = 0;\n }\n return;\n }\n\n let mover = element as HTMLElement; // by default make the element itself scrollIntoView\n if (window.getComputedStyle(element.parentElement!).position !== \"static\") {\n // We can make a new element absolutely positioned and it will be relative to the parent.\n // The idea is to make an element much narrower than the element we are\n // trying to make visible, since we don't want horizontal movement. Quite possibly,\n // as in BL-11038, only some white space is actually off-screen. But even if the author\n // has positioned a bubble so some text is cut off, we don't want horizontal scrolling,\n // which inside swiper will weirdly pull in part of the next page.\n // (In the pathological case that the bubble is more than half hidden, we'll do the\n // horizontal scroll, despite the ugliness of possibly showing part of the next page.)\n // Note that elt may be a span, when scrolling chunks of text into view to play.\n // I thought about using scrollWidth/Height to include any part of the element\n // that is scrolled out of view, but for some reason these are always zero for spans.\n // OffsetHeight seems to give the full height, though docs seem to indicate that it\n // should not include invisible areas.\n const elt = element as HTMLElement;\n mover = document.createElement(\"div\");\n mover.style.position = \"absolute\";\n mover.style.top = elt.offsetTop + \"px\";\n\n // now we need what for a block would be offsetLeft. However, for a span, that\n // yields the offset of the top left corner, which may be in the middle\n // of a line.\n const bounds = elt.getBoundingClientRect();\n const parent = elt.parentElement;\n const parentBounds = parent?.getBoundingClientRect();\n const scale = parentBounds!.width / parent!.offsetWidth;\n const leftRelativeToParent = (bounds.left - parentBounds!.left) / scale;\n\n mover.style.left = leftRelativeToParent + elt.offsetWidth / 2 + \"px\";\n mover.style.height = elt.offsetHeight + \"px\";\n mover.style.width = \"0\";\n element.parentElement?.insertBefore(mover, element);\n }\n\n mover.scrollIntoView({\n // Animated instead of sudden\n behavior: \"smooth\",\n\n // \"nearest\" setting does lots of smarts for us (compared to us deciding when to use \"start\" or \"end\")\n // Seems to reduce unnecessary scrolling compared to start (aka true) or end (aka false).\n // Refer to https://drafts.csswg.org/cssom-view/#scroll-an-element-into-view,\n // which seems to imply that it won't do any scrolling if the two relevant edges are already inside.\n block: \"nearest\",\n\n // horizontal alignment is controlled by \"inline\". We'll leave it as its default (\"nearest\")\n // which typically won't move things at all horizontally\n });\n if (mover !== element) {\n mover.parentElement?.removeChild(mover);\n }\n}\n\nfunction getEditable(element: Element): Element | null {\n if (element.classList.contains(\"bloom-editable\")) {\n return element;\n } else {\n return element.closest(\".bloom-editable\"); // Might be null\n }\n}\n\nfunction setSoundFrom(element: Element) {\n const firstAudioSentence = getFirstAudioSentenceWithinElement(element);\n const id: string = firstAudioSentence ? firstAudioSentence.id : element.id;\n setCurrentAudioId(id);\n}\n\nfunction getFirstAudioSentenceWithinElement(\n element: Element | null,\n): Element | null {\n const audioSentences = getAudioSegmentsWithinElement(element);\n if (!audioSentences || audioSentences.length === 0) {\n return null;\n }\n\n return audioSentences[0];\n}\n\nfunction getAudioSegmentsWithinElement(element: Element | null): Element[] {\n const audioSegments: Element[] = [];\n\n if (element) {\n if (element.classList.contains(kAudioSentence)) {\n audioSegments.push(element);\n } else {\n const collection = element.getElementsByClassName(kAudioSentence);\n for (let i = 0; i < collection.length; ++i) {\n const audioSentenceElement = collection.item(i);\n if (audioSentenceElement) {\n audioSegments.push(audioSentenceElement);\n }\n }\n }\n }\n\n return audioSegments;\n}\n\nfunction setCurrentAudioId(id: string) {\n if (!currentAudioId || currentAudioId !== id) {\n currentAudioId = id;\n updatePlayerStatus();\n }\n}\n\nfunction updatePlayerStatus() {\n const player = getPlayer();\n if (!player) {\n return;\n }\n // Any time we change the src, the player will pause.\n // So if we're playing currently, we'd better report whatever time\n // we played.\n if (player.currentTime > 0 && !player.paused && !player.ended) {\n reportPlayDuration();\n }\n const url = currentAudioUrl(currentAudioId);\n logNarration(url);\n // because this code is meant to work in both Bloom and BloomPlayer, we can't call a Bloom API to find\n // out whether we actually have a recording (as we well might not, if we just opened the talking book\n // tool and haven't recorded anything yet). So we just try to play it and see what happens.\n // The optional param tells Bloom not to report an error if the file isn't found, and is ignored in\n // other contexts.\n player.setAttribute(\n \"src\",\n url + \"?nocache=\" + new Date().getTime() + \"&optional=true\",\n );\n}\n\nfunction currentAudioUrl(id: string): string {\n const result = urlPrefix() + \"/audio/\" + id + \".mp3\";\n return result;\n}\n\nfunction getPlayer(): HTMLMediaElement {\n const audio = getAudio(\"bloom-audio-player\", (a) => {\n a.addEventListener(\"ended\", handlePlayEnded);\n a.addEventListener(\"error\", handlePlayError);\n });\n return audio;\n}\n\nfunction handlePlayEnded() {\n playEnded();\n}\n\n// Stop any audio that is currently playing.\n// This will also raise the PlayCompleted and PageNarrationComplete events\nexport function abortNarrationPlayback() {\n if (currentPlaybackMode !== PlaybackMode.AudioPlaying) {\n return; // no need to abort\n }\n\n // I hesitated to put this comment here because I'm afraid it won't make any sense.\n // But I also don't feel right about not attempting to capture what happened.\n // Previously, we didn't have this \"keepPlayingTheStack\" parameter, and we just\n // modified the stack to have only the top element in it.\n // But for no reason we can explain, in BloomPUB Viewer, and only there,\n // even if we weren't calling this code, referencing elementsToPlayConsecutivelyStack\n // caused an error to be thrown and a black screen to result.\n // So if you're tempted to modify this code, especially if you need to\n // reference elementsToPlayConsecutivelyStack, be sure to test in BloomPUB Viewer.\n\n playEnded(false);\n}\n\n// Handles ending the current playback. If there are more things stacked to play, it plays the next one.\n// otherwise, it reports that play ended. Note that the latter raises the PlayCompleted and PageNarrationComplete events.\nfunction playEnded(keepPlayingTheStack = true): void {\n // Not sure if this is necessary, since both 'playCurrentInternal()' and 'reportPlayEnded()'\n // will toggle image description already, but if we've just gotten to the end of our \"stack\",\n // it may be needed.\n if (ToggleImageDescription) {\n ToggleImageDescription?.raise(false);\n }\n reportPlayDuration();\n if (\n elementsToPlayConsecutivelyStack &&\n elementsToPlayConsecutivelyStack.length > 0\n ) {\n const elementJustPlayed = elementsToPlayConsecutivelyStack.pop(); // get rid of the last one we played\n const newStackCount = elementsToPlayConsecutivelyStack.length;\n if (newStackCount > 0 && keepPlayingTheStack) {\n // More items to play\n const nextElement =\n elementsToPlayConsecutivelyStack[newStackCount - 1];\n setSoundAndHighlight(nextElement, true);\n playCurrentInternal();\n } else {\n reportPlayEnded();\n removeAudioCurrent(elementJustPlayed);\n // In some error conditions, we need to stop repeating attempts to play.\n getPlayer().pause();\n }\n }\n}\n\nfunction reportPlayEnded() {\n elementsToPlayConsecutivelyStack = [];\n subElementsWithTimings = [];\n\n removeAudioCurrent();\n PageNarrationComplete?.raise(currentPlayPage!);\n PlayCompleted?.raise();\n}\n\nfunction reportPlayDuration() {\n if (!audioPlayCurrentStartTime || !durationReporter) {\n return;\n }\n const currentTime = new Date().getTime();\n const duration = (currentTime - audioPlayCurrentStartTime) / 1000;\n durationReporter(duration);\n}\n\nfunction getAudio(id: string, init: (audio: HTMLAudioElement) => void) {\n let player: HTMLAudioElement | null = document.querySelector(\n \"#\" + id,\n ) as HTMLAudioElement;\n // If (somehow?) it exists but is not a valid HTMLAudioElement, remove it.\n if (player && !player.play) {\n player.remove();\n player = null;\n }\n if (!player) {\n player = document.createElement(\"audio\") as HTMLAudioElement;\n player.setAttribute(\"id\", id);\n document.body.appendChild(player);\n init(player);\n }\n return player as HTMLMediaElement;\n}\n\nfunction canPlayAudio(current: Element): boolean {\n return true; // currently no way to check\n}\n\n// If something goes wrong playing a media element, typically that we don't actually have a recording\n// for a particular one, we seem to sometimes get an error event, while other times, the promise returned\n// by play() is rejected. Both cases call handlePlayError, which calls playEnded, but in case we get both,\n// we don't want to call playEnded twice.\nlet gotErrorPlaying = false;\n\nfunction handlePlayError() {\n if (gotErrorPlaying) {\n console.log(\"Already got error playing, not handling again\");\n return;\n }\n gotErrorPlaying = true;\n console.log(\"Error playing, handling\");\n setTimeout(() => {\n playEnded();\n }, 100);\n}\n\n// Returns all elements that match CSS selector {expr} as an array.\n// Querying can optionally be restricted to {container}'s descendants\n// If includeSelf is true, it includes both itself as well as its descendants.\n// Otherwise, it only includes descendants.\n// Also filters out imageDescriptions if we aren't supposed to be reading them.\nfunction findAll(\n expr: string,\n container: HTMLElement,\n includeSelf: boolean = false,\n): HTMLElement[] {\n // querySelectorAll checks all the descendants\n const allMatches: HTMLElement[] = [].slice.call(\n (container || document).querySelectorAll(expr),\n );\n\n // Now check itself\n if (includeSelf && container && container.matches(expr)) {\n allMatches.push(container);\n }\n\n return includeImageDescriptions\n ? allMatches\n : allMatches.filter((match) => !isImageDescriptionSegment(match));\n}\n\nfunction getPlayableDivs(\n container: HTMLElement,\n canvasToExclude?: HTMLElement,\n) {\n // We want to play any audio we have from divs the user can see.\n // This is a crude test, but currently we always use display:none to hide unwanted languages.\n var results = findAll(\".bloom-editable\", container).filter(\n (e) => window.getComputedStyle(e).display !== \"none\",\n );\n if (canvasToExclude) {\n results = results.filter((e) => !canvasToExclude.contains(e));\n }\n return results;\n}\n\n// Optional param is for use when 'playerPage' has NOT been initialized.\n// Not using the optional param assumes 'playerPage' has been initialized\nfunction getPagePlayableDivs(\n page?: HTMLElement,\n canvasToExclude?: HTMLElement,\n): HTMLElement[] {\n return getPlayableDivs(page ? page : currentPlayPage!, canvasToExclude);\n}\n\n// Optional param is for use when 'playerPage' has NOT been initialized.\n// Not using the optional param assumes 'playerPage' has been initialized\nfunction getPageAudioElements(\n page?: HTMLElement,\n canvasToExclude?: HTMLElement,\n): HTMLElement[] {\n return [].concat.apply(\n [],\n getPagePlayableDivs(page, canvasToExclude).map((x) =>\n findAll(\".audio-sentence\", x, true),\n ),\n );\n}\n\nexport function pageHasAudio(page: HTMLElement): boolean {\n return getPageAudioElements(page).length ? true : false;\n}\n\n// Called when the user clicks the play/pause button, and we want to resume playing.\n// If we're in the middle of playing, we resume it.\n// If we have finished playing, we start over.\n// If the page nas no audio, we assume the user paused as long as wanted on\n// the page, and raise the PageNarrationComplete event at once (to move to the\n// next page if we are in autoplay).\nexport function playNarration() {\n if (currentPlaybackMode === PlaybackMode.AudioPlaying) {\n return; // no change.\n }\n setCurrentPlaybackMode(PlaybackMode.AudioPlaying);\n // I'm not sure how getPlayer() can return null/undefined, but have seen it happen\n // typically when doing something odd like trying to go back from the first page.\n if (segmentsWeArePlaying.length && getPlayer()) {\n if (elementsToPlayConsecutivelyStack.length) {\n handlePlayPromise(getPlayer().play());\n\n // Resuming play. Only currentStartTime needs to be adjusted, but originalStartTime shouldn't be changed.\n audioPlayCurrentStartTime = new Date().getTime();\n // in case we're resuming play, we need a new timout when the current subelement is finished\n highlightNextSubElement(currentAudioSessionNum);\n return;\n } else {\n // Pressing the play button in this case is triggering a replay of the current page,\n // so we need to reset the highlighting.\n playAllSentences(null);\n return;\n }\n }\n // Nothing real to play on this page, so PageNarrationComplete depends on a timeout.\n // We only get here following a pause, so assume the reader has paused as long as wanted,\n // and move on.\n PageNarrationComplete?.raise(currentPlayPage!);\n}\n\nexport function pauseNarration() {\n if (currentPlaybackMode === PlaybackMode.AudioPaused) {\n return;\n }\n pausePlaying();\n startPause = new Date();\n\n // Note that neither music.pause() nor animations.PauseAnimations() check the state.\n // If that changes, then this state setting might need attention.\n setCurrentPlaybackMode(PlaybackMode.AudioPaused);\n}\n\n// This pauses the current player without setting the \"AudioPaused\" state or setting the\n// startPause timestamp. If this method is called when resumption is possible, the calling\n// method must take care of these values (as in the pause method directly above).\n// Note that there's no \"stop\" method on player, only a \"pause\" method. This method is\n// used both when \"pausing\" the narration while viewing a page and when stopping narration\n// when changing pages.\nfunction pausePlaying() {\n const player = getPlayer();\n // We're paused, so if we have a timer running to switch pages after a certain time, cancel it.\n clearTimeout(fakeNarrationTimer);\n if (segmentsWeArePlaying && segmentsWeArePlaying.length && player) {\n // Before reporting duration, try to check that we really are playing.\n // a separate report is sent if play ends.\n if (player.currentTime > 0 && !player.paused && !player.ended) {\n reportPlayDuration();\n }\n player.pause();\n }\n}\n\n// Figure out the total duration of the audio on the page.\n// An earlier version of this code (see narration.ts around November 2023)\n// was designed to run asnychronously so that if we don't have audio\n// durations in the file, it would try to get the actual duration of the audio\n// from the server. However, comments indicated that this approach did not\n// work in mobile apps, and bloompubs have now long shipped with the durations.\n// So I decided to simplify.\nexport function computeDuration(page: HTMLElement): number {\n let pageDuration = 0.0;\n getPageAudioElements(page).forEach((segment) => {\n const attrDuration = segment.getAttribute(\"data-duration\");\n if (attrDuration) {\n pageDuration += parseFloat(attrDuration);\n }\n });\n if (pageDuration < durationOfPagesWithoutNarration) {\n pageDuration = durationOfPagesWithoutNarration;\n }\n return pageDuration;\n}\n\nexport function hidingPage() {\n // This causes problems. When we're hiding one page, we immediately show another.\n // If that page has no audio, we pause the player then.\n // If it DOES have audio, a pause here can interfere with playing it.\n //pausePlaying(); // Doesn't set AudioPaused state. Caller sets NewPage state.\n clearTimeout(fakeNarrationTimer);\n}\n\n// Play the specified elements, one after the other. When the last completes (or at once if the array is empty),\n// perform the 'then' action (typically used to play narration, which we put after videos).\n//\n// Note, there is a very similar function in video.ts. It would be nice to combine them, but\n// there are various reasons that is difficult at the moment. e.g.:\n// 1. See comment below about sharing code with Bloom Desktop.\n// 2. The other version handles play/pause which doesn't apply in BloomDesktop.\n//\n// (This function would be more natural in video.ts. But at least for now I'm trying to minimize the\n// number of source files shared with Bloom Desktop, and we need this for Bloom Games.)\nexport function playAllVideo(elements: HTMLVideoElement[], then: () => void) {\n if (elements.length === 0) {\n then();\n return;\n }\n const video = elements[0];\n\n // If there is an error, try to continue with the next video.\n if (\n video.networkState === HTMLMediaElement.NETWORK_NO_SOURCE &&\n video.readyState === HTMLMediaElement.HAVE_NOTHING\n ) {\n showVideoError(video);\n playAllVideo(elements.slice(1), then);\n } else {\n hideVideoError(video);\n setCurrentPlaybackMode(PlaybackMode.VideoPlaying);\n const promise = video.play();\n promise\n .then(() => {\n // The promise resolves when the video starts playing. We want to know when it ends.\n // Note: in Bloom Desktop, sometimes this event does not fire normally, even when the video is\n // played to the end. I have not figured out why. It may be something to do with how we are\n // trimming the videos.\n // In Bloom Desktop, this is worked around by raising the ended event when we detect that it has\n // paused past the end point in resetToStartAfterPlayingToEndPoint.\n // In BloomPlayer,I don't think this is a problem. Videos are trimmed when published, so we always\n // play to the real end (unless the user pauses). So one way or another, we should get the ended\n // event.\n video.addEventListener(\n \"ended\",\n () => {\n playAllVideo(elements.slice(1), then);\n },\n { once: true },\n );\n })\n .catch((reason) => {\n console.error(\"Video play failed\", reason);\n showVideoError(video);\n playAllVideo(elements.slice(1), then);\n });\n }\n}\n\n// These methods live here instead of video.ts because video.ts is already importing\n// from narration.ts, and we don't want to create a circular dependency.\n\n// We're living with this message not being localized.\nconst badVideoMessage = \"Sorry, this video cannot be played in this browser.\";\n\nexport function showVideoError(video: HTMLVideoElement): void {\n const parent = video.parentElement;\n if (parent) {\n const divs = parent.getElementsByClassName(\"video-error-message\");\n if (divs.length === 0) {\n const msgDiv = parent.ownerDocument.createElement(\"div\");\n msgDiv.className = \"video-error-message normal-style\";\n msgDiv.textContent = badVideoMessage;\n msgDiv.style.display = \"block\";\n msgDiv.style.color = \"black\";\n msgDiv.style.backgroundColor = \"rgba(255, 255, 255, 0.5)\"; // semi-transparent white\n msgDiv.style.position = \"absolute\";\n msgDiv.style.left = \"10%\";\n msgDiv.style.top = \"10%\";\n msgDiv.style.width = \"80%\";\n msgDiv.style.fontSize = \"x-large\";\n parent.appendChild(msgDiv);\n }\n }\n}\nexport function hideVideoError(video: HTMLVideoElement): void {\n const parent = video.parentElement;\n if (parent) {\n const divs = parent.getElementsByClassName(\"video-error-message\");\n while (divs.length > 1) parent.removeChild(divs[0]);\n }\n}\n","// This is the code that is shared between the Play tab of the bloom games\n// (also known as drag activities) and bloom-player. The code originates in\n// the bloom-player repo and is shared by the bloom-player package.\n// It wants to live in the dragActivity folder because it is specific to drag activities.\n// However, it also wants to live in the same place relative to narration.ts both in\n// bloom player and bloom desktop. For now that's a stronger requirement.\n// For now, in Bloom desktop, this file is only used in the Play tab of drag activities,\n// so both live there. In Bloom player, both live in the root src directory.\n// In the long run, the answer is probably a folder, or even an npm package, for all\n// the stuff that the two programs share...or maybe we can make bloom player publish\n// these files along with the output bundle and have bloom desktop use them from there.\n// For now, though, it's much easier to just edit them and have them built automatically\n// than to have this code in another repo.\n\nimport { ActivityManager } from \"../activities/activityManager\";\nimport {\n kAudioSentence,\n playAllAudio,\n playAllVideo,\n urlPrefix,\n} from \"./narration\";\n\n// Probably not the most logical place to define this constant, but this file needs it,\n// and if we define it here we don't have to share another file with bloom editor.\nexport const kLegacyCanvasElementSelector =\n \".bloom-textOverPicture, .bloom-canvas-element\";\nlet targetPositions: {\n x: number;\n y: number;\n width: number;\n height: number;\n}[] = [];\nlet originalPositions = new Map<HTMLElement, { x: number; y: number }>();\nlet currentPage: HTMLElement | undefined;\n// Action to invoke if the user clicks a change page button.\n// Our latest templates don't have their own change page buttons, just encourage the user\n// to leave room for the player to add them.\nlet currentChangePageAction: (next: boolean) => void | undefined;\nlet positionsToRestore: { x: string; y: string; elt: HTMLElement }[] = [];\n\n// Save the current positions of all draggables (when entering Play tab, so we can restore them when leaving).\nconst savePositions = (page: HTMLElement) => {\n positionsToRestore = [];\n page.querySelectorAll(\"[data-draggable-id]\").forEach((elt: HTMLElement) => {\n positionsToRestore.push({\n x: elt.style.left,\n y: elt.style.top,\n elt,\n });\n });\n};\n// Restore the positions saved by savePositions (when leaving the Play tab, or leaving this page altogether\n// after being in that tab or when clicking the retry button during play).\nconst restorePositions = () => {\n positionsToRestore.forEach((p) => {\n p.elt.style.left = p.x;\n p.elt.style.top = p.y;\n p.elt.classList.remove(\"bloom-draggedToTarget\");\n });\n};\n\n// This method may be specific to BloomDesktop.\nexport function adjustDraggablesForLanguage(page: HTMLElement) {\n if (page.getAttribute(\"data-activity\") !== \"drag-letter-to-target\") {\n return;\n }\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n draggables.shift(); // The first one is always visible.\n draggables.forEach((draggable: HTMLElement) => {\n const shouldBeVisible = !!(\n draggable.getElementsByClassName(\n \"bloom-visibility-code-on\",\n )[0] as HTMLElement\n )?.innerText.trim();\n draggable.classList.toggle(\"bloom-unused-in-lang\", !shouldBeVisible);\n const target = getTarget(draggable);\n\n if (target) {\n target.classList.toggle(\"bloom-unused-in-lang\", !shouldBeVisible);\n }\n });\n}\nexport function IsRunningOnBloomDesktop(bloomPage: Element): boolean {\n // REVIEW: is there a better way to detect this?\n return bloomPage.closest(\"#page-scaling-container\") !== null;\n // not reliable: in BE, document might be the toolbox doc.\n //return document.body.querySelector(\"div#page-scaling-container\") !== null;\n}\n\n// Function to call to get everything ready for playing the game.\n// Things that get done here should usually be undone in undoPrepareActivity.\nexport function prepareActivity(\n page: HTMLElement,\n // Possibly obsolete: an action to take when the user clicks a change page button.\n // Current plan is to just let BP add its own change page buttons.\n changePageAction: (next: boolean) => void,\n) {\n currentPage = page;\n adjustDraggablesForLanguage(page);\n currentChangePageAction = changePageAction;\n doShowAnswersInTargets(\n page.getAttribute(\"data-show-answers-in-targets\") === \"true\" ||\n page.getAttribute(\"data-show-target-as-shadow\") === \"true\",\n page,\n );\n // not sure we need this in BP, but definitely for when Bloom desktop goes to another tab.\n savePositions(page);\n\n // Set up event listeners for any change page buttons.\n const changePageButtons = Array.from(\n page.getElementsByClassName(\"bloom-change-page-button\"),\n );\n changePageButtons.forEach((b) =>\n b.addEventListener(\"click\", changePageButtonClicked),\n );\n\n // Hide image titles, which might give too much away, or distract.\n Array.from(document.getElementsByClassName(\"bloom-canvas\")).forEach(\n (container) => {\n (container as HTMLElement).title = \"\";\n },\n );\n Array.from(document.getElementsByClassName(\"bloom-imageContainer\")).forEach(\n (container) => {\n (container as HTMLElement).title = \"\";\n },\n );\n\n // By default, a shadow of any image can be dragged (e.g., to a paint program).\n // We want only dragging that is part of the game to be possible.\n Array.from(page.getElementsByTagName(\"img\")).forEach((img: HTMLElement) => {\n img.setAttribute(\"draggable\", \"false\");\n });\n\n // Record the positions of targets as snap locations and the original positions of draggables.\n // Add event listeners to draggables to start dragging.\n targetPositions = [];\n originalPositions = new Map<HTMLElement, { x: number; y: number }>();\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n const targets: HTMLElement[] = [];\n draggables.forEach((elt: HTMLElement) => {\n const targetId = elt.getAttribute(\"data-draggable-id\");\n const target = page.querySelector(\n `[data-target-of=\"${targetId}\"]`,\n ) as HTMLElement;\n if (target) {\n const x = target.offsetLeft;\n const y = target.offsetTop;\n targetPositions.push({\n x,\n y,\n width: target.offsetWidth,\n height: target.offsetHeight,\n });\n targets.push(target);\n }\n // if it has data-draggable-id, it should be draggable, just not needed\n // for the right answer.\n originalPositions.set(elt, { x: elt.offsetLeft, y: elt.offsetTop });\n // Allow pointermove events even on touch devices. See BL-14502.\n elt.style.touchAction = \"none\";\n elt.addEventListener(\"pointerdown\", startDrag, { capture: true });\n });\n\n const videos = Array.from(page.getElementsByTagName(\"video\"));\n videos.forEach((video) => {\n if (\n video\n .closest(kLegacyCanvasElementSelector)\n ?.hasAttribute(\"data-draggable-id\")\n ) {\n // don't want to show controls on these, because they are typically too small,\n // and the play time is short enough that just click-to-play is fine\n video.classList.add(\"bloom-ui-no-controls\");\n // non-draggable video click detectors are handled separately, see handleVideoClick in video.ts,\n // and in BloomDesktop handleVideoClick in bloomVideo.ts.\n video.addEventListener(\"pointerdown\", playVideo);\n }\n });\n\n // Add event listeners to (other) text items that should play audio when clicked.\n const dontPlayWhenClicked = draggables.concat(targets);\n const otherTextItems = Array.from(\n page.getElementsByClassName(\"bloom-visibility-code-on\"),\n ).filter((e) => {\n var top = e.closest(kLegacyCanvasElementSelector) as HTMLElement;\n if (!top) {\n // don't think this can happen with current game templates,\n // but if there's some other text on the page, may as well play when clicked\n // if it can.\n return true;\n }\n // draggables play as well as doing more complex things when clicked.\n // targets don't need to play.\n return dontPlayWhenClicked.indexOf(top) < 0;\n });\n otherTextItems.forEach((e) => {\n e.addEventListener(\"pointerdown\", playAudioOfTarget);\n });\n\n // Add event listeners to check, try again, and show correct buttons.\n const checkButtons = Array.from(\n page.getElementsByClassName(\"check-button\"),\n );\n const tryAgainButtons = Array.from(\n page.getElementsByClassName(\"try-again-button\"),\n );\n const showCorrectButtons = Array.from(\n page.getElementsByClassName(\"show-correct-button\"),\n );\n\n checkButtons.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", performCheck);\n });\n tryAgainButtons.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", performTryAgain);\n });\n showCorrectButtons.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", showCorrect);\n });\n\n const soundItems = Array.from(page.querySelectorAll(\"[data-sound]\"));\n soundItems.forEach((elt: HTMLElement) => {\n elt.addEventListener(\"click\", playSoundOf);\n });\n\n prepareOrderSentenceActivity(page);\n\n // Slider: // for drag-word-chooser-slider\n // setupWordChooserSlider(page);\n // setSlideablesVisibility(page, false);\n // // We may not want to immediately play the first word, because we may want to play some\n // // other stuff first. So we call this (before playInitialElements, so the word is given\n // // the bloom-activeTextBox class) but tell it not to play.\n // // The element with bloom-activeTextBox is put into the list of things that playInitialElements\n // // will play, after everything else that should happen initially.\n\n // showARandomWord(page, false);\n // setupSliderImageEvents(page);\n}\n\n// Break any order-sentence element into words and\n// randomize word order in sentence for reader to sort\nconst prepareOrderSentenceActivity = (page: HTMLElement) => {\n Array.from(page.getElementsByClassName(\"drag-item-order-sentence\")).forEach(\n (elt: HTMLElement) => {\n const contentElt = elt.getElementsByClassName(\n \"bloom-content1 bloom-visibility-code-on\",\n )[0] as HTMLElement;\n const content = contentElt?.textContent?.trim();\n if (!content) return;\n const words = content.split(\" \");\n const shuffledWords = shuffle(words);\n const container = page.ownerDocument.createElement(\"div\");\n container.classList.add(\"drag-item-random-sentence\");\n container.setAttribute(\"data-answer\", content);\n makeWordItems(page, shuffledWords, container, contentElt, true);\n container.style.left = elt.style.left;\n container.style.top = elt.style.top;\n container.style.width = elt.style.width;\n elt.parentElement?.insertBefore(container, elt);\n },\n );\n};\n\nconst playVideo = (e: MouseEvent) => {\n const video = e.currentTarget as HTMLVideoElement;\n video.play();\n};\n\n// Cleans up whatever prepareActivity() did, especially when switching to another tab.\n// May also be useful to do when switching pages in player. If not, we may want to move\n// this out of this runtime file; but it's nice to keep it with prepareActivity.\nexport function undoPrepareActivity(page: HTMLElement) {\n restorePositions();\n // In case we do more editing after leaving the Play tab, we don't want to restore the same positions again\n // if we leave the page completely.\n positionsToRestore = [];\n\n const changePageButtons = Array.from(\n page.getElementsByClassName(\"bloom-change-page-button\"),\n );\n changePageButtons.forEach((b) =>\n b.removeEventListener(\"click\", changePageButtonClicked),\n );\n\n Array.from(page.getElementsByClassName(\"bloom-visibility-code-on\")).forEach(\n (e) => {\n e.removeEventListener(\"pointerdown\", playAudioOfTarget);\n },\n );\n\n page.querySelectorAll(\"[data-draggable-id]\").forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"pointerdown\", startDrag, { capture: true });\n });\n\n Array.from(page.getElementsByTagName(\"img\")).forEach((img: HTMLElement) => {\n img.removeAttribute(\"draggable\");\n });\n\n const videos = Array.from(page.getElementsByTagName(\"video\"));\n videos.forEach((video) => {\n video.removeEventListener(\"pointerdown\", playVideo);\n video.classList.remove(\"bloom-ui-no-controls\");\n });\n const checkButtons = Array.from(\n page.getElementsByClassName(\"check-button\"),\n );\n const tryAgainButtons = Array.from(\n page.getElementsByClassName(\"try-again-button\"),\n );\n const showCorrectButtons = Array.from(\n page.getElementsByClassName(\"show-correct-button\"),\n );\n\n checkButtons.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", performCheck);\n });\n showCorrectButtons.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", showCorrect);\n });\n tryAgainButtons.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", performTryAgain);\n });\n\n // In Bloom Player, this will have been done by other play code, since data-sound is not\n // specific to games. But we're adding a listener for the same function, so it doesn't matter.\n // In Bloom desktop, we need this to make clicking data-sound elements work in Play mode.\n const soundItems = Array.from(page.querySelectorAll(\"[data-sound]\"));\n soundItems.forEach((elt: HTMLElement) => {\n elt.removeEventListener(\"click\", playSoundOf);\n });\n\n Array.from(\n page.getElementsByClassName(\"drag-item-random-sentence\"),\n ).forEach((elt: HTMLElement) => {\n elt.parentElement?.removeChild(elt);\n });\n const inPlayer = page.closest(\".swiper-slide\") !== null;\n doShowAnswersInTargets(!inPlayer, page);\n //Slider: setSlideablesVisibility(page, true);\n // Array.from(page.getElementsByTagName(\"img\")).forEach((img: HTMLElement) => {\n // img.removeEventListener(\"click\", clickSliderImage);\n // });\n}\n\nexport const playSoundOf = (e: MouseEvent) => {\n const elt = e.currentTarget as HTMLElement;\n const soundFile = elt.getAttribute(\"data-sound\");\n if (soundFile) {\n playSound(elt, soundFile);\n }\n // Not needed in Play tab, but in Bloom Player, the click would otherwise cause\n // a toggle between full screen and showing toolbars.\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst playAudioOfTarget = (e: PointerEvent) => {\n const target = e.currentTarget as HTMLElement;\n playAudioOf(target);\n};\n\nconst playAudioOf = (element: HTMLElement) => {\n const playables = getAudioSentencesOfVisibleEditables(element);\n playAllAudio(playables, element.closest(\".bloom-page\") as HTMLElement);\n};\n\nexport function getAudioSentencesOfVisibleEditables(\n element: HTMLElement,\n): HTMLElement[] {\n const possibleElements = getVisibleEditables(element);\n return getAudioSentences(possibleElements);\n}\n\nfunction makeWordItems(\n page: HTMLElement,\n words: string[],\n container: HTMLElement,\n // Something that has the right user-defined style class to apply to the words.\n // May be a bloom-content1 child of the original sentence, or a word item\n // previously created by this function.\n contentElt: HTMLElement,\n // Should the reader be able to drag the words? Not when we're using this\n // to show the correct answer.\n makeDraggable: boolean,\n) {\n const userStyle =\n Array.from(contentElt?.classList)?.find((c) => c.endsWith(\"-style\")) ??\n \"Normal-style\";\n // We need to set the lang attribute on the words to get the right default font. See BL-14885.\n const lang = contentElt?.getAttribute(\"lang\");\n words.forEach((word) => {\n const wordItem = page.ownerDocument.createElement(\"div\");\n wordItem.classList.add(\"drag-item-order-word\");\n wordItem.textContent = word;\n container.appendChild(wordItem);\n wordItem.classList.add(userStyle);\n if (lang) {\n wordItem.setAttribute(\"lang\", lang);\n }\n if (makeDraggable) {\n wordItem.addEventListener(\"pointerdown\", startDragWordInSentence);\n }\n });\n}\n\nfunction changePageButtonClicked(e: MouseEvent) {\n const next = (e.currentTarget as HTMLElement).classList.contains(\n \"bloom-next-page\",\n );\n currentChangePageAction?.(next);\n}\n\nexport function playInitialElements(page: HTMLElement, playVideos: boolean) {\n const initialFilter = (e) => {\n const ce = e.closest(kLegacyCanvasElementSelector) as HTMLElement;\n if (!ce) {\n // not a canvas element at all. Maybe not possible in a drag-activity, but just in case\n return false;\n }\n if (ce.classList.contains(\"draggable-text\")) {\n return false; // draggable items are played only when clicked\n }\n if (ce.hasAttribute(\"data-draggable-id\")) {\n return false; // another indication of a draggable item; in fact, the one above might be obsolete\n }\n if (ce.classList.contains(\"drag-item-order-sentence\")) {\n return false; // This would give away the answer\n }\n if (ce.classList.contains(\"bloom-wordChoice\")) {\n return false; // Only one of these should be played, after any instructions\n }\n // This might be redundant since they are not visible, but just in case\n if (\n ce.classList.contains(\"drag-item-correct\") ||\n ce.classList.contains(\"drag-item-wrong\")\n ) {\n return false; // These are only played after they become visible\n }\n return true;\n };\n const audioElements = getVisibleEditables(page).filter(initialFilter);\n\n //Slider: // This is used in drag-word-chooser-slider to mark the text item the user is currently\n // // finding a matching image for. In that activity, it should be played last (after\n // // the instructions.)\n // const activeTextBox = page.getElementsByClassName(\n // \"bloom-activeTextBox\"\n // )[0] as HTMLElement;\n // if (activeTextBox) {\n // audioElements.push(activeTextBox);\n // }\n const playables = getAudioSentences(audioElements);\n if (playVideos) {\n const videoElements = Array.from(\n page.getElementsByTagName(\"video\"),\n ).filter(initialFilter);\n playAllVideo(videoElements, () => playAllAudio(playables, page));\n } else {\n playAllAudio(playables, page);\n }\n}\n\n// Allows a client (currently BloomPlayer) to insert a function that will be called\n// when the user checks the correctness of a page. It should be called every time\n// they check, though currently only the first time on each page counts.\nlet reportScore: (possible: number, actual: number) => void = (\n possible,\n actual,\n) => {};\n\nexport function setReportScore(\n reportScoreFunction: (possible: number, actual: number) => void,\n) {\n reportScore = reportScoreFunction;\n}\n\nfunction getAudioSentences(editables: HTMLElement[]) {\n // Could be done more cleanly with flatMap or flat() but not ready to switch to es2019 yet.\n const result: HTMLElement[] = [];\n editables.forEach((e) => {\n if (e.classList.contains(kAudioSentence)) {\n result.push(e);\n }\n result.push(\n ...(Array.from(\n e.getElementsByClassName(kAudioSentence),\n ) as HTMLElement[]),\n );\n });\n return result;\n}\n\nfunction getVisibleEditables(container: HTMLElement) {\n // We want to play any audio we have from divs the user can see.\n // This is a crude test, but currently we always use display:none to hide unwanted languages.\n const result = Array.from(\n container.getElementsByClassName(\"bloom-editable\"),\n ).filter(\n (e) => window.getComputedStyle(e).display !== \"none\",\n ) as HTMLElement[];\n if (\n container.classList.contains(\"bloom-editable\") &&\n window.getComputedStyle(container).display !== \"none\"\n ) {\n result.push(container);\n }\n return result;\n}\n\nexport function shuffle<T>(\n array: T[],\n areItemsTheSame?: (a: T, b: T) => boolean,\n): T[] {\n // something Copilot came up with. Otherwise known as the Fisher–Yates Shuffle as discussed\n // at https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array.\n // Getting the output to always be visibly different when input items can visually be the same (as for\n // letters in a word that are repeated) adds complications before and after the guts of the computation.\n // See BL-14446.\n\n // simplify code below by providing a default function\n if (!areItemsTheSame)\n areItemsTheSame = (a: T, b: T) => {\n return a === b;\n };\n let allItemsAreTheSame = true;\n for (let i = 1; i < array.length; ++i) {\n if (!areItemsTheSame(array[0], array[i])) {\n allItemsAreTheSame = false;\n break;\n }\n }\n if (allItemsAreTheSame) return array; // shuffling not needed, wouldn't work anyway\n\n const originalArray = array.slice();\n let bestChanges = 0;\n let bestResult = originalArray;\n let loopCount = 0;\n // Note that each time through the loop uses the output of the previous iteration\n // as its input.\n while (loopCount++ < 10) {\n // BEGIN Fisher-Yates shuffle\n let currentIndex = array.length,\n randomIndex;\n while (0 !== currentIndex) {\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n [array[currentIndex], array[randomIndex]] = [\n array[randomIndex],\n array[currentIndex],\n ];\n }\n // END Fisher-Yates shuffle\n\n // Check whether the shuffling has had an actual visible effect.\n // Save the array with the largest number of changes while the\n // loop is processing.\n let changes = 0;\n for (let i = 0; i < array.length; ++i) {\n if (!areItemsTheSame(array[i], originalArray[i])) ++changes;\n }\n if (changes === array.length) return array; // It can't get better on this simplistic measure.\n if (changes > bestChanges) {\n bestChanges = changes;\n bestResult = array.slice();\n }\n }\n // callers may depend on the array being modified in place.\n for (let i = 0; i < array.length; ++i) array[i] = bestResult[i];\n return array;\n}\n\n// This method can be passed to shuffle to test letters embedded in draggable HTML elements.\nexport function isTheTextInDraggablesTheSame(\n a: HTMLElement,\n b: HTMLElement,\n): boolean {\n return a.innerText.trim() === b.innerText.trim();\n}\n\n// Put the page into the mode that shows the correct answers.\nconst showCorrect = (e: MouseEvent) => {\n if (!currentPage) {\n return; // huh?? but makes TS happy\n }\n restorePositions(); // any distractors return to start positions.\n currentPage\n .querySelectorAll(\"[data-draggable-id]\")\n .forEach((elt: HTMLElement) => {\n const targetId = elt.getAttribute(\"data-draggable-id\");\n const target = currentPage?.querySelector(\n `[data-target-of=\"${targetId}\"]`,\n ) as HTMLElement;\n if (!target) {\n return; // this one is not required to be in a right place\n }\n // IF the element has not been moved to a target, elt is showing up here with\n // an offsetWidth of 0 and an offsetHeight of 0 because the element has been\n // made invisible by the check answer response. So we'll fall back to getting\n // the width and height from the style attribute. See BL-14600\n let eltWidth = elt.offsetWidth;\n if (!eltWidth) {\n const w = elt.style.width.replace(\"px\", \"\");\n eltWidth = Number.parseInt(w, 10);\n }\n let eltHeight = elt.offsetHeight;\n if (!eltHeight) {\n const h = elt.style.height.replace(\"px\", \"\");\n eltHeight = Number.parseInt(h, 10);\n }\n const x = target.offsetLeft + (target.offsetWidth - eltWidth) / 2;\n const y = target.offsetTop + (target.offsetHeight - eltHeight) / 2;\n elt.style.left = x + \"px\";\n elt.style.top = y + \"px\";\n });\n Array.from(\n currentPage.getElementsByClassName(\"drag-item-random-sentence\"),\n ).forEach((container: HTMLElement) => {\n const correctAnswer =\n container.getAttribute(\"data-answer\")?.split(\" \") ?? [];\n const userStyleSource = container.children[0] as HTMLElement; // before we wipe them!\n container.innerHTML = \"\";\n makeWordItems(\n currentPage!,\n correctAnswer,\n container,\n userStyleSource,\n false,\n );\n });\n classSetter(currentPage!, \"drag-activity-wrong\", false);\n classSetter(currentPage!, \"drag-activity-solution\", true);\n};\n\n// where the mouse started the drag, relative to the top left of dragTarget\nlet dragStartX = 0;\nlet dragStartY = 0;\nlet dragTarget: HTMLElement;\nlet snapped = false;\n\n// Bloom desktop has a function getScale, but we do NOT want to use that here\n// because it is not available in Bloom Reader and we don't want to add a dependency.\n// So we define our own.\nconst getScale = (page: HTMLElement) =>\n page.getBoundingClientRect().width / page.offsetWidth;\n\nconst startDrag = (e: PointerEvent) => {\n if (e.button !== 0) return; // only left button\n if (e.ctrlKey) return; // ignore ctrl+click\n e.preventDefault(); // e.g., don't do default drag of child image\n const target = e.currentTarget as HTMLElement;\n dragTarget = target;\n const page = target.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n // get the mouse cursor position at startup relative to the top left.\n dragStartX = e.clientX / scale - target.offsetLeft;\n dragStartY = e.clientY / scale - target.offsetTop;\n target.setPointerCapture(e.pointerId);\n target.addEventListener(\"pointerup\", stopDrag);\n target.addEventListener(\"pointermove\", elementDrag);\n playAudioOf(target);\n target.classList.add(\"bloom-ui-dragging\");\n dragTarget.classList.remove(\"bloom-draggedToTarget\");\n};\n\nconst elementDrag = (e: PointerEvent) => {\n const page = dragTarget.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n e.preventDefault();\n let x = e.clientX / scale - dragStartX;\n let y = e.clientY / scale - dragStartY;\n let deltaMin = Number.MAX_VALUE;\n snapped = false;\n let xBest = x;\n let yBest = y;\n for (const slot of targetPositions) {\n const offsetX = (slot.width - dragTarget.offsetWidth) / 2;\n const offsetY = (slot.height - dragTarget.offsetHeight) / 2;\n // if this target were centered in this slot, it would be at slot.x + offsetX, slot.y + offsetY\n const deltaX = slot.x + offsetX - x;\n const deltaY = slot.y + offsetY - y;\n const delta = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n if (delta < deltaMin) {\n deltaMin = delta;\n xBest = slot.x + offsetX;\n yBest = slot.y + offsetY;\n }\n }\n if (deltaMin < 50) {\n // review: how close do we want?\n x = xBest;\n y = yBest;\n snapped = true;\n }\n dragTarget.style.top = y + \"px\";\n dragTarget.style.left = x + \"px\";\n};\n\nconst stopDrag = (e: PointerEvent) => {\n // If they let go at a place that isn't a snap position at all, put it back where it was.\n if (!snapped) {\n const oldPosition = originalPositions.get(dragTarget);\n dragTarget.style.top = oldPosition?.y + \"px\";\n dragTarget.style.left = oldPosition?.x + \"px\";\n dragTarget.classList.remove(\"bloom-draggedToTarget\");\n } else {\n dragTarget.classList.add(\"bloom-draggedToTarget\");\n }\n dragTarget.classList.remove(\"bloom-ui-dragging\");\n dragTarget.removeEventListener(\"pointerup\", stopDrag);\n dragTarget.removeEventListener(\"pointermove\", elementDrag);\n\n // If there was already a draggable in that slot, move the one we are replacing\n // back to its original position.\n // Enhance: animate?\n const page = dragTarget.closest(\".bloom-page\") as HTMLElement;\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n draggables.forEach((elt: HTMLElement) => {\n if (elt === dragTarget) {\n return;\n }\n if (rightPosition(elt, dragTarget)) {\n const originalPosition = originalPositions.get(elt);\n if (originalPosition) {\n elt.style.left = originalPosition.x + \"px\";\n elt.style.top = originalPosition.y + \"px\";\n elt.classList.remove(\"bloom-draggedToTarget\");\n }\n }\n });\n};\n\nconst getVisibleText = (elt: HTMLElement): string => {\n const visibleDivs = getVisibleEditables(elt);\n return Array.from(visibleDivs)\n .map((elt: HTMLElement) => elt.textContent)\n .join(\" \");\n};\n\nconst rightPosition = (draggableToCheck: HTMLElement, target: HTMLElement) => {\n // Note: in some cases, some of the draggables and their targets are hidden (e.g.,\n // the word spelling game keeps letter draggables that are not needed for the\n // current word in case they are needed in another language.)\n // These automatically register as correct, because offsetLeft and offsetTop return zero\n // for display:none elements, so the position we get for the draggable and the target are\n // both (0,0). This is what we want, since the user can't be faulted for not dragging\n // invisible elements to the right place.\n const actualX = draggableToCheck.offsetLeft;\n const actualY = draggableToCheck.offsetTop;\n const correctX =\n target.offsetLeft +\n (target.offsetWidth - draggableToCheck.offsetWidth) / 2;\n const correctY =\n target.offsetTop +\n (target.offsetHeight - draggableToCheck.offsetHeight) / 2;\n return (\n // At least a half-pixel error can occur just from centering the draggable in the target.\n Math.abs(correctX - actualX) < 0.6 && Math.abs(correctY - actualY) < 0.6\n );\n};\n\nexport const performCheck = (e: MouseEvent) => {\n const target = e.currentTarget as HTMLElement;\n const page = target.closest(\".bloom-page\") as HTMLElement;\n const allCorrect = checkDraggables(page) && checkRandomSentences(page);\n\n showCorrectOrWrongItems(page, allCorrect);\n // Enhance: plausibly we could count the targets and report the total\n // number and the number that contain the right draggable, but it's more\n // consistent with older games to just report success or failure.\n reportScore(1, allCorrect ? 1 : 0);\n\n return allCorrect;\n};\n\nexport const performTryAgain = (e: MouseEvent) => {\n const target = e.currentTarget as HTMLElement;\n const page = target.closest(\".bloom-page\") as HTMLElement;\n classSetter(page, \"drag-activity-correct\", false);\n classSetter(page, \"drag-activity-wrong\", false);\n //currently I don't think it could be set here, but make sure.\n classSetter(page, \"drag-activity-solution\", false);\n // Restore everything to the starting positions. BL-14482.\n restorePositions();\n};\n\nexport const classSetter = (\n page: HTMLElement,\n className: string,\n wanted: boolean,\n) => {\n if (wanted) {\n page.parentElement?.classList.add(className);\n } else {\n page.parentElement?.classList.remove(className);\n }\n};\n\nlet draggableReposition: HTMLElement;\nlet wordBeingRepositioned: HTMLElement;\n\n// The default sounds have to be found in different ways depending on whether we are running\n// in Bloom desktop or Bloom Player. Conditional code is particularly tricky because bloom-player\n// imports these sounds using a vite trick that results in a URL with a hash in it that changes\n// each version. The simplest thing is for this code to just have a way the host can initialize\n// what it wants.\nlet defaultCorrectSoundUrl: string | undefined;\nlet defaultWrongSoundUrl: string | undefined;\n\nexport function setDefaultSoundUrls(\n correctSoundUrl: string | undefined,\n wrongSoundUrl: string | undefined,\n) {\n defaultCorrectSoundUrl = correctSoundUrl;\n defaultWrongSoundUrl = wrongSoundUrl;\n}\n\nfunction showCorrectOrWrongItems(page: HTMLElement, correct: boolean) {\n classSetter(page, \"drag-activity-correct\", correct);\n classSetter(page, \"drag-activity-wrong\", !correct);\n\n // play sound\n let soundFile = page.getAttribute(\n correct ? \"data-correct-sound\" : \"data-wrong-sound\",\n );\n const playOtherStuff = () => {\n const elementsMadeVisible = Array.from(\n page.getElementsByClassName(\n correct ? \"drag-item-correct\" : \"drag-item-wrong\",\n ),\n ) as HTMLElement[];\n const possibleNarrationElements: HTMLElement[] = [];\n const videoElements: HTMLVideoElement[] = [];\n elementsMadeVisible.forEach((e) => {\n possibleNarrationElements.push(...getVisibleEditables(e));\n videoElements.push(...Array.from(e.getElementsByTagName(\"video\")));\n });\n const playables = getAudioSentences(possibleNarrationElements);\n playAllVideo(videoElements, () => playAllAudio(playables, page));\n };\n // if the attribute is not there at all, use the default sound, if one has been set.\n // This is not in relative to the audio folder in the book, so we won't add a prefix\n // in that case.\n const addPrefix = soundFile !== null;\n if (soundFile === null) {\n soundFile = correct ? defaultCorrectSoundUrl : defaultWrongSoundUrl;\n } else if (soundFile === \"none\") {\n // explicity no sound, go straight to other stuff if any\n soundFile = undefined;\n }\n if (soundFile) {\n playSound(page, soundFile, addPrefix);\n } else {\n playOtherStuff();\n }\n}\n\nfunction playSound(someElt: HTMLElement, soundFile: string, addPrefix = true) {\n const audio = new Audio(\n (addPrefix ? urlPrefix() + \"/audio/\" : \"\") + soundFile,\n );\n if (IsRunningOnBloomDesktop(someElt)) {\n audio.classList.add(\"bloom-ui\"); // in case remove code fails, should make sure it doesn't get saved.\n }\n audio.style.visibility = \"hidden\";\n // To my surprise, in BP storybook it works without adding the audio to any document.\n // But in Bloom proper, it does not. I think it is because this code is part of the toolbox,\n // so the audio element doesn't have the right context to interpret the relative URL.\n someElt.append(audio);\n audio.play();\n // It feels cleaner if we remove it when done. This could fail, e.g., if the user\n // switches tabs or pages before we get done playing. Removing it immediately\n // prevents the sound being played. It's not a big deal if it doesn't get removed.\n audio.addEventListener(\n \"ended\",\n () => {\n someElt.removeChild(audio);\n },\n { once: true },\n );\n}\n\nfunction checkDraggables(page: HTMLElement) {\n let allCorrect = true;\n const draggables = Array.from(page.querySelectorAll(\"[data-draggable-id]\"));\n draggables.forEach((draggableToCheck: HTMLElement) => {\n const targetId = draggableToCheck.getAttribute(\"data-draggable-id\");\n const target = page.querySelector(\n `[data-target-of=\"${targetId}\"]`,\n ) as HTMLElement;\n if (!target) {\n // this one is not required to be in a right place.\n // Possibly we might one day need to check that it has NOT been dragged to a target.\n // But for now, we only allow one draggable per target, so if this has been wrongly\n // used some other one will not be in the right place.\n return;\n }\n\n if (!rightPosition(draggableToCheck, target)) {\n // It's not in the expected place. But perhaps one with the same text is?\n // This only applies if it's a text item.\n // (don't use getElementsByClassName here...there could be a TG on an image description of\n // a picture. To be a text item it must have a direct child that is a TG.)\n if (\n !Array.from(draggableToCheck.children).some((x) =>\n x.classList.contains(\"bloom-translationGroup\"),\n )\n ) {\n // not a text item. Two images or videos with the same (empty) text are not equivalent.\n allCorrect = false;\n return;\n }\n const visibleText = getVisibleText(draggableToCheck);\n if (\n !draggables.some((otherDraggable: HTMLElement) => {\n if (otherDraggable === draggableToCheck) {\n return false; // already know this draggable is not at the right place\n }\n if (getVisibleText(otherDraggable) !== visibleText) {\n return false; // only interested in ones with the same text\n }\n return rightPosition(otherDraggable, target);\n })\n ) {\n allCorrect = false;\n }\n }\n });\n return allCorrect;\n}\n\nlet placeHolder: HTMLElement | undefined;\nlet startWidth = 0;\nconst draggableWordMargin = 5; // enhance: compute from element\n\nfunction startDragWordInSentence(e: PointerEvent) {\n if (e.button !== 0) return; // only left button\n if (e.ctrlKey) return; // ignore ctrl+click\n\n // get the pointer position etc. at startup:\n wordBeingRepositioned = e.currentTarget as HTMLElement;\n startWidth = wordBeingRepositioned.offsetWidth; // includes original padding but not margin\n const page = wordBeingRepositioned.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n dragStartX = e.clientX / scale - wordBeingRepositioned.offsetLeft;\n dragStartY = e.clientY / scale - wordBeingRepositioned.offsetTop;\n\n // Leave the original where it was and make a copy to drag around.\n draggableReposition =\n wordBeingRepositioned.ownerDocument.createElement(\"div\");\n wordBeingRepositioned.classList.forEach((c) =>\n draggableReposition.classList.add(c),\n );\n //draggableReposition.classList.add(\"drag-item-order-word\");\n draggableReposition.textContent = wordBeingRepositioned.textContent;\n draggableReposition.style.position = \"absolute\";\n draggableReposition.style.left = wordBeingRepositioned.offsetLeft + \"px\";\n draggableReposition.style.top = wordBeingRepositioned.offsetTop + \"px\";\n draggableReposition.setAttribute(\n \"lang\",\n wordBeingRepositioned.getAttribute(\"lang\")!,\n );\n // We don't want it to show while we're dragging the clone. We need something to take up the space,\n // though, until we decide it has moved. We could mess with its own properties, but then we have\n // to put everything back. Also, we want to move it in the paragraph, and if we move the thing\n // itself, we seem to lose our mouse capture. So we make a placeholder to take up the space.\n placeHolder = makeAnimationPlaceholder(wordBeingRepositioned);\n // don't add padding here, target still has it. Capture this before we hide it.\n placeHolder.style.width = startWidth + draggableWordMargin + \"px\";\n wordBeingRepositioned.parentElement?.insertBefore(\n placeHolder,\n wordBeingRepositioned,\n );\n wordBeingRepositioned.style.display = \"none\";\n\n // It's bizarre to put the listeners and pointer capture on the target, which is NOT being dragged,\n // rather than the draggableReposition, which is. But it doesn't work to setPointerCapture on\n // the draggableReposition. I think it's because the draggableReposition is not the object clicked.\n // And once the mouse events are captured by the target, all mouse events go to that, so we get\n // them properly while dragging, and can use them to move the draggableReposition.\n wordBeingRepositioned.setPointerCapture(e.pointerId);\n wordBeingRepositioned.addEventListener(\"pointerup\", stopDragWordInSentence);\n wordBeingRepositioned.addEventListener(\"pointermove\", dragWordInSentence);\n // not sure we need this.\n // recommended by https://www.redblobgames.com/making-of/draggable/ to prevent touch movement\n // dragging the page behind the draggable element.\n wordBeingRepositioned.addEventListener(\"touchstart\", preventTouchDefault);\n wordBeingRepositioned.parentElement?.appendChild(draggableReposition);\n}\n\nconst preventTouchDefault = (e: TouchEvent) => {\n e.preventDefault();\n};\n\nlet lastItemDraggedOver: HTMLElement | undefined;\n\nconst dragWordInSentence = (e: PointerEvent) => {\n const page = draggableReposition.closest(\".bloom-page\") as HTMLElement;\n const scale = getScale(page);\n e.preventDefault();\n const x = e.clientX / scale - dragStartX;\n const y = e.clientY / scale - dragStartY;\n\n draggableReposition.style.top = y + \"px\";\n draggableReposition.style.left = x + \"px\";\n\n if (animationInProgress) {\n return;\n }\n const container = wordBeingRepositioned.parentElement!;\n const itemDraggedOver = Array.from(container.children).find((c) => {\n const rect = c.getBoundingClientRect();\n return (\n c !== wordBeingRepositioned &&\n c !== placeHolder &&\n c !== draggableReposition &&\n e.clientX > rect.left &&\n e.clientX < rect.right &&\n e.clientY > rect.top &&\n e.clientY < rect.bottom\n );\n });\n\n // If we don't check for a different item, then when we drag a short word over a long one, the mouse\n // may still be over the long word when the animation finishes, at which point it unhelpfully moves\n // back.\n if (itemDraggedOver && itemDraggedOver !== lastItemDraggedOver) {\n const children = Array.from(container.children);\n if (\n children.indexOf(itemDraggedOver) > children.indexOf(placeHolder!)\n ) {\n // moving right; it wants to go after the thing we dragged onto.\n // (It's OK if nextSibling is null; gets inserted at end, which is what we want.)\n animateMove(() => {\n container.insertBefore(\n placeHolder!,\n itemDraggedOver.nextSibling,\n );\n });\n } else {\n // moving left; it wants to go before the thing we dragged onto.\n animateMove(() => {\n container.insertBefore(placeHolder!, itemDraggedOver);\n });\n }\n } else {\n // moved outside the sentence altogether. If we're below or to the right of the last item,\n // move to the end. Enhance: should we move to the front if we're above or to the left?\n const relatedItems = Array.from(\n wordBeingRepositioned.parentElement!.getElementsByClassName(\n \"drag-item-order-word\",\n ),\n ).filter(\n (x) =>\n x !== wordBeingRepositioned &&\n x !== placeHolder &&\n x !== draggableReposition,\n ) as HTMLElement[];\n const lastItem = relatedItems[relatedItems.length - 1];\n const bounds = lastItem.getBoundingClientRect();\n if (\n e.clientY > bounds.bottom ||\n (e.clientX > bounds.right && e.clientY > bounds.top)\n ) {\n animateMove(() => {\n container.appendChild(placeHolder!);\n });\n }\n }\n lastItemDraggedOver = itemDraggedOver as HTMLElement;\n};\n\nconst stopDragWordInSentence = (e: PointerEvent) => {\n e.preventDefault();\n wordBeingRepositioned.style.visibility = \"visible\";\n wordBeingRepositioned.removeEventListener(\n \"pointerup\",\n stopDragWordInSentence,\n );\n wordBeingRepositioned.removeEventListener(\n \"pointermove\",\n dragWordInSentence,\n );\n wordBeingRepositioned.releasePointerCapture(e.pointerId); // redundant I think\n wordBeingRepositioned.removeEventListener(\n \"touchstart\",\n preventTouchDefault,\n );\n // We're getting rid of this, so we don't need to remove the event handlers it has.\n draggableReposition.parentElement?.removeChild(draggableReposition);\n\n wordBeingRepositioned.parentElement?.insertBefore(\n wordBeingRepositioned,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n placeHolder!,\n );\n wordBeingRepositioned.parentElement?.removeChild(placeHolder!);\n placeHolder = undefined;\n wordBeingRepositioned.style.display = \"\"; // show it again\n};\n\nfunction makeAnimationPlaceholder(itemBeingRepositioned: HTMLElement) {\n const placeholder = itemBeingRepositioned.cloneNode(true) as HTMLElement;\n placeholder.style.overflowX = \"hidden\";\n placeholder.style.marginRight = \"0\"; // clear all these so it can shrink to taking up no space at all.\n placeholder.style.paddingLeft = \"0\";\n placeholder.style.paddingRight = \"0\";\n placeholder.style.display = \"\"; // in case it was display:none\n placeholder.style.visibility = \"hidden\"; //just takes up space for animation\n return placeholder;\n}\n\nlet animationInProgress = false;\n\nfunction animateMove(movePlaceholder: () => void) {\n animationInProgress = true;\n const duration = 200;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const container = wordBeingRepositioned.parentElement!;\n const duplicate = makeAnimationPlaceholder(wordBeingRepositioned);\n container.insertBefore(duplicate, placeHolder!);\n movePlaceholder();\n const start = Date.now();\n\n const step = () => {\n const elapsed = Date.now() - start;\n const fraction = Math.min(elapsed / duration, 1);\n // This width includes the original padding and margin, so that it takes up the original space\n // to begin with, but can drop to zero.\n const originalWordWidth = startWidth + draggableWordMargin;\n if (!placeHolder) {\n // terminated by mouseUp\n container.removeChild(duplicate);\n animationInProgress = false;\n return;\n }\n placeHolder.style.width = originalWordWidth * fraction + \"px\";\n duplicate.style.width = originalWordWidth * (1 - fraction) + \"px\";\n if (fraction < 1) {\n requestAnimationFrame(step);\n } else {\n // animation is over, clean up.\n container.removeChild(duplicate);\n placeHolder.style.width = originalWordWidth + \"px\"; // previous step might not have reached full size\n animationInProgress = false;\n }\n };\n requestAnimationFrame(step);\n}\nfunction checkRandomSentences(page: HTMLElement) {\n const sentences = page.getElementsByClassName(\"drag-item-random-sentence\");\n for (let i = 0; i < sentences.length; i++) {\n const sentence = sentences[i];\n // We check the expected text rather than the expected order of the child\n // elements, because it automatically handles the possibility of repeated words.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const correctAnswerWords = sentence\n .getAttribute(\"data-answer\")!\n .split(\" \");\n const actualWordElements = Array.from(sentence.children);\n for (let j = 0; j < actualWordElements.length; j++) {\n const item = actualWordElements[j];\n if (item.textContent !== correctAnswerWords[j]) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport const doShowAnswersInTargets = (showNow: boolean, page: HTMLElement) => {\n // Restrict the search to the current page, so that we don't accidentally find a target on another page.\n // This is important because the targetId is not necessarily unique across pages if users use the default\n // draggables that come with the page.\n const draggables = page.querySelectorAll(\":scope [data-draggable-id]\");\n if (showNow) {\n draggables.forEach((draggable) => {\n copyContentToTarget(draggable as HTMLElement);\n });\n } else {\n draggables.forEach((draggable) => {\n removeContentFromTarget(draggable as HTMLElement);\n });\n }\n};\n\nexport function copyContentToTarget(draggable: HTMLElement) {\n const target = getTarget(draggable);\n if (!target) {\n return;\n }\n // We want to copy the content of the draggable, with several exceptions.\n // To reduce flicker, we do the manipulations on a temporary element, and\n // only copy into the actual target if there is actually a change.\n // (Flicker is particularly likely with changes that don't affect the\n // target, like adding and removing the image editing buttons.)\n let throwAway = target.ownerDocument.createElement(\"div\");\n throwAway.innerHTML = draggable.innerHTML;\n\n // Don't need the bubble controls\n Array.from(throwAway.getElementsByClassName(\"bloom-ui\")).forEach((e) => {\n e.remove();\n });\n // Nor the image editing controls.\n Array.from(throwAway.getElementsByClassName(\"imageOverlayButton\")).forEach(\n (e) => {\n e.remove();\n },\n );\n Array.from(throwAway.getElementsByClassName(\"imageButton\")).forEach((e) => {\n e.remove();\n });\n // Bloom has integrity checks for duplicate ids, and we don't need them in the duplicate content.\n Array.from(throwAway.querySelectorAll(\"[id]\")).forEach((e) => {\n e.removeAttribute(\"id\");\n });\n Array.from(throwAway.getElementsByClassName(\"hoverUp\")).forEach((e) => {\n // Produces at least a change in background color that we don't want.\n e.classList.remove(\"hoverUp\");\n });\n // Content is not editable inside the target.\n Array.from(throwAway.querySelectorAll(\"[contenteditable]\")).forEach((e) => {\n e.removeAttribute(\"contenteditable\");\n });\n // Content is not recordable inside the target.\n Array.from(throwAway.getElementsByClassName(\"ui-audioCurrent\")).forEach(\n (e) => {\n e.classList.remove(\"ui-audioCurrent\");\n },\n );\n // Nor should we able to tab to it, or focus it.\n Array.from(throwAway.querySelectorAll(\"[tabindex]\")).forEach((e) => {\n e.removeAttribute(\"tabindex\");\n });\n let imageContainer = throwAway.getElementsByClassName(\n \"bloom-canvas\",\n )[0] as HTMLElement;\n if (!imageContainer)\n imageContainer = throwAway.getElementsByClassName(\n \"bloom-imageContainer\",\n )[0] as HTMLElement;\n if (imageContainer) {\n // We need another layer to manage clipping and centering. The one we were going to\n // throw away becomes the wrapper, and we add a new throwAway outside it\n const wrapper = throwAway;\n throwAway = target.ownerDocument.createElement(\"div\");\n throwAway.appendChild(wrapper);\n wrapper.classList.add(\"bloom-targetWrapper\");\n // We need the image container size to match the draggable size so that we get the\n // same cropping.\n imageContainer.style.width = draggable.style.width;\n imageContainer.style.height = draggable.style.height;\n // The swiper lazy loading code converts the data-background attribute to the style\n // attribute's backgroundImage property for the draggable element. If this hasn't\n // happened yet, we need to adjust the target to match what the draggable will become.\n let background = imageContainer.getAttribute(\"data-background\");\n if (background && !imageContainer.style.backgroundImage) {\n // See BL-15007 and https://www.w3schools.com/jsref/prop_style_backgroundimage.asp\n if (!background.startsWith(\"url(\"))\n background = \"url(\" + background + \")\";\n imageContainer.style.backgroundImage = background;\n imageContainer.removeAttribute(\"data-background\");\n }\n }\n if (target.innerHTML !== throwAway.innerHTML) {\n target.innerHTML = throwAway.innerHTML;\n }\n}\n\nexport const getTarget = (draggable: HTMLElement): HTMLElement | undefined => {\n const targetId = draggable.getAttribute(\"data-draggable-id\");\n if (!targetId) {\n return undefined;\n }\n // Restrict the search to the current page, so that we don't accidentally find a target on another page.\n // This is important because the targetId is not necessarily unique across pages if users use the default\n // draggables that come with the page.\n return draggable\n .closest(\".bloom-page\")\n .querySelector(`[data-target-of=\"${targetId}\"]`) as HTMLElement;\n};\n\nfunction removeContentFromTarget(draggable: HTMLElement) {\n const target = getTarget(draggable);\n if (target) {\n target.innerHTML = \"\";\n }\n}\n\nexport let draggingSlider = false;\n\n// Setup that is common to Play and design time\nexport function setupWordChooserSlider(page: HTMLElement) {\n //Slider: const wrapper = page.getElementsByClassName(\n // \"bloom-activity-slider\"\n // )[0] as HTMLElement;\n // if (!wrapper) {\n // return; // panic?\n // }\n // wrapper.innerHTML = \"\"; // clear out any existing content.\n // const slider = page.ownerDocument.createElement(\"div\");\n // slider.classList.add(\"bloom-activity-slider-content\");\n // slider.style.left = 0 + \"px\";\n // wrapper.appendChild(slider);\n // dragStartX = 0;\n // const scale = getScale(page);\n // // Review: maybe we should use some sort of fancier slider? This one, for example,\n // // won't have fancy effects like continuing to slide if you flick it.\n // // But it's also possible this is good enough. Not really expecting a lot more items\n // // than will fit.\n // const moveHandler = (e: PointerEvent) => {\n // let x = e.clientX / scale - dragStartX;\n // if (Math.abs(x) > 4) {\n // draggingSlider = true;\n // }\n // if (x > 0) {\n // x = 0;\n // }\n // const maxScroll = Math.max(slider.offsetWidth - wrapper.offsetWidth, 0);\n // if (x < -maxScroll) {\n // x = -maxScroll;\n // }\n // slider.style.left = x + \"px\";\n // };\n // const upHandler = (e: PointerEvent) => {\n // slider.removeEventListener(\"pointermove\", moveHandler);\n // page.ownerDocument.body.removeEventListener(\"pointerup\", upHandler);\n // setTimeout(() => {\n // draggingSlider = false;\n // }, 50);\n // };\n // slider.addEventListener(\"pointerdown\", e => {\n // if (e.button !== 0) return; // only left button\n // if (e.ctrlKey) return; // ignore ctrl+click\n // dragStartX = e.clientX / scale - slider.offsetLeft;\n // slider.addEventListener(\"pointermove\", moveHandler);\n // // We'd like to capture the pointer, and then we could put the up handler on the slider.\n // // But then a click on an image inside the slider never gets the mouse up event, so never\n // // gets a click. So we put the up handler on the body (so that it will get called even if\n // // the up happens outside the slider).\n // //slider.setPointerCapture(e.pointerId);\n // page.ownerDocument.body.addEventListener(\"pointerup\", upHandler);\n // });\n // const imagesToPlace = shuffle(\n // Array.from(page.querySelectorAll(\"[data-img-txt]\"))\n // );\n // imagesToPlace.forEach((imgTop: HTMLElement) => {\n // const img = imgTop.getElementsByTagName(\"img\")[0];\n // let sliderImgSrc = \"\";\n // if (img) {\n // // An older comment said:\n // // Not just img.src: that yields a full URL, which will show the image, but will not match\n // // when we are later trying to find the corresponding original image.\n // // I'm not finding anything that works that way, and the code below finds a full URL\n // sliderImgSrc = img.getAttribute(\"src\")!;\n // } else {\n // WOULD THIS NEED ADJUSTING FOR .bloom-canvas IF THIS CODE WERE RESURRECTED?\n // // In bloom-player, for a forgotten and possibly obsolete reason, we use a background image\n // // on the container. (I vaguely recall it may be important when animating the main image.)\n // const imgContainer = imgTop.getElementsByClassName(\n // \"bloom-imageContainer\"\n // )[0] as HTMLElement;\n // if (!imgContainer) {\n // return; // weird\n // }\n // const bgImg = imgContainer.style.backgroundImage;\n // if (!bgImg) {\n // return; // weird\n // }\n // const start = bgImg.indexOf('\"');\n // const end = bgImg.lastIndexOf('\"');\n // sliderImgSrc = bgImg.substring(start + 1, end);\n // }\n // // not using cloneNode here because I don't want to bring along any alt text that might provide a clue\n // const sliderImg = imgTop.ownerDocument.createElement(\"img\");\n // sliderImg.src = sliderImgSrc;\n // sliderImg.ondragstart = () => false;\n // sliderImg.setAttribute(\n // \"data-img\",\n // imgTop.getAttribute(\"data-img-txt\")!\n // );\n // const sliderItem = imgTop.ownerDocument.createElement(\"div\");\n // sliderItem.classList.add(\"bloom-activity-slider-item\");\n // sliderItem.appendChild(sliderImg);\n // slider.appendChild(sliderItem);\n // });\n // if (slider.offsetWidth > wrapper.offsetWidth) {\n // // We need a slider effect. We want one of the images to be partly visible as a clue that\n // // sliding is possible.\n // const avWidth = slider.offsetWidth / imagesToPlace.length;\n // let indexNearBorder = Math.floor(wrapper.offsetWidth / avWidth);\n // let sliderItem = slider.children[indexNearBorder] as HTMLElement;\n // if (sliderItem.offsetLeft > wrapper.offsetWidth - 30) {\n // // The item we initially selected is mostly off the right edge.\n // // Stretch things to make the previous item half-off-screen.\n // indexNearBorder--;\n // sliderItem = slider.children[indexNearBorder] as HTMLElement;\n // }\n // if (\n // sliderItem.offsetLeft + sliderItem.offsetWidth <\n // wrapper.offsetWidth + 30\n // ) {\n // const oldMarginPx =\n // sliderItem.ownerDocument.defaultView?.getComputedStyle(\n // sliderItem\n // ).marginLeft ?? \"22px\";\n // const oldMargin = parseInt(\n // oldMarginPx.substring(0, oldMarginPx.length - 2)\n // );\n // const desiredLeft =\n // wrapper.offsetWidth - sliderItem.offsetWidth / 2;\n // const newMargin =\n // oldMargin +\n // (desiredLeft - sliderItem.offsetLeft) / indexNearBorder / 2;\n // Array.from(slider.children).forEach((elt: HTMLElement) => {\n // elt.style.marginLeft = newMargin + \"px\";\n // elt.style.marginRight = newMargin + \"px\";\n // });\n // }\n // }\n}\n\n//Slider: const clickSliderImage = (e: MouseEvent) => {\n// if (draggingSlider) {\n// return;\n// }\n// const img = e.currentTarget as HTMLElement;\n// const page = img.closest(\".bloom-page\") as HTMLElement;\n// const activeTextBox = page.getElementsByClassName(\"bloom-activeTextBox\")[0];\n// if (!activeTextBox) {\n// return; // weird\n// }\n// var activeId = activeTextBox.getAttribute(\"data-txt-img\");\n// const imgId = img.getAttribute(\"data-img\");\n// if (activeId === imgId) {\n// const imgTop = page.querySelector(`[data-img-txt=\"${imgId}\"]`);\n// if (!imgTop) {\n// return; // weird\n// }\n// imgTop.classList.remove(\"bloom-hideSliderImage\");\n// setTimeout(() => {\n// if (!showARandomWord(page, true)) {\n// showCorrectOrWrongItems(page, true);\n// }\n// }, 1000); // should roughly correspond to the css transition showing the item\n// } else {\n// showCorrectOrWrongItems(page, false);\n// }\n// };\n\n// function setupSliderImageEvents(page: HTMLElement) {\n// const slider = page.getElementsByClassName(\"bloom-activity-slider\")[0];\n// if (!slider) {\n// return; // panic?\n// }\n// const sliderImages = Array.from(slider.getElementsByTagName(\"img\"));\n// sliderImages.forEach((img: HTMLElement) => {\n// img.addEventListener(\"click\", clickSliderImage);\n// });\n// }\n\n// export function setSlideablesVisibility(page: HTMLElement, visible: boolean) {\n// const slideables = Array.from(page.querySelectorAll(\"[data-img-txt]\"));\n// slideables.forEach((elt: HTMLElement) => {\n// if (visible) {\n// elt.classList.remove(\"bloom-hideSliderImage\");\n// } else {\n// elt.classList.add(\"bloom-hideSliderImage\");\n// }\n// });\n// }\n\n// function showARandomWord(page: HTMLElement, playAudio: boolean) {\n// const possibleWords = Array.from(page.querySelectorAll(\"[data-txt-img]\"));\n// const targetWords = possibleWords.filter(w => {\n// const imgId = w.getAttribute(\"data-txt-img\");\n// const img = page.querySelector(`[data-img-txt=\"${imgId}\"]`);\n// return img?.classList.contains(\"bloom-hideSliderImage\");\n// });\n// possibleWords.forEach(w => {\n// w.classList.remove(\"bloom-activeTextBox\");\n// });\n// if (targetWords.length === 0) {\n// return false;\n// }\n\n// const randomIndex = Math.floor(Math.random() * targetWords.length);\n// targetWords[randomIndex].classList.add(\"bloom-activeTextBox\");\n// if (playAudio) {\n// const playables = getAudioSentences([\n// targetWords[randomIndex] as HTMLElement\n// ]);\n// playAllAudio(playables);\n// }\n// return true;\n// }\n","/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/* jquery.nicescroll\r\n-- version 3.7.6\r\n-- copyright 2017-07-19 InuYaksa*2017\r\n-- licensed under the MIT\r\n--\r\n-- https://nicescroll.areaaperta.com/\r\n-- https://github.com/inuyaksa/jquery.nicescroll\r\n--\r\n*/\r\n\r\n/* jshint expr: true */\r\n\r\n(function (factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as anonymous module.\r\n define(['jquery'], factory);\r\n } else if (typeof exports === 'object') {\r\n // Node/CommonJS.\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n // Browser globals.\r\n factory(jQuery);\r\n }\r\n}(function (jQuery) {\r\n\r\n \"use strict\";\r\n\r\n // globals\r\n var domfocus = false,\r\n mousefocus = false,\r\n tabindexcounter = 0,\r\n ascrailcounter = 2000,\r\n globalmaxzindex = 0;\r\n\r\n var $ = jQuery, // sandbox\r\n _doc = document,\r\n _win = window,\r\n $window = $(_win);\r\n\r\n var delegatevents = [];\r\n\r\n // http://stackoverflow.com/questions/2161159/get-script-path\r\n function getScriptPath() {\r\n var scripts = _doc.currentScript || (function () { var s = _doc.getElementsByTagName('script'); return (s.length) ? s[s.length - 1] : false; })();\r\n var path = scripts ? scripts.src.split('?')[0] : '';\r\n return (path.split('/').length > 0) ? path.split('/').slice(0, -1).join('/') + '/' : '';\r\n }\r\n\r\n // based on code by Paul Irish https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ \r\n var setAnimationFrame = _win.requestAnimationFrame || _win.webkitRequestAnimationFrame || _win.mozRequestAnimationFrame || false;\r\n var clearAnimationFrame = _win.cancelAnimationFrame || _win.webkitCancelAnimationFrame || _win.mozCancelAnimationFrame || false;\r\n\r\n if (!setAnimationFrame) {\r\n var anilasttime = 0;\r\n setAnimationFrame = function (callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - anilasttime));\r\n var id = _win.setTimeout(function () { callback(currTime + timeToCall); },\r\n timeToCall);\r\n anilasttime = currTime + timeToCall;\r\n return id;\r\n };\r\n clearAnimationFrame = function (id) {\r\n _win.clearTimeout(id);\r\n };\r\n } else {\r\n if (!_win.cancelAnimationFrame) clearAnimationFrame = function (id) { };\r\n }\r\n\r\n var ClsMutationObserver = _win.MutationObserver || _win.WebKitMutationObserver || false;\r\n\r\n var now = Date.now || function () { return new Date().getTime(); };\r\n\r\n var _globaloptions = {\r\n zindex: \"auto\",\r\n cursoropacitymin: 0,\r\n cursoropacitymax: 1,\r\n cursorcolor: \"#424242\",\r\n cursorwidth: \"6px\",\r\n cursorborder: \"1px solid #fff\",\r\n cursorborderradius: \"5px\",\r\n scrollspeed: 40,\r\n mousescrollstep: 9 * 3,\r\n touchbehavior: false, // deprecated\r\n emulatetouch: false, // replacing touchbehavior\r\n hwacceleration: true,\r\n usetransition: true,\r\n boxzoom: false,\r\n dblclickzoom: true,\r\n gesturezoom: true,\r\n grabcursorenabled: true,\r\n autohidemode: true,\r\n background: \"\",\r\n iframeautoresize: true,\r\n cursorminheight: 32,\r\n preservenativescrolling: true,\r\n railoffset: false,\r\n railhoffset: false,\r\n bouncescroll: true,\r\n spacebarenabled: true,\r\n railpadding: {\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0\r\n },\r\n disableoutline: true,\r\n horizrailenabled: true,\r\n railalign: \"right\",\r\n railvalign: \"bottom\",\r\n enabletranslate3d: true,\r\n enablemousewheel: true,\r\n enablekeyboard: true,\r\n smoothscroll: true,\r\n sensitiverail: true,\r\n enablemouselockapi: true,\r\n // cursormaxheight:false,\r\n cursorfixedheight: false,\r\n directionlockdeadzone: 6,\r\n hidecursordelay: 400,\r\n nativeparentscrolling: true,\r\n enablescrollonselection: true,\r\n overflowx: true,\r\n overflowy: true,\r\n cursordragspeed: 0.3,\r\n rtlmode: \"auto\",\r\n cursordragontouch: false,\r\n oneaxismousemode: \"auto\",\r\n scriptpath: getScriptPath(),\r\n preventmultitouchscrolling: true,\r\n disablemutationobserver: false,\r\n enableobserver: true,\r\n scrollbarid: false\r\n };\r\n\r\n var browserdetected = false;\r\n\r\n var getBrowserDetection = function () {\r\n\r\n if (browserdetected) return browserdetected;\r\n\r\n var _el = _doc.createElement('DIV'),\r\n _style = _el.style,\r\n _agent = navigator.userAgent,\r\n _platform = navigator.platform,\r\n d = {};\r\n\r\n d.haspointerlock = \"pointerLockElement\" in _doc || \"webkitPointerLockElement\" in _doc || \"mozPointerLockElement\" in _doc;\r\n\r\n d.isopera = (\"opera\" in _win); // 12-\r\n d.isopera12 = (d.isopera && (\"getUserMedia\" in navigator));\r\n d.isoperamini = (Object.prototype.toString.call(_win.operamini) === \"[object OperaMini]\");\r\n\r\n d.isie = ((\"all\" in _doc) && (\"attachEvent\" in _el) && !d.isopera); //IE10-\r\n d.isieold = (d.isie && !(\"msInterpolationMode\" in _style)); // IE6 and older\r\n d.isie7 = d.isie && !d.isieold && (!(\"documentMode\" in _doc) || (_doc.documentMode === 7));\r\n d.isie8 = d.isie && (\"documentMode\" in _doc) && (_doc.documentMode === 8);\r\n d.isie9 = d.isie && (\"performance\" in _win) && (_doc.documentMode === 9);\r\n d.isie10 = d.isie && (\"performance\" in _win) && (_doc.documentMode === 10);\r\n d.isie11 = (\"msRequestFullscreen\" in _el) && (_doc.documentMode >= 11); // IE11+\r\n\r\n d.ismsedge = (\"msCredentials\" in _win); // MS Edge 14+\r\n\r\n d.ismozilla = (\"MozAppearance\" in _style);\r\n\r\n d.iswebkit = !d.ismsedge && (\"WebkitAppearance\" in _style);\r\n\r\n d.ischrome = d.iswebkit && (\"chrome\" in _win);\r\n d.ischrome38 = (d.ischrome && (\"touchAction\" in _style)); // behavior changed in touch emulation \r\n d.ischrome22 = (!d.ischrome38) && (d.ischrome && d.haspointerlock);\r\n d.ischrome26 = (!d.ischrome38) && (d.ischrome && (\"transition\" in _style)); // issue with transform detection (maintain prefix)\r\n\r\n d.cantouch = (\"ontouchstart\" in _doc.documentElement) || (\"ontouchstart\" in _win); // with detection for Chrome Touch Emulation \r\n d.hasw3ctouch = (_win.PointerEvent || false) && ((navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)); //IE11 pointer events, following W3C Pointer Events spec\r\n d.hasmstouch = (!d.hasw3ctouch) && (_win.MSPointerEvent || false); // IE10 pointer events\r\n\r\n d.ismac = /^mac$/i.test(_platform);\r\n\r\n d.isios = d.cantouch && /iphone|ipad|ipod/i.test(_platform);\r\n d.isios4 = d.isios && !(\"seal\" in Object);\r\n d.isios7 = d.isios && (\"webkitHidden\" in _doc); //iOS 7+\r\n d.isios8 = d.isios && (\"hidden\" in _doc); //iOS 8+\r\n d.isios10 = d.isios && _win.Proxy; //iOS 10+\r\n\r\n d.isandroid = (/android/i.test(_agent));\r\n\r\n d.haseventlistener = (\"addEventListener\" in _el);\r\n\r\n d.trstyle = false;\r\n d.hastransform = false;\r\n d.hastranslate3d = false;\r\n d.transitionstyle = false;\r\n d.hastransition = false;\r\n d.transitionend = false;\r\n\r\n d.trstyle = \"transform\";\r\n d.hastransform = (\"transform\" in _style) || (function () {\r\n var check = ['msTransform', 'webkitTransform', 'MozTransform', 'OTransform'];\r\n for (var a = 0, c = check.length; a < c; a++) {\r\n if (_style[check[a]] !== undefined) {\r\n d.trstyle = check[a];\r\n break;\r\n }\r\n }\r\n d.hastransform = (!!d.trstyle);\r\n })();\r\n\r\n if (d.hastransform) {\r\n _style[d.trstyle] = \"translate3d(1px,2px,3px)\";\r\n d.hastranslate3d = /translate3d/.test(_style[d.trstyle]);\r\n }\r\n\r\n d.transitionstyle = \"transition\";\r\n d.prefixstyle = '';\r\n d.transitionend = \"transitionend\";\r\n\r\n d.hastransition = (\"transition\" in _style) || (function () {\r\n\r\n d.transitionend = false;\r\n var check = ['webkitTransition', 'msTransition', 'MozTransition', 'OTransition', 'OTransition', 'KhtmlTransition'];\r\n var prefix = ['-webkit-', '-ms-', '-moz-', '-o-', '-o', '-khtml-'];\r\n var evs = ['webkitTransitionEnd', 'msTransitionEnd', 'transitionend', 'otransitionend', 'oTransitionEnd', 'KhtmlTransitionEnd'];\r\n for (var a = 0, c = check.length; a < c; a++) {\r\n if (check[a] in _style) {\r\n d.transitionstyle = check[a];\r\n d.prefixstyle = prefix[a];\r\n d.transitionend = evs[a];\r\n break;\r\n }\r\n }\r\n if (d.ischrome26) d.prefixstyle = prefix[1]; // always use prefix\r\n\r\n d.hastransition = (d.transitionstyle);\r\n\r\n })();\r\n\r\n function detectCursorGrab() {\r\n var lst = ['grab', '-webkit-grab', '-moz-grab'];\r\n if ((d.ischrome && !d.ischrome38) || d.isie) lst = []; // force setting for IE returns false positive and chrome cursor bug\r\n for (var a = 0, l = lst.length; a < l; a++) {\r\n var p = lst[a];\r\n _style.cursor = p;\r\n if (_style.cursor == p) return p;\r\n }\r\n return 'url(https://cdnjs.cloudflare.com/ajax/libs/slider-pro/1.3.0/css/images/openhand.cur),n-resize'; // thanks to https://cdnjs.com/ for the openhand cursor!\r\n }\r\n d.cursorgrabvalue = detectCursorGrab();\r\n\r\n d.hasmousecapture = (\"setCapture\" in _el);\r\n\r\n d.hasMutationObserver = (ClsMutationObserver !== false);\r\n\r\n _el = null; //memory released\r\n\r\n browserdetected = d;\r\n\r\n return d;\r\n };\r\n\r\n var NiceScrollClass = function (myopt, me) {\r\n\r\n var self = this;\r\n\r\n this.version = '3.7.6';\r\n this.name = 'nicescroll';\r\n\r\n this.me = me;\r\n\r\n var $body = $(\"body\");\r\n\r\n var opt = this.opt = {\r\n doc: $body,\r\n win: false\r\n };\r\n\r\n $.extend(opt, _globaloptions); // clone opts\r\n\r\n // Options for internal use\r\n opt.snapbackspeed = 80;\r\n\r\n if (myopt || false) {\r\n for (var a in opt) {\r\n if (myopt[a] !== undefined) opt[a] = myopt[a];\r\n }\r\n }\r\n\r\n if (opt.disablemutationobserver) ClsMutationObserver = false;\r\n\r\n this.doc = opt.doc;\r\n this.iddoc = (this.doc && this.doc[0]) ? this.doc[0].id || '' : '';\r\n this.ispage = /^BODY|HTML/.test((opt.win) ? opt.win[0].nodeName : this.doc[0].nodeName);\r\n this.haswrapper = (opt.win !== false);\r\n this.win = opt.win || (this.ispage ? $window : this.doc);\r\n this.docscroll = (this.ispage && !this.haswrapper) ? $window : this.win;\r\n this.body = $body;\r\n this.viewport = false;\r\n\r\n this.isfixed = false;\r\n\r\n this.iframe = false;\r\n this.isiframe = ((this.doc[0].nodeName == 'IFRAME') && (this.win[0].nodeName == 'IFRAME'));\r\n\r\n this.istextarea = (this.win[0].nodeName == 'TEXTAREA');\r\n\r\n this.forcescreen = false; //force to use screen position on events\r\n\r\n this.canshowonmouseevent = (opt.autohidemode != \"scroll\");\r\n\r\n // Events jump table \r\n this.onmousedown = false;\r\n this.onmouseup = false;\r\n this.onmousemove = false;\r\n this.onmousewheel = false;\r\n this.onkeypress = false;\r\n this.ongesturezoom = false;\r\n this.onclick = false;\r\n\r\n // Nicescroll custom events\r\n this.onscrollstart = false;\r\n this.onscrollend = false;\r\n this.onscrollcancel = false;\r\n\r\n this.onzoomin = false;\r\n this.onzoomout = false;\r\n\r\n // Let's start! \r\n this.view = false;\r\n this.page = false;\r\n\r\n this.scroll = {\r\n x: 0,\r\n y: 0\r\n };\r\n this.scrollratio = {\r\n x: 0,\r\n y: 0\r\n };\r\n this.cursorheight = 20;\r\n this.scrollvaluemax = 0;\r\n\r\n // http://dev.w3.org/csswg/css-writing-modes-3/#logical-to-physical\r\n // http://dev.w3.org/csswg/css-writing-modes-3/#svg-writing-mode\r\n if (opt.rtlmode == \"auto\") {\r\n var target = this.win[0] == _win ? this.body : this.win;\r\n var writingMode = target.css(\"writing-mode\") || target.css(\"-webkit-writing-mode\") || target.css(\"-ms-writing-mode\") || target.css(\"-moz-writing-mode\");\r\n\r\n if (writingMode == \"horizontal-tb\" || writingMode == \"lr-tb\" || writingMode === \"\") {\r\n this.isrtlmode = (target.css(\"direction\") == \"rtl\");\r\n this.isvertical = false;\r\n } else {\r\n this.isrtlmode = (writingMode == \"vertical-rl\" || writingMode == \"tb\" || writingMode == \"tb-rl\" || writingMode == \"rl-tb\");\r\n this.isvertical = (writingMode == \"vertical-rl\" || writingMode == \"tb\" || writingMode == \"tb-rl\");\r\n }\r\n } else {\r\n this.isrtlmode = (opt.rtlmode === true);\r\n this.isvertical = false;\r\n }\r\n // this.checkrtlmode = false;\r\n\r\n this.scrollrunning = false;\r\n\r\n this.scrollmom = false;\r\n\r\n this.observer = false; // observer div changes\r\n this.observerremover = false; // observer on parent for remove detection\r\n this.observerbody = false; // observer on body for position change\r\n\r\n if (opt.scrollbarid !== false) {\r\n this.id = opt.scrollbarid;\r\n } else {\r\n do {\r\n this.id = \"ascrail\" + (ascrailcounter++);\r\n } while (_doc.getElementById(this.id));\r\n }\r\n\r\n this.rail = false;\r\n this.cursor = false;\r\n this.cursorfreezed = false;\r\n this.selectiondrag = false;\r\n\r\n this.zoom = false;\r\n this.zoomactive = false;\r\n\r\n this.hasfocus = false;\r\n this.hasmousefocus = false;\r\n\r\n //this.visibility = true;\r\n this.railslocked = false; // locked by resize\r\n this.locked = false; // prevent lost of locked status sets by user\r\n this.hidden = false; // rails always hidden\r\n this.cursoractive = true; // user can interact with cursors\r\n\r\n this.wheelprevented = false; //prevent mousewheel event\r\n\r\n this.overflowx = opt.overflowx;\r\n this.overflowy = opt.overflowy;\r\n\r\n this.nativescrollingarea = false;\r\n this.checkarea = 0;\r\n\r\n this.events = []; // event list for unbind\r\n\r\n this.saved = {}; // style saved\r\n\r\n this.delaylist = {};\r\n this.synclist = {};\r\n\r\n this.lastdeltax = 0;\r\n this.lastdeltay = 0;\r\n\r\n this.detected = getBrowserDetection();\r\n\r\n var cap = $.extend({}, this.detected);\r\n\r\n this.canhwscroll = (cap.hastransform && opt.hwacceleration);\r\n this.ishwscroll = (this.canhwscroll && self.haswrapper);\r\n\r\n if (!this.isrtlmode) {\r\n this.hasreversehr = false;\r\n } else if (this.isvertical) { // RTL mode with reverse horizontal axis\r\n this.hasreversehr = !(cap.iswebkit || cap.isie || cap.isie11);\r\n } else {\r\n this.hasreversehr = !(cap.iswebkit || (cap.isie && !cap.isie10 && !cap.isie11));\r\n }\r\n\r\n this.istouchcapable = false; // desktop devices with touch screen support\r\n\r\n //## Check WebKit-based desktop with touch support\r\n //## + Firefox 18 nightly build (desktop) false positive (or desktop with touch support)\r\n\r\n if (!cap.cantouch && (cap.hasw3ctouch || cap.hasmstouch)) { // desktop device with multiple input\r\n this.istouchcapable = true;\r\n } else if (cap.cantouch && !cap.isios && !cap.isandroid && (cap.iswebkit || cap.ismozilla)) {\r\n this.istouchcapable = true;\r\n }\r\n\r\n //## disable MouseLock API on user request\r\n if (!opt.enablemouselockapi) {\r\n cap.hasmousecapture = false;\r\n cap.haspointerlock = false;\r\n }\r\n\r\n this.debounced = function (name, fn, tm) {\r\n if (!self) return;\r\n var dd = self.delaylist[name] || false;\r\n if (!dd) {\r\n self.delaylist[name] = {\r\n h: setAnimationFrame(function () {\r\n self.delaylist[name].fn.call(self);\r\n self.delaylist[name] = false;\r\n }, tm)\r\n };\r\n fn.call(self);\r\n }\r\n self.delaylist[name].fn = fn;\r\n };\r\n\r\n\r\n this.synched = function (name, fn) {\r\n if (self.synclist[name]) self.synclist[name] = fn;\r\n else {\r\n self.synclist[name] = fn;\r\n setAnimationFrame(function () {\r\n if (!self) return;\r\n self.synclist[name] && self.synclist[name].call(self);\r\n self.synclist[name] = null;\r\n });\r\n }\r\n };\r\n\r\n this.unsynched = function (name) {\r\n if (self.synclist[name]) self.synclist[name] = false;\r\n };\r\n\r\n this.css = function (el, pars) { // save & set\r\n for (var n in pars) {\r\n self.saved.css.push([el, n, el.css(n)]);\r\n el.css(n, pars[n]);\r\n }\r\n };\r\n\r\n this.scrollTop = function (val) {\r\n return (val === undefined) ? self.getScrollTop() : self.setScrollTop(val);\r\n };\r\n\r\n this.scrollLeft = function (val) {\r\n return (val === undefined) ? self.getScrollLeft() : self.setScrollLeft(val);\r\n };\r\n\r\n // derived by by Dan Pupius www.pupius.net\r\n var BezierClass = function (st, ed, spd, p1, p2, p3, p4) {\r\n\r\n this.st = st;\r\n this.ed = ed;\r\n this.spd = spd;\r\n\r\n this.p1 = p1 || 0;\r\n this.p2 = p2 || 1;\r\n this.p3 = p3 || 0;\r\n this.p4 = p4 || 1;\r\n\r\n this.ts = now();\r\n this.df = ed - st;\r\n };\r\n BezierClass.prototype = {\r\n B2: function (t) {\r\n return 3 * (1 - t) * (1 - t) * t;\r\n },\r\n B3: function (t) {\r\n return 3 * (1 - t) * t * t;\r\n },\r\n B4: function (t) {\r\n return t * t * t;\r\n },\r\n getPos: function () {\r\n return (now() - this.ts) / this.spd;\r\n },\r\n getNow: function () {\r\n var pc = (now() - this.ts) / this.spd;\r\n var bz = this.B2(pc) + this.B3(pc) + this.B4(pc);\r\n return (pc >= 1) ? this.ed : this.st + (this.df * bz) | 0;\r\n },\r\n update: function (ed, spd) {\r\n this.st = this.getNow();\r\n this.ed = ed;\r\n this.spd = spd;\r\n this.ts = now();\r\n this.df = this.ed - this.st;\r\n return this;\r\n }\r\n };\r\n\r\n //derived from http://stackoverflow.com/questions/11236090/\r\n function getMatrixValues() {\r\n var tr = self.doc.css(cap.trstyle);\r\n if (tr && (tr.substr(0, 6) == \"matrix\")) {\r\n return tr.replace(/^.*\\((.*)\\)$/g, \"$1\").replace(/px/g, '').split(/, +/);\r\n }\r\n return false;\r\n }\r\n\r\n if (this.ishwscroll) { // hw accelerated scroll\r\n\r\n this.doc.translate = {\r\n x: 0,\r\n y: 0,\r\n tx: \"0px\",\r\n ty: \"0px\"\r\n };\r\n\r\n //this one can help to enable hw accel on ios6 http://indiegamr.com/ios6-html-hardware-acceleration-changes-and-how-to-fix-them/\r\n if (cap.hastranslate3d && cap.isios) this.doc.css(\"-webkit-backface-visibility\", \"hidden\"); // prevent flickering http://stackoverflow.com/questions/3461441/ \r\n\r\n this.getScrollTop = function (last) {\r\n if (!last) {\r\n var mtx = getMatrixValues();\r\n if (mtx) return (mtx.length == 16) ? -mtx[13] : -mtx[5]; //matrix3d 16 on IE10\r\n if (self.timerscroll && self.timerscroll.bz) return self.timerscroll.bz.getNow();\r\n }\r\n return self.doc.translate.y;\r\n };\r\n\r\n this.getScrollLeft = function (last) {\r\n if (!last) {\r\n var mtx = getMatrixValues();\r\n if (mtx) return (mtx.length == 16) ? -mtx[12] : -mtx[4]; //matrix3d 16 on IE10\r\n if (self.timerscroll && self.timerscroll.bh) return self.timerscroll.bh.getNow();\r\n }\r\n return self.doc.translate.x;\r\n };\r\n\r\n this.notifyScrollEvent = function (el) {\r\n var e = _doc.createEvent(\"UIEvents\");\r\n e.initUIEvent(\"scroll\", false, false, _win, 1);\r\n e.niceevent = true;\r\n el.dispatchEvent(e);\r\n };\r\n\r\n var cxscrollleft = (this.isrtlmode) ? 1 : -1;\r\n\r\n if (cap.hastranslate3d && opt.enabletranslate3d) {\r\n this.setScrollTop = function (val, silent) {\r\n self.doc.translate.y = val;\r\n self.doc.translate.ty = (val * -1) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate3d(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \",0)\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n this.setScrollLeft = function (val, silent) {\r\n self.doc.translate.x = val;\r\n self.doc.translate.tx = (val * cxscrollleft) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate3d(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \",0)\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n } else {\r\n this.setScrollTop = function (val, silent) {\r\n self.doc.translate.y = val;\r\n self.doc.translate.ty = (val * -1) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \")\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n this.setScrollLeft = function (val, silent) {\r\n self.doc.translate.x = val;\r\n self.doc.translate.tx = (val * cxscrollleft) + \"px\";\r\n self.doc.css(cap.trstyle, \"translate(\" + self.doc.translate.tx + \",\" + self.doc.translate.ty + \")\");\r\n if (!silent) self.notifyScrollEvent(self.win[0]);\r\n };\r\n }\r\n } else { // native scroll\r\n\r\n this.getScrollTop = function () {\r\n return self.docscroll.scrollTop();\r\n };\r\n this.setScrollTop = function (val) {\r\n self.docscroll.scrollTop(val);\r\n };\r\n\r\n this.getScrollLeft = function () {\r\n var val;\r\n if (!self.hasreversehr) {\r\n val = self.docscroll.scrollLeft();\r\n } else if (self.detected.ismozilla) {\r\n val = self.page.maxw - Math.abs(self.docscroll.scrollLeft());\r\n } else {\r\n val = self.page.maxw - self.docscroll.scrollLeft();\r\n }\r\n return val;\r\n };\r\n this.setScrollLeft = function (val) {\r\n return setTimeout(function () {\r\n if (!self) return;\r\n if (self.hasreversehr) {\r\n if (self.detected.ismozilla) {\r\n val = -(self.page.maxw - val);\r\n } else {\r\n val = self.page.maxw - val;\r\n }\r\n }\r\n return self.docscroll.scrollLeft(val);\r\n }, 1);\r\n };\r\n }\r\n\r\n this.getTarget = function (e) {\r\n if (!e) return false;\r\n if (e.target) return e.target;\r\n if (e.srcElement) return e.srcElement;\r\n return false;\r\n };\r\n\r\n this.hasParent = function (e, id) {\r\n if (!e) return false;\r\n var el = e.target || e.srcElement || e || false;\r\n while (el && el.id != id) {\r\n el = el.parentNode || false;\r\n }\r\n return (el !== false);\r\n };\r\n\r\n function getZIndex() {\r\n var dom = self.win;\r\n if (\"zIndex\" in dom) return dom.zIndex(); // use jQuery UI method when available\r\n while (dom.length > 0) {\r\n if (dom[0].nodeType == 9) return false;\r\n var zi = dom.css('zIndex');\r\n if (!isNaN(zi) && zi !== 0) return parseInt(zi);\r\n dom = dom.parent();\r\n }\r\n return false;\r\n }\r\n\r\n //inspired by http://forum.jquery.com/topic/width-includes-border-width-when-set-to-thin-medium-thick-in-ie\r\n var _convertBorderWidth = {\r\n \"thin\": 1,\r\n \"medium\": 3,\r\n \"thick\": 5\r\n };\r\n\r\n function getWidthToPixel(dom, prop, chkheight) {\r\n var wd = dom.css(prop);\r\n var px = parseFloat(wd);\r\n if (isNaN(px)) {\r\n px = _convertBorderWidth[wd] || 0;\r\n var brd = (px == 3) ? ((chkheight) ? (self.win.outerHeight() - self.win.innerHeight()) : (self.win.outerWidth() - self.win.innerWidth())) : 1; //DON'T TRUST CSS\r\n if (self.isie8 && px) px += 1;\r\n return (brd) ? px : 0;\r\n }\r\n return px;\r\n }\r\n\r\n this.getDocumentScrollOffset = function () {\r\n return {\r\n top: _win.pageYOffset || _doc.documentElement.scrollTop,\r\n left: _win.pageXOffset || _doc.documentElement.scrollLeft\r\n };\r\n };\r\n\r\n this.getOffset = function () {\r\n if (self.isfixed) {\r\n var ofs = self.win.offset(); // fix Chrome auto issue (when right/bottom props only)\r\n var scrl = self.getDocumentScrollOffset();\r\n ofs.top -= scrl.top;\r\n ofs.left -= scrl.left;\r\n return ofs;\r\n }\r\n var ww = self.win.offset();\r\n if (!self.viewport) return ww;\r\n var vp = self.viewport.offset();\r\n return {\r\n top: ww.top - vp.top,\r\n left: ww.left - vp.left\r\n };\r\n };\r\n\r\n this.updateScrollBar = function (len) {\r\n var pos, off;\r\n if (self.ishwscroll) {\r\n self.rail.css({\r\n height: self.win.innerHeight() - (opt.railpadding.top + opt.railpadding.bottom)\r\n });\r\n if (self.railh) self.railh.css({\r\n width: self.win.innerWidth() - (opt.railpadding.left + opt.railpadding.right)\r\n });\r\n } else {\r\n var wpos = self.getOffset();\r\n pos = {\r\n top: wpos.top,\r\n left: wpos.left - (opt.railpadding.left + opt.railpadding.right)\r\n };\r\n pos.top += getWidthToPixel(self.win, 'border-top-width', true);\r\n pos.left += (self.rail.align) ? self.win.outerWidth() - getWidthToPixel(self.win, 'border-right-width') - self.rail.width : getWidthToPixel(self.win, 'border-left-width');\r\n\r\n off = opt.railoffset;\r\n if (off) {\r\n if (off.top) pos.top += off.top;\r\n if (off.left) pos.left += off.left;\r\n }\r\n\r\n if (!self.railslocked) self.rail.css({\r\n top: pos.top,\r\n left: pos.left,\r\n height: ((len) ? len.h : self.win.innerHeight()) - (opt.railpadding.top + opt.railpadding.bottom)\r\n });\r\n\r\n if (self.zoom) {\r\n self.zoom.css({\r\n top: pos.top + 1,\r\n left: (self.rail.align == 1) ? pos.left - 20 : pos.left + self.rail.width + 4\r\n });\r\n }\r\n\r\n if (self.railh && !self.railslocked) {\r\n pos = {\r\n top: wpos.top,\r\n left: wpos.left\r\n };\r\n off = opt.railhoffset;\r\n if (off) {\r\n if (off.top) pos.top += off.top;\r\n if (off.left) pos.left += off.left;\r\n }\r\n var y = (self.railh.align) ? pos.top + getWidthToPixel(self.win, 'border-top-width', true) + self.win.innerHeight() - self.railh.height : pos.top + getWidthToPixel(self.win, 'border-top-width', true);\r\n var x = pos.left + getWidthToPixel(self.win, 'border-left-width');\r\n self.railh.css({\r\n top: y - (opt.railpadding.top + opt.railpadding.bottom),\r\n left: x,\r\n width: self.railh.width\r\n });\r\n }\r\n\r\n }\r\n };\r\n\r\n this.doRailClick = function (e, dbl, hr) {\r\n var fn, pg, cur, pos;\r\n\r\n if (self.railslocked) return;\r\n\r\n self.cancelEvent(e);\r\n\r\n if (!(\"pageY\" in e)) {\r\n e.pageX = e.clientX + _doc.documentElement.scrollLeft;\r\n e.pageY = e.clientY + _doc.documentElement.scrollTop;\r\n }\r\n\r\n if (dbl) {\r\n fn = (hr) ? self.doScrollLeft : self.doScrollTop;\r\n cur = (hr) ? ((e.pageX - self.railh.offset().left - (self.cursorwidth / 2)) * self.scrollratio.x) : ((e.pageY - self.rail.offset().top - (self.cursorheight / 2)) * self.scrollratio.y);\r\n self.unsynched(\"relativexy\");\r\n fn(cur|0);\r\n } else {\r\n fn = (hr) ? self.doScrollLeftBy : self.doScrollBy;\r\n cur = (hr) ? self.scroll.x : self.scroll.y;\r\n pos = (hr) ? e.pageX - self.railh.offset().left : e.pageY - self.rail.offset().top;\r\n pg = (hr) ? self.view.w : self.view.h;\r\n fn((cur >= pos) ? pg : -pg);\r\n }\r\n\r\n };\r\n\r\n self.newscrolly = self.newscrollx = 0;\r\n\r\n self.hasanimationframe = (\"requestAnimationFrame\" in _win);\r\n self.hascancelanimationframe = (\"cancelAnimationFrame\" in _win);\r\n\r\n self.hasborderbox = false;\r\n\r\n this.init = function () {\r\n\r\n self.saved.css = [];\r\n\r\n if (cap.isoperamini) return true; // SORRY, DO NOT WORK!\r\n if (cap.isandroid && !(\"hidden\" in _doc)) return true; // Android 3- SORRY, DO NOT WORK!\r\n\r\n opt.emulatetouch = opt.emulatetouch || opt.touchbehavior; // mantain compatibility with \"touchbehavior\" \r\n\r\n self.hasborderbox = _win.getComputedStyle && (_win.getComputedStyle(_doc.body)['box-sizing'] === \"border-box\");\r\n\r\n var _scrollyhidden = { 'overflow-y': 'hidden' };\r\n if (cap.isie11 || cap.isie10) _scrollyhidden['-ms-overflow-style'] = 'none'; // IE 10 & 11 is always a world apart!\r\n\r\n if (self.ishwscroll) {\r\n this.doc.css(cap.transitionstyle, cap.prefixstyle + 'transform 0ms ease-out');\r\n if (cap.transitionend) self.bind(self.doc, cap.transitionend, self.onScrollTransitionEnd, false); //I have got to do something usefull!!\r\n }\r\n\r\n self.zindex = \"auto\";\r\n if (!self.ispage && opt.zindex == \"auto\") {\r\n self.zindex = getZIndex() || \"auto\";\r\n } else {\r\n self.zindex = opt.zindex;\r\n }\r\n\r\n if (!self.ispage && self.zindex != \"auto\" && self.zindex > globalmaxzindex) {\r\n globalmaxzindex = self.zindex;\r\n }\r\n\r\n if (self.isie && self.zindex === 0 && opt.zindex == \"auto\") { // fix IE auto == 0\r\n self.zindex = \"auto\";\r\n }\r\n\r\n if (!self.ispage || !cap.isieold) {\r\n\r\n var cont = self.docscroll;\r\n if (self.ispage) cont = (self.haswrapper) ? self.win : self.doc;\r\n\r\n self.css(cont, _scrollyhidden);\r\n\r\n if (self.ispage && (cap.isie11 || cap.isie)) { // IE 7-11\r\n self.css($(\"html\"), _scrollyhidden);\r\n }\r\n\r\n if (cap.isios && !self.ispage && !self.haswrapper) self.css($body, {\r\n \"-webkit-overflow-scrolling\": \"touch\"\r\n }); //force hw acceleration\r\n\r\n var cursor = $(_doc.createElement('div'));\r\n cursor.css({\r\n position: \"relative\",\r\n top: 0,\r\n \"float\": \"right\",\r\n width: opt.cursorwidth,\r\n height: 0,\r\n 'background-color': opt.cursorcolor,\r\n border: opt.cursorborder,\r\n 'background-clip': 'padding-box',\r\n '-webkit-border-radius': opt.cursorborderradius,\r\n '-moz-border-radius': opt.cursorborderradius,\r\n 'border-radius': opt.cursorborderradius\r\n });\r\n\r\n cursor.addClass('nicescroll-cursors');\r\n\r\n self.cursor = cursor;\r\n\r\n var rail = $(_doc.createElement('div'));\r\n rail.attr('id', self.id);\r\n rail.addClass('nicescroll-rails nicescroll-rails-vr');\r\n\r\n var v, a, kp = [\"left\", \"right\", \"top\", \"bottom\"]; //**\r\n for (var n in kp) {\r\n a = kp[n];\r\n v = opt.railpadding[a] || 0;\r\n v && rail.css(\"padding-\" + a, v + \"px\");\r\n }\r\n\r\n rail.append(cursor);\r\n\r\n rail.width = Math.max(parseFloat(opt.cursorwidth), cursor.outerWidth());\r\n rail.css({\r\n width: rail.width + \"px\",\r\n zIndex: self.zindex,\r\n background: opt.background,\r\n cursor: \"default\"\r\n });\r\n\r\n rail.visibility = true;\r\n rail.scrollable = true;\r\n\r\n rail.align = (opt.railalign == \"left\") ? 0 : 1;\r\n\r\n self.rail = rail;\r\n\r\n self.rail.drag = false;\r\n\r\n var zoom = false;\r\n if (opt.boxzoom && !self.ispage && !cap.isieold) {\r\n zoom = _doc.createElement('div');\r\n\r\n self.bind(zoom, \"click\", self.doZoom);\r\n self.bind(zoom, \"mouseenter\", function () {\r\n self.zoom.css('opacity', opt.cursoropacitymax);\r\n });\r\n self.bind(zoom, \"mouseleave\", function () {\r\n self.zoom.css('opacity', opt.cursoropacitymin);\r\n });\r\n\r\n self.zoom = $(zoom);\r\n self.zoom.css({\r\n cursor: \"pointer\",\r\n zIndex: self.zindex,\r\n backgroundImage: 'url(' + opt.scriptpath + 'zoomico.png)',\r\n height: 18,\r\n width: 18,\r\n backgroundPosition: '0 0'\r\n });\r\n if (opt.dblclickzoom) self.bind(self.win, \"dblclick\", self.doZoom);\r\n if (cap.cantouch && opt.gesturezoom) {\r\n self.ongesturezoom = function (e) {\r\n if (e.scale > 1.5) self.doZoomIn(e);\r\n if (e.scale < 0.8) self.doZoomOut(e);\r\n return self.cancelEvent(e);\r\n };\r\n self.bind(self.win, \"gestureend\", self.ongesturezoom);\r\n }\r\n }\r\n\r\n // init HORIZ\r\n\r\n self.railh = false;\r\n var railh;\r\n\r\n if (opt.horizrailenabled) {\r\n\r\n self.css(cont, {\r\n overflowX: 'hidden'\r\n });\r\n\r\n cursor = $(_doc.createElement('div'));\r\n cursor.css({\r\n position: \"absolute\",\r\n top: 0,\r\n height: opt.cursorwidth,\r\n width: 0,\r\n backgroundColor: opt.cursorcolor,\r\n border: opt.cursorborder,\r\n backgroundClip: 'padding-box',\r\n '-webkit-border-radius': opt.cursorborderradius,\r\n '-moz-border-radius': opt.cursorborderradius,\r\n 'border-radius': opt.cursorborderradius\r\n });\r\n\r\n if (cap.isieold) cursor.css('overflow', 'hidden'); //IE6 horiz scrollbar issue\r\n\r\n cursor.addClass('nicescroll-cursors');\r\n\r\n self.cursorh = cursor;\r\n\r\n railh = $(_doc.createElement('div'));\r\n railh.attr('id', self.id + '-hr');\r\n railh.addClass('nicescroll-rails nicescroll-rails-hr');\r\n railh.height = Math.max(parseFloat(opt.cursorwidth), cursor.outerHeight());\r\n railh.css({\r\n height: railh.height + \"px\",\r\n 'zIndex': self.zindex,\r\n \"background\": opt.background\r\n });\r\n\r\n railh.append(cursor);\r\n\r\n railh.visibility = true;\r\n railh.scrollable = true;\r\n\r\n railh.align = (opt.railvalign == \"top\") ? 0 : 1;\r\n\r\n self.railh = railh;\r\n\r\n self.railh.drag = false;\r\n\r\n }\r\n\r\n if (self.ispage) {\r\n\r\n rail.css({\r\n position: \"fixed\",\r\n top: 0,\r\n height: \"100%\"\r\n });\r\n\r\n rail.css((rail.align) ? { right: 0 } : { left: 0 });\r\n\r\n self.body.append(rail);\r\n if (self.railh) {\r\n railh.css({\r\n position: \"fixed\",\r\n left: 0,\r\n width: \"100%\"\r\n });\r\n\r\n railh.css((railh.align) ? { bottom: 0 } : { top: 0 });\r\n\r\n self.body.append(railh);\r\n }\r\n } else {\r\n if (self.ishwscroll) {\r\n if (self.win.css('position') == 'static') self.css(self.win, { 'position': 'relative' });\r\n var bd = (self.win[0].nodeName == 'HTML') ? self.body : self.win;\r\n $(bd).scrollTop(0).scrollLeft(0); // fix rail position if content already scrolled\r\n if (self.zoom) {\r\n self.zoom.css({\r\n position: \"absolute\",\r\n top: 1,\r\n right: 0,\r\n \"margin-right\": rail.width + 4\r\n });\r\n bd.append(self.zoom);\r\n }\r\n rail.css({\r\n position: \"absolute\",\r\n top: 0\r\n });\r\n rail.css((rail.align) ? { right: 0 } : { left: 0 });\r\n bd.append(rail);\r\n if (railh) {\r\n railh.css({\r\n position: \"absolute\",\r\n left: 0,\r\n bottom: 0\r\n });\r\n railh.css((railh.align) ? { bottom: 0 } : { top: 0 });\r\n bd.append(railh);\r\n }\r\n } else {\r\n self.isfixed = (self.win.css(\"position\") == \"fixed\");\r\n var rlpos = (self.isfixed) ? \"fixed\" : \"absolute\";\r\n\r\n if (!self.isfixed) self.viewport = self.getViewport(self.win[0]);\r\n if (self.viewport) {\r\n self.body = self.viewport;\r\n if (!(/fixed|absolute/.test(self.viewport.css(\"position\")))) self.css(self.viewport, {\r\n \"position\": \"relative\"\r\n });\r\n }\r\n\r\n rail.css({\r\n position: rlpos\r\n });\r\n if (self.zoom) self.zoom.css({\r\n position: rlpos\r\n });\r\n self.updateScrollBar();\r\n self.body.append(rail);\r\n if (self.zoom) self.body.append(self.zoom);\r\n if (self.railh) {\r\n railh.css({\r\n position: rlpos\r\n });\r\n self.body.append(railh);\r\n }\r\n }\r\n\r\n if (cap.isios) self.css(self.win, {\r\n '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\r\n '-webkit-touch-callout': 'none'\r\n }); // prevent grey layer on click\r\n\r\n if (opt.disableoutline) {\r\n if (cap.isie) self.win.attr(\"hideFocus\", \"true\"); // IE, prevent dotted rectangle on focused div\r\n if (cap.iswebkit) self.win.css('outline', 'none'); // Webkit outline\r\n }\r\n\r\n }\r\n\r\n if (opt.autohidemode === false) {\r\n self.autohidedom = false;\r\n self.rail.css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n if (self.railh) self.railh.css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n } else if ((opt.autohidemode === true) || (opt.autohidemode === \"leave\")) {\r\n self.autohidedom = $().add(self.rail);\r\n if (cap.isie8) self.autohidedom = self.autohidedom.add(self.cursor);\r\n if (self.railh) self.autohidedom = self.autohidedom.add(self.railh);\r\n if (self.railh && cap.isie8) self.autohidedom = self.autohidedom.add(self.cursorh);\r\n } else if (opt.autohidemode == \"scroll\") {\r\n self.autohidedom = $().add(self.rail);\r\n if (self.railh) self.autohidedom = self.autohidedom.add(self.railh);\r\n } else if (opt.autohidemode == \"cursor\") {\r\n self.autohidedom = $().add(self.cursor);\r\n if (self.railh) self.autohidedom = self.autohidedom.add(self.cursorh);\r\n } else if (opt.autohidemode == \"hidden\") {\r\n self.autohidedom = false;\r\n self.hide();\r\n self.railslocked = false;\r\n }\r\n\r\n if (cap.cantouch || self.istouchcapable || opt.emulatetouch || cap.hasmstouch) {\r\n\r\n self.scrollmom = new ScrollMomentumClass2D(self);\r\n\r\n var delayedclick = null;\r\n\r\n self.ontouchstart = function (e) {\r\n\r\n if (self.locked) return false;\r\n\r\n //if (e.pointerType && e.pointerType != 2 && e.pointerType != \"touch\") return false;\r\n if (e.pointerType && (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE)) return false; // need test on surface!!\r\n\r\n self.hasmoving = false;\r\n\r\n if (self.scrollmom.timer) {\r\n self.triggerScrollEnd();\r\n self.scrollmom.stop();\r\n }\r\n\r\n if (!self.railslocked) {\r\n var tg = self.getTarget(e);\r\n\r\n if (tg) {\r\n var skp = (/INPUT/i.test(tg.nodeName)) && (/range/i.test(tg.type));\r\n if (skp) return self.stopPropagation(e);\r\n }\r\n\r\n var ismouse = (e.type === \"mousedown\");\r\n\r\n if (!(\"clientX\" in e) && (\"changedTouches\" in e)) {\r\n e.clientX = e.changedTouches[0].clientX;\r\n e.clientY = e.changedTouches[0].clientY;\r\n }\r\n\r\n if (self.forcescreen) {\r\n var le = e;\r\n e = {\r\n \"original\": (e.original) ? e.original : e\r\n };\r\n e.clientX = le.screenX;\r\n e.clientY = le.screenY;\r\n }\r\n\r\n self.rail.drag = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n sx: self.scroll.x,\r\n sy: self.scroll.y,\r\n st: self.getScrollTop(),\r\n sl: self.getScrollLeft(),\r\n pt: 2,\r\n dl: false,\r\n tg: tg\r\n };\r\n\r\n if (self.ispage || !opt.directionlockdeadzone) {\r\n\r\n self.rail.drag.dl = \"f\";\r\n\r\n } else {\r\n\r\n var view = {\r\n w: $window.width(),\r\n h: $window.height()\r\n };\r\n\r\n var page = self.getContentSize();\r\n\r\n var maxh = page.h - view.h;\r\n var maxw = page.w - view.w;\r\n\r\n if (self.rail.scrollable && !self.railh.scrollable) self.rail.drag.ck = (maxh > 0) ? \"v\" : false;\r\n else if (!self.rail.scrollable && self.railh.scrollable) self.rail.drag.ck = (maxw > 0) ? \"h\" : false;\r\n else self.rail.drag.ck = false;\r\n\r\n }\r\n\r\n if (opt.emulatetouch && self.isiframe && cap.isie) {\r\n var wp = self.win.position();\r\n self.rail.drag.x += wp.left;\r\n self.rail.drag.y += wp.top;\r\n }\r\n\r\n self.hasmoving = false;\r\n self.lastmouseup = false;\r\n self.scrollmom.reset(e.clientX, e.clientY);\r\n\r\n if (tg&&ismouse) {\r\n\r\n var ip = /INPUT|SELECT|BUTTON|TEXTAREA/i.test(tg.nodeName);\r\n if (!ip) {\r\n if (cap.hasmousecapture) tg.setCapture();\r\n if (opt.emulatetouch) {\r\n if (tg.onclick && !(tg._onclick || false)) { // intercept DOM0 onclick event\r\n tg._onclick = tg.onclick;\r\n tg.onclick = function (e) {\r\n if (self.hasmoving) return false;\r\n tg._onclick.call(this, e);\r\n };\r\n }\r\n return self.cancelEvent(e);\r\n }\r\n return self.stopPropagation(e);\r\n }\r\n\r\n if (/SUBMIT|CANCEL|BUTTON/i.test($(tg).attr('type'))) {\r\n self.preventclick = {\r\n \"tg\": tg,\r\n \"click\": false\r\n };\r\n }\r\n\r\n }\r\n }\r\n\r\n };\r\n\r\n self.ontouchend = function (e) {\r\n\r\n if (!self.rail.drag) return true;\r\n\r\n if (self.rail.drag.pt == 2) {\r\n //if (e.pointerType && e.pointerType != 2 && e.pointerType != \"touch\") return false;\r\n if (e.pointerType && (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE)) return false;\r\n\r\n self.rail.drag = false;\r\n\r\n var ismouse = (e.type === \"mouseup\");\r\n\r\n if (self.hasmoving) {\r\n self.scrollmom.doMomentum();\r\n self.lastmouseup = true;\r\n self.hideCursor();\r\n if (cap.hasmousecapture) _doc.releaseCapture();\r\n if (ismouse) return self.cancelEvent(e);\r\n }\r\n\r\n }\r\n else if (self.rail.drag.pt == 1) {\r\n return self.onmouseup(e);\r\n }\r\n\r\n };\r\n\r\n var moveneedoffset = (opt.emulatetouch && self.isiframe && !cap.hasmousecapture);\r\n\r\n var locktollerance = opt.directionlockdeadzone * 0.3 | 0;\r\n\r\n self.ontouchmove = function (e, byiframe) {\r\n\r\n if (!self.rail.drag) return true;\r\n\r\n if (e.targetTouches && opt.preventmultitouchscrolling) {\r\n if (e.targetTouches.length > 1) return true; // multitouch\r\n }\r\n\r\n //if (e.pointerType && e.pointerType != 2 && e.pointerType != \"touch\") return false;\r\n if (e.pointerType && (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE)) return true;\r\n\r\n if (self.rail.drag.pt == 2) {\r\n\r\n if ((\"changedTouches\" in e)) {\r\n e.clientX = e.changedTouches[0].clientX;\r\n e.clientY = e.changedTouches[0].clientY;\r\n }\r\n\r\n var ofy, ofx;\r\n ofx = ofy = 0;\r\n\r\n if (moveneedoffset && !byiframe) {\r\n var wp = self.win.position();\r\n ofx = -wp.left;\r\n ofy = -wp.top;\r\n }\r\n\r\n var fy = e.clientY + ofy;\r\n var my = (fy - self.rail.drag.y);\r\n var fx = e.clientX + ofx;\r\n var mx = (fx - self.rail.drag.x);\r\n\r\n var ny = self.rail.drag.st - my;\r\n\r\n if (self.ishwscroll && opt.bouncescroll) {\r\n if (ny < 0) {\r\n ny = Math.round(ny / 2);\r\n } else if (ny > self.page.maxh) {\r\n ny = self.page.maxh + Math.round((ny - self.page.maxh) / 2);\r\n }\r\n } else {\r\n if (ny < 0) {\r\n ny = 0;\r\n fy = 0;\r\n }\r\n else if (ny > self.page.maxh) {\r\n ny = self.page.maxh;\r\n fy = 0;\r\n }\r\n if (fy === 0 && !self.hasmoving) {\r\n if (!self.ispage) self.rail.drag = false;\r\n return true;\r\n }\r\n }\r\n\r\n var nx = self.getScrollLeft();\r\n\r\n if (self.railh && self.railh.scrollable) {\r\n nx = (self.isrtlmode) ? mx - self.rail.drag.sl : self.rail.drag.sl - mx;\r\n\r\n if (self.ishwscroll && opt.bouncescroll) {\r\n if (nx < 0) {\r\n nx = Math.round(nx / 2);\r\n } else if (nx > self.page.maxw) {\r\n nx = self.page.maxw + Math.round((nx - self.page.maxw) / 2);\r\n }\r\n } else {\r\n if (nx < 0) {\r\n nx = 0;\r\n fx = 0;\r\n }\r\n if (nx > self.page.maxw) {\r\n nx = self.page.maxw;\r\n fx = 0;\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n if (!self.hasmoving) {\r\n\r\n if (self.rail.drag.y === e.clientY && self.rail.drag.x === e.clientX) return self.cancelEvent(e); // prevent first useless move event \r\n\r\n var ay = Math.abs(my);\r\n var ax = Math.abs(mx);\r\n var dz = opt.directionlockdeadzone;\r\n\r\n if (!self.rail.drag.ck) {\r\n if (ay > dz && ax > dz) self.rail.drag.dl = \"f\";\r\n else if (ay > dz) self.rail.drag.dl = (ax > locktollerance) ? \"f\" : \"v\";\r\n else if (ax > dz) self.rail.drag.dl = (ay > locktollerance) ? \"f\" : \"h\";\r\n }\r\n else if (self.rail.drag.ck == \"v\") {\r\n if (ax > dz && ay <= locktollerance) {\r\n self.rail.drag = false;\r\n }\r\n else if (ay > dz) self.rail.drag.dl = \"v\";\r\n\r\n }\r\n else if (self.rail.drag.ck == \"h\") {\r\n\r\n if (ay > dz && ax <= locktollerance) {\r\n self.rail.drag = false;\r\n }\r\n else if (ax > dz) self.rail.drag.dl = \"h\";\r\n\r\n }\r\n\r\n if (!self.rail.drag.dl) return self.cancelEvent(e);\r\n\r\n self.triggerScrollStart(e.clientX, e.clientY, 0, 0, 0);\r\n self.hasmoving = true;\r\n }\r\n\r\n if (self.preventclick && !self.preventclick.click) {\r\n self.preventclick.click = self.preventclick.tg.onclick || false;\r\n self.preventclick.tg.onclick = self.onpreventclick;\r\n }\r\n\r\n if (self.rail.drag.dl) {\r\n if (self.rail.drag.dl == \"v\") nx = self.rail.drag.sl;\r\n else if (self.rail.drag.dl == \"h\") ny = self.rail.drag.st;\r\n }\r\n\r\n self.synched(\"touchmove\", function () {\r\n if (self.rail.drag && (self.rail.drag.pt == 2)) {\r\n if (self.prepareTransition) self.resetTransition();\r\n if (self.rail.scrollable) self.setScrollTop(ny);\r\n self.scrollmom.update(fx, fy);\r\n if (self.railh && self.railh.scrollable) {\r\n self.setScrollLeft(nx);\r\n self.showCursor(ny, nx);\r\n } else {\r\n self.showCursor(ny);\r\n }\r\n if (cap.isie10) _doc.selection.clear();\r\n }\r\n });\r\n\r\n return self.cancelEvent(e);\r\n\r\n }\r\n else if (self.rail.drag.pt == 1) { // drag on cursor\r\n return self.onmousemove(e);\r\n }\r\n\r\n };\r\n\r\n self.ontouchstartCursor = function (e, hronly) {\r\n if (self.rail.drag && self.rail.drag.pt != 3) return;\r\n if (self.locked) return self.cancelEvent(e);\r\n self.cancelScroll();\r\n self.rail.drag = {\r\n x: e.touches[0].clientX,\r\n y: e.touches[0].clientY,\r\n sx: self.scroll.x,\r\n sy: self.scroll.y,\r\n pt: 3,\r\n hr: (!!hronly)\r\n };\r\n var tg = self.getTarget(e);\r\n if (!self.ispage && cap.hasmousecapture) tg.setCapture();\r\n if (self.isiframe && !cap.hasmousecapture) {\r\n self.saved.csspointerevents = self.doc.css(\"pointer-events\");\r\n self.css(self.doc, { \"pointer-events\": \"none\" });\r\n }\r\n return self.cancelEvent(e);\r\n };\r\n\r\n self.ontouchendCursor = function (e) {\r\n if (self.rail.drag) {\r\n if (cap.hasmousecapture) _doc.releaseCapture();\r\n if (self.isiframe && !cap.hasmousecapture) self.doc.css(\"pointer-events\", self.saved.csspointerevents);\r\n if (self.rail.drag.pt != 3) return;\r\n self.rail.drag = false;\r\n return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n self.ontouchmoveCursor = function (e) {\r\n if (self.rail.drag) {\r\n if (self.rail.drag.pt != 3) return;\r\n\r\n self.cursorfreezed = true;\r\n\r\n if (self.rail.drag.hr) {\r\n self.scroll.x = self.rail.drag.sx + (e.touches[0].clientX - self.rail.drag.x);\r\n if (self.scroll.x < 0) self.scroll.x = 0;\r\n var mw = self.scrollvaluemaxw;\r\n if (self.scroll.x > mw) self.scroll.x = mw;\r\n } else {\r\n self.scroll.y = self.rail.drag.sy + (e.touches[0].clientY - self.rail.drag.y);\r\n if (self.scroll.y < 0) self.scroll.y = 0;\r\n var my = self.scrollvaluemax;\r\n if (self.scroll.y > my) self.scroll.y = my;\r\n }\r\n\r\n self.synched('touchmove', function () {\r\n if (self.rail.drag && (self.rail.drag.pt == 3)) {\r\n self.showCursor();\r\n if (self.rail.drag.hr) self.doScrollLeft(Math.round(self.scroll.x * self.scrollratio.x), opt.cursordragspeed);\r\n else self.doScrollTop(Math.round(self.scroll.y * self.scrollratio.y), opt.cursordragspeed);\r\n }\r\n });\r\n\r\n return self.cancelEvent(e);\r\n }\r\n\r\n };\r\n\r\n }\r\n\r\n self.onmousedown = function (e, hronly) {\r\n if (self.rail.drag && self.rail.drag.pt != 1) return;\r\n if (self.railslocked) return self.cancelEvent(e);\r\n self.cancelScroll();\r\n self.rail.drag = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n sx: self.scroll.x,\r\n sy: self.scroll.y,\r\n pt: 1,\r\n hr: hronly || false\r\n };\r\n var tg = self.getTarget(e);\r\n\r\n if (cap.hasmousecapture) tg.setCapture();\r\n if (self.isiframe && !cap.hasmousecapture) {\r\n self.saved.csspointerevents = self.doc.css(\"pointer-events\");\r\n self.css(self.doc, {\r\n \"pointer-events\": \"none\"\r\n });\r\n }\r\n self.hasmoving = false;\r\n return self.cancelEvent(e);\r\n };\r\n\r\n self.onmouseup = function (e) {\r\n if (self.rail.drag) {\r\n if (self.rail.drag.pt != 1) return true;\r\n\r\n if (cap.hasmousecapture) _doc.releaseCapture();\r\n if (self.isiframe && !cap.hasmousecapture) self.doc.css(\"pointer-events\", self.saved.csspointerevents);\r\n self.rail.drag = false;\r\n self.cursorfreezed = false;\r\n if (self.hasmoving) self.triggerScrollEnd();\r\n return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n self.onmousemove = function (e) {\r\n if (self.rail.drag) {\r\n if (self.rail.drag.pt !== 1) return;\r\n\r\n if (cap.ischrome && e.which === 0) return self.onmouseup(e);\r\n\r\n self.cursorfreezed = true;\r\n\r\n if (!self.hasmoving) self.triggerScrollStart(e.clientX, e.clientY, 0, 0, 0);\r\n\r\n self.hasmoving = true;\r\n\r\n if (self.rail.drag.hr) {\r\n self.scroll.x = self.rail.drag.sx + (e.clientX - self.rail.drag.x);\r\n if (self.scroll.x < 0) self.scroll.x = 0;\r\n var mw = self.scrollvaluemaxw;\r\n if (self.scroll.x > mw) self.scroll.x = mw;\r\n } else {\r\n self.scroll.y = self.rail.drag.sy + (e.clientY - self.rail.drag.y);\r\n if (self.scroll.y < 0) self.scroll.y = 0;\r\n var my = self.scrollvaluemax;\r\n if (self.scroll.y > my) self.scroll.y = my;\r\n }\r\n\r\n self.synched('mousemove', function () {\r\n\r\n if (self.cursorfreezed) {\r\n self.showCursor();\r\n\r\n if (self.rail.drag.hr) {\r\n self.scrollLeft(Math.round(self.scroll.x * self.scrollratio.x));\r\n } else {\r\n self.scrollTop(Math.round(self.scroll.y * self.scrollratio.y));\r\n }\r\n\r\n }\r\n });\r\n\r\n return self.cancelEvent(e);\r\n }\r\n else {\r\n self.checkarea = 0;\r\n }\r\n };\r\n\r\n if (cap.cantouch || opt.emulatetouch) {\r\n\r\n self.onpreventclick = function (e) {\r\n if (self.preventclick) {\r\n self.preventclick.tg.onclick = self.preventclick.click;\r\n self.preventclick = false;\r\n return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n self.onclick = (cap.isios) ? false : function (e) { // it needs to check IE11 ???\r\n if (self.lastmouseup) {\r\n self.lastmouseup = false;\r\n return self.cancelEvent(e);\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n if (opt.grabcursorenabled && cap.cursorgrabvalue) {\r\n self.css((self.ispage) ? self.doc : self.win, {\r\n 'cursor': cap.cursorgrabvalue\r\n });\r\n self.css(self.rail, {\r\n 'cursor': cap.cursorgrabvalue\r\n });\r\n }\r\n\r\n } else {\r\n\r\n var checkSelectionScroll = function (e) {\r\n if (!self.selectiondrag) return;\r\n\r\n if (e) {\r\n var ww = self.win.outerHeight();\r\n var df = (e.pageY - self.selectiondrag.top);\r\n if (df > 0 && df < ww) df = 0;\r\n if (df >= ww) df -= ww;\r\n self.selectiondrag.df = df;\r\n }\r\n if (self.selectiondrag.df === 0) return;\r\n\r\n var rt = -(self.selectiondrag.df*2/6)|0;\r\n self.doScrollBy(rt);\r\n\r\n self.debounced(\"doselectionscroll\", function () {\r\n checkSelectionScroll();\r\n }, 50);\r\n };\r\n\r\n if (\"getSelection\" in _doc) { // A grade - Major browsers\r\n self.hasTextSelected = function () {\r\n return (_doc.getSelection().rangeCount > 0);\r\n };\r\n } else if (\"selection\" in _doc) { //IE9-\r\n self.hasTextSelected = function () {\r\n return (_doc.selection.type != \"None\");\r\n };\r\n } else {\r\n self.hasTextSelected = function () { // no support\r\n return false;\r\n };\r\n }\r\n\r\n self.onselectionstart = function (e) {\r\n // More testing - severe chrome issues \r\n /* \r\n if (!self.haswrapper&&(e.which&&e.which==2)) { // fool browser to manage middle button scrolling\r\n self.win.css({'overflow':'auto'});\r\n setTimeout(function(){\r\n self.win.css({'overflow':'hidden'});\r\n },10); \r\n return true;\r\n } \r\n */\r\n if (self.ispage) return;\r\n self.selectiondrag = self.win.offset();\r\n };\r\n\r\n self.onselectionend = function (e) {\r\n self.selectiondrag = false;\r\n };\r\n self.onselectiondrag = function (e) {\r\n if (!self.selectiondrag) return;\r\n if (self.hasTextSelected()) self.debounced(\"selectionscroll\", function () {\r\n checkSelectionScroll(e);\r\n }, 250);\r\n };\r\n }\r\n\r\n if (cap.hasw3ctouch) { //IE11+\r\n self.css((self.ispage) ? $(\"html\") : self.win, { 'touch-action': 'none' });\r\n self.css(self.rail, {\r\n 'touch-action': 'none'\r\n });\r\n self.css(self.cursor, {\r\n 'touch-action': 'none'\r\n });\r\n self.bind(self.win, \"pointerdown\", self.ontouchstart);\r\n self.bind(_doc, \"pointerup\", self.ontouchend);\r\n self.delegate(_doc, \"pointermove\", self.ontouchmove);\r\n } else if (cap.hasmstouch) { //IE10\r\n self.css((self.ispage) ? $(\"html\") : self.win, { '-ms-touch-action': 'none' });\r\n self.css(self.rail, {\r\n '-ms-touch-action': 'none'\r\n });\r\n self.css(self.cursor, {\r\n '-ms-touch-action': 'none'\r\n });\r\n self.bind(self.win, \"MSPointerDown\", self.ontouchstart);\r\n self.bind(_doc, \"MSPointerUp\", self.ontouchend);\r\n self.delegate(_doc, \"MSPointerMove\", self.ontouchmove);\r\n self.bind(self.cursor, \"MSGestureHold\", function (e) {\r\n e.preventDefault();\r\n });\r\n self.bind(self.cursor, \"contextmenu\", function (e) {\r\n e.preventDefault();\r\n });\r\n } else if (cap.cantouch) { // smartphones/touch devices\r\n self.bind(self.win, \"touchstart\", self.ontouchstart, false, true);\r\n self.bind(_doc, \"touchend\", self.ontouchend, false, true);\r\n self.bind(_doc, \"touchcancel\", self.ontouchend, false, true);\r\n self.delegate(_doc, \"touchmove\", self.ontouchmove, false, true);\r\n }\r\n\r\n if (opt.emulatetouch) {\r\n self.bind(self.win, \"mousedown\", self.ontouchstart, false, true);\r\n self.bind(_doc, \"mouseup\", self.ontouchend, false, true);\r\n self.bind(_doc, \"mousemove\", self.ontouchmove, false, true);\r\n }\r\n\r\n if (opt.cursordragontouch || (!cap.cantouch && !opt.emulatetouch)) {\r\n\r\n self.rail.css({\r\n cursor: \"default\"\r\n });\r\n self.railh && self.railh.css({\r\n cursor: \"default\"\r\n });\r\n\r\n self.jqbind(self.rail, \"mouseenter\", function () {\r\n if (!self.ispage && !self.win.is(\":visible\")) return false;\r\n if (self.canshowonmouseevent) self.showCursor();\r\n self.rail.active = true;\r\n });\r\n self.jqbind(self.rail, \"mouseleave\", function () {\r\n self.rail.active = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n\r\n if (opt.sensitiverail) {\r\n self.bind(self.rail, \"click\", function (e) {\r\n self.doRailClick(e, false, false);\r\n });\r\n self.bind(self.rail, \"dblclick\", function (e) {\r\n self.doRailClick(e, true, false);\r\n });\r\n self.bind(self.cursor, \"click\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n self.bind(self.cursor, \"dblclick\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n }\r\n\r\n if (self.railh) {\r\n self.jqbind(self.railh, \"mouseenter\", function () {\r\n if (!self.ispage && !self.win.is(\":visible\")) return false;\r\n if (self.canshowonmouseevent) self.showCursor();\r\n self.rail.active = true;\r\n });\r\n self.jqbind(self.railh, \"mouseleave\", function () {\r\n self.rail.active = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n\r\n if (opt.sensitiverail) {\r\n self.bind(self.railh, \"click\", function (e) {\r\n self.doRailClick(e, false, true);\r\n });\r\n self.bind(self.railh, \"dblclick\", function (e) {\r\n self.doRailClick(e, true, true);\r\n });\r\n self.bind(self.cursorh, \"click\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n self.bind(self.cursorh, \"dblclick\", function (e) {\r\n self.cancelEvent(e);\r\n });\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n if (opt.cursordragontouch && (this.istouchcapable || cap.cantouch)) {\r\n self.bind(self.cursor, \"touchstart\", self.ontouchstartCursor);\r\n self.bind(self.cursor, \"touchmove\", self.ontouchmoveCursor);\r\n self.bind(self.cursor, \"touchend\", self.ontouchendCursor);\r\n self.cursorh && self.bind(self.cursorh, \"touchstart\", function (e) {\r\n self.ontouchstartCursor(e, true);\r\n });\r\n self.cursorh && self.bind(self.cursorh, \"touchmove\", self.ontouchmoveCursor);\r\n self.cursorh && self.bind(self.cursorh, \"touchend\", self.ontouchendCursor);\r\n }\r\n\r\n// if (!cap.cantouch && !opt.emulatetouch) {\r\n if (!opt.emulatetouch && !cap.isandroid && !cap.isios) {\r\n\r\n self.bind((cap.hasmousecapture) ? self.win : _doc, \"mouseup\", self.onmouseup);\r\n self.bind(_doc, \"mousemove\", self.onmousemove);\r\n if (self.onclick) self.bind(_doc, \"click\", self.onclick);\r\n\r\n self.bind(self.cursor, \"mousedown\", self.onmousedown);\r\n self.bind(self.cursor, \"mouseup\", self.onmouseup);\r\n\r\n if (self.railh) {\r\n self.bind(self.cursorh, \"mousedown\", function (e) {\r\n self.onmousedown(e, true);\r\n });\r\n self.bind(self.cursorh, \"mouseup\", self.onmouseup);\r\n }\r\n\r\n if (!self.ispage && opt.enablescrollonselection) {\r\n self.bind(self.win[0], \"mousedown\", self.onselectionstart);\r\n self.bind(_doc, \"mouseup\", self.onselectionend);\r\n self.bind(self.cursor, \"mouseup\", self.onselectionend);\r\n if (self.cursorh) self.bind(self.cursorh, \"mouseup\", self.onselectionend);\r\n self.bind(_doc, \"mousemove\", self.onselectiondrag);\r\n }\r\n\r\n if (self.zoom) {\r\n self.jqbind(self.zoom, \"mouseenter\", function () {\r\n if (self.canshowonmouseevent) self.showCursor();\r\n self.rail.active = true;\r\n });\r\n self.jqbind(self.zoom, \"mouseleave\", function () {\r\n self.rail.active = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n }\r\n\r\n } else {\r\n\r\n self.bind((cap.hasmousecapture) ? self.win : _doc, \"mouseup\", self.ontouchend);\r\n if (self.onclick) self.bind(_doc, \"click\", self.onclick);\r\n\r\n if (opt.cursordragontouch) {\r\n self.bind(self.cursor, \"mousedown\", self.onmousedown);\r\n self.bind(self.cursor, \"mouseup\", self.onmouseup);\r\n self.cursorh && self.bind(self.cursorh, \"mousedown\", function (e) {\r\n self.onmousedown(e, true);\r\n });\r\n self.cursorh && self.bind(self.cursorh, \"mouseup\", self.onmouseup);\r\n } else {\r\n self.bind(self.rail, \"mousedown\", function (e) { e.preventDefault(); }); // prevent text selection \r\n self.railh && self.bind(self.railh, \"mousedown\", function (e) { e.preventDefault(); });\r\n }\r\n\r\n }\r\n\r\n\r\n if (opt.enablemousewheel) {\r\n if (!self.isiframe) self.mousewheel((cap.isie && self.ispage) ? _doc : self.win, self.onmousewheel);\r\n self.mousewheel(self.rail, self.onmousewheel);\r\n if (self.railh) self.mousewheel(self.railh, self.onmousewheelhr);\r\n }\r\n\r\n if (!self.ispage && !cap.cantouch && !(/HTML|^BODY/.test(self.win[0].nodeName))) {\r\n if (!self.win.attr(\"tabindex\")) self.win.attr({\r\n \"tabindex\": ++tabindexcounter\r\n });\r\n\r\n self.bind(self.win, \"focus\", function (e) { // better using native events\r\n domfocus = (self.getTarget(e)).id || self.getTarget(e) || false;\r\n self.hasfocus = true;\r\n if (self.canshowonmouseevent) self.noticeCursor();\r\n });\r\n self.bind(self.win, \"blur\", function (e) { // *\r\n domfocus = false;\r\n self.hasfocus = false;\r\n });\r\n\r\n self.bind(self.win, \"mouseenter\", function (e) { // *\r\n mousefocus = (self.getTarget(e)).id || self.getTarget(e) || false;\r\n self.hasmousefocus = true;\r\n if (self.canshowonmouseevent) self.noticeCursor();\r\n });\r\n self.bind(self.win, \"mouseleave\", function (e) { // * \r\n mousefocus = false;\r\n self.hasmousefocus = false;\r\n if (!self.rail.drag) self.hideCursor();\r\n });\r\n\r\n }\r\n\r\n\r\n //Thanks to http://www.quirksmode.org !!\r\n self.onkeypress = function (e) {\r\n if (self.railslocked && self.page.maxh === 0) return true;\r\n\r\n e = e || _win.event;\r\n var tg = self.getTarget(e);\r\n if (tg && /INPUT|TEXTAREA|SELECT|OPTION/.test(tg.nodeName)) {\r\n var tp = tg.getAttribute('type') || tg.type || false;\r\n if ((!tp) || !(/submit|button|cancel/i.tp)) return true;\r\n }\r\n\r\n if ($(tg).attr('contenteditable')) return true;\r\n\r\n if (self.hasfocus || (self.hasmousefocus && !domfocus) || (self.ispage && !domfocus && !mousefocus)) {\r\n var key = e.keyCode;\r\n\r\n if (self.railslocked && key != 27) return self.cancelEvent(e);\r\n\r\n var ctrl = e.ctrlKey || false;\r\n var shift = e.shiftKey || false;\r\n\r\n var ret = false;\r\n switch (key) {\r\n case 38:\r\n case 63233: //safari\r\n self.doScrollBy(24 * 3);\r\n ret = true;\r\n break;\r\n case 40:\r\n case 63235: //safari\r\n self.doScrollBy(-24 * 3);\r\n ret = true;\r\n break;\r\n case 37:\r\n case 63232: //safari\r\n if (self.railh) {\r\n (ctrl) ? self.doScrollLeft(0) : self.doScrollLeftBy(24 * 3);\r\n ret = true;\r\n }\r\n break;\r\n case 39:\r\n case 63234: //safari\r\n if (self.railh) {\r\n (ctrl) ? self.doScrollLeft(self.page.maxw) : self.doScrollLeftBy(-24 * 3);\r\n ret = true;\r\n }\r\n break;\r\n case 33:\r\n case 63276: // safari\r\n self.doScrollBy(self.view.h);\r\n ret = true;\r\n break;\r\n case 34:\r\n case 63277: // safari\r\n self.doScrollBy(-self.view.h);\r\n ret = true;\r\n break;\r\n case 36:\r\n case 63273: // safari \r\n (self.railh && ctrl) ? self.doScrollPos(0, 0) : self.doScrollTo(0);\r\n ret = true;\r\n break;\r\n case 35:\r\n case 63275: // safari\r\n (self.railh && ctrl) ? self.doScrollPos(self.page.maxw, self.page.maxh) : self.doScrollTo(self.page.maxh);\r\n ret = true;\r\n break;\r\n case 32:\r\n if (opt.spacebarenabled) {\r\n (shift) ? self.doScrollBy(self.view.h) : self.doScrollBy(-self.view.h);\r\n ret = true;\r\n }\r\n break;\r\n case 27: // ESC\r\n if (self.zoomactive) {\r\n self.doZoom();\r\n ret = true;\r\n }\r\n break;\r\n }\r\n if (ret) return self.cancelEvent(e);\r\n }\r\n };\r\n\r\n if (opt.enablekeyboard) self.bind(_doc, (cap.isopera && !cap.isopera12) ? \"keypress\" : \"keydown\", self.onkeypress);\r\n\r\n self.bind(_doc, \"keydown\", function (e) {\r\n var ctrl = e.ctrlKey || false;\r\n if (ctrl) self.wheelprevented = true;\r\n });\r\n self.bind(_doc, \"keyup\", function (e) {\r\n var ctrl = e.ctrlKey || false;\r\n if (!ctrl) self.wheelprevented = false;\r\n });\r\n self.bind(_win, \"blur\", function (e) {\r\n self.wheelprevented = false;\r\n });\r\n\r\n self.bind(_win, 'resize', self.onscreenresize);\r\n self.bind(_win, 'orientationchange', self.onscreenresize);\r\n\r\n self.bind(_win, \"load\", self.lazyResize);\r\n\r\n if (cap.ischrome && !self.ispage && !self.haswrapper) { //chrome void scrollbar bug - it persists in version 26\r\n var tmp = self.win.attr(\"style\");\r\n var ww = parseFloat(self.win.css(\"width\")) + 1;\r\n self.win.css('width', ww);\r\n self.synched(\"chromefix\", function () {\r\n self.win.attr(\"style\", tmp);\r\n });\r\n }\r\n\r\n\r\n // Trying a cross-browser implementation - good luck!\r\n\r\n self.onAttributeChange = function (e) {\r\n self.lazyResize(self.isieold ? 250 : 30);\r\n };\r\n\r\n if (opt.enableobserver) {\r\n\r\n if ((!self.isie11) && (ClsMutationObserver !== false)) { // IE11 crashes #568\r\n self.observerbody = new ClsMutationObserver(function (mutations) {\r\n mutations.forEach(function (mut) {\r\n if (mut.type == \"attributes\") {\r\n return ($body.hasClass(\"modal-open\") && $body.hasClass(\"modal-dialog\") && !$.contains($('.modal-dialog')[0], self.doc[0])) ? self.hide() : self.show(); // Support for Bootstrap modal; Added check if the nice scroll element is inside a modal\r\n }\r\n });\r\n if (self.me.clientWidth != self.page.width || self.me.clientHeight != self.page.height) return self.lazyResize(30);\r\n });\r\n self.observerbody.observe(_doc.body, {\r\n childList: true,\r\n subtree: true,\r\n characterData: false,\r\n attributes: true,\r\n attributeFilter: ['class']\r\n });\r\n }\r\n\r\n if (!self.ispage && !self.haswrapper) {\r\n\r\n var _dom = self.win[0];\r\n\r\n // redesigned MutationObserver for Chrome18+/Firefox14+/iOS6+ with support for: remove div, add/remove content\r\n if (ClsMutationObserver !== false) {\r\n self.observer = new ClsMutationObserver(function (mutations) {\r\n mutations.forEach(self.onAttributeChange);\r\n });\r\n self.observer.observe(_dom, {\r\n childList: true,\r\n characterData: false,\r\n attributes: true,\r\n subtree: false\r\n });\r\n self.observerremover = new ClsMutationObserver(function (mutations) {\r\n mutations.forEach(function (mo) {\r\n if (mo.removedNodes.length > 0) {\r\n for (var dd in mo.removedNodes) {\r\n if (!!self && (mo.removedNodes[dd] === _dom)) return self.remove();\r\n }\r\n }\r\n });\r\n });\r\n self.observerremover.observe(_dom.parentNode, {\r\n childList: true,\r\n characterData: false,\r\n attributes: false,\r\n subtree: false\r\n });\r\n } else {\r\n self.bind(_dom, (cap.isie && !cap.isie9) ? \"propertychange\" : \"DOMAttrModified\", self.onAttributeChange);\r\n if (cap.isie9) _dom.attachEvent(\"onpropertychange\", self.onAttributeChange); //IE9 DOMAttrModified bug\r\n self.bind(_dom, \"DOMNodeRemoved\", function (e) {\r\n if (e.target === _dom) self.remove();\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n //\r\n\r\n if (!self.ispage && opt.boxzoom) self.bind(_win, \"resize\", self.resizeZoom);\r\n if (self.istextarea) {\r\n self.bind(self.win, \"keydown\", self.lazyResize);\r\n self.bind(self.win, \"mouseup\", self.lazyResize);\r\n }\r\n\r\n self.lazyResize(30);\r\n\r\n }\r\n\r\n if (this.doc[0].nodeName == 'IFRAME') {\r\n var oniframeload = function () {\r\n self.iframexd = false;\r\n var doc;\r\n try {\r\n doc = 'contentDocument' in this ? this.contentDocument : this.contentWindow._doc;\r\n var a = doc.domain;\r\n } catch (e) {\r\n self.iframexd = true;\r\n doc = false;\r\n }\r\n\r\n if (self.iframexd) {\r\n if (\"console\" in _win) console.log('NiceScroll error: policy restriced iframe');\r\n return true; //cross-domain - I can't manage this \r\n }\r\n\r\n self.forcescreen = true;\r\n\r\n if (self.isiframe) {\r\n self.iframe = {\r\n \"doc\": $(doc),\r\n \"html\": self.doc.contents().find('html')[0],\r\n \"body\": self.doc.contents().find('body')[0]\r\n };\r\n self.getContentSize = function () {\r\n return {\r\n w: Math.max(self.iframe.html.scrollWidth, self.iframe.body.scrollWidth),\r\n h: Math.max(self.iframe.html.scrollHeight, self.iframe.body.scrollHeight)\r\n };\r\n };\r\n self.docscroll = $(self.iframe.body);\r\n }\r\n\r\n if (!cap.isios && opt.iframeautoresize && !self.isiframe) {\r\n self.win.scrollTop(0); // reset position\r\n self.doc.height(\"\"); //reset height to fix browser bug\r\n var hh = Math.max(doc.getElementsByTagName('html')[0].scrollHeight, doc.body.scrollHeight);\r\n self.doc.height(hh);\r\n }\r\n self.lazyResize(30);\r\n\r\n self.css($(self.iframe.body), _scrollyhidden);\r\n\r\n if (cap.isios && self.haswrapper) {\r\n self.css($(doc.body), {\r\n '-webkit-transform': 'translate3d(0,0,0)'\r\n }); // avoid iFrame content clipping - thanks to http://blog.derraab.com/2012/04/02/avoid-iframe-content-clipping-with-css-transform-on-ios/\r\n }\r\n\r\n if ('contentWindow' in this) {\r\n self.bind(this.contentWindow, \"scroll\", self.onscroll); //IE8 & minor\r\n } else {\r\n self.bind(doc, \"scroll\", self.onscroll);\r\n }\r\n\r\n if (opt.enablemousewheel) {\r\n self.mousewheel(doc, self.onmousewheel);\r\n }\r\n\r\n if (opt.enablekeyboard) self.bind(doc, (cap.isopera) ? \"keypress\" : \"keydown\", self.onkeypress);\r\n\r\n if (cap.cantouch) {\r\n self.bind(doc, \"touchstart\", self.ontouchstart);\r\n self.bind(doc, \"touchmove\", self.ontouchmove);\r\n }\r\n else if (opt.emulatetouch) {\r\n self.bind(doc, \"mousedown\", self.ontouchstart);\r\n self.bind(doc, \"mousemove\", function (e) {\r\n return self.ontouchmove(e, true);\r\n });\r\n if (opt.grabcursorenabled && cap.cursorgrabvalue) self.css($(doc.body), {\r\n 'cursor': cap.cursorgrabvalue\r\n });\r\n }\r\n\r\n self.bind(doc, \"mouseup\", self.ontouchend);\r\n\r\n if (self.zoom) {\r\n if (opt.dblclickzoom) self.bind(doc, 'dblclick', self.doZoom);\r\n if (self.ongesturezoom) self.bind(doc, \"gestureend\", self.ongesturezoom);\r\n }\r\n };\r\n\r\n if (this.doc[0].readyState && this.doc[0].readyState === \"complete\") {\r\n setTimeout(function () {\r\n oniframeload.call(self.doc[0], false);\r\n }, 500);\r\n }\r\n self.bind(this.doc, \"load\", oniframeload);\r\n\r\n }\r\n\r\n };\r\n\r\n this.showCursor = function (py, px) {\r\n if (self.cursortimeout) {\r\n clearTimeout(self.cursortimeout);\r\n self.cursortimeout = 0;\r\n }\r\n if (!self.rail) return;\r\n if (self.autohidedom) {\r\n self.autohidedom.stop().css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n self.cursoractive = true;\r\n }\r\n\r\n if (!self.rail.drag || self.rail.drag.pt != 1) {\r\n if (py !== undefined && py !== false) {\r\n self.scroll.y = (py / self.scrollratio.y) | 0;\r\n }\r\n if (px !== undefined) {\r\n self.scroll.x = (px / self.scrollratio.x) | 0;\r\n }\r\n }\r\n\r\n self.cursor.css({\r\n height: self.cursorheight,\r\n top: self.scroll.y\r\n });\r\n if (self.cursorh) {\r\n var lx = (self.hasreversehr) ? self.scrollvaluemaxw - self.scroll.x : self.scroll.x;\r\n self.cursorh.css({\r\n width: self.cursorwidth,\r\n left: (!self.rail.align && self.rail.visibility) ? lx + self.rail.width : lx\r\n });\r\n self.cursoractive = true;\r\n }\r\n\r\n if (self.zoom) self.zoom.stop().css({\r\n opacity: opt.cursoropacitymax\r\n });\r\n };\r\n\r\n this.hideCursor = function (tm) {\r\n if (self.cursortimeout) return;\r\n if (!self.rail) return;\r\n if (!self.autohidedom) return;\r\n\r\n if (self.hasmousefocus && opt.autohidemode === \"leave\") return;\r\n self.cursortimeout = setTimeout(function () {\r\n if (!self.rail.active || !self.showonmouseevent) {\r\n self.autohidedom.stop().animate({\r\n opacity: opt.cursoropacitymin\r\n });\r\n if (self.zoom) self.zoom.stop().animate({\r\n opacity: opt.cursoropacitymin\r\n });\r\n self.cursoractive = false;\r\n }\r\n self.cursortimeout = 0;\r\n }, tm || opt.hidecursordelay);\r\n };\r\n\r\n this.noticeCursor = function (tm, py, px) {\r\n self.showCursor(py, px);\r\n if (!self.rail.active) self.hideCursor(tm);\r\n };\r\n\r\n this.getContentSize =\r\n (self.ispage) ?\r\n function () {\r\n return {\r\n w: Math.max(_doc.body.scrollWidth, _doc.documentElement.scrollWidth),\r\n h: Math.max(_doc.body.scrollHeight, _doc.documentElement.scrollHeight)\r\n };\r\n } : (self.haswrapper) ?\r\n function () {\r\n return {\r\n w: self.doc[0].offsetWidth,\r\n h: self.doc[0].offsetHeight\r\n };\r\n } : function () {\r\n return {\r\n w: self.docscroll[0].scrollWidth,\r\n h: self.docscroll[0].scrollHeight\r\n };\r\n };\r\n\r\n this.onResize = function (e, page) {\r\n\r\n if (!self || !self.win) return false;\r\n\r\n var premaxh = self.page.maxh,\r\n premaxw = self.page.maxw,\r\n previewh = self.view.h,\r\n previeww = self.view.w;\r\n\r\n self.view = {\r\n w: (self.ispage) ? self.win.width() : self.win[0].clientWidth,\r\n h: (self.ispage) ? self.win.height() : self.win[0].clientHeight\r\n };\r\n\r\n self.page = (page) ? page : self.getContentSize();\r\n\r\n self.page.maxh = Math.max(0, self.page.h - self.view.h);\r\n self.page.maxw = Math.max(0, self.page.w - self.view.w);\r\n\r\n if ((self.page.maxh == premaxh) && (self.page.maxw == premaxw) && (self.view.w == previeww) && (self.view.h == previewh)) {\r\n // test position \r\n if (!self.ispage) {\r\n var pos = self.win.offset();\r\n if (self.lastposition) {\r\n var lst = self.lastposition;\r\n if ((lst.top == pos.top) && (lst.left == pos.left)) return self; //nothing to do \r\n }\r\n self.lastposition = pos;\r\n } else {\r\n return self; //nothing to do\r\n }\r\n }\r\n\r\n if (self.page.maxh === 0) {\r\n self.hideRail();\r\n self.scrollvaluemax = 0;\r\n self.scroll.y = 0;\r\n self.scrollratio.y = 0;\r\n self.cursorheight = 0;\r\n self.setScrollTop(0);\r\n if (self.rail) self.rail.scrollable = false;\r\n } else {\r\n self.page.maxh -= (opt.railpadding.top + opt.railpadding.bottom);\r\n self.rail.scrollable = true;\r\n }\r\n\r\n if (self.page.maxw === 0) {\r\n self.hideRailHr();\r\n self.scrollvaluemaxw = 0;\r\n self.scroll.x = 0;\r\n self.scrollratio.x = 0;\r\n self.cursorwidth = 0;\r\n self.setScrollLeft(0);\r\n if (self.railh) {\r\n self.railh.scrollable = false;\r\n }\r\n } else {\r\n self.page.maxw -= (opt.railpadding.left + opt.railpadding.right);\r\n if (self.railh) self.railh.scrollable = (opt.horizrailenabled);\r\n }\r\n\r\n self.railslocked = (self.locked) || ((self.page.maxh === 0) && (self.page.maxw === 0));\r\n if (self.railslocked) {\r\n if (!self.ispage) self.updateScrollBar(self.view);\r\n return false;\r\n }\r\n\r\n if (!self.hidden) {\r\n if (!self.rail.visibility) self.showRail();\r\n if (self.railh && !self.railh.visibility) self.showRailHr();\r\n }\r\n\r\n if (self.istextarea && self.win.css('resize') && self.win.css('resize') != 'none') self.view.h -= 20;\r\n\r\n self.cursorheight = Math.min(self.view.h, Math.round(self.view.h * (self.view.h / self.page.h)));\r\n self.cursorheight = (opt.cursorfixedheight) ? opt.cursorfixedheight : Math.max(opt.cursorminheight, self.cursorheight);\r\n\r\n self.cursorwidth = Math.min(self.view.w, Math.round(self.view.w * (self.view.w / self.page.w)));\r\n self.cursorwidth = (opt.cursorfixedheight) ? opt.cursorfixedheight : Math.max(opt.cursorminheight, self.cursorwidth);\r\n\r\n self.scrollvaluemax = self.view.h - self.cursorheight - (opt.railpadding.top + opt.railpadding.bottom);\r\n if (!self.hasborderbox) self.scrollvaluemax -= self.cursor[0].offsetHeight - self.cursor[0].clientHeight;\r\n\r\n if (self.railh) {\r\n self.railh.width = (self.page.maxh > 0) ? (self.view.w - self.rail.width) : self.view.w;\r\n self.scrollvaluemaxw = self.railh.width - self.cursorwidth - (opt.railpadding.left + opt.railpadding.right);\r\n }\r\n\r\n if (!self.ispage) self.updateScrollBar(self.view);\r\n\r\n self.scrollratio = {\r\n x: (self.page.maxw / self.scrollvaluemaxw),\r\n y: (self.page.maxh / self.scrollvaluemax)\r\n };\r\n\r\n var sy = self.getScrollTop();\r\n if (sy > self.page.maxh) {\r\n self.doScrollTop(self.page.maxh);\r\n } else {\r\n self.scroll.y = (self.getScrollTop() / self.scrollratio.y) | 0;\r\n self.scroll.x = (self.getScrollLeft() / self.scrollratio.x) | 0;\r\n if (self.cursoractive) self.noticeCursor();\r\n }\r\n\r\n if (self.scroll.y && (self.getScrollTop() === 0)) self.doScrollTo((self.scroll.y * self.scrollratio.y)|0);\r\n\r\n return self;\r\n };\r\n\r\n this.resize = self.onResize;\r\n\r\n var hlazyresize = 0;\r\n\r\n this.onscreenresize = function(e) {\r\n clearTimeout(hlazyresize);\r\n\r\n var hiderails = (!self.ispage && !self.haswrapper);\r\n if (hiderails) self.hideRails();\r\n\r\n hlazyresize = setTimeout(function () {\r\n if (self) {\r\n if (hiderails) self.showRails();\r\n self.resize();\r\n }\r\n hlazyresize=0;\r\n }, 120);\r\n };\r\n\r\n this.lazyResize = function (tm) { // event debounce\r\n\r\n clearTimeout(hlazyresize);\r\n\r\n tm = isNaN(tm) ? 240 : tm;\r\n\r\n hlazyresize = setTimeout(function () {\r\n self && self.resize();\r\n hlazyresize=0;\r\n }, tm);\r\n\r\n return self;\r\n\r\n };\r\n\r\n // derived by MDN https://developer.mozilla.org/en-US/docs/DOM/Mozilla_event_reference/wheel\r\n function _modernWheelEvent(dom, name, fn, bubble) {\r\n self._bind(dom, name, function (e) {\r\n e = e || _win.event;\r\n var event = {\r\n original: e,\r\n target: e.target || e.srcElement,\r\n type: \"wheel\",\r\n deltaMode: e.type == \"MozMousePixelScroll\" ? 0 : 1,\r\n deltaX: 0,\r\n deltaZ: 0,\r\n preventDefault: function () {\r\n e.preventDefault ? e.preventDefault() : e.returnValue = false;\r\n return false;\r\n },\r\n stopImmediatePropagation: function () {\r\n (e.stopImmediatePropagation) ? e.stopImmediatePropagation() : e.cancelBubble = true;\r\n }\r\n };\r\n\r\n if (name == \"mousewheel\") {\r\n e.wheelDeltaX && (event.deltaX = -1 / 40 * e.wheelDeltaX);\r\n e.wheelDeltaY && (event.deltaY = -1 / 40 * e.wheelDeltaY);\r\n !event.deltaY && !event.deltaX && (event.deltaY = -1 / 40 * e.wheelDelta);\r\n } else {\r\n event.deltaY = e.detail;\r\n }\r\n\r\n return fn.call(dom, event);\r\n }, bubble);\r\n }\r\n\r\n\r\n\r\n this.jqbind = function (dom, name, fn) { // use jquery bind for non-native events (mouseenter/mouseleave)\r\n self.events.push({\r\n e: dom,\r\n n: name,\r\n f: fn,\r\n q: true\r\n });\r\n $(dom).on(name, fn);\r\n };\r\n\r\n this.mousewheel = function (dom, fn, bubble) { // bind mousewheel\r\n var el = (\"jquery\" in dom) ? dom[0] : dom;\r\n if (\"onwheel\" in _doc.createElement(\"div\")) { // Modern browsers support \"wheel\"\r\n self._bind(el, \"wheel\", fn, bubble || false);\r\n } else {\r\n var wname = (_doc.onmousewheel !== undefined) ? \"mousewheel\" : \"DOMMouseScroll\"; // older Webkit+IE support or older Firefox \r\n _modernWheelEvent(el, wname, fn, bubble || false);\r\n if (wname == \"DOMMouseScroll\") _modernWheelEvent(el, \"MozMousePixelScroll\", fn, bubble || false); // Firefox legacy\r\n }\r\n };\r\n\r\n var passiveSupported = false;\r\n\r\n if (cap.haseventlistener) { // W3C standard event model\r\n\r\n // thanks to https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\r\n try { var options = Object.defineProperty({}, \"passive\", { get: function () { passiveSupported = !0; } }); _win.addEventListener(\"test\", null, options); } catch (err) { }\r\n\r\n this.stopPropagation = function (e) {\r\n if (!e) return false;\r\n e = (e.original) ? e.original : e;\r\n e.stopPropagation();\r\n return false;\r\n };\r\n\r\n this.cancelEvent = function(e) {\r\n if (e.cancelable) e.preventDefault();\r\n e.stopImmediatePropagation();\r\n if (e.preventManipulation) e.preventManipulation(); // IE10+\r\n return false;\r\n }; \r\n\r\n } else {\r\n\r\n // inspired from https://gist.github.com/jonathantneal/2415137 \r\n\r\n Event.prototype.preventDefault = function () {\r\n this.returnValue = false;\r\n };\r\n\r\n Event.prototype.stopPropagation = function () {\r\n this.cancelBubble = true;\r\n };\r\n\r\n _win.constructor.prototype.addEventListener = _doc.constructor.prototype.addEventListener = Element.prototype.addEventListener = function (type, listener, useCapture) {\r\n this.attachEvent(\"on\" + type, listener);\r\n };\r\n _win.constructor.prototype.removeEventListener = _doc.constructor.prototype.removeEventListener = Element.prototype.removeEventListener = function (type, listener, useCapture) {\r\n this.detachEvent(\"on\" + type, listener);\r\n };\r\n\r\n // Thanks to http://www.switchonthecode.com !!\r\n this.cancelEvent = function (e) {\r\n e = e || _win.event;\r\n if (e) { \r\n e.cancelBubble = true;\r\n e.cancel = true;\r\n e.returnValue = false;\r\n } \r\n return false;\r\n };\r\n\r\n this.stopPropagation = function (e) {\r\n e = e || _win.event;\r\n if (e) e.cancelBubble = true;\r\n return false;\r\n };\r\n\r\n }\r\n\r\n this.delegate = function (dom, name, fn, bubble, active) {\r\n\r\n var de = delegatevents[name] || false;\r\n\r\n if (!de) {\r\n\r\n de = {\r\n a: [],\r\n l: [],\r\n f: function (e) {\r\n var lst = de.l, l = lst.length - 1;\r\n var r = false;\r\n for (var a = l; a >= 0; a--) {\r\n r = lst[a].call(e.target, e);\r\n if (r === false) return false;\r\n }\r\n return r;\r\n }\r\n };\r\n\r\n self.bind(dom, name, de.f, bubble, active);\r\n\r\n delegatevents[name] = de;\r\n\r\n }\r\n\r\n if (self.ispage) {\r\n de.a = [self.id].concat(de.a);\r\n de.l = [fn].concat(de.l);\r\n } else {\r\n de.a.push(self.id);\r\n de.l.push(fn); \r\n }\r\n\r\n };\r\n\r\n this.undelegate = function (dom, name, fn, bubble, active) {\r\n var de = delegatevents[name]||false;\r\n if (de&&de.l) { // quick fix #683\r\n for (var a=0,l=de.l.length;a<l;a++) {\r\n if (de.a[a] === self.id) {\r\n de.a.splice(a);\r\n de.l.splice(a);\r\n if (de.a.length===0) {\r\n self._unbind(dom,name,de.l.f);\r\n delegatevents[name] = null;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n this.bind = function (dom, name, fn, bubble, active) {\r\n var el = (\"jquery\" in dom) ? dom[0] : dom;\r\n self._bind(el, name, fn, bubble || false, active || false);\r\n };\r\n\r\n this._bind = function (el, name, fn, bubble, active) { // primitive bind\r\n\r\n self.events.push({\r\n e: el,\r\n n: name,\r\n f: fn,\r\n b: bubble,\r\n q: false\r\n });\r\n\r\n (passiveSupported && active) ? el.addEventListener(name, fn, { passive: false, capture: bubble }) : el.addEventListener(name, fn, bubble || false);\r\n };\r\n\r\n this._unbind = function (el, name, fn, bub) { // primitive unbind\r\n if (delegatevents[name]) self.undelegate(el, name, fn, bub);\r\n else el.removeEventListener(name, fn, bub);\r\n };\r\n\r\n this.unbindAll = function () {\r\n for (var a = 0; a < self.events.length; a++) {\r\n var r = self.events[a];\r\n (r.q) ? r.e.unbind(r.n, r.f) : self._unbind(r.e, r.n, r.f, r.b);\r\n }\r\n };\r\n\r\n this.showRails = function () {\r\n return self.showRail().showRailHr();\r\n };\r\n\r\n this.showRail = function () {\r\n if ((self.page.maxh !== 0) && (self.ispage || self.win.css('display') != 'none')) {\r\n //self.visibility = true;\r\n self.rail.visibility = true;\r\n self.rail.css('display', 'block');\r\n }\r\n return self;\r\n };\r\n\r\n this.showRailHr = function () {\r\n if (self.railh) {\r\n if ((self.page.maxw !== 0) && (self.ispage || self.win.css('display') != 'none')) {\r\n self.railh.visibility = true;\r\n self.railh.css('display', 'block');\r\n }\r\n }\r\n return self;\r\n };\r\n\r\n this.hideRails = function () {\r\n return self.hideRail().hideRailHr();\r\n };\r\n\r\n this.hideRail = function () {\r\n //self.visibility = false;\r\n self.rail.visibility = false;\r\n self.rail.css('display', 'none');\r\n return self;\r\n };\r\n\r\n this.hideRailHr = function () {\r\n if (self.railh) {\r\n self.railh.visibility = false;\r\n self.railh.css('display', 'none');\r\n }\r\n return self;\r\n };\r\n\r\n this.show = function () {\r\n self.hidden = false;\r\n self.railslocked = false;\r\n return self.showRails();\r\n };\r\n\r\n this.hide = function () {\r\n self.hidden = true;\r\n self.railslocked = true;\r\n return self.hideRails();\r\n };\r\n\r\n this.toggle = function () {\r\n return (self.hidden) ? self.show() : self.hide();\r\n };\r\n\r\n this.remove = function () {\r\n self.stop();\r\n if (self.cursortimeout) clearTimeout(self.cursortimeout);\r\n for (var n in self.delaylist) if (self.delaylist[n]) clearAnimationFrame(self.delaylist[n].h);\r\n self.doZoomOut();\r\n self.unbindAll();\r\n\r\n if (cap.isie9) self.win[0].detachEvent(\"onpropertychange\", self.onAttributeChange); //IE9 DOMAttrModified bug\r\n\r\n if (self.observer !== false) self.observer.disconnect();\r\n if (self.observerremover !== false) self.observerremover.disconnect();\r\n if (self.observerbody !== false) self.observerbody.disconnect();\r\n\r\n self.events = null;\r\n\r\n if (self.cursor) {\r\n self.cursor.remove();\r\n }\r\n if (self.cursorh) {\r\n self.cursorh.remove();\r\n }\r\n if (self.rail) {\r\n self.rail.remove();\r\n }\r\n if (self.railh) {\r\n self.railh.remove();\r\n }\r\n if (self.zoom) {\r\n self.zoom.remove();\r\n }\r\n for (var a = 0; a < self.saved.css.length; a++) {\r\n var d = self.saved.css[a];\r\n d[0].css(d[1], (d[2] === undefined) ? '' : d[2]);\r\n }\r\n self.saved = false;\r\n self.me.data('__nicescroll', ''); //erase all traces\r\n\r\n // memory leak fixed by GianlucaGuarini - thanks a lot!\r\n // remove the current nicescroll from the $.nicescroll array & normalize array\r\n var lst = $.nicescroll;\r\n lst.each(function (i) {\r\n if (!this) return;\r\n if (this.id === self.id) {\r\n delete lst[i];\r\n for (var b = ++i; b < lst.length; b++ , i++) lst[i] = lst[b];\r\n lst.length--;\r\n if (lst.length) delete lst[lst.length];\r\n }\r\n });\r\n\r\n for (var i in self) {\r\n self[i] = null;\r\n delete self[i];\r\n }\r\n\r\n self = null;\r\n\r\n };\r\n\r\n this.scrollstart = function (fn) {\r\n this.onscrollstart = fn;\r\n return self;\r\n };\r\n this.scrollend = function (fn) {\r\n this.onscrollend = fn;\r\n return self;\r\n };\r\n this.scrollcancel = function (fn) {\r\n this.onscrollcancel = fn;\r\n return self;\r\n };\r\n\r\n this.zoomin = function (fn) {\r\n this.onzoomin = fn;\r\n return self;\r\n };\r\n this.zoomout = function (fn) {\r\n this.onzoomout = fn;\r\n return self;\r\n };\r\n\r\n this.isScrollable = function (e) {\r\n var dom = (e.target) ? e.target : e;\r\n if (dom.nodeName == 'OPTION') return true;\r\n while (dom && (dom.nodeType == 1) && (dom !== this.me[0]) && !(/^BODY|HTML/.test(dom.nodeName))) {\r\n var dd = $(dom);\r\n var ov = dd.css('overflowY') || dd.css('overflowX') || dd.css('overflow') || '';\r\n if (/scroll|auto/.test(ov)) return (dom.clientHeight != dom.scrollHeight);\r\n dom = (dom.parentNode) ? dom.parentNode : false;\r\n }\r\n return false;\r\n };\r\n\r\n this.getViewport = function (me) {\r\n var dom = (me && me.parentNode) ? me.parentNode : false;\r\n while (dom && (dom.nodeType == 1) && !(/^BODY|HTML/.test(dom.nodeName))) {\r\n var dd = $(dom);\r\n if (/fixed|absolute/.test(dd.css(\"position\"))) return dd;\r\n var ov = dd.css('overflowY') || dd.css('overflowX') || dd.css('overflow') || '';\r\n if ((/scroll|auto/.test(ov)) && (dom.clientHeight != dom.scrollHeight)) return dd;\r\n if (dd.getNiceScroll().length > 0) return dd;\r\n dom = (dom.parentNode) ? dom.parentNode : false;\r\n }\r\n return false;\r\n };\r\n\r\n this.triggerScrollStart = function (cx, cy, rx, ry, ms) {\r\n\r\n if (self.onscrollstart) {\r\n var info = {\r\n type: \"scrollstart\",\r\n current: {\r\n x: cx,\r\n y: cy\r\n },\r\n request: {\r\n x: rx,\r\n y: ry\r\n },\r\n end: {\r\n x: self.newscrollx,\r\n y: self.newscrolly\r\n },\r\n speed: ms\r\n };\r\n self.onscrollstart.call(self, info);\r\n }\r\n\r\n };\r\n\r\n this.triggerScrollEnd = function () {\r\n if (self.onscrollend) {\r\n\r\n var px = self.getScrollLeft();\r\n var py = self.getScrollTop();\r\n\r\n var info = {\r\n type: \"scrollend\",\r\n current: {\r\n x: px,\r\n y: py\r\n },\r\n end: {\r\n x: px,\r\n y: py\r\n }\r\n };\r\n\r\n self.onscrollend.call(self, info);\r\n\r\n }\r\n\r\n };\r\n\r\n var scrolldiry = 0, scrolldirx = 0, scrolltmr = 0, scrollspd = 1;\r\n\r\n function doScrollRelative(px, py, chkscroll, iswheel) {\r\n\r\n if (!self.scrollrunning) {\r\n self.newscrolly = self.getScrollTop();\r\n self.newscrollx = self.getScrollLeft();\r\n scrolltmr = now();\r\n }\r\n\r\n var gap = (now() - scrolltmr);\r\n scrolltmr = now();\r\n\r\n if (gap > 350) {\r\n scrollspd = 1;\r\n } else {\r\n scrollspd += (2 - scrollspd) / 10;\r\n }\r\n\r\n px = px * scrollspd | 0;\r\n py = py * scrollspd | 0;\r\n\r\n if (px) {\r\n\r\n if (iswheel) { // mouse-only\r\n if (px < 0) { // fix apple magic mouse swipe back/forward\r\n if (self.getScrollLeft() >= self.page.maxw) return true;\r\n } else {\r\n if (self.getScrollLeft() <= 0) return true;\r\n }\r\n }\r\n\r\n var dx = px > 0 ? 1 : -1;\r\n\r\n if (scrolldirx !== dx) {\r\n if (self.scrollmom) self.scrollmom.stop();\r\n self.newscrollx = self.getScrollLeft();\r\n scrolldirx = dx;\r\n }\r\n\r\n self.lastdeltax -= px;\r\n\r\n }\r\n\r\n if (py) {\r\n\r\n var chk = (function () {\r\n var top = self.getScrollTop();\r\n if (py < 0) {\r\n if (top >= self.page.maxh) return true;\r\n } else {\r\n if (top <= 0) return true;\r\n }\r\n })();\r\n\r\n if (chk) {\r\n if (opt.nativeparentscrolling && chkscroll && !self.ispage && !self.zoomactive) return true;\r\n var ny = self.view.h >> 1;\r\n if (self.newscrolly < -ny) { self.newscrolly = -ny; py = -1; }\r\n else if (self.newscrolly > self.page.maxh + ny) { self.newscrolly = self.page.maxh + ny; py = 1; }\r\n else py = 0;\r\n }\r\n\r\n var dy = py > 0 ? 1 : -1;\r\n\r\n if (scrolldiry !== dy) {\r\n if (self.scrollmom) self.scrollmom.stop();\r\n self.newscrolly = self.getScrollTop();\r\n scrolldiry = dy;\r\n }\r\n\r\n self.lastdeltay -= py;\r\n\r\n }\r\n\r\n if (py || px) {\r\n self.synched(\"relativexy\", function () {\r\n\r\n var dty = self.lastdeltay + self.newscrolly;\r\n self.lastdeltay = 0;\r\n\r\n var dtx = self.lastdeltax + self.newscrollx;\r\n self.lastdeltax = 0;\r\n\r\n if (!self.rail.drag) self.doScrollPos(dtx, dty);\r\n\r\n });\r\n }\r\n\r\n }\r\n\r\n var hasparentscrollingphase = false;\r\n\r\n function execScrollWheel(e, hr, chkscroll) {\r\n var px, py;\r\n\r\n if (!chkscroll && hasparentscrollingphase) return true;\r\n\r\n if (e.deltaMode === 0) { // PIXEL\r\n px = -(e.deltaX * (opt.mousescrollstep / (18 * 3))) | 0;\r\n py = -(e.deltaY * (opt.mousescrollstep / (18 * 3))) | 0;\r\n } else if (e.deltaMode === 1) { // LINE\r\n px = -(e.deltaX * opt.mousescrollstep * 50 / 80) | 0;\r\n py = -(e.deltaY * opt.mousescrollstep * 50 / 80) | 0;\r\n }\r\n\r\n if (hr && opt.oneaxismousemode && (px === 0) && py) { // classic vertical-only mousewheel + browser with x/y support \r\n px = py;\r\n py = 0;\r\n\r\n if (chkscroll) {\r\n var hrend = (px < 0) ? (self.getScrollLeft() >= self.page.maxw) : (self.getScrollLeft() <= 0);\r\n if (hrend) { // preserve vertical scrolling\r\n py = px;\r\n px = 0;\r\n }\r\n }\r\n\r\n }\r\n\r\n // invert horizontal direction for rtl mode\r\n if (self.isrtlmode) px = -px;\r\n\r\n var chk = doScrollRelative(px, py, chkscroll, true);\r\n\r\n if (chk) {\r\n if (chkscroll) hasparentscrollingphase = true;\r\n } else {\r\n hasparentscrollingphase = false;\r\n e.stopImmediatePropagation();\r\n return e.preventDefault();\r\n }\r\n\r\n }\r\n\r\n this.onmousewheel = function (e) {\r\n if (self.wheelprevented||self.locked) return false;\r\n if (self.railslocked) {\r\n self.debounced(\"checkunlock\", self.resize, 250);\r\n return false;\r\n }\r\n if (self.rail.drag) return self.cancelEvent(e);\r\n\r\n if (opt.oneaxismousemode === \"auto\" && e.deltaX !== 0) opt.oneaxismousemode = false; // check two-axis mouse support (not very elegant)\r\n\r\n if (opt.oneaxismousemode && e.deltaX === 0) {\r\n if (!self.rail.scrollable) {\r\n if (self.railh && self.railh.scrollable) {\r\n return self.onmousewheelhr(e);\r\n } else {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n var nw = now();\r\n var chk = false;\r\n if (opt.preservenativescrolling && ((self.checkarea + 600) < nw)) {\r\n self.nativescrollingarea = self.isScrollable(e);\r\n chk = true;\r\n }\r\n self.checkarea = nw;\r\n if (self.nativescrollingarea) return true; // this isn't my business\r\n var ret = execScrollWheel(e, false, chk);\r\n if (ret) self.checkarea = 0;\r\n return ret;\r\n };\r\n\r\n this.onmousewheelhr = function (e) {\r\n if (self.wheelprevented) return;\r\n if (self.railslocked || !self.railh.scrollable) return true;\r\n if (self.rail.drag) return self.cancelEvent(e);\r\n\r\n var nw = now();\r\n var chk = false;\r\n if (opt.preservenativescrolling && ((self.checkarea + 600) < nw)) {\r\n self.nativescrollingarea = self.isScrollable(e);\r\n chk = true;\r\n }\r\n self.checkarea = nw;\r\n if (self.nativescrollingarea) return true; // this is not my business\r\n if (self.railslocked) return self.cancelEvent(e);\r\n\r\n return execScrollWheel(e, true, chk);\r\n };\r\n\r\n this.stop = function () {\r\n self.cancelScroll();\r\n if (self.scrollmon) self.scrollmon.stop();\r\n self.cursorfreezed = false;\r\n self.scroll.y = Math.round(self.getScrollTop() * (1 / self.scrollratio.y));\r\n self.noticeCursor();\r\n return self;\r\n };\r\n\r\n this.getTransitionSpeed = function (dif) {\r\n\r\n return 80 + (dif / 72) * opt.scrollspeed |0;\r\n\r\n };\r\n\r\n if (!opt.smoothscroll) {\r\n this.doScrollLeft = function (x, spd) { //direct\r\n var y = self.getScrollTop();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n this.doScrollTop = function (y, spd) { //direct\r\n var x = self.getScrollLeft();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n this.doScrollPos = function (x, y, spd) { //direct\r\n var nx = (x > self.page.maxw) ? self.page.maxw : x;\r\n if (nx < 0) nx = 0;\r\n var ny = (y > self.page.maxh) ? self.page.maxh : y;\r\n if (ny < 0) ny = 0;\r\n self.synched('scroll', function () {\r\n self.setScrollTop(ny);\r\n self.setScrollLeft(nx);\r\n });\r\n };\r\n this.cancelScroll = function () { }; // direct\r\n\r\n } else if (self.ishwscroll && cap.hastransition && opt.usetransition && !!opt.smoothscroll) {\r\n\r\n var lasttransitionstyle = '';\r\n\r\n this.resetTransition = function () {\r\n lasttransitionstyle = '';\r\n self.doc.css(cap.prefixstyle + 'transition-duration', '0ms');\r\n };\r\n\r\n this.prepareTransition = function (dif, istime) {\r\n var ex = (istime) ? dif : self.getTransitionSpeed(dif);\r\n var trans = ex + 'ms';\r\n if (lasttransitionstyle !== trans) {\r\n lasttransitionstyle = trans;\r\n self.doc.css(cap.prefixstyle + 'transition-duration', trans);\r\n }\r\n return ex;\r\n };\r\n\r\n this.doScrollLeft = function (x, spd) { //trans\r\n var y = (self.scrollrunning) ? self.newscrolly : self.getScrollTop();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.doScrollTop = function (y, spd) { //trans\r\n var x = (self.scrollrunning) ? self.newscrollx : self.getScrollLeft();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.cursorupdate = {\r\n running: false,\r\n start: function () {\r\n var m = this;\r\n\r\n if (m.running) return;\r\n m.running = true;\r\n\r\n var loop = function () {\r\n if (m.running) setAnimationFrame(loop);\r\n self.showCursor(self.getScrollTop(), self.getScrollLeft());\r\n self.notifyScrollEvent(self.win[0]);\r\n };\r\n\r\n setAnimationFrame(loop);\r\n },\r\n stop: function () {\r\n this.running = false;\r\n }\r\n };\r\n\r\n this.doScrollPos = function (x, y, spd) { //trans\r\n\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n\r\n if (((self.newscrolly - py) * (y - py) < 0) || ((self.newscrollx - px) * (x - px) < 0)) self.cancelScroll(); //inverted movement detection \r\n\r\n if (!opt.bouncescroll) {\r\n if (y < 0) y = 0;\r\n else if (y > self.page.maxh) y = self.page.maxh;\r\n if (x < 0) x = 0;\r\n else if (x > self.page.maxw) x = self.page.maxw;\r\n } else {\r\n if (y < 0) y = y / 2 | 0;\r\n else if (y > self.page.maxh) y = self.page.maxh + (y - self.page.maxh) / 2 | 0;\r\n if (x < 0) x = x / 2 | 0;\r\n else if (x > self.page.maxw) x = self.page.maxw + (x - self.page.maxw) / 2 | 0;\r\n }\r\n\r\n if (self.scrollrunning && x == self.newscrollx && y == self.newscrolly) return false;\r\n\r\n self.newscrolly = y;\r\n self.newscrollx = x;\r\n\r\n var top = self.getScrollTop();\r\n var lft = self.getScrollLeft();\r\n\r\n var dst = {};\r\n dst.x = x - lft;\r\n dst.y = y - top;\r\n\r\n var dd = Math.sqrt((dst.x * dst.x) + (dst.y * dst.y)) | 0;\r\n\r\n var ms = self.prepareTransition(dd);\r\n\r\n if (!self.scrollrunning) {\r\n self.scrollrunning = true;\r\n self.triggerScrollStart(lft, top, x, y, ms);\r\n self.cursorupdate.start();\r\n }\r\n\r\n self.scrollendtrapped = true;\r\n\r\n if (!cap.transitionend) {\r\n if (self.scrollendtrapped) clearTimeout(self.scrollendtrapped);\r\n self.scrollendtrapped = setTimeout(self.onScrollTransitionEnd, ms); // simulate transitionend event\r\n }\r\n\r\n self.setScrollTop(self.newscrolly);\r\n self.setScrollLeft(self.newscrollx);\r\n\r\n };\r\n\r\n this.cancelScroll = function () {\r\n if (!self.scrollendtrapped) return true;\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n self.scrollrunning = false;\r\n if (!cap.transitionend) clearTimeout(cap.transitionend);\r\n self.scrollendtrapped = false;\r\n self.resetTransition();\r\n self.setScrollTop(py); // fire event onscroll\r\n if (self.railh) self.setScrollLeft(px);\r\n if (self.timerscroll && self.timerscroll.tm) clearInterval(self.timerscroll.tm);\r\n self.timerscroll = false;\r\n\r\n self.cursorfreezed = false;\r\n\r\n self.cursorupdate.stop();\r\n self.showCursor(py, px);\r\n return self;\r\n };\r\n\r\n this.onScrollTransitionEnd = function () {\r\n\r\n if (!self.scrollendtrapped) return;\r\n\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n\r\n if (py < 0) py = 0;\r\n else if (py > self.page.maxh) py = self.page.maxh;\r\n if (px < 0) px = 0;\r\n else if (px > self.page.maxw) px = self.page.maxw;\r\n if ((py != self.newscrolly) || (px != self.newscrollx)) return self.doScrollPos(px, py, opt.snapbackspeed);\r\n\r\n if (self.scrollrunning) self.triggerScrollEnd();\r\n self.scrollrunning = false;\r\n\r\n self.scrollendtrapped = false;\r\n self.resetTransition();\r\n self.timerscroll = false;\r\n self.setScrollTop(py); // fire event onscroll \r\n if (self.railh) self.setScrollLeft(px); // fire event onscroll left\r\n\r\n self.cursorupdate.stop();\r\n self.noticeCursor(false, py, px);\r\n\r\n self.cursorfreezed = false;\r\n\r\n };\r\n\r\n } else {\r\n\r\n this.doScrollLeft = function (x, spd) { //no-trans\r\n var y = (self.scrollrunning) ? self.newscrolly : self.getScrollTop();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.doScrollTop = function (y, spd) { //no-trans\r\n var x = (self.scrollrunning) ? self.newscrollx : self.getScrollLeft();\r\n self.doScrollPos(x, y, spd);\r\n };\r\n\r\n this.doScrollPos = function (x, y, spd) { //no-trans\r\n\r\n var py = self.getScrollTop();\r\n var px = self.getScrollLeft();\r\n\r\n if (((self.newscrolly - py) * (y - py) < 0) || ((self.newscrollx - px) * (x - px) < 0)) self.cancelScroll(); //inverted movement detection\r\n\r\n var clipped = false;\r\n\r\n if (!self.bouncescroll || !self.rail.visibility) {\r\n if (y < 0) {\r\n y = 0;\r\n clipped = true;\r\n } else if (y > self.page.maxh) {\r\n y = self.page.maxh;\r\n clipped = true;\r\n }\r\n }\r\n if (!self.bouncescroll || !self.railh.visibility) {\r\n if (x < 0) {\r\n x = 0;\r\n clipped = true;\r\n } else if (x > self.page.maxw) {\r\n x = self.page.maxw;\r\n clipped = true;\r\n }\r\n }\r\n\r\n if (self.scrollrunning && (self.newscrolly === y) && (self.newscrollx === x)) return true;\r\n\r\n self.newscrolly = y;\r\n self.newscrollx = x;\r\n\r\n self.dst = {};\r\n self.dst.x = x - px;\r\n self.dst.y = y - py;\r\n self.dst.px = px;\r\n self.dst.py = py;\r\n\r\n var dd = Math.sqrt((self.dst.x * self.dst.x) + (self.dst.y * self.dst.y)) | 0;\r\n var ms = self.getTransitionSpeed(dd);\r\n\r\n self.bzscroll = {};\r\n\r\n var p3 = (clipped) ? 1 : 0.58;\r\n self.bzscroll.x = new BezierClass(px, self.newscrollx, ms, 0, 0, p3, 1);\r\n self.bzscroll.y = new BezierClass(py, self.newscrolly, ms, 0, 0, p3, 1);\r\n\r\n var loopid = now();\r\n\r\n var loop = function () {\r\n\r\n if (!self.scrollrunning) return;\r\n var x = self.bzscroll.y.getPos();\r\n\r\n self.setScrollLeft(self.bzscroll.x.getNow());\r\n self.setScrollTop(self.bzscroll.y.getNow());\r\n\r\n if (x <= 1) {\r\n self.timer = setAnimationFrame(loop);\r\n } else {\r\n self.scrollrunning = false;\r\n self.timer = 0;\r\n self.triggerScrollEnd();\r\n }\r\n\r\n };\r\n\r\n if (!self.scrollrunning) {\r\n self.triggerScrollStart(px, py, x, y, ms);\r\n self.scrollrunning = true;\r\n self.timer = setAnimationFrame(loop);\r\n }\r\n\r\n };\r\n\r\n this.cancelScroll = function () {\r\n if (self.timer) clearAnimationFrame(self.timer);\r\n self.timer = 0;\r\n self.bzscroll = false;\r\n self.scrollrunning = false;\r\n return self;\r\n };\r\n\r\n }\r\n\r\n this.doScrollBy = function (stp, relative) {\r\n doScrollRelative(0, stp);\r\n };\r\n\r\n this.doScrollLeftBy = function (stp, relative) {\r\n doScrollRelative(stp, 0);\r\n };\r\n\r\n this.doScrollTo = function (pos, relative) {\r\n var ny = (relative) ? Math.round(pos * self.scrollratio.y) : pos;\r\n if (ny < 0) ny = 0;\r\n else if (ny > self.page.maxh) ny = self.page.maxh;\r\n self.cursorfreezed = false;\r\n self.doScrollTop(pos);\r\n };\r\n\r\n this.checkContentSize = function () {\r\n var pg = self.getContentSize();\r\n if ((pg.h != self.page.h) || (pg.w != self.page.w)) self.resize(false, pg);\r\n };\r\n\r\n self.onscroll = function (e) {\r\n if (self.rail.drag) return;\r\n if (!self.cursorfreezed) {\r\n self.synched('scroll', function () {\r\n self.scroll.y = Math.round(self.getScrollTop() / self.scrollratio.y);\r\n if (self.railh) self.scroll.x = Math.round(self.getScrollLeft() / self.scrollratio.x);\r\n self.noticeCursor();\r\n });\r\n }\r\n };\r\n self.bind(self.docscroll, \"scroll\", self.onscroll);\r\n\r\n this.doZoomIn = function (e) {\r\n if (self.zoomactive) return;\r\n self.zoomactive = true;\r\n\r\n self.zoomrestore = {\r\n style: {}\r\n };\r\n var lst = ['position', 'top', 'left', 'zIndex', 'backgroundColor', 'marginTop', 'marginBottom', 'marginLeft', 'marginRight'];\r\n var win = self.win[0].style;\r\n for (var a in lst) {\r\n var pp = lst[a];\r\n self.zoomrestore.style[pp] = (win[pp] !== undefined) ? win[pp] : '';\r\n }\r\n\r\n self.zoomrestore.style.width = self.win.css('width');\r\n self.zoomrestore.style.height = self.win.css('height');\r\n\r\n self.zoomrestore.padding = {\r\n w: self.win.outerWidth() - self.win.width(),\r\n h: self.win.outerHeight() - self.win.height()\r\n };\r\n\r\n if (cap.isios4) {\r\n self.zoomrestore.scrollTop = $window.scrollTop();\r\n $window.scrollTop(0);\r\n }\r\n\r\n self.win.css({\r\n position: (cap.isios4) ? \"absolute\" : \"fixed\",\r\n top: 0,\r\n left: 0,\r\n zIndex: globalmaxzindex + 100,\r\n margin: 0\r\n });\r\n var bkg = self.win.css(\"backgroundColor\");\r\n if (\"\" === bkg || /transparent|rgba\\(0, 0, 0, 0\\)|rgba\\(0,0,0,0\\)/.test(bkg)) self.win.css(\"backgroundColor\", \"#fff\");\r\n self.rail.css({\r\n zIndex: globalmaxzindex + 101\r\n });\r\n self.zoom.css({\r\n zIndex: globalmaxzindex + 102\r\n });\r\n self.zoom.css('backgroundPosition', '0 -18px');\r\n self.resizeZoom();\r\n\r\n if (self.onzoomin) self.onzoomin.call(self);\r\n\r\n return self.cancelEvent(e);\r\n };\r\n\r\n this.doZoomOut = function (e) {\r\n if (!self.zoomactive) return;\r\n self.zoomactive = false;\r\n\r\n self.win.css(\"margin\", \"\");\r\n self.win.css(self.zoomrestore.style);\r\n\r\n if (cap.isios4) {\r\n $window.scrollTop(self.zoomrestore.scrollTop);\r\n }\r\n\r\n self.rail.css({\r\n \"z-index\": self.zindex\r\n });\r\n self.zoom.css({\r\n \"z-index\": self.zindex\r\n });\r\n self.zoomrestore = false;\r\n self.zoom.css('backgroundPosition', '0 0');\r\n self.onResize();\r\n\r\n if (self.onzoomout) self.onzoomout.call(self);\r\n\r\n return self.cancelEvent(e);\r\n };\r\n\r\n this.doZoom = function (e) {\r\n return (self.zoomactive) ? self.doZoomOut(e) : self.doZoomIn(e);\r\n };\r\n\r\n this.resizeZoom = function () {\r\n if (!self.zoomactive) return;\r\n\r\n var py = self.getScrollTop(); //preserve scrolling position\r\n self.win.css({\r\n width: $window.width() - self.zoomrestore.padding.w + \"px\",\r\n height: $window.height() - self.zoomrestore.padding.h + \"px\"\r\n });\r\n self.onResize();\r\n\r\n self.setScrollTop(Math.min(self.page.maxh, py));\r\n };\r\n\r\n this.init();\r\n\r\n $.nicescroll.push(this);\r\n\r\n };\r\n\r\n // Inspired by the work of Kin Blas\r\n // http://webpro.host.adobe.com/people/jblas/momentum/includes/jquery.momentum.0.7.js \r\n var ScrollMomentumClass2D = function (nc) {\r\n var self = this;\r\n this.nc = nc;\r\n\r\n this.lastx = 0;\r\n this.lasty = 0;\r\n this.speedx = 0;\r\n this.speedy = 0;\r\n this.lasttime = 0;\r\n this.steptime = 0;\r\n this.snapx = false;\r\n this.snapy = false;\r\n this.demulx = 0;\r\n this.demuly = 0;\r\n\r\n this.lastscrollx = -1;\r\n this.lastscrolly = -1;\r\n\r\n this.chkx = 0;\r\n this.chky = 0;\r\n\r\n this.timer = 0;\r\n\r\n this.reset = function (px, py) {\r\n self.stop();\r\n self.steptime = 0;\r\n self.lasttime = now();\r\n self.speedx = 0;\r\n self.speedy = 0;\r\n self.lastx = px;\r\n self.lasty = py;\r\n self.lastscrollx = -1;\r\n self.lastscrolly = -1;\r\n };\r\n\r\n this.update = function (px, py) {\r\n var tm = now();\r\n self.steptime = tm - self.lasttime;\r\n self.lasttime = tm;\r\n var dy = py - self.lasty;\r\n var dx = px - self.lastx;\r\n var sy = self.nc.getScrollTop();\r\n var sx = self.nc.getScrollLeft();\r\n var newy = sy + dy;\r\n var newx = sx + dx;\r\n self.snapx = (newx < 0) || (newx > self.nc.page.maxw);\r\n self.snapy = (newy < 0) || (newy > self.nc.page.maxh);\r\n self.speedx = dx;\r\n self.speedy = dy;\r\n self.lastx = px;\r\n self.lasty = py;\r\n };\r\n\r\n this.stop = function () {\r\n self.nc.unsynched(\"domomentum2d\");\r\n if (self.timer) clearTimeout(self.timer);\r\n self.timer = 0;\r\n self.lastscrollx = -1;\r\n self.lastscrolly = -1;\r\n };\r\n\r\n this.doSnapy = function (nx, ny) {\r\n var snap = false;\r\n\r\n if (ny < 0) {\r\n ny = 0;\r\n snap = true;\r\n } else if (ny > self.nc.page.maxh) {\r\n ny = self.nc.page.maxh;\r\n snap = true;\r\n }\r\n\r\n if (nx < 0) {\r\n nx = 0;\r\n snap = true;\r\n } else if (nx > self.nc.page.maxw) {\r\n nx = self.nc.page.maxw;\r\n snap = true;\r\n }\r\n\r\n (snap) ? self.nc.doScrollPos(nx, ny, self.nc.opt.snapbackspeed) : self.nc.triggerScrollEnd();\r\n };\r\n\r\n this.doMomentum = function (gp) {\r\n var t = now();\r\n var l = (gp) ? t + gp : self.lasttime;\r\n\r\n var sl = self.nc.getScrollLeft();\r\n var st = self.nc.getScrollTop();\r\n\r\n var pageh = self.nc.page.maxh;\r\n var pagew = self.nc.page.maxw;\r\n\r\n self.speedx = (pagew > 0) ? Math.min(60, self.speedx) : 0;\r\n self.speedy = (pageh > 0) ? Math.min(60, self.speedy) : 0;\r\n\r\n var chk = l && (t - l) <= 60;\r\n\r\n if ((st < 0) || (st > pageh) || (sl < 0) || (sl > pagew)) chk = false;\r\n\r\n var sy = (self.speedy && chk) ? self.speedy : false;\r\n var sx = (self.speedx && chk) ? self.speedx : false;\r\n\r\n if (sy || sx) {\r\n var tm = Math.max(16, self.steptime); //timeout granularity\r\n\r\n if (tm > 50) { // do smooth\r\n var xm = tm / 50;\r\n self.speedx *= xm;\r\n self.speedy *= xm;\r\n tm = 50;\r\n }\r\n\r\n self.demulxy = 0;\r\n\r\n self.lastscrollx = self.nc.getScrollLeft();\r\n self.chkx = self.lastscrollx;\r\n self.lastscrolly = self.nc.getScrollTop();\r\n self.chky = self.lastscrolly;\r\n\r\n var nx = self.lastscrollx;\r\n var ny = self.lastscrolly;\r\n\r\n var onscroll = function () {\r\n var df = ((now() - t) > 600) ? 0.04 : 0.02;\r\n\r\n if (self.speedx) {\r\n nx = Math.floor(self.lastscrollx - (self.speedx * (1 - self.demulxy)));\r\n self.lastscrollx = nx;\r\n if ((nx < 0) || (nx > pagew)) df = 0.10;\r\n }\r\n\r\n if (self.speedy) {\r\n ny = Math.floor(self.lastscrolly - (self.speedy * (1 - self.demulxy)));\r\n self.lastscrolly = ny;\r\n if ((ny < 0) || (ny > pageh)) df = 0.10;\r\n }\r\n\r\n self.demulxy = Math.min(1, self.demulxy + df);\r\n\r\n self.nc.synched(\"domomentum2d\", function () {\r\n\r\n if (self.speedx) {\r\n var scx = self.nc.getScrollLeft();\r\n // if (scx != self.chkx) self.stop();\r\n self.chkx = nx;\r\n self.nc.setScrollLeft(nx);\r\n }\r\n\r\n if (self.speedy) {\r\n var scy = self.nc.getScrollTop();\r\n // if (scy != self.chky) self.stop();\r\n self.chky = ny;\r\n self.nc.setScrollTop(ny);\r\n }\r\n\r\n if (!self.timer) {\r\n self.nc.hideCursor();\r\n self.doSnapy(nx, ny);\r\n }\r\n\r\n });\r\n\r\n if (self.demulxy < 1) {\r\n self.timer = setTimeout(onscroll, tm);\r\n } else {\r\n self.stop();\r\n self.nc.hideCursor();\r\n self.doSnapy(nx, ny);\r\n }\r\n };\r\n\r\n onscroll();\r\n\r\n } else {\r\n self.doSnapy(self.nc.getScrollLeft(), self.nc.getScrollTop());\r\n }\r\n\r\n };\r\n\r\n };\r\n\r\n\r\n // override jQuery scrollTop\r\n var _scrollTop = jQuery.fn.scrollTop; // preserve original function\r\n\r\n jQuery.cssHooks.pageYOffset = {\r\n get: function (elem, computed, extra) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollTop() : _scrollTop.call(elem);\r\n },\r\n set: function (elem, value) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollTop(parseInt(value)) : _scrollTop.call(elem, value);\r\n return this;\r\n }\r\n };\r\n\r\n jQuery.fn.scrollTop = function (value) {\r\n if (value === undefined) {\r\n var nice = (this[0]) ? $.data(this[0], '__nicescroll') || false : false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollTop() : _scrollTop.call(this);\r\n } else {\r\n return this.each(function () {\r\n var nice = $.data(this, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollTop(parseInt(value)) : _scrollTop.call($(this), value);\r\n });\r\n }\r\n };\r\n\r\n // override jQuery scrollLeft\r\n var _scrollLeft = jQuery.fn.scrollLeft; // preserve original function\r\n\r\n $.cssHooks.pageXOffset = {\r\n get: function (elem, computed, extra) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollLeft() : _scrollLeft.call(elem);\r\n },\r\n set: function (elem, value) {\r\n var nice = $.data(elem, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call(elem, value);\r\n return this;\r\n }\r\n };\r\n\r\n jQuery.fn.scrollLeft = function (value) {\r\n if (value === undefined) {\r\n var nice = (this[0]) ? $.data(this[0], '__nicescroll') || false : false;\r\n return (nice && nice.ishwscroll) ? nice.getScrollLeft() : _scrollLeft.call(this);\r\n } else {\r\n return this.each(function () {\r\n var nice = $.data(this, '__nicescroll') || false;\r\n (nice && nice.ishwscroll) ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call($(this), value);\r\n });\r\n }\r\n };\r\n\r\n var NiceScrollArray = function (doms) {\r\n var self = this;\r\n this.length = 0;\r\n this.name = \"nicescrollarray\";\r\n\r\n this.each = function (fn) {\r\n $.each(self, fn);\r\n return self;\r\n };\r\n\r\n this.push = function (nice) {\r\n self[self.length] = nice;\r\n self.length++;\r\n };\r\n\r\n this.eq = function (idx) {\r\n return self[idx];\r\n };\r\n\r\n if (doms) {\r\n for (var a = 0; a < doms.length; a++) {\r\n var nice = $.data(doms[a], '__nicescroll') || false;\r\n if (nice) {\r\n this[this.length] = nice;\r\n this.length++;\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n function mplex(el, lst, fn) {\r\n for (var a = 0, l = lst.length; a < l; a++) fn(el, lst[a]);\r\n }\r\n mplex(\r\n NiceScrollArray.prototype, ['show', 'hide', 'toggle', 'onResize', 'resize', 'remove', 'stop', 'doScrollPos'],\r\n function (e, n) {\r\n e[n] = function () {\r\n var args = arguments;\r\n return this.each(function () {\r\n this[n].apply(this, args);\r\n });\r\n };\r\n }\r\n );\r\n\r\n jQuery.fn.getNiceScroll = function (index) {\r\n if (index === undefined) {\r\n return new NiceScrollArray(this);\r\n } else {\r\n return this[index] && $.data(this[index], '__nicescroll') || false;\r\n }\r\n };\r\n\r\n var pseudos = jQuery.expr.pseudos || jQuery.expr[':']; // jQuery 3 migration\r\n pseudos.nicescroll = function (a) {\r\n return $.data(a, '__nicescroll') !== undefined;\r\n };\r\n\r\n $.fn.niceScroll = function (wrapper, _opt) {\r\n if (_opt === undefined && typeof wrapper == \"object\" && !(\"jquery\" in wrapper)) {\r\n _opt = wrapper;\r\n wrapper = false;\r\n }\r\n\r\n var ret = new NiceScrollArray();\r\n\r\n this.each(function () {\r\n var $this = $(this);\r\n\r\n var opt = $.extend({}, _opt); // cloning\r\n\r\n if (wrapper || false) {\r\n var wrp = $(wrapper);\r\n opt.doc = (wrp.length > 1) ? $(wrapper, $this) : wrp;\r\n opt.win = $this;\r\n }\r\n var docundef = !(\"doc\" in opt);\r\n if (!docundef && !(\"win\" in opt)) opt.win = $this;\r\n\r\n var nice = $this.data('__nicescroll') || false;\r\n if (!nice) {\r\n opt.doc = opt.doc || $this;\r\n nice = new NiceScrollClass(opt, $this);\r\n $this.data('__nicescroll', nice);\r\n }\r\n ret.push(nice);\r\n });\r\n\r\n return (ret.length === 1) ? ret[0] : ret;\r\n };\r\n\r\n _win.NiceScroll = {\r\n getjQuery: function () {\r\n return jQuery;\r\n }\r\n };\r\n\r\n if (!$.nicescroll) {\r\n $.nicescroll = new NiceScrollArray();\r\n $.nicescroll.options = _globaloptions;\r\n }\r\n\r\n}));","import $ from \"jquery\";\nimport \"jquery.nicescroll\";\nimport {\n IsRunningOnBloomDesktop,\n kLegacyCanvasElementSelector,\n} from \"./dragActivityRuntime\";\n\nexport const kSelectorForPotentialNiceScrollElements =\n \".bloom-translationGroup:not(.bloom-imageDescription) .bloom-editable.bloom-visibility-code-on, \" +\n \".scrollable\"; // we added .scrollable for branding cases where the boilerplate text also needs to scroll\n\n// Add a \"nice\" scrollbar to the page if the content overflows.\nexport function addScrollbarsToPage(\n bloomPage: Element,\n pointerEventHandler?: (e: PointerEvent) => void,\n): void {\n // Expected behavior for cover: \"on the cover, which is has a very dynamic layout, we just don't do scrollbars\"\n if (bloomPage.classList.contains(\"cover\")) {\n return;\n }\n const isRunningOnBloomDesktop = IsRunningOnBloomDesktop(bloomPage);\n\n // on a browser so obsolete that it doesn't have IntersectionObserver (e.g., IE or Safari before 12.2),\n // we just won't get scrolling.\n if (\"IntersectionObserver\" in window) {\n // Attach overlaid scrollbar to all editables except canvas elements (e.g. comics)\n // Expected behavior for comic bubbles: \"we want overflow to show, but not generate scroll bars\"\n let scrollBlocks: HTMLElement[] = [];\n let countOfObserversExpectedToReport = 0;\n let countOfObserversThatHaveReported = 0;\n $(bloomPage)\n .find(kSelectorForPotentialNiceScrollElements)\n .each((index, elt) => {\n // Process the blocks that are possibly overflowing.\n // Blocks that are overflowing will be configured to use niceScroll\n // so the user can scroll and see everything. That is costly, because\n // niceScroll leaks event listeners every time it is called. So we don't\n // want to use it any more than we need to. (Is this true?) Also, niceScroll\n // somehow fails to work when our vertical alignment classes are applied;\n // probably something to do with the bloom-editables being display:flex\n // to achieve vertical positioning. We can safely remove those classes\n // if the block is overflowing, because there's no excess white space\n // to distribute.\n // Note: there are complications Bloom desktop handles in determining\n // accurately whether a block is overflowing. We don't handle those here.\n // If it is close enough to overflow to get a scroll bar, it's close\n // enough not to care whether extra white space is at the top, bottom,\n // or split (hence we can safely remove classes used for that).\n // And we'll risk sometimes adding niceScroll when we could (just)\n // have done without it. Using the same code in Bloom Desktop and bloom-player\n // ensures consistent scrollbar behavior between the two.\n const firstChild = elt.firstElementChild;\n const lastChild = elt.lastElementChild;\n if (!firstChild || !lastChild) {\n // no children, can't be overflowing\n return;\n }\n\n // We need to know the scale of the page, because nicescroll doesn't handle\n // scaling when it comes to the padding that we add to the top and left of\n // the translationGroup element. See BL-13796.\n let scale = 1;\n // bloom-player approach to setting the scale\n const scaleStyle = document.querySelector(\n \"style#scale-style-sheet\",\n );\n if (scaleStyle) {\n const match = scaleStyle.innerHTML.match(\n /transform:[a-z0-9, ()]* scale\\((\\d+(\\.\\d+)?)\\)/,\n );\n if (match) {\n scale = parseFloat(match[1]);\n }\n } else {\n // Bloom Desktop approach to setting the scale\n const scaleContainer = elt.closest(\n \"#page-scaling-container\",\n ) as HTMLElement;\n if (scaleContainer) {\n const scaleValue = scaleContainer.style.transform;\n if (scaleValue && scaleValue.startsWith(\"scale(\")) {\n scale = parseFloat(\n scaleValue.substring(6, scaleValue.length - 1),\n );\n }\n }\n }\n // nicescroll doesn't provide a way to adjust the height of the scrollbar\n // (\"rail\"). Adjusting the height of the thumb (\"cursor\") is counterproductive\n // if the scrollbar height doesn't change, so we don't try to adjust that\n // aspect of the thumb.\n const { topAdjust, leftAdjust, thumbWidth } =\n ComputeNiceScrollOffsets(scale, elt as HTMLElement);\n\n // We don't really want continuous observation, but this is an elegant\n // way to find out whether each child is entirely contained within its\n // parent. Unlike computations involving coordinates, we don't have to\n // worry about whether borders, margins, and padding are included in\n // various measurements. We do need to check the first as well as the\n // last child, because if text is aligned bottom, any overflow will be\n // at the top.\n const observer = new IntersectionObserver(\n (entries, ob) => {\n // called more-or-less immediately for each child, but after the\n // loop creates them all.\n entries.forEach((entry) => {\n countOfObserversThatHaveReported++;\n ob.unobserve(entry.target); // don't want to keep getting them, or leak observers\n if (!entry.target.parentElement) {\n // We can't do anything with this target. It must be in another DOM. (BL-15508)\n // I'm not sure how that can happen, but with iframes around, who knows?\n return;\n }\n const isBubble = !!entry.target.closest(\n kLegacyCanvasElementSelector,\n );\n // In bloom desktop preview, we set width to 200% and then scale down by 50%.\n // This can lead to intersection ratios very slightly less than 1, probably due\n // to pixel rounding of some sort, when in fact the content fits comfortably.\n // For example, in one case we got a boundingClientRect 72.433 high\n // and an intersectionRect 72.416, for a ratio of 0.9998.\n // If a block is 1000 pixels high and really overflowing by 1 pixel, the ratio\n // will be 0.999. I think it's safe to take anything closer to 1 than that as\n // 'not overflowing'.\n let overflowing = entry.intersectionRatio < 0.999;\n\n if (overflowing && isBubble) {\n // We want to be less aggressive about putting scroll bars on bubbles.\n // Most of the time, a bubble is very carefully sized to just fit the\n // text. But the intersection observer wants it to fit a certain amount\n // of white space as well. We want a scroll bar if it's overflowing\n // really badly for some reason, but that's much more the exception\n // than the rule, so better a little clipping when the bubble is badly\n // sized than a scroll bar that isn't needed in one that is just right.\n // Example: a bubble which appears to fit perfectly, 3 lines high:\n // its clientHeight is 72; containing bloom-editable's is 59;\n // lineHeight is 24px. IntersectionRatio computes to 59/72,\n // which makes the 'overflow' 13. A ratio of 0.5 as we originally\n // proposed would give us a scroll bar we don't want.\n let maxBubbleOverflowLineFraction = 0.6;\n if (\n entry.target !=\n entry.target.parentElement\n ?.firstElementChild ||\n entry.target !=\n entry.target.parentElement!\n .lastElementChild\n ) {\n // Bubbles are center-aligned vertically. If this is not the only\n // child,the first and last will overflow above and below by about the\n // same amount. So we're only really looking at half the overflow on this para,\n // and should reduce the threshold.\n maxBubbleOverflowLineFraction /= 2;\n }\n const overflow =\n (1 - entry.intersectionRatio) *\n entry.target.clientHeight;\n const lineHeightPx = window.getComputedStyle(\n entry.target,\n ).lineHeight;\n const lineHeight = parseFloat(\n // remove the trailing \"px\"\n lineHeightPx.substring(\n 0,\n lineHeightPx.length - 2,\n ),\n );\n overflowing =\n overflow >\n lineHeight * maxBubbleOverflowLineFraction;\n }\n if (\n overflowing &&\n scrollBlocks.indexOf(\n entry.target.parentElement!,\n ) < 0\n ) {\n scrollBlocks.push(entry.target.parentElement!);\n // remove classes incompatible with niceScroll\n const group =\n entry.target.parentElement!.parentElement!;\n if (\n group.classList.contains(\n \"bloom-vertical-align-center\",\n )\n ) {\n group.classList.remove(\n \"bloom-vertical-align-center\",\n );\n if (isRunningOnBloomDesktop)\n group.classList.add(\n \"bloom-vertical-align-center-removed\",\n );\n }\n if (\n group.classList.contains(\n \"bloom-vertical-align-bottom\",\n )\n ) {\n group.classList.remove(\n \"bloom-vertical-align-bottom\",\n );\n if (isRunningOnBloomDesktop)\n group.classList.add(\n \"bloom-vertical-align-bottom-removed\",\n );\n }\n if (isBubble) {\n // This is a way of forcing it not to be display-flex, which doesn't\n // work with the nice-scroll-bar library we're using.\n // That library messes with the element style, so it seemed safer\n // not to do that myself.\n entry.target.parentElement!.classList.add(\n \"scrolling-bubble\",\n );\n }\n }\n if (\n countOfObserversThatHaveReported ===\n countOfObserversExpectedToReport\n ) {\n // configure nicescroll...ideally only once for all of them\n $(scrollBlocks).niceScroll({\n autohidemode: false,\n railoffset: {\n top: -topAdjust,\n left: -leftAdjust,\n },\n cursorwidth: thumbWidth,\n cursorcolor: \"#000000\",\n cursoropacitymax: 0.1,\n cursorborderradius: thumbWidth, // Make the corner more rounded than the 5px default.\n });\n setupSpecialMouseTrackingForNiceScroll(\n bloomPage,\n pointerEventHandler,\n );\n scrollBlocks = []; // Just in case it's possible to get callbacks before we created them all.\n }\n });\n },\n { root: elt },\n );\n countOfObserversExpectedToReport++;\n observer.observe(firstChild);\n if (firstChild !== lastChild) {\n countOfObserversExpectedToReport++;\n observer.observe(lastChild);\n }\n });\n }\n}\n\n// This method is copied from the nicescroll source code, albeit with some renamings and\n// getting rid of jquery as much as possible. This is how nicescroll determines the parent\n// element that should have the inserted scrollbar elements. If nothing is found by this\n// method, nicescroll uses the body element. Since the nicescroll release hasn't been updated\n// since 2017, I feel safe in copying this method here in January 2025.\nfunction getNiceScrollParent(elt: HTMLElement): HTMLElement | null {\n var parentElt =\n elt && elt.parentNode ? (elt.parentNode as HTMLElement) : null;\n while (\n parentElt &&\n parentElt.nodeType === Node.ELEMENT_NODE &&\n !/^BODY|HTML/.test(parentElt.nodeName)\n ) {\n const computed = window.getComputedStyle(parentElt);\n const position = computed.getPropertyValue(\"position\");\n if (/fixed|absolute/.test(position)) return parentElt;\n const ov =\n computed.getPropertyValue(\"overflow-y\") ||\n computed.getPropertyValue(\"overflow-x\") ||\n computed.getPropertyValue(\"overflow\") ||\n \"\";\n if (\n /scroll|auto/.test(ov) &&\n parentElt.clientHeight != parentElt.scrollHeight\n )\n return parentElt;\n if (($(parentElt).getNiceScroll() as any).length > 0) return parentElt;\n parentElt = parentElt.parentNode\n ? (parentElt.parentNode as HTMLElement)\n : null;\n }\n return null;\n}\n\n// nicescroll doesn't properly scale the padding at the top and left of the\n// scrollable area of the languageGroup divs when the page is scaled. This\n// method computes offset values to correct for this. See BL-13796.\n// nicescroll also doesn't scale at all when nicescroll cannot find a scrollable\n// area containing the element under the scaling div. See BL-14112.\nfunction ComputeNiceScrollOffsets(\n scale: number,\n elt: HTMLElement,\n): { topAdjust: number; leftAdjust: number; thumbWidth: string } {\n let topAdjust = 0;\n let leftAdjust = 0;\n let thumbWidth = \"12px\"; // nicescroll calls the thumb a \"cursor\", but it's really a thumb\n if (scale !== 1) {\n const translationGroupDiv = elt.parentElement;\n if (\n !translationGroupDiv ||\n !translationGroupDiv.classList.contains(\"bloom-translationGroup\")\n ) {\n // We don't know how to deal with this case, so we'll just return the default values.\n return { topAdjust, leftAdjust, thumbWidth };\n }\n const whereToPutTheScrollbars = getNiceScrollParent(elt);\n if (whereToPutTheScrollbars) {\n // The nicescroll elements are added somewhere in the DOM that is presumably inside\n // the element that sets the scaling.\n const compStyles = window.getComputedStyle(translationGroupDiv);\n const topPadding =\n compStyles.getPropertyValue(\"padding-top\") || \"0\";\n const leftPadding =\n compStyles.getPropertyValue(\"padding-left\") || \"0\";\n topAdjust = parseFloat(topPadding) * (scale - 1);\n leftAdjust = parseFloat(leftPadding) * (scale - 1);\n } else {\n // The nicescroll elements are added directly under the body element, which is presumably\n // outside the element that sets the scaling. We need to adjust for the scaling of the\n // scrollbar position and size ourselves. See BL-14112.\n const splitPageComponentInner = translationGroupDiv.parentElement;\n if (!splitPageComponentInner) {\n // This should never happen, but if it does, we'll just return the default values.\n return { topAdjust, leftAdjust, thumbWidth };\n }\n // This seems to apply only to text-only pages which don't have any additional padding\n // to worry about: only the basic page dimensions given by the splitPageComponentInner\n // element.\n thumbWidth = `${12 * scale}px`;\n const top = splitPageComponentInner?.offsetTop;\n const right =\n splitPageComponentInner.offsetLeft +\n splitPageComponentInner.offsetWidth;\n topAdjust = -(top * (scale - 1));\n leftAdjust = -(right * (scale - 1));\n }\n }\n return { topAdjust, leftAdjust, thumbWidth };\n}\n\nexport function setupSpecialMouseTrackingForNiceScroll(\n bloomPage: Element,\n pointerEventHandler?: (e: PointerEvent) => void,\n) {\n bloomPage.removeEventListener(\"pointerdown\", listenForPointerDown); // only want one!\n bloomPage.addEventListener(\"pointerdown\", listenForPointerDown);\n if (!pointerEventHandler) {\n return;\n }\n // The purpose of this is to prevent Swiper causing the page to be moved or\n // flicked when the user is trying to scroll on the page. See BL-14079.\n for (const eventName of [\"pointermove\", \"pointerup\"]) {\n bloomPage.ownerDocument.body.addEventListener(\n eventName,\n pointerEventHandler,\n {\n capture: true,\n },\n );\n }\n}\n\n// nicescroll doesn't properly scale the padding at the top and left of the\n// scrollable area of the languageGroup divs when the page is scaled. This\n// method sets offset values to correct for this. It is called whenever the\n// entire window resizes, which also scales the page before this is called.\n// See BL-13796.\nexport function fixNiceScrollOffsets(page: HTMLElement, scale: number) {\n page.querySelectorAll(kSelectorForPotentialNiceScrollElements).forEach(\n (group) => {\n // The type definition is not correct for getNiceScroll; we expect it to return an array.\n const groupNiceScroll = $(group).getNiceScroll() as any;\n if (groupNiceScroll && groupNiceScroll.length > 0) {\n let { topAdjust, leftAdjust, thumbWidth } =\n ComputeNiceScrollOffsets(scale, group as HTMLElement);\n groupNiceScroll[0].opt.railoffset.top = -topAdjust;\n groupNiceScroll[0].opt.railoffset.left = -leftAdjust;\n groupNiceScroll[0].opt.cursorwidth = thumbWidth;\n groupNiceScroll[0].resize();\n }\n },\n );\n}\n\n// If the mouse down is in the thumb of a NiceScroll, we don't want to get a click\n// event later even if the mouse up is outside that element. Also, we want the\n// scrolling to follow the mouse movement even if the mouse cursor leaves the thumb\n// before the mouse button is released.\nfunction listenForPointerDown(ev: PointerEvent) {\n if (\n ev.target instanceof HTMLDivElement &&\n (ev.target as HTMLDivElement).classList.contains(\"nicescroll-cursors\")\n ) {\n (ev.target as HTMLDivElement).setPointerCapture(ev.pointerId);\n if (ev.pointerType === \"mouse\") {\n // Investigation shows that Swiper uses pointer event handlers and NiceScroll\n // uses mouse event handlers, so stopping the propagation of pointer events\n // doesn't effect the scrolling, but does stop the swiping. See BL-14079.\n // Pointer capture affects mouse events as well as pointer events.\n ev.stopPropagation();\n }\n }\n}\n\nexport function cleanupNiceScroll() {\n // Doing this cleanup is unfortunate overhead, but niceScrolls stick around too much,\n // including when the page divs they are on are removed because the page is not the\n // current page. This leads to performance issues, including the scrollbar getting darker\n // and darker as the nicescroll elements build up in the HTML. This may also be the source\n // of the event listener leaks that was mentioned in an earlier comment.\n $(\"div.bloom-page\")[0]\n ?.querySelectorAll(kSelectorForPotentialNiceScrollElements)\n .forEach((group) => {\n // The \"as\" cast is crucial here for this code to work. For some reason,\n // the type returned by getNiceScroll() is not interpreted correctly and\n // the code silently fails to work, with length always being 0.\n // (bloom-player uses \"as any\" in this context, but \"as JQuery\" seems to\n // work as well and doesn't trigger an eslint warning.)\n const groupNiceScroll = $(\n group,\n ).getNiceScroll() as unknown as JQuery;\n if (groupNiceScroll && groupNiceScroll.length > 0) {\n groupNiceScroll.remove();\n }\n // Remove classes added to make the niceScroll work, and restore\n // classes that were removed to make the niceScroll work.\n if (group.classList.contains(\"scrolling-bubble\")) {\n group.classList.remove(\"scrolling-bubble\");\n }\n const groupParent = group.parentElement;\n if (!groupParent) return; // this should never happen, but just in case\n if (\n groupParent.classList.contains(\n \"bloom-vertical-align-center-removed\",\n )\n ) {\n groupParent.classList.remove(\n \"bloom-vertical-align-center-removed\",\n );\n groupParent.classList.add(\"bloom-vertical-align-center\");\n }\n if (\n groupParent.classList.contains(\n \"bloom-vertical-align-bottom-removed\",\n )\n ) {\n groupParent.classList.remove(\n \"bloom-vertical-align-bottom-removed\",\n );\n groupParent.classList.add(\"bloom-vertical-align-bottom\");\n }\n // Remove more debris left by niceScroll. See BL-14052.\n (group as HTMLElement).style.overflow = \"\";\n (group as HTMLElement).style.outline = \"\";\n (group as HTMLElement).style.width = \"\";\n });\n}\n","export class DomHelper {\n public static getActualUrlFromCSSPropertyValue(cssPropertyValue: string) {\n const match = cssPropertyValue.match(/.*url\\((['\"])(.*?)\\1\\).*/i);\n if (!match) {\n return \"\";\n }\n return match[2];\n }\n}\n","import { AspectRatio } from \"@material-ui/icons\";\nimport { DomHelper } from \"../utilities/domHelper\";\nimport { easing } from \"jquery\";\nimport { request } from \"http\";\n\n// class Animation captures the logic needed to produce the Ken Burns effect\n// of panning and zooming as specified in Bloom's motion tool.\n\n// Defines the extra fields we expect to find in the dataset of an HTMLElement\n// that has animation specified (to make TypeScript and TSLint happy).\ninterface IAnimation {\n initialrect: string;\n finalrect: string;\n}\n\n//NOTE: this class is functionally a singleton. There is NOT a separate instance created to animate each page of a bloom book.\nexport class Animation {\n public static pageHasAnimation(page: HTMLDivElement): boolean {\n return !!Animation.getAnimatableCanvas(page);\n }\n\n // Get the animatable clone of the animatable bloom canvas, if we already made it.\n public static getAnimationCanvas(page: HTMLElement): HTMLElement | null {\n if (\n page.firstElementChild &&\n page.firstElementChild.classList.contains(\n \"bloom-animationBackground\",\n )\n ) {\n const animationBackground = page.firstElementChild;\n if (\n animationBackground.firstElementChild &&\n animationBackground.firstElementChild.classList.contains(\n Animation.wrapperClassName,\n )\n ) {\n const wrapperDiv = animationBackground.firstElementChild;\n if (\n wrapperDiv.firstElementChild &&\n wrapperDiv.firstElementChild.hasAttribute(\n \"data-initialrect\",\n )\n ) {\n return wrapperDiv.firstElementChild as HTMLElement;\n }\n }\n }\n return null; // not made yet, or no image to make it from\n }\n\n // Search for a bloom-canvas that has the properties we need for animation.\n public static getAnimatableCanvas(page: HTMLElement): HTMLElement {\n const animatedCanvas = [].slice\n .call(page.getElementsByClassName(\"bloom-canvas\"))\n .find(\n (v) =>\n !v.closest(\".bloom-animationBackground\") &&\n !!(v.dataset as IAnimation).initialrect,\n ) as HTMLElement;\n if (animatedCanvas) return animatedCanvas;\n return [].slice\n .call(page.getElementsByClassName(\"bloom-imageContainer\"))\n .find(\n (v) => !!(v.dataset as IAnimation).initialrect,\n ) as HTMLElement;\n }\n\n private animationEngine: TransformBasedAnimator; // The animator for the most recently loaded page. This.createAndPlayAnimation stops any exisiting animation and overwrites the variable.\n public PlayAnimations: boolean; // true if animation should occur (only set by bloom-player core based on bookInfo)\n private currentPage: HTMLElement; // one we're currently showing\n private lastDurationPage: HTMLElement; // one we most recently obtained a duration for\n private static wrapperClassName = \"bloom-ui-animationWrapper\";\n private animationDuration: number = 3000; // ms (3000 ifs default)\n\n constructor() {\n // 200 is designed to make sure this happens AFTER we adjust the scale.\n // Note that if we are not currently animating, this.currentPage may be null or\n // obsolete. It is only used if we need to turn OFF the animation.\n window.addEventListener(\"orientationchange\", () =>\n window.setTimeout(\n () => this.adjustAnimationWrapper(this.currentPage),\n 200,\n ),\n );\n }\n\n public HandlePageBeforeVisible(page: HTMLElement) {\n if (!this.shouldAnimate(page)) {\n // may have left-over wrappers from when page previously played.\n this.removeAnimationWrappers(page);\n }\n }\n\n // What we need to do when the page becomes visible (possibly start the animation,\n // if we already have the duration and are not paused).\n public HandlePageVisible(page: HTMLElement, paused: boolean) {\n if (this.shouldAnimate(page)) {\n //if we've already gotten this page's duration, set up the animation\n this.currentPage = page;\n this.animatableCanvas = Animation.getAnimatableCanvas(page);\n if (this.currentPage === this.lastDurationPage) {\n // already got the corresponding durationAvailable event\n this.setupAnimation(page, paused);\n }\n }\n }\n\n // What we need to do when we get the duration of a page (possibly start the animation,\n // if the page is already visible and we are not paused).\n public HandlePageDurationAvailable(\n page: HTMLElement,\n duration: number,\n paused: boolean,\n ) {\n if (this.shouldAnimate(page)) {\n this.animationDuration = duration;\n //if the page is already visible, set up the animation\n this.lastDurationPage = page;\n if (this.currentPage === this.lastDurationPage) {\n // already got the corresponding pageVisible event\n this.setupAnimation(page, paused);\n }\n }\n }\n\n // Only applicable to resuming paused animation\n // May be called when we are not paused;should do nothing if so.\n public resumeAnimation() {\n if (!this.PlayAnimations || !this.animationEngine) {\n return;\n }\n this.animationEngine.resume();\n }\n\n // May be called when already paused;if so do nothing.\n // Not yet tested in bloom preview context;have not yet decided affordance for pausing\n public PauseAnimation() {\n if (!this.PlayAnimations || !this.animationEngine) {\n return;\n }\n this.animationEngine.pause();\n }\n\n public animatableCanvas: HTMLElement | null = null;\n\n private setupAnimation(page: HTMLElement, paused: boolean): void {\n if (!this.PlayAnimations) {\n return;\n }\n\n if (!this.animatableCanvas) {\n return; // no image to animate\n }\n\n // We expect to see something like this:\n // <div class=\"bloom-canvas bloom-leadingElement bloom-has-canvas-element bloom-background-image-in-style-attr swiper-lazy swiper-lazy-loaded\"\n // data-imgsizebasedon=\"320,180\"\n // style=\"background-image:url('1.jpg')\"\n // data-title=\"...\"\n // data-initialrect=\"0.3615 0.0977 0.6120 0.6149\"\n // data-finalrect=\"0.0000 0.0800 0.7495 0.7526\"\n // data-duration=\"5\" />\n // ... children with\n // </div>\n //\n // We want to make something like this:\n // <div class=\"bloom-canvas bloom-leadingElement bloom-has-canvas-element bloom-background-image-in-style-attr swiper-lazy swiper-lazy-loaded bloom-animationBackground\">\n // <div class=\"bloom-ui-animationWrapper\" style = \"width: 100%;height: 100%;overflow: hidden;background-color: white;\">\n // <div ... the entire bloom-canvas (as outlined above) or bloom-ImageContainer (if running an obsolete book)/>\n // </div>\n // </div>\n // and insert it into the bloom-page div as the first element.\n\n let animationBackground = page.firstElementChild as HTMLDivElement;\n let animationWrapper: HTMLElement | null = null;\n\n // We don't already have an animationBackground and need to make it.\n if (\n !animationBackground ||\n !animationBackground.classList.contains(\"bloom-animationBackground\")\n ) {\n // Note that this copies all the classes, so we need to be careful that css based\n // on the classes works as expected\n // It's of particular note that properly hiding the page's regular contents depends on\n // the bloom-animationBackground class in ./src/bloom-player-content.less\n animationBackground = document.createElement(\"div\");\n for (let i = 0; i < this.animatableCanvas.classList.length; i++) {\n animationBackground.classList.add(\n this.animatableCanvas.classList[i],\n );\n }\n animationBackground.classList.add(\"bloom-animationBackground\");\n\n const animationCanvas = this.animatableCanvas.cloneNode(\n true,\n ) as HTMLDivElement;\n\n //in old books, if you change pages very quickly, the animationCanvas will be cloned before the animatableCanvas has its background image style applied.\n //in that case, keep asking for url of the animatableCanvas's background image until it's present.\n //I'm unsure why this is happening at all, but my best guess is it's related to swiper's handling of lazy-load.\n //Enhance: consider disabling swiper's lazy-load. It's likely unnecessary anyway, as our code never makes it possible to load more than three pages at a time anyway\n const checkForBackgroundImage = () => {\n const backgroundImage =\n this.animatableCanvas.style.backgroundImage;\n if (backgroundImage) {\n animationCanvas.style.backgroundImage = backgroundImage;\n } else {\n requestAnimationFrame(checkForBackgroundImage);\n }\n };\n if (!animationCanvas.hasAttribute(\"data-imgsizebasedon\")) {\n requestAnimationFrame(checkForBackgroundImage);\n }\n\n animationWrapper = document.createElement(\"div\");\n animationWrapper.classList.add(Animation.wrapperClassName);\n animationWrapper.appendChild(animationCanvas);\n // hide it until we can set its size and the transform rule for its child properly.\n animationWrapper.style.visibility = \"hidden\";\n animationBackground.appendChild(animationWrapper);\n\n page.insertBefore(animationBackground, page.firstChild);\n\n //calculates the aspect ratio of the canvas, sets the animationWrapper's aspect ratio field to that value, calls placeAnimationWrapper, then calls createAndPlayAnimation\n this.applyCanvasAspectRatioToAnimationWrapper(\n page,\n animationWrapper,\n animationCanvas,\n paused,\n );\n } else {\n // We already made the animation div, just retrieve the animationWrapper from inside it.\n animationWrapper =\n animationBackground.firstElementChild as HTMLElement;\n\n if (animationWrapper.hasAttribute(\"data-aspectRatio\")) {\n // if we have the animation wrapper and have already determined its aspect ratio,\n // it might still be wrongly positioned if we changed orientation\n // since it was computed.\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n } else {\n //we haven't yet determined its aspect ratio.\n this.applyCanvasAspectRatioToAnimationWrapper(\n page,\n animationWrapper,\n animationWrapper.firstElementChild as HTMLElement,\n paused,\n );\n }\n }\n }\n\n private createAndPlayAnimation(page: HTMLElement, paused: boolean) {\n const animationCanvas = Animation.getAnimationCanvas(page);\n\n //stop the old engine's animation so it doesn't compete with the new animation\n if (this.animationEngine) this.animationEngine.endAnimation();\n\n if (animationCanvas) {\n const initialRect =\n animationCanvas.getAttribute(\"data-initialrect\");\n const finalRect = animationCanvas.getAttribute(\"data-finalrect\");\n this.animationEngine = new TransformBasedAnimator(\n initialRect,\n finalRect,\n this.animationDuration,\n animationCanvas,\n );\n if (paused) {\n // Just advance to the initial frame.\n // The animation engine is created in the paused state with totalElapsedTime = 0,\n // so we just need to set the transform to correspond.\n this.animationEngine.setCurrentAnimationFrame();\n } else {\n this.animationEngine.startAnimation();\n }\n }\n }\n\n private applyCanvasAspectRatioToAnimationWrapper(\n page: HTMLElement,\n animationWrapper: HTMLElement,\n canvas: HTMLElement,\n paused: boolean,\n ): void {\n if (page.hasAttribute(\"data-aspectRatio\")) {\n //if the task we started before loading has already found the aspect ratio:\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n }\n //if the canvas has this attribute, it's trivial to find the aspect ratio\n else if (canvas.hasAttribute(\"data-imgsizebasedon\")) {\n const canvasDimensions = canvas\n .getAttribute(\"data-imgsizebasedon\")\n .split(\",\")\n .map(parseFloat);\n animationWrapper.setAttribute(\n \"data-aspectRatio\",\n (canvasDimensions[0] / canvasDimensions[1]).toString(),\n );\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n }\n //if there's no imgSizeBasedOn attribute, default to the old method of looking at the background image\n //however, the animation canvas's background image may not have been loaded yet. In that case, wait until it exists.\n //This is a consequence of checkForBackgroundImage within setupAnimation, which appears to be a consequence of swiper's lazy loading\n else {\n const waitForImageAndSetAspectRatio = () => {\n if (canvas.style.backgroundImage) {\n const virtualImage = new Image();\n virtualImage.addEventListener(\"load\", () => {\n animationWrapper.setAttribute(\n \"data-aspectRatio\",\n (\n virtualImage.naturalWidth /\n virtualImage.naturalHeight\n ).toString(),\n );\n this.placeAnimationWrapper(animationWrapper);\n this.createAndPlayAnimation(page, paused);\n });\n virtualImage.src =\n DomHelper.getActualUrlFromCSSPropertyValue(\n canvas.style.backgroundImage,\n );\n } else {\n requestAnimationFrame(waitForImageAndSetAspectRatio);\n }\n };\n requestAnimationFrame(waitForImageAndSetAspectRatio);\n }\n }\n\n // Enhance: some of the calculations here may require adjustment if we ever do\n // animation while scaled. Currently we use a different system to make the\n // bloom canvas fill the viewport when animating, and suppress scaling.\n // So we can ignore that factor.\n private placeAnimationWrapper(animationWrapper: HTMLElement) {\n const imageAspectRatio = parseFloat(\n animationWrapper.getAttribute(\"data-aspectRatio\")!,\n );\n const animationBackground = animationWrapper.parentElement;\n const viewWidth = animationBackground.clientWidth; // getBoundingClientRect().width;\n const viewHeight = animationBackground.clientHeight; // getBoundingClientRect().height;\n const viewAspectRatio = viewWidth / viewHeight;\n if (imageAspectRatio < viewAspectRatio) {\n // black bars on side\n const imageWidth = viewHeight * imageAspectRatio;\n animationWrapper.style.height = \"100%\";\n animationWrapper.style.width = `${imageWidth}px`;\n animationWrapper.style.left = `${(viewWidth - imageWidth) / 2}px`;\n } else {\n // black bars top and bottom\n const imageHeight = viewWidth / imageAspectRatio;\n animationWrapper.style.width = \"100%\";\n animationWrapper.style.height = `${imageHeight}px`;\n animationWrapper.style.top = `${(viewHeight - imageHeight) / 2}px`;\n }\n animationWrapper.style.overflow = \"hidden\";\n animationWrapper.style.visibility = \"visible\";\n\n this.placeCanvasByScale(\n animationWrapper,\n animationWrapper.firstElementChild as HTMLElement,\n );\n }\n\n //the SVGs and text boxes from an overlay are positioned by absolute pixel values.\n //By default, our canvas size is 100% of the animation wrapper. That doesn't rescale the overlays to fit the canvas.\n //Instead, we want to start the canvas at the size those overlays expect, and then rescale everything to the size of the animation wrapper\n private placeCanvasByScale(\n animationWrapper: HTMLElement,\n canvas: HTMLElement,\n ): void {\n if (canvas.hasAttribute(\"data-imgsizebasedon\")) {\n const originalDimensions = canvas\n .getAttribute(\"data-imgsizebasedon\")\n .split(\",\")\n .map(parseFloat);\n const animationWrapperDimensions = [\n animationWrapper.clientWidth,\n animationWrapper.clientHeight,\n ];\n\n canvas.style.width = `${originalDimensions[0]}px`;\n canvas.style.height = `${originalDimensions[1]}px`;\n canvas.style.scale = `${animationWrapperDimensions[0] / originalDimensions[0]}`;\n\n //after applying the scale, the canvas will be centered in the same place. Move its top left corner to coincide with the canvas's top left corner.\n //our top left corner moved half the difference between the original canvas's dimensions and the animation wrapper's dimensions\n canvas.style.top = `${(animationWrapperDimensions[1] - originalDimensions[1]) / 2}px`;\n canvas.style.left = `${(animationWrapperDimensions[0] - originalDimensions[0]) / 2}px`;\n }\n }\n\n // Adjust the animation wrapper for a change of orientation. The name is slightly obsolete\n // since currently we don't continue the animation if we change to portrait mode,\n // where animation is disabled. And if we change to landscape mode, we don't try\n // to start up the animation in the middle of the narration. So all it really\n // has to do currently is REMOVE the animation stuff if changing to portrait.\n // However, since everything else is built around shouldAnimatePage, it seemed\n // worth keeping the logic that adjusts things if we ever go from one animated\n // orientation to another. Note, however, that the 'page' argument passed is not\n // currently valid if turning ON animation. Thus, we will need to do more to get\n // the right page if we want to turn animation ON while switching to horizontal.\n private adjustAnimationWrapper(page: HTMLElement): void {\n if (!page) {\n return;\n }\n if (!this.shouldAnimate(page)) {\n // we may have a left-over animationWrapper from animating in the other orientation,\n // which could confuse things.\n this.removeAnimationWrappers(page);\n return;\n }\n // Nothing to do if we don't have an animation wrapper currently.\n const animationWrapper = this.getAnimationWrapper(page);\n if (!animationWrapper) {\n return;\n }\n this.placeAnimationWrapper(animationWrapper);\n }\n\n private getAnimationWrapper(page: HTMLElement): HTMLElement | null {\n if (!page) {\n return null;\n }\n const animationDiv = Animation.getAnimationCanvas(page);\n if (!animationDiv || animationDiv.children.length !== 1) {\n return null;\n }\n const animationWrapper = animationDiv.firstElementChild as HTMLElement;\n if (!animationWrapper.classList.contains(Animation.wrapperClassName)) {\n return null;\n }\n return animationWrapper;\n }\n\n private removeAnimationWrappers(page: HTMLElement) {\n if (\n page.firstElementChild &&\n page.firstElementChild.classList.contains(\n \"bloom-animationBackground\",\n )\n ) {\n page.removeChild(page.firstElementChild);\n }\n }\n\n //returns true if:\n // bloom player core has set this.PlayAnimations to true (this.PlayAnimations = bookInfo.playAnimations)\n // AND the page in question is in landscape orientation\n // Notably, this is NOT a check for whether the animation is currently paused, just whether an animation should be applied to the page.\n public shouldAnimate(page: HTMLElement): boolean {\n return (\n this.PlayAnimations &&\n page.getAttribute(\"class\")!.indexOf(\"Landscape\") >= 0\n );\n }\n}\n\n//Important note: the HTML element sent to this class's constructor must have a parent with overflow set to hidden.\n// The parent must be the desired size and shape of the image to be displayed, and the element sent in should start at that same size and shape.\n//Also note that the aspect ratio is determined by that parent container. Therefore, only one of the height or width on (intitial/final)rect will have an effect: the one which requires a higher level of zoom.\nexport class TransformBasedAnimator {\n private initialScale: number;\n private finalScale: number;\n private initialLeft: number;\n private finalLeft: number;\n private initialTop: number;\n private finalTop: number;\n\n private canvasToAnimate: HTMLElement;\n\n private lastFrameTime: number;\n private totalElapsedTime: number;\n private duration: number; //stored in milliseconds\n\n private paused: boolean;\n\n //initial and final rect strings come in as space-separated \"left top width height\"\n // all four of these parameters are reperesented as fractions of the canvas\n //duration is the length of the animation in seconds\n //canvasToAnimate is the whole canvas containing the images to be animated.\n // note that canvasToAnimate needs to be the child of an element that has the correct aspect ratio, has overflow set to hidden, AND has a transform applied\n // the parent's transform can just be translateZ(0), but it needs to be moved out of the page stacking context in the same way as its child in order for overflow:hidden to have any effect\n constructor(\n initialRect: string,\n finalRect: string,\n duration: number,\n canvasToAnimate: HTMLElement,\n ) {\n this.duration = duration * 1000; //this.duration is stored in milliseconds\n this.totalElapsedTime = 0;\n this.lastFrameTime = Date.now();\n\n this.paused = true;\n\n this.canvasToAnimate = canvasToAnimate;\n\n const initialVals = initialRect.split(\" \").map(parseFloat);\n const finalVals = finalRect.split(\" \").map(parseFloat);\n\n //error handling: if any inputs attempt to do anything that will result in any part of the animation box being blank at any time,\n //set class variables such that no animation plays.\n // JT November 2025: The book in BL-15408 has initialVals[1] + initialVals[3] adding up to 1.0003, probably because\n // of a rounding error. I'm not sure I fully understand what problem it causes when this sum is much larger than 1,\n // but it doesn't seem to cause any problem when it's just a tiny bit over, so I added some tolerance here.\n if (\n initialVals.length != 4 ||\n finalVals.length != 4 ||\n Math.min(...finalVals) < 0 ||\n Math.min(...initialVals) < 0 ||\n initialVals[0] + initialVals[2] > 1.01 ||\n initialVals[1] + initialVals[3] > 1.01 ||\n finalVals[0] + finalVals[2] > 1.01 ||\n finalVals[1] + finalVals[3] > 1.01\n ) {\n this.initialScale = 1;\n this.finalScale = 1;\n this.initialLeft = 0;\n this.finalLeft = 0;\n this.initialTop = 0;\n this.finalTop = 0;\n } else {\n const initialLeftFrac = initialVals[0];\n const finalLeftFrac = finalVals[0];\n const initialTopFrac = initialVals[1];\n const finalTopFrac = finalVals[1];\n //for now, we'll let scale default to the more zoomed-in of width or height.\n //By just changing scale, we maintain the original aspect ratio.\n this.initialScale = 1 / Math.min(initialVals[2], initialVals[3]);\n if (this.initialScale == 1) this.initialScale = 1.0001; //avoid edge case where scale=1 and we divide by zero below\n this.finalScale = 1 / Math.min(finalVals[2], finalVals[3]);\n if (this.finalScale == 1) this.finalScale = 1.0001;\n\n //the amount we need to move the top left corner relative to the center is 50% - (1/2 width + position)\n this.initialLeft =\n this.initialScale *\n 100 *\n (0.5 - (0.5 * initialVals[2] + initialVals[0]));\n this.initialTop =\n this.initialScale *\n 100 *\n (0.5 - (0.5 * initialVals[3] + initialVals[1]));\n this.finalLeft =\n this.finalScale *\n 100 *\n (0.5 - (0.5 * finalVals[2] + finalVals[0]));\n this.finalTop =\n this.finalScale *\n 100 *\n (0.5 - (0.5 * finalVals[3] + finalVals[1]));\n }\n }\n\n //Enhance: changing scale while changing left/top can result in slightly choppy motion if the direction of apparent motion from scaling is opposite the direction of motion from left and/or top\n //this is noticeable at low speeds.\n //consider coordinating scale with left/top somehow\n private getScaleAndPosition(): {\n scale: number;\n left: number;\n top: number;\n } {\n let fractionComplete = this.totalElapsedTime / this.duration;\n fractionComplete = Math.min(1, Math.max(0, fractionComplete)); //paranoia\n const easingFactor = this.easingFunction(fractionComplete);\n const currentScale =\n this.initialScale +\n (this.finalScale - this.initialScale) * easingFactor;\n const currentLeft =\n this.initialLeft +\n (this.finalLeft - this.initialLeft) * easingFactor;\n const currentTop =\n this.initialTop + (this.finalTop - this.initialTop) * easingFactor;\n\n return {\n scale: currentScale,\n left: currentLeft,\n top: currentTop,\n };\n }\n\n //make the animation smoother by applying a non-linear transformation.\n //progress must be between 0 and 1, and this function returns a number between 0 and 1\n private easingFunction(progress: number): number {\n //ease in and out with a cosine function\n return (-1 * (Math.cos(progress * Math.PI) - 1)) / 2;\n }\n\n private advanceAnimation() {\n //only advance the animation if we aren't paused.\n if (this.paused) return;\n\n const currentTime = Date.now();\n this.totalElapsedTime += currentTime - this.lastFrameTime;\n\n // Only advance the animation until the duration is up.\n // The endAnimation method relies on this guard statement to prevent changes to the canvas state after the animation is done.\n // That's necessary because there can still be one more call to this method after endAnimation has been called.\n if (this.totalElapsedTime >= this.duration) return;\n\n this.setCurrentAnimationFrame();\n\n this.lastFrameTime = currentTime;\n\n requestAnimationFrame(() => this.advanceAnimation());\n }\n\n public setCurrentAnimationFrame() {\n const { scale, left, top } = this.getScaleAndPosition();\n this.canvasToAnimate.style.transform = `translate(${left}%, ${top}%) scale(${scale})`;\n }\n\n public pause() {\n this.paused = true;\n }\n\n public resume() {\n this.paused = false;\n this.lastFrameTime = Date.now();\n this.advanceAnimation();\n }\n\n public startAnimation() {\n this.paused = false;\n this.totalElapsedTime = 0;\n this.lastFrameTime = Date.now();\n this.advanceAnimation();\n }\n\n //After end animation is called, there may be one more call to advanceAnimation,\n // which will see that the duration has been exceeded and do nothing.\n public endAnimation() {\n this.totalElapsedTime = this.duration + 1;\n }\n}\n"],"names":["LiteEvent","handler","data","PlaybackMode","PlaybackMode2","currentPlaybackMode","setCurrentPlaybackMode","mode","durationReporter","listenForPlayDuration","reporter","isSwipeInProgress","setTestIsSwipeInProgress","tester","logNarration","setLogNarration","logger","playerUrlPrefix","setPlayerUrlPrefix","prefix","setPlayerUrlPrefixFromWindowLocationHref","bookSrc","getUrlPrefixFromWindowHref","index","urlPrefix","sortAudioElements","input","keyedItems","item","getTgTabIndex","x","y","tg","kHighlightSegmentClass","kEnableHighlightClass","kDisableHighlightClass","kSuppressHighlightClass","durationOfPagesWithoutNarration","setDurationOfPagesWithoutNarration","d","kAudioSentence","kImageDescriptionClass","currentPlayPage","recentPageChange","setCurrentPage","page","getCurrentNarrationPage","fakeNarrationTimer","segmentsWeArePlaying","currentAudioId","elementsToPlayConsecutivelyStack","subElementsWithTimings","PageNarrationComplete","PlayCompleted","PlayFailed","ToggleImageDescription","currentAudioSessionNum","includeImageDescriptions","setIncludeImageDescriptions","b","audioPlayCurrentStartTime","playAllSentences","canvasToExclude","pageToPlay","playAllAudio","getPageAudioElements","elements","mediaPlayer","getPlayer","fixHighlighting","stackSize","firstElementToPlay","setSoundAndHighlight","playCurrentInternal","multiSpaceRegex","multiSpaceRegexGlobal","audioElements","audioElement","findAll","element","removeHighlightClasses","fixHighlightingInNode","child","node","startingSpan","fixHighlightingInTextNode","childNode","textNode","matches","regexResult","matchingText","newNodes","makeHighlightedSpan","lastMatchEndIndex","i","match","preMatchText","postMatchText","oldNode","nodeToInsert","textContent","newSpan","canPlayAudio","playEnded","timingsStr","childSpanElements","fields","subElementCount","durationSecs","currentSegment","isImageDescriptionSegment","gotErrorPlaying","promise","highlightNextSubElement","handlePlayPromise","segment","player","reason","originalSessionNum","startTimeInSecs","topTuple","endTimeInSecs","setHighlightTo","currentTimeInSecs","durationInSecs","onSubElementHighlightTimeEnded","playedDurationInSecs","nextStartTimeInSecs","minRemainingDurationInSecs","removeAudioCurrent","around","audioCurrentArray","currentImg","newElement","disableHighlightIfNoAudio","oldElement","setSoundFrom","shouldScrollToElement","scrollElementIntoView","e","hasError","translationGroup","imgContainer","_a","_b","scrollAncestor","getEditable","mover","elt","bounds","parent","parentBounds","scale","leftRelativeToParent","firstAudioSentence","getFirstAudioSentenceWithinElement","id","setCurrentAudioId","audioSentences","getAudioSegmentsWithinElement","audioSegments","collection","audioSentenceElement","updatePlayerStatus","reportPlayDuration","url","currentAudioUrl","getAudio","a","handlePlayEnded","handlePlayError","abortNarrationPlayback","keepPlayingTheStack","elementJustPlayed","newStackCount","nextElement","reportPlayEnded","duration","init","current","expr","container","includeSelf","allMatches","getPlayableDivs","results","getPagePlayableDivs","pageHasAudio","playNarration","pauseNarration","pausePlaying","computeDuration","pageDuration","attrDuration","hidingPage","playAllVideo","then","video","showVideoError","hideVideoError","badVideoMessage","msgDiv","divs","kLegacyCanvasElementSelector","targetPositions","originalPositions","currentPage","currentChangePageAction","positionsToRestore","savePositions","restorePositions","p","adjustDraggablesForLanguage","draggables","draggable","shouldBeVisible","target","getTarget","IsRunningOnBloomDesktop","bloomPage","prepareActivity","changePageAction","doShowAnswersInTargets","changePageButtonClicked","img","targets","targetId","startDrag","playVideo","dontPlayWhenClicked","top","playAudioOfTarget","checkButtons","tryAgainButtons","showCorrectButtons","performCheck","performTryAgain","showCorrect","playSoundOf","prepareOrderSentenceActivity","contentElt","content","words","shuffledWords","shuffle","makeWordItems","undoPrepareActivity","inPlayer","soundFile","playSound","playAudioOf","playables","getAudioSentencesOfVisibleEditables","possibleElements","getVisibleEditables","getAudioSentences","makeDraggable","userStyle","c","lang","word","wordItem","startDragWordInSentence","next","playInitialElements","playVideos","initialFilter","ce","videoElements","reportScore","possible","actual","setReportScore","reportScoreFunction","editables","result","array","areItemsTheSame","allItemsAreTheSame","originalArray","bestChanges","bestResult","loopCount","currentIndex","randomIndex","changes","isTheTextInDraggablesTheSame","eltWidth","w","eltHeight","h","correctAnswer","userStyleSource","classSetter","dragStartX","dragStartY","dragTarget","snapped","getScale","stopDrag","elementDrag","deltaMin","xBest","yBest","slot","offsetX","offsetY","deltaX","deltaY","delta","oldPosition","rightPosition","originalPosition","getVisibleText","visibleDivs","draggableToCheck","actualX","actualY","correctX","correctY","allCorrect","checkDraggables","checkRandomSentences","showCorrectOrWrongItems","className","wanted","draggableReposition","wordBeingRepositioned","defaultCorrectSoundUrl","defaultWrongSoundUrl","setDefaultSoundUrls","correctSoundUrl","wrongSoundUrl","correct","playOtherStuff","elementsMadeVisible","possibleNarrationElements","addPrefix","someElt","audio","visibleText","otherDraggable","placeHolder","startWidth","draggableWordMargin","makeAnimationPlaceholder","stopDragWordInSentence","dragWordInSentence","preventTouchDefault","lastItemDraggedOver","animationInProgress","itemDraggedOver","rect","children","animateMove","relatedItems","_c","itemBeingRepositioned","placeholder","movePlaceholder","duplicate","start","step","elapsed","fraction","originalWordWidth","sentences","sentence","correctAnswerWords","actualWordElements","j","showNow","copyContentToTarget","removeContentFromTarget","throwAway","imageContainer","wrapper","background","draggingSlider","setupWordChooserSlider","global","factory","module","this","window","noGlobal","arr","getProto","slice","flat","push","indexOf","class2type","toString","hasOwn","fnToString","ObjectFunctionString","support","isFunction","obj","isWindow","document","preservedScriptAttributes","DOMEval","code","doc","val","script","toType","version","jQuery","selector","context","num","elems","ret","callback","elem","_elem","len","options","name","src","copy","copyIsArray","clone","length","deep","msg","proto","Ctor","isArrayLike","first","second","invert","callbackInverse","callbackExpect","arg","value","_i","type","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","expando","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","rcssescape","fcssescape","ch","asCodePoint","unloadHandler","inDisabledFieldset","addCombinator","els","seed","m","nid","groups","newSelector","newContext","nodeType","testContext","toSelector","keys","cache","key","markFunction","fn","assert","el","addHandle","attrs","siblingCheck","cur","diff","createInputPseudo","createButtonPseudo","createDisabledPseudo","disabled","createPositionalPseudo","argument","matchIndexes","namespace","hasCompare","subWindow","attrId","tag","tmp","adown","bup","compare","aup","ap","bp","sel","duplicates","excess","unquoted","nodeNameSelector","nodeName","pattern","operator","check","what","_argument","last","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","dir","useCache","pseudo","args","idx","matched","matcher","unmatched","text","elemLang","hash","attr","_matchIndexes","setFilters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","filter","newUnmatched","mapped","setMatcher","preFilter","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","find","compiled","_name","until","truncate","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","not","self","rootjQuery","root","rparentsprev","guaranteedUnique","l","selectors","sibling","rnothtmlwhite","createOptions","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","add","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","func","tuples","state","deferred","fns","newDefer","tuple","returned","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","process","stateString","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","error","stack","readyList","wait","completed","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","camelCase","string","acceptData","owner","Data","prop","dataPriv","dataUser","rbrace","rmultiDash","getData","dataAttr","startLength","hooks","setter","count","defer","pnum","rcssNum","cssExpand","documentElement","isAttached","composed","isHiddenWithinTree","adjustCSS","valueParts","tween","adjusted","maxIterations","currentValue","initial","unit","initialInUnit","defaultDisplayMap","getDefaultDisplay","display","showHide","show","values","rcheckableType","rtagName","rscriptType","fragment","div","wrapMap","getAll","setGlobalEval","refElements","buildFragment","scripts","selection","ignored","wrap","attached","nodes","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","safeActiveElement","on","types","one","origFn","event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","mappedTypes","origCount","nativeEvent","handlerQueue","matchedHandlers","matchedSelectors","delegateCount","hook","originalEvent","leverageNative","notAsync","saved","handle","props","button","delegateType","orig","fix","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","udataOld","udataCur","fixInput","domManip","hasScripts","iNoClone","valueIsFunction","remove","keepData","html","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","original","insert","rnumnonpx","getStyles","view","swap","old","rboxStyle","computeStyleTests","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","measure","reliableTrDimensionsVal","table","tr","trChild","trStyle","curCSS","computed","width","minWidth","maxWidth","style","addGetHookIf","conditionFn","hookFn","cssPrefixes","emptyStyle","vendorProps","vendorPropName","capName","finalPropName","final","rdisplayswap","rcustomProp","cssShow","cssNormalTransform","setPositiveNumber","subtract","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","getWidthOrHeight","boxSizingNeeded","valueIsBorderBox","offsetProp","origName","isCustomProp","scrollboxSizeBuggy","suffix","expanded","parts","Tween","end","easing","percent","eased","fxNow","inProgress","rfxtypes","rrun","schedule","createFxNow","genFx","includeWidth","which","createTween","animation","Animation","defaultPrefilter","opts","toggle","oldfire","propTween","restoreDisplay","isBox","anim","hidden","dataShow","propFilter","specialEasing","properties","stopped","tick","currentTime","gotoEnd","prepend","speed","opt","to","empty","optall","doAnimation","clearQueue","stopQueue","stop","dequeue","timers","cssFn","timer","time","timeout","boolHook","attrHandle","nType","attrNames","getter","lowercaseName","rfocusable","rclickable","tabindex","stripAndCollapse","getClass","classesToArray","classes","curValue","clazz","finalValue","stateVal","isValidValue","classNames","rreturn","option","max","optionSet","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","attaches","location","nonce","rquery","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","s","valueOrFunction","r20","rhash","rantiCache","rheaders","rlocalProtocol","rnoContent","rprotocol","prefilters","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","selected","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxHandleResponses","responses","ct","finalDataType","firstDataType","contents","ajaxConvert","response","isSuccess","conv2","conv","prev","converters","settings","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","statusText","finalText","status","nativeStatusText","headers","success","modified","htmlIsFunction","xhrSuccessStatus","xhrSupported","errorCallback","complete","xhr","evt","oldCallbacks","rjsonp","originalSettings","callbackName","overwritten","responseContainer","jsonProp","body","keepScripts","parsed","params","off","responseText","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","position","curElem","win","offsetParent","offset","parentOffset","defaultExtra","funcName","margin","fnOver","fnOut","proxy","hold","_jQuery","_$","require$$0","domfocus","mousefocus","tabindexcounter","ascrailcounter","globalmaxzindex","$","_doc","_win","$window","delegatevents","getScriptPath","path","setAnimationFrame","clearAnimationFrame","anilasttime","currTime","timeToCall","ClsMutationObserver","now","_globaloptions","browserdetected","getBrowserDetection","_el","_style","_agent","_platform","evs","detectCursorGrab","lst","NiceScrollClass","myopt","me","$body","writingMode","cap","tm","dd","pars","BezierClass","st","ed","spd","p1","p2","p3","p4","pc","bz","getMatrixValues","mtx","cxscrollleft","silent","getZIndex","dom","zi","_convertBorderWidth","getWidthToPixel","chkheight","wd","px","brd","ofs","scrl","ww","vp","pos","wpos","dbl","hr","pg","_scrollyhidden","cont","cursor","rail","kp","zoom","railh","bd","rlpos","ScrollMomentumClass2D","skp","ismouse","le","maxh","maxw","wp","ip","moveneedoffset","locktollerance","byiframe","ofy","ofx","fy","my","fx","mx","ny","nx","ay","ax","dz","hronly","mw","checkSelectionScroll","df","rt","tp","ctrl","shift","mutations","mut","_dom","mo","oniframeload","hh","py","lx","premaxh","premaxw","previewh","previeww","sy","hlazyresize","hiderails","_modernWheelEvent","bubble","wname","passiveSupported","listener","useCapture","active","de","r","bub","ov","cx","cy","rx","ry","ms","info","scrolldiry","scrolldirx","scrolltmr","scrollspd","doScrollRelative","chkscroll","iswheel","gap","dx","chk","dy","dty","dtx","hasparentscrollingphase","execScrollWheel","hrend","nw","dif","lasttransitionstyle","istime","trans","loop","lft","dst","clipped","stp","relative","pp","bkg","nc","sx","newy","newx","snap","gp","sl","pageh","pagew","xm","onscroll","_scrollTop","nice","_scrollLeft","NiceScrollArray","doms","mplex","_opt","$this","wrp","docundef","kSelectorForPotentialNiceScrollElements","addScrollbarsToPage","pointerEventHandler","isRunningOnBloomDesktop","scrollBlocks","countOfObserversExpectedToReport","countOfObserversThatHaveReported","firstChild","lastChild","scaleStyle","scaleContainer","scaleValue","topAdjust","leftAdjust","thumbWidth","ComputeNiceScrollOffsets","observer","entries","ob","entry","isBubble","overflowing","maxBubbleOverflowLineFraction","overflow","lineHeightPx","lineHeight","group","setupSpecialMouseTrackingForNiceScroll","getNiceScrollParent","parentElt","translationGroupDiv","compStyles","topPadding","leftPadding","splitPageComponentInner","right","listenForPointerDown","eventName","fixNiceScrollOffsets","groupNiceScroll","ev","cleanupNiceScroll","groupParent","DomHelper","cssPropertyValue","_Animation","animationBackground","wrapperDiv","animatedCanvas","paused","animationWrapper","animationCanvas","checkForBackgroundImage","backgroundImage","initialRect","finalRect","TransformBasedAnimator","canvas","canvasDimensions","waitForImageAndSetAspectRatio","virtualImage","imageAspectRatio","viewWidth","viewHeight","viewAspectRatio","imageWidth","imageHeight","originalDimensions","animationWrapperDimensions","animationDiv","canvasToAnimate","initialVals","finalVals","fractionComplete","easingFactor","currentScale","currentLeft","currentTop","progress","left"],"mappings":"AAQA,MAAqBA,GAAsC;AAAA,EAA3D,cAAA;AACI,SAAQ,WAAsC;EAAC;AAAA,EAExC,UAAUC,GAA6B;AAC1C,IAAI,KAAK,SAAS,QAAQA,CAAO,MAAM,MAC9B,KAAA,SAAS,KAAKA,CAAO;AAAA,EAElC;AAAA,EAEO,YAAYA,GAA6B;AAC5C,SAAK,WAAW,KAAK,SAAS,OAAO,CAAC,MAAM,MAAMA,CAAO;AAAA,EAC7D;AAAA,EAEO,MAAMC,GAAU;AACd,SAAA,SAAS,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAEA,CAAI,CAAC;AAAA,EACjD;AACJ;ACQY,IAAAC,uBAAAA,OACRA,EAAAC,EAAA,UAAA,CAAA,IAAA,WACAD,EAAAC,EAAA,qBAAA,CAAA,IAAA,sBACAD,EAAAC,EAAA,eAAA,CAAA,IAAA,gBACAD,EAAAC,EAAA,cAAA,CAAA,IAAA,eACAD,EAAAC,EAAA,eAAA,CAAA,IAAA,gBACAD,EAAAC,EAAA,cAAA,CAAA,IAAA,eACAD,EAAAC,EAAA,gBAAA,CAAA,IAAA,iBAPQD,IAAAA,MAAA,CAAA,CAAA;AAWL,IAAIE,KAAoC;AACxC,SAASC,GAAuBC,GAAoB;AACjC,EAAAF,KAAAE;AAC1B;AAKW,IAAAC;AACJ,SAASC,GAAsBC,GAAsC;AACrD,EAAAF,KAAAE;AACvB;AAMW,IAAAC;AACJ,SAASC,GAAyBC,GAAuB;AACxC,EAAAF,KAAAE;AACxB;AAGO,IAAIC,KAAsC,MAAM;AAEvD;AACO,SAASC,GAAgBC,GAA+B;AAC3D,EAAAF,KACIE,MACC,MAAM;AAAA,EAAA;AAGf;AAEA,IAAIC,KAAkB;AAOf,SAASC,GAAmBC,GAAgB;AAC7B,EAAAF,KAAAE;AACtB;AAEO,SAASC,GAAyCC,GAAiB;AACnD,EAAAH,GAAAI,GAA2BD,CAAO,CAAC;AAC1D;AAEO,SAASC,GAA2BD,GAAiB;AAClD,QAAAE,IAAQF,EAAQ,YAAY,GAAG;AAC9B,SAAAA,EAAQ,UAAU,GAAGE,CAAK;AACrC;AAEO,SAASC,KAAoB;AAChC,SAAIP,MAGGK,GAA2B,OAAO,SAAS,IAAI;AAC1D;AAgBO,SAASG,GAAkBC,GAAqC;AACnE,QAAMC,IAAaD,EAAM,IAAI,CAACE,GAAML,OACzB,EAAE,UAAUM,GAAcD,CAAI,GAAG,OAAAL,GAAO,MAAAK,IAClD;AACU,SAAAD,EAAA,KAAK,CAACG,GAAGC,MAIZ,CAACD,EAAE,YAAY,CAACC,EAAE,YAAYD,EAAE,aAAaC,EAAE,WACxCD,EAAE,QAAQC,EAAE,QAGhB,SAASD,EAAE,UAAU,EAAE,IAAI,SAASC,EAAE,UAAU,EAAE,CAC5D,GACMJ,EAAW,IAAI,CAACG,MAAMA,EAAE,IAAI;AACvC;AAEA,SAASD,GAAcH,GAAmC;AACtD,MAAIM,IAAyBN;AAC7B,SAAOM,KAAM,CAACA,EAAG,UAAU,SAAS,wBAAwB;AACxD,IAAAA,IAAKA,EAAG;AAEZ,SAAKA,KAGEA,EAAG,aAAa,UAAU,KAAK;AAC1C;AAGO,MAAMC,KAAyB,0BAGhCC,KAAwB,sBAKxBC,KAAyB,uBAIzBC,KAA0B;AAEhC,IAAIC,KAAkC;AAC/B,SAASC,GAAmCC,GAAW;AACxB,EAAAF,KAAAE;AACtC;AAIO,MAAMC,KAAiB,kBAExBC,KAAyB;AAG/B,IAAIC,KAAsC,MAKtCC,KAAwB;AAGrB,SAASC,GAAeC,GAAmB;AAC9C,EAAIA,MAASH,OACTC,MACA,aAAaA,EAAgB,GAEjCA,KAAmB,WAAW,MAAM;AACb,IAAAA,KAAA;AAAA,KACpB,GAAI,GACWD,KAAAG;AACtB;AAEO,SAASC,KAAuC;AAC5C,SAAAJ;AACX;AAYA,IAAIK,IAKAC,IAEAC,KAAiB,IAGjBC,KAAkD,CAAA,GAClDC,KAAmD,CAAA;AAM1C,MAAAC,KAAwB,IAAIpD,GAAuB,GACnDqD,KAAgB,IAAIrD,GAAuB,GAG3CsD,KAAa,IAAItD,GAAuB,GAOxCuD,KAAyB,IAAIvD,GAAmB;AAK7D,IAAIwD,KAAiC,GAEjCC,KAAoC;AACjC,SAASC,GAA4BC,GAAY;AACzB,EAAAF,KAAAE;AAC/B;AAIA,IAAIC,KAA2C;AAI/B,SAAAC,GACZhB,GACAiB,GACI;AACA,MAAA,CAACjB,KAAQ,CAACH;AACV;AAEJ,QAAMqB,IAAalB,KAAQH;AAC3B,EAAAsB,GAAaC,GAAqBF,GAAYD,CAAe,GAAGC,CAAU;AAC9E;AAEgB,SAAAC,GAAaE,GAAyBrB,GAAyB;AAC3E,EAAAD,GAAeC,CAAI,GACIG,KAAAkB;AAEvB,QAAMC,IAAcC;AACpB,EAAID,MAOID,EAAS,UAAU,KACnBC,EAAY,MAAM,GAEtBA,EAAY,cAAc,IAK5B,EAAAX,IAEFa,GAAgBH,CAAQ,GAIWhB,KAAAzB,GAAkByC,CAAQ,EAAE,QAAQ;AAEvE,QAAMI,IAAYpB,GAAiC;AACnD,MAAIoB,MAAc,GAAG;AAGjB,IAAIjB,OACAA,MAAA,QAAAA,GAAe,MAAMR,KAKzBvC;AAAA,MAAuB;AAAA;AAAA,IAAyB,GAC5C8C,OACqBL,KAAA,OAAO,WAAW,MAAM;AACzC,MAAAzC;AAAA,QAAuB;AAAA;AAAA,MAA0B,GACjD8C,MAAA,QAAAA,GAAuB,MAAMP;AAAA,IAAI,GAClCR,KAAkC,GAAI;AAE7C;AAAA,EACJ;AAEM,QAAAkC,IAAqBrB,GAAiCoB,IAAY,CAAC;AAezE,EAAAE,GAAqBD,GAAoB,EAAI,GAE7CjE;AAAA,IAAuB;AAAA;AAAA,EAAyB,GAC5BmE;AAExB;AAIA,MAAMC,KAAkB,uBAClBC,KAAwB,IAAI,OAAOD,IAAiB,GAAG;AAM7D,SAASL,GAAgBO,GAA8B;AAIrC,EAAAA,EAAA,QAAQ,CAACC,MAAiB;AAO5B,IALQC;AAAA,MACZ;AAAA,MACAD;AAAA,MACA;AAAA,IAAA,EAEI,QAAQ,CAACE,MAAY;AAIzB,MAAAC,GAAuBD,CAAO,GAM1B,CAAC,CAACA,EAAQ,UAAU,MAAML,EAAe,KAGzCO,GAAsBF,GAASA,CAAO;AAAA,IAC1C,CACH;AAAA,EAAA,CACJ;AACL;AAGA,SAASC,GAAuBD,GAAsB;AAC1C,EAAAA,EAAA,UAAU,OAAO5C,EAAsB,GACvC4C,EAAA,UAAU,OAAO7C,EAAqB,GAE9C,MAAM,KAAK6C,EAAQ,QAAQ,EAAE,QAAQ,CAACG,MAAuB;AACzD,IAAAF,GAAuBE,CAAK;AAAA,EAAA,CAC/B;AACL;AAOA,SAASD,GAAsBE,GAAYC,GAA+B;AAElE,MAAA,EAAAD,EAAK,aAAa,KAAK,gBACtBA,EAAiB,UAAU,SAAShD,EAAsB;AAIpD,QAAAgD,EAAK,aAAa,KAAK,WAAW;AAEzC,MAAAE,GAA0BF,GAAMC,CAAY;AAC5C;AAAA,IAAA;AAIe,MADQ,MAAM,KAAKD,EAAK,UAAU,EAClC,QAAQ,CAACG,MAAc;AAClC,QAAAL,GAAsBK,GAAWF,CAAY;AAAA,MAAA,CAChD;AAET;AAKA,SAASC,GACLE,GACAH,GACF;AACM,MAAAG,EAAS,aAAa,KAAK;AAC3B,UAAM,IAAI;AAAA,MACN;AAAA,IAAA;AAIJ,MAAA,CAACA,EAAS;AACV;AAKJ,EAAAZ,GAAsB,YAAY;AAClC,QAAMa,IAIA,CAAA;AACF,MAAAC;AACJ,UACKA,IAAcd,GAAsB,KAAKY,EAAS,SAAS,MAAM;AAEtD,IAAAE,EAAA,QAAQ,CAACC,MAAiB;AAClC,MAAAF,EAAQ,KAAK;AAAA,QACT,MAAME;AAAA,QACN,YACIf,GAAsB,YAAYe,EAAa;AAAA,QACnD,UAAUf,GAAsB;AAAA;AAAA,MAAA,CACnC;AAAA,IAAA,CACJ;AAIL,QAAMgB,IAAmB,CAAA;AACrB,MAAAH,EAAQ,WAAW;AAEnB,IAAAG,EAAS,KAAKC,GAAoBL,EAAS,SAAS,CAAC;AAAA,OAClD;AACH,QAAIM,IAAoB;AACxB,aAASC,IAAI,GAAGA,IAAIN,EAAQ,QAAQ,EAAEM,GAAG;AAC/B,YAAAC,IAAQP,EAAQM,CAAC,GAEjBE,IAAeT,EAAS,UAAU;AAAA,QACpCM;AAAA,QACAE,EAAM;AAAA,MAAA;AAON,UALJF,IAAoBE,EAAM,UACtBC,KAAcL,EAAS,KAAKC,GAAoBI,CAAY,CAAC,GAEjEL,EAAS,KAAK,SAAS,eAAeI,EAAM,IAAI,CAAC,GAE7CD,MAAMN,EAAQ,SAAS,GAAG;AAC1B,cAAMS,IAAgBV,EAAS,UAAU,MAAMQ,EAAM,QAAQ;AAC7D,QAAIE,KACSN,EAAA,KAAKC,GAAoBK,CAAa,CAAC;AAAA,MAExD;AAAA,IACJ;AAAA,EACJ;AAGA,QAAMC,IAAUX;AAChB,MAAIW,EAAQ,cAAcP,KAAYA,EAAS,SAAS,GAAG;AACvD,aAASG,IAAI,GAAGA,IAAIH,EAAS,QAAQ,EAAEG,GAAG;AAChC,YAAAK,IAAeR,EAASG,CAAC;AACvB,MAAAI,EAAA,WAAW,aAAaC,GAAcD,CAAO;AAAA,IACzD;AAEQ,IAAAA,EAAA,WAAW,YAAYA,CAAO,GAOzBd,EAAA,UAAU,IAAIjD,EAAsB;AAAA,EACrD;AACJ;AAEA,SAASyD,GAAoBQ,GAAqB;AACxC,QAAAC,IAAU,SAAS,cAAc,MAAM;AACrC,SAAAA,EAAA,UAAU,IAAInE,EAAqB,GAC3CmE,EAAQ,YAAY,SAAS,eAAeD,CAAW,CAAC,GACjDC;AACX;AAEA,SAAS5B,KAAsB;AAC3B,MAAIpE,OAAwB,GAA2B;AACnD,UAAM8D,IAAcC;AACpB,QAAID,GAAa;AACP,YAAAY,IAAUjC,KAA0B;AAAA,QACtC,IAAIG,EAAc;AAAA,MAAA;AAEtB,UAAI,CAAC8B,KAAW,CAACuB,GAAoB,GAAG;AAC1B,QAAAC;AACV;AAAA,MACJ;AAKA,MAAApD,KAAyB,CAAA;AAEzB,YAAMqD,IAA4BzB,EAAQ;AAAA,QACtC;AAAA,MAAA;AAEJ,UAAIyB,GAAY;AACZ,cAAMC,IAAoB1B,EAAQ;AAAA,UAC9B,QAAQ9C,EAAsB;AAAA,QAAA,GAE5ByE,IAASF,EAAW,MAAM,GAAG,GAC7BG,IAAkB,KAAK;AAAA,UACzBD,EAAO;AAAA,UACPD,EAAkB;AAAA,QAAA;AAGtB,iBAASX,IAAIa,IAAkB,GAAGb,KAAK,GAAG,EAAEA,GAAG;AAC3C,gBAAMc,IAAuB,OAAOF,EAAOZ,CAAC,CAAC;AACzC,UAAA,MAAMc,CAAY,KAGtBzD,GAAuB,KAAK;AAAA,YACxBsD,EAAkB,KAAKX,CAAC;AAAA,YACxBc;AAAA,UAAA,CACH;AAAA,QACL;AAAA,MAKJ;AAEA,YAAMC,IAAiB9B;AACvB,MAAI8B,KAAkBtD,OACMA,MAAA,QAAAA,GAAA;AAAA,QACpBuD,GAA0BD,CAAc;AAAA,UAI9BE,KAAA;AACZ,YAAAC,IAAU7C,EAAY;AAC1B,QAAAX,IAC0BI,MAAA,oBAAI,KAAK,GAAE,QAAQ,GAC/CqD,GAAwBzD,EAAsB,GAC9C0D,GAAkBF,CAAO;AAAA,IAC7B;AAAA,EACJ;AACJ;AAEA,SAASF,GAA0BK,GAA+B;AAC9D,SAAOA,EAAQ,QAAQ,MAAM1E,EAAsB,MAAM;AAC7D;AAEA,SAASyE,GAAkBF,GAAwBI,GAA2B;AAOtE,EAAAJ,KAAWA,EAAQ,SACXA,EAAA,MAAM,CAACK,MAAgB;AAe3B,YAAQ,IAAI,2BAA2BA,IAAS,MADG,SACc,GAG7DA,KACAA,EACK,SAAA,EACA;AAAA,MACG;AAAA,IAAA,KASA,QAAA;AAAA,MACJ;AAAA,IAAA,GAoBJA,EAAO,SAAS,qBAAqB/D,OACrCA,MAAA,QAAAA,GAAY;AAAA,EAChB,CACH;AAET;AAMA,SAAS2D,GACLK,GACAC,IAA0B,GAC5B;AAEE,QAAMZ,IAAkBxD,GAAuB;AAE/C,MAAIwD,KAAmB;AACnB;AAGE,QAAAa,IAAWrE,GAAuBwD,IAAkB,CAAC,GACrD5B,IAAUyC,EAAS,CAAC,GACpBC,IAAwBD,EAAS,CAAC;AAEzB,EAAAE,GAAA;AAAA,IACX,YAAY3C;AAAA,IACZ,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,EAAA,CAC9B;AAKD,MAAI4C,IAHkC,SAAS;AAAA,IAC3C;AAAA,EAAA,EAEwC;AAC5C,EAAIA,KAAqB,MACDA,IAAAJ;AAMxB,QAAMK,IAAiB,KAAK,IAAIH,IAAgBE,GAAmB,GAAG;AAEtE,aAAW,MAAM;AACb,IAAAE,GAA+BP,CAAkB;AAAA,EAAA,GAClDM,IAAiB,GAAI;AAC5B;AAMA,SAASC,GAA+BP,GAA4B;AAShE,MALIA,MAAuB9D,MAKvBnD,OAAwB;AACxB;AAGJ,QAAMsG,IAAkBxD,GAAuB;AAC/C,MAAIwD,KAAmB;AACnB;AAGJ,QAAMxC,IAAgC,SAAS;AAAA,IAC3C;AAAA,EAAA;AAEA,MAAAA,EAAY,SAASA,EAAY;AAGjC;AAEJ,QAAM2D,IACF3D,EAAY,aAIV4D,IADuB5E,GAAuBwD,IAAkB,CAAC,EACtB,CAAC;AAE9C,MAAAmB,KAAwBA,IAAuBC,GAAqB;AAEpE,UAAMC,IACFD,IAAsBD;AAC1B,eAAW,MAAM;AACb,MAAAD,GAA+BP,CAAkB;AAAA,IAAA,GAClDU,IAA6B,GAAI;AAEpC;AAAA,EACJ;AAEA,EAAA7E,GAAuB,IAAI,GAE3B8D,GAAwBK,GAAoBS,CAAmB;AACnE;AAOA,SAASE,GAAmBC,IAAsB,SAAS,MAAM;AAG7D,QAAMC,IAAoB,MAAM;AAAA,IAC5BD,EAAO,cAAc,uBAAuB,iBAAiB;AAAA,EAAA;AAGjE,WAASpC,IAAI,GAAGA,IAAIqC,EAAkB,QAAQrC;AAC1C,IAAAqC,EAAkBrC,CAAC,EAAE,UAAU,OAAO,iBAAiB;AAE3D,QAAMsC,IACFF,EAAO,cAAc,uBAAuB,oBAAoB,EAAE,CAAC;AACvE,EAAIE,KACWA,EAAA,UAAU,OAAO,oBAAoB;AAExD;AAEA,SAAS5D,GACL6D,GACAC,GACAC,GACF;AACE,EAAAC,GAAaH,CAAU,GACRX,GAAA;AAAA,IACX,YAAAW;AAAA,IACA,uBAAuB;AAAA;AAAA,IACvB,2BAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,CACH;AACL;AAEA,SAASb,GAAe;AAAA,EACpB,YAAAW;AAAA,EACA,uBAAAI;AAAA,EACA,2BAAAH;AAAA,EACA,YAAAC;AACJ,GAAwB;AAEpB,MAAIE;AAGI,QAAA;AACA,MAAAC,GAAsBL,CAAU;AAAA,aAC3BM,GAAG;AACR,cAAQ,MAAMA,CAAC;AAAA,IACnB;AAGJ,MAAIJ,MAAeF;AAEf;AAGJ,EAAAJ,GAAoBM,KAAcF,CAA0B;AAE5D,QAAMlE,IAAcC,MAIdwE,IAAWzE,EAAY,UAAU;AACnC,EAAA,CAACyE,KAAYN,MACYnE,EAAY,cAAc,MAMpCkE,EAAA,UAAU,IAAIjG,EAAuB,GAGpC+B,EAAA,iBAAiB,WAAW,MAAM;AAC/B,IAAAkE,EAAA,UAAU,OAAOjG,EAAuB;AAAA,EAAA,CACtD,GACW+B,EAAA,iBAAiB,SAAS,MAAM;AAC7B,IAAAkE,EAAA,UAAU,OAAO,iBAAiB,GAClCA,EAAA,UAAU,OAAOjG,EAAuB;AAAA,EAAA,CACtD,KAIJwG,KAAqBP,EAAA,UAAU,IAAI,iBAAiB;AAKnD,QAAAQ,IAAmBR,EAAW,QAAQ,yBAAyB;AACrE,MACIQ,KACAA,EAAiB,UAAU,SAASpG,EAAsB,GAC5D;AACE,UAAMqG,IAAeD,EAAiB;AAAA,MAClC;AAAA,IAAA;AAEJ,IAAIC,KACaA,EAAA,UAAU,IAAI,oBAAoB;AAAA,EAEvD;AACJ;AAGA,SAASJ,GAAsB3D,GAAkB;AD3zBjD,MAAAgE,GAAAC;AC8zBQ,MAAArI,MAAA,QAAAA,QAAyBgC,IAAkB;AAOrC,UAAAsG,IAAiBC,GAAYnE,CAAO;AAC1C,IAAIkE,MACAA,EAAe,YAAY;AAE/B;AAAA,EACJ;AAEA,MAAIE,IAAQpE;AACZ,MAAI,OAAO,iBAAiBA,EAAQ,aAAc,EAAE,aAAa,UAAU;AAcvE,UAAMqE,IAAMrE;AACJ,IAAAoE,IAAA,SAAS,cAAc,KAAK,GACpCA,EAAM,MAAM,WAAW,YACjBA,EAAA,MAAM,MAAMC,EAAI,YAAY;AAK5B,UAAAC,IAASD,EAAI,yBACbE,IAASF,EAAI,eACbG,IAAeD,KAAA,gBAAAA,EAAQ,yBACvBE,IAAQD,EAAc,QAAQD,EAAQ,aACtCG,KAAwBJ,EAAO,OAAOE,EAAc,QAAQC;AAElE,IAAAL,EAAM,MAAM,OAAOM,IAAuBL,EAAI,cAAc,IAAI,MAC1DD,EAAA,MAAM,SAASC,EAAI,eAAe,MACxCD,EAAM,MAAM,QAAQ,MACZJ,IAAAhE,EAAA,kBAAA,QAAAgE,EAAe,aAAaI,GAAOpE;AAAA,EAC/C;AAEA,EAAAoE,EAAM,eAAe;AAAA;AAAA,IAEjB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAMV,OAAO;AAAA;AAAA;AAAA,EAAA,CAIV,GACGA,MAAUpE,OACJiE,IAAAG,EAAA,kBAAA,QAAAH,EAAe,YAAYG;AAEzC;AAEA,SAASD,GAAYnE,GAAkC;AACnD,SAAIA,EAAQ,UAAU,SAAS,gBAAgB,IACpCA,IAEAA,EAAQ,QAAQ,iBAAiB;AAEhD;AAEA,SAASyD,GAAazD,GAAkB;AAC9B,QAAA2E,IAAqBC,GAAmC5E,CAAO,GAC/D6E,IAAaF,IAAqBA,EAAmB,KAAK3E,EAAQ;AACxE,EAAA8E,GAAkBD,CAAE;AACxB;AAEA,SAASD,GACL5E,GACc;AACR,QAAA+E,IAAiBC,GAA8BhF,CAAO;AAC5D,SAAI,CAAC+E,KAAkBA,EAAe,WAAW,IACtC,OAGJA,EAAe,CAAC;AAC3B;AAEA,SAASC,GAA8BhF,GAAoC;AACvE,QAAMiF,IAA2B,CAAA;AAEjC,MAAIjF;AACA,QAAIA,EAAQ,UAAU,SAASvC,EAAc;AACzC,MAAAwH,EAAc,KAAKjF,CAAO;AAAA,SACvB;AACG,YAAAkF,IAAalF,EAAQ,uBAAuBvC,EAAc;AAChE,eAASsD,IAAI,GAAGA,IAAImE,EAAW,QAAQ,EAAEnE,GAAG;AAClC,cAAAoE,IAAuBD,EAAW,KAAKnE,CAAC;AAC9C,QAAIoE,KACAF,EAAc,KAAKE,CAAoB;AAAA,MAE/C;AAAA,IACJ;AAGG,SAAAF;AACX;AAEA,SAASH,GAAkBD,GAAY;AAC/B,GAAA,CAAC3G,MAAkBA,OAAmB2G,OACrB3G,KAAA2G,GACEO;AAE3B;AAEA,SAASA,KAAqB;AAC1B,QAAM/C,IAAShD;AACf,MAAI,CAACgD;AACD;AAKA,EAAAA,EAAO,cAAc,KAAK,CAACA,EAAO,UAAU,CAACA,EAAO,SACjCgD;AAEjB,QAAAC,IAAMC,GAAgBrH,EAAc;AAC1C,EAAAnC,GAAauJ,CAAG,GAMTjD,EAAA;AAAA,IACH;AAAA,IACAiD,IAAM,eAAc,oBAAI,KAAK,GAAE,QAAY,IAAA;AAAA,EAAA;AAEnD;AAEA,SAASC,GAAgBV,GAAoB;AAElC,SADQpI,GAAA,IAAc,YAAYoI,IAAK;AAElD;AAEA,SAASxF,KAA8B;AAK5B,SAJOmG,GAAS,sBAAsB,CAACC,MAAM;AAC9C,IAAAA,EAAA,iBAAiB,SAASC,EAAe,GACzCD,EAAA,iBAAiB,SAASE,EAAe;AAAA,EAAA,CAC9C;AAEL;AAEA,SAASD,KAAkB;AACb,EAAAlE;AACd;AAIO,SAASoE,KAAyB;AACrC,EAAItK,OAAwB,KAc5BkG,GAAU,EAAK;AACnB;AAIA,SAASA,GAAUqE,IAAsB,IAAY;AAS7C,MALArH,OACAA,MAAA,QAAAA,GAAwB,MAAM,MAEf6G,MAEflH,MACAA,GAAiC,SAAS,GAC5C;AACQ,UAAA2H,IAAoB3H,GAAiC,OACrD4H,IAAgB5H,GAAiC;AACnD,QAAA4H,IAAgB,KAAKF,GAAqB;AAEpC,YAAAG,IACF7H,GAAiC4H,IAAgB,CAAC;AACtD,MAAAtG,GAAqBuG,GAAa,EAAI,GAClBtG;IAAA;AAEJ,MAAAuG,MAChB/C,GAAmB4C,CAAiB,GAEpCzG,GAAA,EAAY;EAEpB;AACJ;AAEA,SAAS4G,KAAkB;AACvB,EAAA9H,KAAmC,CAAA,GACnCC,KAAyB,CAAA,GAEN8E,MACnB7E,MAAA,QAAAA,GAAuB,MAAMV,KAC7BW,MAAA,QAAAA,GAAe;AACnB;AAEA,SAAS+G,KAAqB;AACtB,MAAA,CAACxG,MAA6B,CAACpD;AAC/B;AAGE,QAAAyK,MADc,oBAAI,KAAK,GAAE,QAAQ,IACPrH,MAA6B;AAC7D,EAAApD,GAAiByK,CAAQ;AAC7B;AAEA,SAASV,GAASX,GAAYsB,GAAyC;AACnE,MAAI9D,IAAkC,SAAS;AAAA,IAC3C,MAAMwC;AAAA,EAAA;AAGN,SAAAxC,KAAU,CAACA,EAAO,SAClBA,EAAO,OAAO,GACLA,IAAA,OAERA,MACQA,IAAA,SAAS,cAAc,OAAO,GAChCA,EAAA,aAAa,MAAMwC,CAAE,GACnB,SAAA,KAAK,YAAYxC,CAAM,GAChC8D,EAAK9D,CAAM,IAERA;AACX;AAEA,SAASd,GAAa6E,GAA2B;AACtC,SAAA;AACX;AAMA,IAAIpE,KAAkB;AAEtB,SAAS2D,KAAkB;AACvB,MAAI3D,IAAiB;AACjB,YAAQ,IAAI,+CAA+C;AAC3D;AAAA,EACJ;AACkB,EAAAA,KAAA,IAClB,QAAQ,IAAI,yBAAyB,GACrC,WAAW,MAAM;AACH,IAAAR;KACX,GAAG;AACV;AAOA,SAASzB,GACLsG,GACAC,GACAC,IAAuB,IACV;AAEP,QAAAC,IAA4B,GAAG,MAAM;AAAA,KACtCF,KAAa,UAAU,iBAAiBD,CAAI;AAAA,EAAA;AAIjD,SAAIE,KAAeD,KAAaA,EAAU,QAAQD,CAAI,KAClDG,EAAW,KAAKF,CAAS,GAGtB5H,KACD8H,IACAA,EAAW,OAAO,CAACxF,MAAU,CAACe,GAA0Bf,CAAK,CAAC;AACxE;AAEA,SAASyF,GACLH,GACAvH,GACF;AAGE,MAAI2H,IAAU3G,GAAQ,mBAAmBuG,CAAS,EAAE;AAAA,IAChD,CAAC1C,MAAM,OAAO,iBAAiBA,CAAC,EAAE,YAAY;AAAA,EAAA;AAElD,SAAI7E,MACU2H,IAAAA,EAAQ,OAAO,CAAC9C,MAAM,CAAC7E,EAAgB,SAAS6E,CAAC,CAAC,IAEzD8C;AACX;AAIA,SAASC,GACL7I,GACAiB,GACa;AACb,SAAO0H,GAAgB3I,KAAcH,IAAkBoB,CAAe;AAC1E;AAIA,SAASG,GACLpB,GACAiB,GACa;AACN,SAAA,CAAA,EAAG,OAAO;AAAA,IACb,CAAC;AAAA,IACD4H,GAAoB7I,GAAMiB,CAAe,EAAE;AAAA,MAAI,CAAChC,MAC5CgD,GAAQ,mBAAmBhD,GAAG,EAAI;AAAA,IACtC;AAAA,EAAA;AAER;AAEO,SAAS6J,GAAa9I,GAA4B;AACrD,SAAO,EAAAoB,GAAqBpB,CAAI,EAAE;AACtC;AAQO,SAAS+I,KAAgB;AAC5B,MAAIvL,OAAwB,GAMxB;AAAA,QAHJC;AAAA,MAAuB;AAAA;AAAA,IAAyB,GAG5C0C,GAAqB,UAAUoB;AAC/B,UAAIlB,GAAiC,QAAQ;AACvB,QAAAgE,GAAA9C,GAAA,EAAY,KAAA,CAAM,GAGRR,MAAA,oBAAI,KAAK,GAAE,QAAQ,GAE/CqD,GAAwBzD,EAAsB;AAC9C;AAAA,MAAA,OACG;AAGH,QAAAK,GAAiB,IAAI;AACrB;AAAA,MACJ;AAKJ,IAAAT,MAAA,QAAAA,GAAuB,MAAMV;AAAA;AACjC;AAEO,SAASmJ,KAAiB;AAC7B,EAAIxL,OAAwB,MAGfyL,MAKbxL;AAAA,IAAuB;AAAA;AAAA,EAAwB;AACnD;AAQA,SAASwL,KAAe;AACpB,QAAM1E,IAAShD;AAEf,eAAarB,EAAkB,GAC3BC,MAAwBA,GAAqB,UAAUoE,MAGnDA,EAAO,cAAc,KAAK,CAACA,EAAO,UAAU,CAACA,EAAO,SACjCgD,MAEvBhD,EAAO,MAAM;AAErB;AASO,SAAS2E,GAAgBlJ,GAA2B;AACvD,MAAImJ,IAAe;AACnB,SAAA/H,GAAqBpB,CAAI,EAAE,QAAQ,CAACsE,MAAY;AACtC,UAAA8E,IAAe9E,EAAQ,aAAa,eAAe;AACzD,IAAI8E,MACAD,KAAgB,WAAWC,CAAY;AAAA,EAC3C,CACH,GACGD,IAAe3J,OACA2J,IAAA3J,KAEZ2J;AACX;AAEO,SAASE,KAAa;AAKzB,eAAanJ,EAAkB;AACnC;AAYgB,SAAAoJ,GAAajI,GAA8BkI,GAAkB;AACrE,MAAAlI,EAAS,WAAW,GAAG;AAClB,IAAAkI;AACL;AAAA,EACJ;AACM,QAAAC,IAAQnI,EAAS,CAAC;AAGxB,EACImI,EAAM,iBAAiB,iBAAiB,qBACxCA,EAAM,eAAe,iBAAiB,gBAEtCC,GAAeD,CAAK,GACpBF,GAAajI,EAAS,MAAM,CAAC,GAAGkI,CAAI,MAEpCG,GAAeF,CAAK,GACpB/L;AAAA,IAAuB;AAAA;AAAA,EAAyB,GAChC+L,EAAM,OAEjB,KAAK,MAAM;AAUF,IAAAA,EAAA;AAAA,MACF;AAAA,MACA,MAAM;AACF,QAAAF,GAAajI,EAAS,MAAM,CAAC,GAAGkI,CAAI;AAAA,MACxC;AAAA,MACA,EAAE,MAAM,GAAK;AAAA,IAAA;AAAA,EACjB,CACH,EACA,MAAM,CAAC/E,MAAW;AACP,YAAA,MAAM,qBAAqBA,CAAM,GACzCiF,GAAeD,CAAK,GACpBF,GAAajI,EAAS,MAAM,CAAC,GAAGkI,CAAI;AAAA,EAAA,CACvC;AAEb;AAMA,MAAMI,KAAkB;AAEjB,SAASF,GAAeD,GAA+B;AAC1D,QAAM/C,IAAS+C,EAAM;AACrB,MAAI/C,KACaA,EAAO,uBAAuB,qBAAqB,EACvD,WAAW,GAAG;AACnB,UAAMmD,IAASnD,EAAO,cAAc,cAAc,KAAK;AACvD,IAAAmD,EAAO,YAAY,oCACnBA,EAAO,cAAcD,IACrBC,EAAO,MAAM,UAAU,SACvBA,EAAO,MAAM,QAAQ,SACrBA,EAAO,MAAM,kBAAkB,4BAC/BA,EAAO,MAAM,WAAW,YACxBA,EAAO,MAAM,OAAO,OACpBA,EAAO,MAAM,MAAM,OACnBA,EAAO,MAAM,QAAQ,OACrBA,EAAO,MAAM,WAAW,WACxBnD,EAAO,YAAYmD,CAAM;AAAA,EAC7B;AAER;AACO,SAASF,GAAeF,GAA+B;AAC1D,QAAM/C,IAAS+C,EAAM;AACrB,MAAI/C,GAAQ;AACF,UAAAoD,IAAOpD,EAAO,uBAAuB,qBAAqB;AAChE,WAAOoD,EAAK,SAAS,OAAU,YAAYA,EAAK,CAAC,CAAC;AAAA,EACtD;AACJ;ACrzCO,MAAMC,KACT;AACJ,IAAIC,KAKE,CAAA,GACFC,yBAAwB,OACxBC,IAIAC,IACAC,KAAmE,CAAA;AAGvE,MAAMC,KAAgB,CAACpK,MAAsB;AACzC,EAAAmK,KAAqB,CAAA,GACrBnK,EAAK,iBAAiB,qBAAqB,EAAE,QAAQ,CAACuG,MAAqB;AACvE,IAAA4D,GAAmB,KAAK;AAAA,MACpB,GAAG5D,EAAI,MAAM;AAAA,MACb,GAAGA,EAAI,MAAM;AAAA,MACb,KAAAA;AAAA,IAAA,CACH;AAAA,EAAA,CACJ;AACL,GAGM8D,KAAmB,MAAM;AACR,EAAAF,GAAA,QAAQ,CAACG,MAAM;AAC5B,IAAAA,EAAA,IAAI,MAAM,OAAOA,EAAE,GACnBA,EAAA,IAAI,MAAM,MAAMA,EAAE,GAClBA,EAAA,IAAI,UAAU,OAAO,uBAAuB;AAAA,EAAA,CACjD;AACL;AAGO,SAASC,GAA4BvK,GAAmB;AAC3D,MAAIA,EAAK,aAAa,eAAe,MAAM;AACvC;AAEJ,QAAMwK,IAAa,MAAM,KAAKxK,EAAK,iBAAiB,qBAAqB,CAAC;AAC1E,EAAAwK,EAAW,MAAM,GACNA,EAAA,QAAQ,CAACC,MAA2B;AF5DnD,QAAAvE;AE6Dc,UAAAwE,IAAkB,CAAC,GACrBxE,IAAAuE,EAAU;AAAA,MACN;AAAA,IACF,EAAA,CAAC,MAFH,QAAAvE,EAGD,UAAU;AACb,IAAAuE,EAAU,UAAU,OAAO,wBAAwB,CAACC,CAAe;AAC7D,UAAAC,IAASC,GAAUH,CAAS;AAElC,IAAIE,KACAA,EAAO,UAAU,OAAO,wBAAwB,CAACD,CAAe;AAAA,EACpE,CACH;AACL;AACO,SAASG,GAAwBC,GAA6B;AAE1D,SAAAA,EAAU,QAAQ,yBAAyB,MAAM;AAG5D;AAIgB,SAAAC,GACZ/K,GAGAgL,GACF;AACgB,EAAAf,KAAAjK,GACduK,GAA4BvK,CAAI,GACNkK,KAAAc,GAC1BC;AAAA,IACIjL,EAAK,aAAa,8BAA8B,MAAM,UAClDA,EAAK,aAAa,4BAA4B,MAAM;AAAA,IACxDA;AAAA,EAAA,GAGJoK,GAAcpK,CAAI,GAGQ,MAAM;AAAA,IAC5BA,EAAK,uBAAuB,0BAA0B;AAAA,EAAA,EAExC;AAAA,IAAQ,CAACc,OACvBA,GAAE,iBAAiB,SAASoK,EAAuB;AAAA,EAAA,GAIvD,MAAM,KAAK,SAAS,uBAAuB,cAAc,CAAC,EAAE;AAAA,IACxD,CAAC1C,OAAc;AACV,MAAAA,GAA0B,QAAQ;AAAA,IACvC;AAAA,EAAA,GAEJ,MAAM,KAAK,SAAS,uBAAuB,sBAAsB,CAAC,EAAE;AAAA,IAChE,CAACA,OAAc;AACV,MAAAA,GAA0B,QAAQ;AAAA,IACvC;AAAA,EAAA,GAKE,MAAA,KAAKxI,EAAK,qBAAqB,KAAK,CAAC,EAAE,QAAQ,CAACmL,OAAqB;AACnE,IAAAA,GAAA,aAAa,aAAa,OAAO;AAAA,EAAA,CACxC,GAIDpB,KAAkB,CAAA,GAClBC,yBAAwB;AACxB,QAAMQ,IAAa,MAAM,KAAKxK,EAAK,iBAAiB,qBAAqB,CAAC,GACpEoL,IAAyB,CAAA;AACpB,EAAAZ,EAAA,QAAQ,CAACjE,OAAqB;AAC/B,UAAA8E,KAAW9E,GAAI,aAAa,mBAAmB,GAC/CoE,KAAS3K,EAAK;AAAA,MAChB,oBAAoBqL,EAAQ;AAAA,IAAA;AAEhC,QAAIV,IAAQ;AACR,YAAM1L,IAAI0L,GAAO,YACXzL,KAAIyL,GAAO;AACjB,MAAAZ,GAAgB,KAAK;AAAA,QACjB,GAAA9K;AAAA,QACA,GAAAC;AAAA,QACA,OAAOyL,GAAO;AAAA,QACd,QAAQA,GAAO;AAAA,MAAA,CAClB,GACDS,EAAQ,KAAKT,EAAM;AAAA,IACvB;AAGkB,IAAAX,GAAA,IAAIzD,IAAK,EAAE,GAAGA,GAAI,YAAY,GAAGA,GAAI,UAAA,CAAW,GAElEA,GAAI,MAAM,cAAc,QACxBA,GAAI,iBAAiB,eAAe+E,IAAW,EAAE,SAAS,IAAM;AAAA,EAAA,CACnE,GAEc,MAAM,KAAKtL,EAAK,qBAAqB,OAAO,CAAC,EACrD,QAAQ,CAACwJ,OAAU;AF7J9B,QAAAtD;AE8JQ,KACIA,KAAAsD,GACK,QAAQM,EAA4B,MADzC,QAAA5D,GAEM,aAAa,yBAIbsD,GAAA,UAAU,IAAI,sBAAsB,GAGpCA,GAAA,iBAAiB,eAAe+B,EAAS;AAAA,EACnD,CACH;AAGK,QAAAC,IAAsBhB,EAAW,OAAOY,CAAO;AAetC,EAdQ,MAAM;AAAA,IACzBpL,EAAK,uBAAuB,0BAA0B;AAAA,EAAA,EACxD,OAAO,CAAC8F,OAAM;AACR,QAAA2F,KAAM3F,GAAE,QAAQgE,EAA4B;AAChD,WAAK2B,KAQED,EAAoB,QAAQC,EAAG,IAAI,IAJ/B;AAAA,EAI+B,CAC7C,EACc,QAAQ,CAAC3F,OAAM;AACxB,IAAAA,GAAA,iBAAiB,eAAe4F,EAAiB;AAAA,EAAA,CACtD;AAGD,QAAMC,IAAe,MAAM;AAAA,IACvB3L,EAAK,uBAAuB,cAAc;AAAA,EAAA,GAExC4L,IAAkB,MAAM;AAAA,IAC1B5L,EAAK,uBAAuB,kBAAkB;AAAA,EAAA,GAE5C6L,IAAqB,MAAM;AAAA,IAC7B7L,EAAK,uBAAuB,qBAAqB;AAAA,EAAA;AAGxC,EAAA2L,EAAA,QAAQ,CAACpF,OAAqB;AACnC,IAAAA,GAAA,iBAAiB,SAASuF,EAAY;AAAA,EAAA,CAC7C,GACeF,EAAA,QAAQ,CAACrF,OAAqB;AACtC,IAAAA,GAAA,iBAAiB,SAASwF,EAAe;AAAA,EAAA,CAChD,GACkBF,EAAA,QAAQ,CAACtF,OAAqB;AACzC,IAAAA,GAAA,iBAAiB,SAASyF,EAAW;AAAA,EAAA,CAC5C,GAEkB,MAAM,KAAKhM,EAAK,iBAAiB,cAAc,CAAC,EACxD,QAAQ,CAACuG,OAAqB;AACjC,IAAAA,GAAA,iBAAiB,SAAS0F,EAAW;AAAA,EAAA,CAC5C,GAEDC,GAA6BlM,CAAI;AAarC;AAIA,MAAMkM,KAA+B,CAAClM,MAAsB;AACxD,QAAM,KAAKA,EAAK,uBAAuB,0BAA0B,CAAC,EAAE;AAAA,IAChE,CAACuG,MAAqB;AF7O9B,UAAAL,GAAAC;AE8OY,YAAMgG,IAAa5F,EAAI;AAAA,QACnB;AAAA,QACF,CAAC,GACG6F,KAAUlG,IAAAiG,KAAA,gBAAAA,EAAY,gBAAZ,gBAAAjG,EAAyB;AACzC,UAAI,CAACkG,EAAS;AACR,YAAAC,IAAQD,EAAQ,MAAM,GAAG,GACzBE,IAAgBC,GAAQF,CAAK,GAC7B7D,IAAYxI,EAAK,cAAc,cAAc,KAAK;AAC9C,MAAAwI,EAAA,UAAU,IAAI,2BAA2B,GACzCA,EAAA,aAAa,eAAe4D,CAAO,GAC7CI,GAAcxM,GAAMsM,GAAe9D,GAAW2D,GAAY,EAAI,GACpD3D,EAAA,MAAM,OAAOjC,EAAI,MAAM,MACvBiC,EAAA,MAAM,MAAMjC,EAAI,MAAM,KACtBiC,EAAA,MAAM,QAAQjC,EAAI,MAAM,QAC9BJ,IAAAI,EAAA,kBAAA,QAAAJ,EAAe,aAAaqC,GAAWjC;AAAA,IAC/C;AAAA,EAAA;AAER,GAEMgF,KAAY,CAACzF,MAAkB;AAEjC,EADcA,EAAE,cACV,KAAK;AACf;AAKO,SAAS2G,GAAoBzM,GAAmB;AAClC,EAAAqK,MAGjBF,KAAqB,CAAA,GAEK,MAAM;AAAA,IAC5BnK,EAAK,uBAAuB,0BAA0B;AAAA,EAAA,EAExC;AAAA,IAAQ,CAACc,MACvBA,EAAE,oBAAoB,SAASoK,EAAuB;AAAA,EAAA,GAG1D,MAAM,KAAKlL,EAAK,uBAAuB,0BAA0B,CAAC,EAAE;AAAA,IAChE,CAAC8F,MAAM;AACD,MAAAA,EAAA,oBAAoB,eAAe4F,EAAiB;AAAA,IAC1D;AAAA,EAAA,GAGJ1L,EAAK,iBAAiB,qBAAqB,EAAE,QAAQ,CAACuG,MAAqB;AACvE,IAAAA,EAAI,oBAAoB,eAAe+E,IAAW,EAAE,SAAS,IAAM;AAAA,EAAA,CACtE,GAEK,MAAA,KAAKtL,EAAK,qBAAqB,KAAK,CAAC,EAAE,QAAQ,CAACmL,MAAqB;AACvE,IAAAA,EAAI,gBAAgB,WAAW;AAAA,EAAA,CAClC,GAEc,MAAM,KAAKnL,EAAK,qBAAqB,OAAO,CAAC,EACrD,QAAQ,CAACwJ,MAAU;AAChB,IAAAA,EAAA,oBAAoB,eAAe+B,EAAS,GAC5C/B,EAAA,UAAU,OAAO,sBAAsB;AAAA,EAAA,CAChD;AACD,QAAMmC,IAAe,MAAM;AAAA,IACvB3L,EAAK,uBAAuB,cAAc;AAAA,EAAA,GAExC4L,IAAkB,MAAM;AAAA,IAC1B5L,EAAK,uBAAuB,kBAAkB;AAAA,EAAA,GAE5C6L,IAAqB,MAAM;AAAA,IAC7B7L,EAAK,uBAAuB,qBAAqB;AAAA,EAAA;AAGxC,EAAA2L,EAAA,QAAQ,CAACpF,MAAqB;AACnC,IAAAA,EAAA,oBAAoB,SAASuF,EAAY;AAAA,EAAA,CAChD,GACkBD,EAAA,QAAQ,CAACtF,MAAqB;AACzC,IAAAA,EAAA,oBAAoB,SAASyF,EAAW;AAAA,EAAA,CAC/C,GACeJ,EAAA,QAAQ,CAACrF,MAAqB;AACtC,IAAAA,EAAA,oBAAoB,SAASwF,EAAe;AAAA,EAAA,CACnD,GAKkB,MAAM,KAAK/L,EAAK,iBAAiB,cAAc,CAAC,EACxD,QAAQ,CAACuG,MAAqB;AACjC,IAAAA,EAAA,oBAAoB,SAAS0F,EAAW;AAAA,EAAA,CAC/C,GAEK,MAAA;AAAA,IACFjM,EAAK,uBAAuB,2BAA2B;AAAA,EAAA,EACzD,QAAQ,CAACuG,MAAqB;AFvUpC,QAAAL;AEwUY,KAAAA,IAAAK,EAAA,kBAAA,QAAAL,EAAe,YAAYK;AAAA,EAAG,CACrC;AACD,QAAMmG,IAAW1M,EAAK,QAAQ,eAAe,MAAM;AAC5B,EAAAiL,GAAA,CAACyB,GAAU1M,CAAI;AAK1C;AAEa,MAAAiM,KAAc,CAACnG,MAAkB;AAC1C,QAAMS,IAAMT,EAAE,eACR6G,IAAYpG,EAAI,aAAa,YAAY;AAC/C,EAAIoG,KACAC,GAAUrG,GAAKoG,CAAS,GAI5B7G,EAAE,eAAe,GACjBA,EAAE,gBAAgB;AACtB,GAEM4F,KAAoB,CAAC5F,MAAoB;AAC3C,QAAM6E,IAAS7E,EAAE;AACjB,EAAA+G,GAAYlC,CAAM;AACtB,GAEMkC,KAAc,CAAC3K,MAAyB;AACpC,QAAA4K,IAAYC,GAAoC7K,CAAO;AAC7D,EAAAf,GAAa2L,GAAW5K,EAAQ,QAAQ,aAAa,CAAgB;AACzE;AAEO,SAAS6K,GACZ7K,GACa;AACP,QAAA8K,IAAmBC,GAAoB/K,CAAO;AACpD,SAAOgL,GAAkBF,CAAgB;AAC7C;AAEA,SAASR,GACLxM,GACAqM,GACA7D,GAIA2D,GAGAgB,GACF;AF1XF,MAAAjH;AE2XI,QAAMkH,MACFlH,IAAA,MAAM,KAAKiG,KAAA,gBAAAA,EAAY,SAAS,MAAhC,gBAAAjG,EAAmC,KAAK,CAACmH,MAAMA,EAAE,SAAS,QAAQ,OAClE,gBAEEC,IAAOnB,KAAA,gBAAAA,EAAY,aAAa;AAChC,EAAAE,EAAA,QAAQ,CAACkB,MAAS;AACpB,UAAMC,IAAWxN,EAAK,cAAc,cAAc,KAAK;AAC9C,IAAAwN,EAAA,UAAU,IAAI,sBAAsB,GAC7CA,EAAS,cAAcD,GACvB/E,EAAU,YAAYgF,CAAQ,GACrBA,EAAA,UAAU,IAAIJ,CAAS,GAC5BE,KACSE,EAAA,aAAa,QAAQF,CAAI,GAElCH,KACSK,EAAA,iBAAiB,eAAeC,EAAuB;AAAA,EACpE,CACH;AACL;AAEA,SAASvC,GAAwBpF,GAAe;AACtC,QAAA4H,IAAQ5H,EAAE,cAA8B,UAAU;AAAA,IACpD;AAAA,EAAA;AAEJ,EAAAoE,MAAA,QAAAA,GAA0BwD;AAC9B;AAEgB,SAAAC,GAAoB3N,GAAmB4N,GAAqB;AAClE,QAAAC,IAAgB,CAAC/H,MAAM;AACnB,UAAAgI,IAAKhI,EAAE,QAAQgE,EAA4B;AAmB7C,WAlBA,GAACgE,KAIDA,EAAG,UAAU,SAAS,gBAAgB,KAGtCA,EAAG,aAAa,mBAAmB,KAGnCA,EAAG,UAAU,SAAS,0BAA0B,KAGhDA,EAAG,UAAU,SAAS,kBAAkB,KAKxCA,EAAG,UAAU,SAAS,mBAAmB,KACzCA,EAAG,UAAU,SAAS,iBAAiB;AAAA,EAIpC,GAEL/L,IAAgBkL,GAAoBjN,CAAI,EAAE,OAAO6N,CAAa,GAW9Df,IAAYI,GAAkBnL,CAAa;AACjD,MAAI6L,GAAY;AACZ,UAAMG,IAAgB,MAAM;AAAA,MACxB/N,EAAK,qBAAqB,OAAO;AAAA,IAAA,EACnC,OAAO6N,CAAa;AACtB,IAAAvE,GAAayE,GAAe,MAAM5M,GAAa2L,GAAW9M,CAAI,CAAC;AAAA,EAAA;AAE/D,IAAAmB,GAAa2L,GAAW9M,CAAI;AAEpC;AAKA,IAAIgO,KAA0D,CAC1DC,GACAC,MACC;AAAC;AAEC,SAASC,GACZC,GACF;AACgB,EAAAJ,KAAAI;AAClB;AAEA,SAASlB,GAAkBmB,GAA0B;AAEjD,QAAMC,IAAwB,CAAA;AACpB,SAAAD,EAAA,QAAQ,CAACvI,MAAM;AACrB,IAAIA,EAAE,UAAU,SAASnG,EAAc,KACnC2O,EAAO,KAAKxI,CAAC,GAEVwI,EAAA;AAAA,MACH,GAAI,MAAM;AAAA,QACNxI,EAAE,uBAAuBnG,EAAc;AAAA,MAC3C;AAAA,IAAA;AAAA,EACJ,CACH,GACM2O;AACX;AAEA,SAASrB,GAAoBzE,GAAwB;AAGjD,QAAM8F,IAAS,MAAM;AAAA,IACjB9F,EAAU,uBAAuB,gBAAgB;AAAA,EAAA,EACnD;AAAA,IACE,CAAC1C,MAAM,OAAO,iBAAiBA,CAAC,EAAE,YAAY;AAAA,EAAA;AAG9C,SAAA0C,EAAU,UAAU,SAAS,gBAAgB,KAC7C,OAAO,iBAAiBA,CAAS,EAAE,YAAY,UAE/C8F,EAAO,KAAK9F,CAAS,GAElB8F;AACX;AAEgB,SAAA/B,GACZgC,GACAC,GACG;AAQH,EAAKA,MACiBA,IAAA,CAAC7G,GAAM7G,MACd6G,MAAM7G;AAErB,MAAI2N,IAAqB;AACzB,WAASxL,IAAI,GAAGA,IAAIsL,EAAM,QAAQ,EAAEtL;AAC5B,QAAA,CAACuL,EAAgBD,EAAM,CAAC,GAAGA,EAAMtL,CAAC,CAAC,GAAG;AACjB,MAAAwL,IAAA;AACrB;AAAA,IACJ;AAEJ,MAAIA,EAA2B,QAAAF;AAEzB,QAAAG,IAAgBH,EAAM;AAC5B,MAAII,IAAc,GACdC,IAAaF,GACbG,IAAY;AAGhB,SAAOA,MAAc,MAAI;AAEjB,QAAAC,IAAeP,EAAM,QACrBQ;AACJ,WAAaD,MAAN;AACH,MAAAC,IAAc,KAAK,MAAM,KAAK,OAAA,IAAWD,CAAY,GACrDA,KACA,CAACP,EAAMO,CAAY,GAAGP,EAAMQ,CAAW,CAAC,IAAI;AAAA,QACxCR,EAAMQ,CAAW;AAAA,QACjBR,EAAMO,CAAY;AAAA,MAAA;AAQ1B,QAAIE,IAAU;AACd,aAAS/L,IAAI,GAAGA,IAAIsL,EAAM,QAAQ,EAAEtL;AAC5B,MAACuL,EAAgBD,EAAMtL,CAAC,GAAGyL,EAAczL,CAAC,CAAC,KAAK,EAAA+L;AAEpD,QAAAA,MAAYT,EAAM,OAAe,QAAAA;AACrC,IAAIS,IAAUL,MACIA,IAAAK,GACdJ,IAAaL,EAAM;EAE3B;AAES,WAAAtL,IAAI,GAAGA,IAAIsL,EAAM,QAAQ,EAAEtL,EAAS,CAAAsL,EAAAtL,CAAC,IAAI2L,EAAW3L,CAAC;AACvD,SAAAsL;AACX;AAGgB,SAAAU,GACZtH,GACA7G,GACO;AACP,SAAO6G,EAAE,UAAU,KAAA,MAAW7G,EAAE,UAAU;AAC9C;AAGA,MAAMkL,KAAc,CAAClG,MAAkB;AACnC,EAAKmE,OAGYI,MACjBJ,GACK,iBAAiB,qBAAqB,EACtC,QAAQ,CAAC1D,MAAqB;AACrB,UAAA8E,IAAW9E,EAAI,aAAa,mBAAmB,GAC/CoE,IAASV,MAAA,gBAAAA,GAAa;AAAA,MACxB,oBAAoBoB,CAAQ;AAAA;AAEhC,QAAI,CAACV;AACD;AAMJ,QAAIuE,IAAW3I,EAAI;AACnB,QAAI,CAAC2I,GAAU;AACX,YAAMC,IAAI5I,EAAI,MAAM,MAAM,QAAQ,MAAM,EAAE;AAC/B,MAAA2I,IAAA,OAAO,SAASC,GAAG,EAAE;AAAA,IACpC;AACA,QAAIC,IAAY7I,EAAI;AACpB,QAAI,CAAC6I,GAAW;AACZ,YAAMC,IAAI9I,EAAI,MAAM,OAAO,QAAQ,MAAM,EAAE;AAC/B,MAAA6I,IAAA,OAAO,SAASC,GAAG,EAAE;AAAA,IACrC;AACA,UAAMpQ,IAAI0L,EAAO,cAAcA,EAAO,cAAcuE,KAAY,GAC1DhQ,IAAIyL,EAAO,aAAaA,EAAO,eAAeyE,KAAa;AAC7D,IAAA7I,EAAA,MAAM,OAAOtH,IAAI,MACjBsH,EAAA,MAAM,MAAMrH,IAAI;AAAA,EAAA,CACvB,GACC,MAAA;AAAA,IACF+K,GAAY,uBAAuB,2BAA2B;AAAA,EAAA,EAChE,QAAQ,CAACzB,MAA2B;AFlmB1C,QAAAtC;AEmmBc,UAAAoJ,MACFpJ,IAAAsC,EAAU,aAAa,aAAa,MAApC,gBAAAtC,EAAuC,MAAM,SAAQ,IACnDqJ,IAAkB/G,EAAU,SAAS,CAAC;AAC5C,IAAAA,EAAU,YAAY,IACtBgE;AAAA,MACIvC;AAAA,MACAqF;AAAA,MACA9G;AAAA,MACA+G;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,CACH,GACWC,GAAAvF,IAAc,uBAAuB,EAAK,GAC1CuF,GAAAvF,IAAc,0BAA0B,EAAI;AAC5D;AAGA,IAAIwF,KAAa,GACbC,KAAa,GACbC,IACAC,KAAU;AAKd,MAAMC,KAAW,CAAC7P,MACdA,EAAK,sBAAsB,EAAE,QAAQA,EAAK,aAExCsL,KAAY,CAACxF,MAAoB;AAEnC,MADIA,EAAE,WAAW,KACbA,EAAE,QAAS;AACf,EAAAA,EAAE,eAAe;AACjB,QAAM6E,IAAS7E,EAAE;AACJ,EAAA6J,KAAAhF;AACP,QAAA3K,IAAO2K,EAAO,QAAQ,aAAa,GACnChE,IAAQkJ,GAAS7P,CAAI;AAEd,EAAAyP,KAAA3J,EAAE,UAAUa,IAAQgE,EAAO,YAC3B+E,KAAA5J,EAAE,UAAUa,IAAQgE,EAAO,WACjCA,EAAA,kBAAkB7E,EAAE,SAAS,GAC7B6E,EAAA,iBAAiB,aAAamF,EAAQ,GACtCnF,EAAA,iBAAiB,eAAeoF,EAAW,GAClDlD,GAAYlC,CAAM,GACXA,EAAA,UAAU,IAAI,mBAAmB,GAC7BgF,GAAA,UAAU,OAAO,uBAAuB;AACvD,GAEMI,KAAc,CAACjK,MAAoB;AAC/B,QAAA9F,IAAO2P,GAAW,QAAQ,aAAa,GACvChJ,IAAQkJ,GAAS7P,CAAI;AAC3B,EAAA8F,EAAE,eAAe;AACb,MAAA7G,IAAI6G,EAAE,UAAUa,IAAQ8I,IACxBvQ,IAAI4G,EAAE,UAAUa,IAAQ+I,IACxBM,IAAW,OAAO;AACZ,EAAAJ,KAAA;AACV,MAAIK,IAAQhR,GACRiR,IAAQhR;AACZ,aAAWiR,KAAQpG,IAAiB;AAChC,UAAMqG,KAAWD,EAAK,QAAQR,GAAW,eAAe,GAClDU,KAAWF,EAAK,SAASR,GAAW,gBAAgB,GAEpDW,KAASH,EAAK,IAAIC,IAAUnR,GAC5BsR,KAASJ,EAAK,IAAIE,IAAUnR,GAC5BsR,KAAQ,KAAK,KAAKF,KAASA,KAASC,KAASA,EAAM;AACzD,IAAIC,KAAQR,MACGA,IAAAQ,IACXP,IAAQE,EAAK,IAAIC,GACjBF,IAAQC,EAAK,IAAIE;AAAA,EAEzB;AACA,EAAIL,IAAW,OAEP/Q,IAAAgR,GACA/Q,IAAAgR,GACMN,KAAA,KAEHD,GAAA,MAAM,MAAMzQ,IAAI,MAChByQ,GAAA,MAAM,OAAO1Q,IAAI;AAChC,GAEM6Q,KAAW,CAAChK,MAAoB;AAElC,MAAK8J;AAMU,IAAAD,GAAA,UAAU,IAAI,uBAAuB;AAAA,OANtC;AACJ,UAAAc,IAAczG,GAAkB,IAAI2F,EAAU;AACzC,IAAAA,GAAA,MAAM,OAAMc,KAAA,gBAAAA,EAAa,KAAI,MAC7Bd,GAAA,MAAM,QAAOc,KAAA,gBAAAA,EAAa,KAAI,MAC9Bd,GAAA,UAAU,OAAO,uBAAuB;AAAA,EAAA;AAI5C,EAAAA,GAAA,UAAU,OAAO,mBAAmB,GACpCA,GAAA,oBAAoB,aAAaG,EAAQ,GACzCH,GAAA,oBAAoB,eAAeI,EAAW;AAKnD,QAAA/P,IAAO2P,GAAW,QAAQ,aAAa;AAElC,EADQ,MAAM,KAAK3P,EAAK,iBAAiB,qBAAqB,CAAC,EAC/D,QAAQ,CAACuG,MAAqB;AACrC,QAAIA,MAAQoJ,MAGRe,GAAcnK,GAAKoJ,EAAU,GAAG;AAC1B,YAAAgB,IAAmB3G,GAAkB,IAAIzD,CAAG;AAClD,MAAIoK,MACIpK,EAAA,MAAM,OAAOoK,EAAiB,IAAI,MAClCpK,EAAA,MAAM,MAAMoK,EAAiB,IAAI,MACjCpK,EAAA,UAAU,OAAO,uBAAuB;AAAA,IAEpD;AAAA,EAAA,CACH;AACL,GAEMqK,KAAiB,CAACrK,MAA6B;AAC3C,QAAAsK,IAAc5D,GAAoB1G,CAAG;AACpC,SAAA,MAAM,KAAKsK,CAAW,EACxB,IAAI,CAACtK,MAAqBA,EAAI,WAAW,EACzC,KAAK,GAAG;AACjB,GAEMmK,KAAgB,CAACI,GAA+BnG,MAAwB;AAQ1E,QAAMoG,IAAUD,EAAiB,YAC3BE,IAAUF,EAAiB,WAC3BG,IACFtG,EAAO,cACNA,EAAO,cAAcmG,EAAiB,eAAe,GACpDI,IACFvG,EAAO,aACNA,EAAO,eAAemG,EAAiB,gBAAgB;AAC5D;AAAA;AAAA,IAEI,KAAK,IAAIG,IAAWF,CAAO,IAAI,OAAO,KAAK,IAAIG,IAAWF,CAAO,IAAI;AAAA;AAE7E,GAEalF,KAAe,CAAChG,MAAkB;AAErC,QAAA9F,IADS8F,EAAE,cACG,QAAQ,aAAa,GACnCqL,IAAaC,GAAgBpR,CAAI,KAAKqR,GAAqBrR,CAAI;AAErE,SAAAsR,GAAwBtR,GAAMmR,CAAU,GAI5BnD,GAAA,GAAGmD,IAAa,IAAI,CAAC,GAE1BA;AACX,GAEapF,KAAkB,CAACjG,MAAkB;AAExC,QAAA9F,IADS8F,EAAE,cACG,QAAQ,aAAa;AAC7B,EAAA0J,GAAAxP,GAAM,yBAAyB,EAAK,GACpCwP,GAAAxP,GAAM,uBAAuB,EAAK,GAElCwP,GAAAxP,GAAM,0BAA0B,EAAK,GAEhCqK;AACrB,GAEamF,KAAc,CACvBxP,GACAuR,GACAC,MACC;AF/wBL,MAAAtL,GAAAC;AEgxBI,EAAIqL,KACKtL,IAAAlG,EAAA,kBAAA,QAAAkG,EAAe,UAAU,IAAIqL,MAE7BpL,IAAAnG,EAAA,kBAAA,QAAAmG,EAAe,UAAU,OAAOoL;AAE7C;AAEA,IAAIE,IACAC,IAOAC,IACAC;AAEY,SAAAC,GACZC,GACAC,GACF;AAC2B,EAAAJ,KAAAG,GACFF,KAAAG;AAC3B;AAEA,SAAST,GAAwBtR,GAAmBgS,GAAkB;AACtD,EAAAxC,GAAAxP,GAAM,yBAAyBgS,CAAO,GACtCxC,GAAAxP,GAAM,uBAAuB,CAACgS,CAAO;AAGjD,MAAIrF,IAAY3M,EAAK;AAAA,IACjBgS,IAAU,uBAAuB;AAAA,EAAA;AAErC,QAAMC,IAAiB,MAAM;AACzB,UAAMC,IAAsB,MAAM;AAAA,MAC9BlS,EAAK;AAAA,QACDgS,IAAU,sBAAsB;AAAA,MACpC;AAAA,IAAA,GAEEG,IAA2C,CAAA,GAC3CpE,IAAoC,CAAA;AACtB,IAAAmE,EAAA,QAAQ,CAACpM,MAAM;AAC/B,MAAAqM,EAA0B,KAAK,GAAGlF,GAAoBnH,CAAC,CAAC,GAC1CiI,EAAA,KAAK,GAAG,MAAM,KAAKjI,EAAE,qBAAqB,OAAO,CAAC,CAAC;AAAA,IAAA,CACpE;AACK,UAAAgH,IAAYI,GAAkBiF,CAAyB;AAC7D,IAAA7I,GAAayE,GAAe,MAAM5M,GAAa2L,GAAW9M,CAAI,CAAC;AAAA,EAAA,GAK7DoS,IAAYzF,MAAc;AAChC,EAAIA,MAAc,OACdA,IAAYqF,IAAUL,KAAyBC,KACxCjF,MAAc,WAETA,IAAA,SAEZA,IACUC,GAAA5M,GAAM2M,GAAWyF,CAAS,IAErBH;AAEvB;AAEA,SAASrF,GAAUyF,GAAsB1F,GAAmByF,IAAY,IAAM;AAC1E,QAAME,IAAQ,IAAI;AAAA,KACbF,IAAYzT,GAAA,IAAc,YAAY,MAAMgO;AAAA,EAAA;AAE7C,EAAA9B,GAAwBwH,CAAO,KACzBC,EAAA,UAAU,IAAI,UAAU,GAElCA,EAAM,MAAM,aAAa,UAIzBD,EAAQ,OAAOC,CAAK,GACpBA,EAAM,KAAK,GAILA,EAAA;AAAA,IACF;AAAA,IACA,MAAM;AACF,MAAAD,EAAQ,YAAYC,CAAK;AAAA,IAC7B;AAAA,IACA,EAAE,MAAM,GAAK;AAAA,EAAA;AAErB;AAEA,SAASlB,GAAgBpR,GAAmB;AACxC,MAAImR,IAAa;AACjB,QAAM3G,IAAa,MAAM,KAAKxK,EAAK,iBAAiB,qBAAqB,CAAC;AAC/D,SAAAwK,EAAA,QAAQ,CAACsG,MAAkC;AAC5C,UAAAzF,IAAWyF,EAAiB,aAAa,mBAAmB,GAC5DnG,IAAS3K,EAAK;AAAA,MAChB,oBAAoBqL,CAAQ;AAAA,IAAA;AAEhC,QAAKV,KAQD,CAAC+F,GAAcI,GAAkBnG,CAAM,GAAG;AAK1C,UACI,CAAC,MAAM,KAAKmG,EAAiB,QAAQ,EAAE;AAAA,QAAK,CAAC7R,MACzCA,EAAE,UAAU,SAAS,wBAAwB;AAAA,MAAA,GAEnD;AAEe,QAAAkS,IAAA;AACb;AAAA,MACJ;AACM,YAAAoB,IAAc3B,GAAeE,CAAgB;AACnD,MACKtG,EAAW,KAAK,CAACgI,MACVA,MAAmB1B,KAGnBF,GAAe4B,CAAc,MAAMD,IAC5B,KAEJ7B,GAAc8B,GAAgB7H,CAAM,CAC9C,MAEYwG,IAAA;AAAA,IAErB;AAAA,EAAA,CACH,GACMA;AACX;AAEA,IAAIsB,IACAC,KAAa;AACjB,MAAMC,KAAsB;AAE5B,SAASlF,GAAwB3H,GAAiB;AFh6BlD,MAAAI,GAAAC;AEk6BI,MADIL,EAAE,WAAW,KACbA,EAAE,QAAS;AAGf,EAAA4L,KAAwB5L,EAAE,eAC1B4M,KAAahB,GAAsB;AAC7B,QAAA1R,IAAO0R,GAAsB,QAAQ,aAAa,GAClD/K,IAAQkJ,GAAS7P,CAAI;AACd,EAAAyP,KAAA3J,EAAE,UAAUa,IAAQ+K,GAAsB,YAC1ChC,KAAA5J,EAAE,UAAUa,IAAQ+K,GAAsB,WAInDD,KAAAC,GAAsB,cAAc,cAAc,KAAK,GAC3DA,GAAsB,UAAU;AAAA,IAAQ,CAACrE,MACrCoE,GAAoB,UAAU,IAAIpE,CAAC;AAAA,EAAA,GAGvCoE,GAAoB,cAAcC,GAAsB,aACxDD,GAAoB,MAAM,WAAW,YACjBA,GAAA,MAAM,OAAOC,GAAsB,aAAa,MAChDD,GAAA,MAAM,MAAMC,GAAsB,YAAY,MAC9CD,GAAA;AAAA,IAChB;AAAA,IACAC,GAAsB,aAAa,MAAM;AAAA,EAAA,GAM7Ce,KAAcG,GAAyBlB,EAAqB,GAEhDe,GAAA,MAAM,QAAQC,KAAaC,KAAsB,OAC7DzM,IAAAwL,GAAsB,kBAAtB,QAAAxL,EAAqC;AAAA,IACjCuM;AAAA,IACAf;AAAA,KAEJA,GAAsB,MAAM,UAAU,QAOhBA,GAAA,kBAAkB5L,EAAE,SAAS,GAC7B4L,GAAA,iBAAiB,aAAamB,EAAsB,GACpDnB,GAAA,iBAAiB,eAAeoB,EAAkB,GAIlDpB,GAAA,iBAAiB,cAAcqB,EAAmB,IAClD5M,IAAAuL,GAAA,kBAAA,QAAAvL,EAAe,YAAYsL;AACrD;AAEA,MAAMsB,KAAsB,CAACjN,MAAkB;AAC3C,EAAAA,EAAE,eAAe;AACrB;AAEA,IAAIkN;AAEJ,MAAMF,KAAqB,CAAChN,MAAoB;AACtC,QAAA9F,IAAOyR,GAAoB,QAAQ,aAAa,GAChD9K,IAAQkJ,GAAS7P,CAAI;AAC3B,EAAA8F,EAAE,eAAe;AACX,QAAA7G,IAAI6G,EAAE,UAAUa,IAAQ8I,IACxBvQ,IAAI4G,EAAE,UAAUa,IAAQ+I;AAK9B,MAHoB+B,GAAA,MAAM,MAAMvS,IAAI,MAChBuS,GAAA,MAAM,OAAOxS,IAAI,MAEjCgU;AACA;AAEJ,QAAMzK,IAAYkJ,GAAsB,eAClCwB,IAAkB,MAAM,KAAK1K,EAAU,QAAQ,EAAE,KAAK,CAAC6E,MAAM;AACzD,UAAA8F,IAAO9F,EAAE;AAEX,WAAAA,MAAMqE,MACNrE,MAAMoF,MACNpF,MAAMoE,MACN3L,EAAE,UAAUqN,EAAK,QACjBrN,EAAE,UAAUqN,EAAK,SACjBrN,EAAE,UAAUqN,EAAK,OACjBrN,EAAE,UAAUqN,EAAK;AAAA,EAAA,CAExB;AAKG,MAAAD,KAAmBA,MAAoBF,IAAqB;AAC5D,UAAMI,IAAW,MAAM,KAAK5K,EAAU,QAAQ;AAC9C,IACI4K,EAAS,QAAQF,CAAe,IAAIE,EAAS,QAAQX,EAAY,IAIjEY,GAAY,MAAM;AACJ,MAAA7K,EAAA;AAAA,QACNiK;AAAA,QACAS,EAAgB;AAAA,MAAA;AAAA,IACpB,CACH,IAGDG,GAAY,MAAM;AACJ,MAAA7K,EAAA,aAAaiK,IAAcS,CAAe;AAAA,IAAA,CACvD;AAAA,EACL,OACG;AAGH,UAAMI,IAAe,MAAM;AAAA,MACvB5B,GAAsB,cAAe;AAAA,QACjC;AAAA,MACJ;AAAA,IAAA,EACF;AAAA,MACE,CAACzS,MACGA,MAAMyS,MACNzS,MAAMwT,MACNxT,MAAMwS;AAAA,IAAA,GAGRjL,IADW8M,EAAaA,EAAa,SAAS,CAAC,EAC7B;AAEpB,KAAAxN,EAAE,UAAUU,EAAO,UAClBV,EAAE,UAAUU,EAAO,SAASV,EAAE,UAAUU,EAAO,QAEhD6M,GAAY,MAAM;AACd,MAAA7K,EAAU,YAAYiK,EAAY;AAAA,IAAA,CACrC;AAAA,EAET;AACsB,EAAAO,KAAAE;AAC1B,GAEML,KAAyB,CAAC/M,MAAoB;AFziCpD,MAAAI,GAAAC,GAAAoN;AE0iCI,EAAAzN,EAAE,eAAe,GACjB4L,GAAsB,MAAM,aAAa,WACnBA,GAAA;AAAA,IAClB;AAAA,IACAmB;AAAA,EAAA,GAEkBnB,GAAA;AAAA,IAClB;AAAA,IACAoB;AAAA,EAAA,GAEkBpB,GAAA,sBAAsB5L,EAAE,SAAS,GACjC4L,GAAA;AAAA,IAClB;AAAA,IACAqB;AAAA,EAAA,IAGgB7M,IAAAuL,GAAA,kBAAA,QAAAvL,EAAe,YAAYuL,MAE/CtL,IAAAuL,GAAsB,kBAAtB,QAAAvL,EAAqC;AAAA,IACjCuL;AAAA;AAAA,IAEAe;AAAA,MAEkBc,IAAA7B,GAAA,kBAAA,QAAA6B,EAAe,YAAYd,KACnCA,KAAA,QACdf,GAAsB,MAAM,UAAU;AAC1C;AAEA,SAASkB,GAAyBY,GAAoC;AAC5D,QAAAC,IAAcD,EAAsB,UAAU,EAAI;AACxD,SAAAC,EAAY,MAAM,YAAY,UAC9BA,EAAY,MAAM,cAAc,KAChCA,EAAY,MAAM,cAAc,KAChCA,EAAY,MAAM,eAAe,KACjCA,EAAY,MAAM,UAAU,IAC5BA,EAAY,MAAM,aAAa,UACxBA;AACX;AAEA,IAAIR,KAAsB;AAE1B,SAASI,GAAYK,GAA6B;AACxB,EAAAT,KAAA;AACtB,QAAM7K,IAAW,KAEXI,IAAYkJ,GAAsB,eAClCiC,IAAYf,GAAyBlB,EAAqB;AACtD,EAAAlJ,EAAA,aAAamL,GAAWlB,EAAY,GAC9BiB;AACV,QAAAE,IAAQ,KAAK,OAEbC,IAAO,MAAM;AACT,UAAAC,IAAU,KAAK,IAAA,IAAQF,GACvBG,IAAW,KAAK,IAAID,IAAU1L,GAAU,CAAC,GAGzC4L,IAAoBtB,KAAaC;AACvC,QAAI,CAACF,IAAa;AAEd,MAAAjK,EAAU,YAAYmL,CAAS,GACTV,KAAA;AACtB;AAAA,IACJ;AACY,IAAAR,GAAA,MAAM,QAAQuB,IAAoBD,IAAW,MACzDJ,EAAU,MAAM,QAAQK,KAAqB,IAAID,KAAY,MACzDA,IAAW,IACX,sBAAsBF,CAAI,KAG1BrL,EAAU,YAAYmL,CAAS,GACnBlB,GAAA,MAAM,QAAQuB,IAAoB,MACxBf,KAAA;AAAA,EAC1B;AAEJ,wBAAsBY,CAAI;AAC9B;AACA,SAASxC,GAAqBrR,GAAmB;AACvC,QAAAiU,IAAYjU,EAAK,uBAAuB,2BAA2B;AACzE,WAASiD,IAAI,GAAGA,IAAIgR,EAAU,QAAQhR,KAAK;AACjC,UAAAiR,IAAWD,EAAUhR,CAAC,GAItBkR,IAAqBD,EACtB,aAAa,aAAa,EAC1B,MAAM,GAAG,GACRE,IAAqB,MAAM,KAAKF,EAAS,QAAQ;AACvD,aAASG,IAAI,GAAGA,IAAID,EAAmB,QAAQC;AAE3C,UADaD,EAAmBC,CAAC,EACxB,gBAAgBF,EAAmBE,CAAC;AAClC,eAAA;AAAA,EAGnB;AACO,SAAA;AACX;AAEa,MAAApJ,KAAyB,CAACqJ,GAAkBtU,MAAsB;AAIrE,QAAAwK,IAAaxK,EAAK,iBAAiB,4BAA4B;AACrE,EAAIsU,IACW9J,EAAA,QAAQ,CAACC,MAAc;AAC9B,IAAA8J,GAAoB9J,CAAwB;AAAA,EAAA,CAC/C,IAEUD,EAAA,QAAQ,CAACC,MAAc;AAC9B,IAAA+J,GAAwB/J,CAAwB;AAAA,EAAA,CACnD;AAET;AAEO,SAAS8J,GAAoB9J,GAAwB;AAClD,QAAAE,IAASC,GAAUH,CAAS;AAClC,MAAI,CAACE;AACD;AAOJ,MAAI8J,IAAY9J,EAAO,cAAc,cAAc,KAAK;AACxD,EAAA8J,EAAU,YAAYhK,EAAU,WAG1B,MAAA,KAAKgK,EAAU,uBAAuB,UAAU,CAAC,EAAE,QAAQ,CAAC3O,MAAM;AACpE,IAAAA,EAAE,OAAO;AAAA,EAAA,CACZ,GAED,MAAM,KAAK2O,EAAU,uBAAuB,oBAAoB,CAAC,EAAE;AAAA,IAC/D,CAAC3O,MAAM;AACH,MAAAA,EAAE,OAAO;AAAA,IACb;AAAA,EAAA,GAEE,MAAA,KAAK2O,EAAU,uBAAuB,aAAa,CAAC,EAAE,QAAQ,CAAC3O,MAAM;AACvE,IAAAA,EAAE,OAAO;AAAA,EAAA,CACZ,GAEK,MAAA,KAAK2O,EAAU,iBAAiB,MAAM,CAAC,EAAE,QAAQ,CAAC3O,MAAM;AAC1D,IAAAA,EAAE,gBAAgB,IAAI;AAAA,EAAA,CACzB,GACK,MAAA,KAAK2O,EAAU,uBAAuB,SAAS,CAAC,EAAE,QAAQ,CAAC3O,MAAM;AAEjE,IAAAA,EAAA,UAAU,OAAO,SAAS;AAAA,EAAA,CAC/B,GAEK,MAAA,KAAK2O,EAAU,iBAAiB,mBAAmB,CAAC,EAAE,QAAQ,CAAC3O,MAAM;AACvE,IAAAA,EAAE,gBAAgB,iBAAiB;AAAA,EAAA,CACtC,GAED,MAAM,KAAK2O,EAAU,uBAAuB,iBAAiB,CAAC,EAAE;AAAA,IAC5D,CAAC3O,MAAM;AACD,MAAAA,EAAA,UAAU,OAAO,iBAAiB;AAAA,IACxC;AAAA,EAAA,GAGE,MAAA,KAAK2O,EAAU,iBAAiB,YAAY,CAAC,EAAE,QAAQ,CAAC3O,MAAM;AAChE,IAAAA,EAAE,gBAAgB,UAAU;AAAA,EAAA,CAC/B;AACD,MAAI4O,IAAiBD,EAAU;AAAA,IAC3B;AAAA,IACF,CAAC;AAKH,MAJKC,MACDA,IAAiBD,EAAU;AAAA,IACvB;AAAA,IACF,CAAC,IACHC,GAAgB;AAGhB,UAAMC,IAAUF;AACJ,IAAAA,IAAA9J,EAAO,cAAc,cAAc,KAAK,GACpD8J,EAAU,YAAYE,CAAO,GACrBA,EAAA,UAAU,IAAI,qBAAqB,GAG5BD,EAAA,MAAM,QAAQjK,EAAU,MAAM,OAC9BiK,EAAA,MAAM,SAASjK,EAAU,MAAM;AAI1C,QAAAmK,IAAaF,EAAe,aAAa,iBAAiB;AAC9D,IAAIE,KAAc,CAACF,EAAe,MAAM,oBAE/BE,EAAW,WAAW,MAAM,MAC7BA,IAAa,SAASA,IAAa,MACvCF,EAAe,MAAM,kBAAkBE,GACvCF,EAAe,gBAAgB,iBAAiB;AAAA,EAExD;AACI,EAAA/J,EAAO,cAAc8J,EAAU,cAC/B9J,EAAO,YAAY8J,EAAU;AAErC;AAEa,MAAA7J,KAAY,CAACH,MAAoD;AACpE,QAAAY,IAAWZ,EAAU,aAAa,mBAAmB;AAC3D,MAAKY;AAML,WAAOZ,EACF,QAAQ,aAAa,EACrB,cAAc,oBAAoBY,CAAQ,IAAI;AACvD;AAEA,SAASmJ,GAAwB/J,GAAwB;AAC/C,QAAAE,IAASC,GAAUH,CAAS;AAClC,EAAIE,MACAA,EAAO,YAAY;AAE3B;AAEO,IAAIkK,KAAiB;AAGrB,SAASC,GAAuB9U,GAAmB;AAgI1D;;;;;;;;;;;;;;;;;;;;;;ACh4CA,KAAE,SAAU+U,GAAQC,GAAU;AAa5B,MAAAC,EAAA,UAAiBF,EAAO,WACvBC,EAASD,GAAQ,EAAM,IACvB,SAAU5F,GAAI;AACb,YAAK,CAACA,EAAE;AACP,gBAAM,IAAI,MAAO;AAElB,eAAO6F,EAAS7F;MACpB;AAAA,IAMA,GAAK,OAAO,SAAW,MAAc,SAAS+F,IAAM,SAAUC,GAAQC,GAAW;AAQjF,UAAIC,IAAM,CAAA,GAENC,IAAW,OAAO,gBAElBC,IAAQF,EAAI,OAEZG,IAAOH,EAAI,OAAO,SAAU9G,GAAQ;AACvC,eAAO8G,EAAI,KAAK,KAAM9G,CAAK;AAAA,MAC3B,IAAG,SAAUA,GAAQ;AACrB,eAAO8G,EAAI,OAAO,MAAO,CAAE,GAAE9G,CAAK;AAAA,MACnC,GAGIkH,IAAOJ,EAAI,MAEXK,IAAUL,EAAI,SAEdM,IAAa,CAAA,GAEbC,IAAWD,EAAW,UAEtBE,KAASF,EAAW,gBAEpBG,KAAaD,GAAO,UAEpBE,KAAuBD,GAAW,KAAM,MAAM,GAE9CE,KAAU,CAAA,GAEVC,IAAa,SAAqBC,GAAM;AAMtC,eAAO,OAAOA,KAAQ,cAAc,OAAOA,EAAI,YAAa;AAAA,MAClE,GAGIC,KAAW,SAAmBD,GAAM;AACtC,eAAOA,KAAO,QAAQA,MAAQA,EAAI;AAAA,MACpC,GAGIE,KAAWjB,EAAO,UAIjBkB,KAA4B;AAAA,QAC/B,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAEC,eAASC,GAASC,GAAMjU,GAAMkU,GAAM;AACnC,QAAAA,IAAMA,KAAOJ;AAEb,YAAInT,GAAGwT,GACNC,IAASF,EAAI,cAAe;AAG7B,YADAE,EAAO,OAAOH,GACTjU;AACJ,eAAMW,KAAKoT;AAYV,YAAAI,IAAMnU,EAAMW,MAAOX,EAAK,gBAAgBA,EAAK,aAAcW,IACtDwT,KACJC,EAAO,aAAczT,GAAGwT;AAI3B,QAAAD,EAAI,KAAK,YAAaE,CAAQ,EAAC,WAAW,YAAaA;MACvD;AAGF,eAASC,GAAQT,GAAM;AACtB,eAAKA,KAAO,OACJA,IAAM,KAIP,OAAOA,KAAQ,YAAY,OAAOA,KAAQ,aAChDP,EAAYC,EAAS,KAAMM,CAAG,CAAI,KAAI,WACtC,OAAOA;AAAA,MACR;AAOD,UACCU,KAAU,SAGVC,IAAS,SAAUC,GAAUC,GAAU;AAItC,eAAO,IAAIF,EAAO,GAAG,KAAMC,GAAUC,CAAO;AAAA,MAC9C;AAEA,MAAAF,EAAO,KAAKA,EAAO,YAAY;AAAA;AAAA,QAG9B,QAAQD;AAAA,QAER,aAAaC;AAAA;AAAA,QAGb,QAAQ;AAAA,QAER,SAAS,WAAW;AACnB,iBAAOtB,EAAM,KAAM;QACnB;AAAA;AAAA;AAAA,QAID,KAAK,SAAUyB,GAAM;AAGpB,iBAAKA,KAAO,OACJzB,EAAM,KAAM,QAIbyB,IAAM,IAAI,KAAMA,IAAM,KAAK,MAAQ,IAAG,KAAMA;QACnD;AAAA;AAAA;AAAA,QAID,WAAW,SAAUC,GAAQ;AAG5B,cAAIC,IAAML,EAAO,MAAO,KAAK,YAAW,GAAII;AAG5C,iBAAAC,EAAI,aAAa,MAGVA;AAAA,QACP;AAAA;AAAA,QAGD,MAAM,SAAUC,GAAW;AAC1B,iBAAON,EAAO,KAAM,MAAMM,CAAQ;AAAA,QAClC;AAAA,QAED,KAAK,SAAUA,GAAW;AACzB,iBAAO,KAAK,UAAWN,EAAO,IAAK,MAAM,SAAUO,GAAMnU,GAAI;AAC5D,mBAAOkU,EAAS,KAAMC,GAAMnU,GAAGmU,CAAI;AAAA,UACnC,CAAA;QACD;AAAA,QAED,OAAO,WAAW;AACjB,iBAAO,KAAK,UAAW7B,EAAM,MAAO,MAAM,SAAS;QACnD;AAAA,QAED,OAAO,WAAW;AACjB,iBAAO,KAAK,GAAI;QAChB;AAAA,QAED,MAAM,WAAW;AAChB,iBAAO,KAAK,GAAI;QAChB;AAAA,QAED,MAAM,WAAW;AAChB,iBAAO,KAAK,UAAWsB,EAAO,KAAM,MAAM,SAAUQ,GAAO,GAAI;AAC9D,oBAAS,IAAI,KAAM;AAAA,UACnB,CAAA;QACD;AAAA,QAED,KAAK,WAAW;AACf,iBAAO,KAAK,UAAWR,EAAO,KAAM,MAAM,SAAUQ,GAAO,GAAI;AAC9D,mBAAO,IAAI;AAAA,UACX,CAAA;QACD;AAAA,QAED,IAAI,SAAUpU,GAAI;AACjB,cAAIqU,IAAM,KAAK,QACdjD,IAAI,CAACpR,KAAMA,IAAI,IAAIqU,IAAM;AAC1B,iBAAO,KAAK,UAAWjD,KAAK,KAAKA,IAAIiD,IAAM,CAAE,KAAMjD,EAAK,IAAG,CAAE,CAAA;AAAA,QAC7D;AAAA,QAED,KAAK,WAAW;AACf,iBAAO,KAAK,cAAc,KAAK,YAAW;AAAA,QAC1C;AAAA;AAAA;AAAA,QAID,MAAMoB;AAAA,QACN,MAAMJ,EAAI;AAAA,QACV,QAAQA,EAAI;AAAA,MACb,GAEAwB,EAAO,SAASA,EAAO,GAAG,SAAS,WAAW;AAC7C,YAAIU,GAASC,GAAMC,GAAKC,GAAMC,GAAaC,GAC1CjN,IAAS,UAAW,CAAC,KAAM,CAAE,GAC7B1H,IAAI,GACJ4U,IAAS,UAAU,QACnBC,IAAO;AAsBR,aAnBK,OAAOnN,KAAW,cACtBmN,IAAOnN,GAGPA,IAAS,UAAW1H,CAAG,KAAI,IAC3BA,MAII,OAAO0H,KAAW,YAAY,CAACsL,EAAYtL,CAAM,MACrDA,IAAS,CAAA,IAIL1H,MAAM4U,MACVlN,IAAS,MACT1H,MAGOA,IAAI4U,GAAQ5U;AAGnB,eAAOsU,IAAU,UAAWtU,CAAC,MAAQ;AAGpC,iBAAMuU,KAAQD;AAKb,cAJAG,IAAOH,EAASC,IAIX,EAAAA,MAAS,eAAe7M,MAAW+M,OAKnCI,KAAQJ,MAAUb,EAAO,cAAea,CAAM,MAChDC,IAAc,MAAM,QAASD,CAAI,OACnCD,IAAM9M,EAAQ6M,IAGTG,KAAe,CAAC,MAAM,QAASF,CAAG,IACtCG,IAAQ,CAAA,IACG,CAACD,KAAe,CAACd,EAAO,cAAeY,CAAG,IACrDG,IAAQ,CAAA,IAERA,IAAQH,GAETE,IAAc,IAGdhN,EAAQ6M,CAAI,IAAKX,EAAO,OAAQiB,GAAMF,GAAOF,MAGlCA,MAAS,WACpB/M,EAAQ6M,CAAM,IAAGE;AAOrB,eAAO/M;AAAA,MACR,GAEAkM,EAAO,OAAQ;AAAA;AAAA,QAGd,SAAS,YAAaD,KAAU,KAAK,UAAW,QAAS,OAAO,EAAI;AAAA;AAAA,QAGpE,SAAS;AAAA,QAET,OAAO,SAAUmB,GAAM;AACtB,gBAAM,IAAI,MAAOA;QACjB;AAAA,QAED,MAAM,WAAW;AAAA,QAAE;AAAA,QAEnB,eAAe,SAAU7B,GAAM;AAC9B,cAAI8B,GAAOC;AAIX,iBAAK,CAAC/B,KAAON,EAAS,KAAMM,CAAG,MAAO,oBAC9B,MAGR8B,IAAQ1C,EAAUY,IAGZ8B,KAKNC,IAAOpC,GAAO,KAAMmC,GAAO,aAAe,KAAIA,EAAM,aAC7C,OAAOC,KAAS,cAAcnC,GAAW,KAAMmC,CAAM,MAAKlC,MALzD;AAAA,QAMR;AAAA,QAED,eAAe,SAAUG,GAAM;AAC9B,cAAIsB;AAEJ,eAAMA,KAAQtB;AACb,mBAAO;AAER,iBAAO;AAAA,QACP;AAAA;AAAA;AAAA,QAID,YAAY,SAAUK,GAAMgB,GAASf,GAAM;AAC1C,UAAAF,GAASC,GAAM,EAAE,OAAOgB,KAAWA,EAAQ,MAAK,GAAIf;QACpD;AAAA,QAED,MAAM,SAAUN,GAAKiB,GAAW;AAC/B,cAAIU,GAAQ5U,IAAI;AAEhB,cAAKiV,GAAahC;AAEjB,iBADA2B,IAAS3B,EAAI,QACLjT,IAAI4U,KACNV,EAAS,KAAMjB,EAAKjT,CAAC,GAAIA,GAAGiT,EAAKjT,EAAK,MAAK,IAD7BA;AACnB;AAAA;AAKD,iBAAMA,KAAKiT;AACV,kBAAKiB,EAAS,KAAMjB,EAAKjT,CAAC,GAAIA,GAAGiT,EAAKjT,EAAK,MAAK;AAC/C;AAKH,iBAAOiT;AAAA,QACP;AAAA;AAAA,QAGD,WAAW,SAAUb,GAAKzM,GAAU;AACnC,cAAIsO,IAAMtO,KAAW;AAErB,iBAAKyM,KAAO,SACN6C,GAAa,OAAQ7C,CAAG,KAC5BwB,EAAO;AAAA,YAAOK;AAAA,YACb,OAAO7B,KAAQ,WACf,CAAEA,CAAK,IAAGA;AAAA,UACf,IAEII,EAAK,KAAMyB,GAAK7B,KAIX6B;AAAA,QACP;AAAA,QAED,SAAS,SAAUE,GAAM/B,GAAKpS,GAAI;AACjC,iBAAOoS,KAAO,OAAO,KAAKK,EAAQ,KAAML,GAAK+B,GAAMnU;QACnD;AAAA;AAAA;AAAA,QAID,OAAO,SAAUkV,GAAOC,GAAS;AAKhC,mBAJId,IAAM,CAACc,EAAO,QACjB/D,IAAI,GACJpR,IAAIkV,EAAM,QAEH9D,IAAIiD,GAAKjD;AAChB,YAAA8D,EAAOlV,GAAG,IAAKmV,EAAQ/D,CAAC;AAGzB,iBAAA8D,EAAM,SAASlV,GAERkV;AAAA,QACP;AAAA,QAED,MAAM,SAAUlB,GAAOE,GAAUkB,GAAS;AASzC,mBARIC,GACH3V,IAAU,CAAE,GACZM,IAAI,GACJ4U,IAASZ,EAAM,QACfsB,IAAiB,CAACF,GAIXpV,IAAI4U,GAAQ5U;AACnB,YAAAqV,IAAkB,CAACnB,EAAUF,EAAOhU,CAAG,GAAEA,CAAC,GACrCqV,MAAoBC,KACxB5V,EAAQ,KAAMsU,EAAOhU,CAAG,CAAA;AAI1B,iBAAON;AAAA,QACP;AAAA;AAAA,QAGD,KAAK,SAAUsU,GAAOE,GAAUqB,GAAM;AACrC,cAAIX,GAAQY,GACXxV,IAAI,GACJiU,IAAM,CAAA;AAGP,cAAKgB,GAAajB;AAEjB,iBADAY,IAASZ,EAAM,QACPhU,IAAI4U,GAAQ5U;AACnB,cAAAwV,IAAQtB,EAAUF,EAAOhU,CAAC,GAAIA,GAAGuV,IAE5BC,KAAS,QACbvB,EAAI,KAAMuB;;AAMZ,iBAAMxV,KAAKgU;AACV,cAAAwB,IAAQtB,EAAUF,EAAOhU,CAAC,GAAIA,GAAGuV,IAE5BC,KAAS,QACbvB,EAAI,KAAMuB;AAMb,iBAAOjD,EAAM0B;QACb;AAAA;AAAA,QAGD,MAAM;AAAA;AAAA;AAAA,QAIN,SAASlB;AAAA,MACV,IAEK,OAAO,UAAW,eACtBa,EAAO,GAAI,OAAO,QAAU,IAAGxB,EAAK,OAAO,YAI5CwB,EAAO;AAAA,QAAM,uEAAuE,MAAO,GAAK;AAAA,QAChG,SAAU6B,GAAIlB,GAAO;AACpB,UAAA7B,EAAY,aAAa6B,IAAO,GAAG,IAAKA,EAAK;QAC9C;AAAA;AAEA,eAASU,GAAahC,GAAM;AAM3B,YAAI2B,IAAS,CAAC,CAAC3B,KAAO,YAAYA,KAAOA,EAAI,QAC5CyC,IAAOhC,GAAQT;AAEhB,eAAKD,EAAYC,CAAG,KAAMC,GAAUD,CAAG,IAC/B,KAGDyC,MAAS,WAAWd,MAAW,KACrC,OAAOA,KAAW,YAAYA,IAAS,KAAOA,IAAS,KAAO3B;AAAA,MAC/D;AACD,UAAI0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWF,SAAUzD,GAAS;AACrB,cAAI,GACHa,GACA6C,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAGAC,GACAlD,GACAmD,GACAC,IACAC,GACAC,IACA/W,IACAgX,IAGAC,KAAU,WAAW,IAAI,oBAAI,KAAM,GACnCC,KAAe1E,EAAO,UACtB2E,KAAU,GACVC,KAAO,GACPC,KAAaC,GAAa,GAC1BC,KAAaD,GAAa,GAC1BE,KAAgBF,GAAa,GAC7BG,KAAyBH,GAAa,GACtCI,KAAY,SAAU1S,GAAG7G,GAAI;AAC5B,mBAAK6G,MAAM7G,MACVuY,IAAe,KAET;AAAA,UACP,GAGDxD,KAAW,CAAA,EAAK,gBAChBR,KAAM,CAAE,GACRiF,KAAMjF,GAAI,KACVkF,KAAalF,GAAI,MACjBI,KAAOJ,GAAI,MACXE,KAAQF,GAAI,OAIZK,KAAU,SAAU8E,GAAMpD,GAAO;AAGhC,qBAFInU,IAAI,GACPqU,IAAMkD,EAAK,QACJvX,IAAIqU,GAAKrU;AAChB,kBAAKuX,EAAMvX,CAAG,MAAKmU;AAClB,uBAAOnU;AAGT,mBAAO;AAAA,UACP,GAEDwX,KAAW,8HAMXC,KAAa,uBAGbC,KAAa,4BAA4BD,KACxC,2CAGDE,KAAa,QAAQF,KAAa,OAAOC,KAAa,SAASD;AAAA,UAG9D,kBAAkBA;AAAA;AAAA,UAIlB,0DAA6DC,KAAa,SAC1ED,KAAa,QAEdG,KAAU,OAAOF,KAAa,uFAOAC,KAAa,gBAO3CE,KAAc,IAAI,OAAQJ,KAAa,KAAK,GAAK,GACjDK,KAAQ,IAAI,OAAQ,MAAML,KAAa,gCACtCA,KAAa,MAAM,GAAK,GAEzBM,KAAS,IAAI,OAAQ,MAAMN,KAAa,OAAOA,KAAa,GAAK,GACjEO,KAAe,IAAI,OAAQ,MAAMP,KAAa,aAAaA,KAAa,MAAMA,KAC7E,GAAK,GACNQ,KAAW,IAAI,OAAQR,KAAa,IAAM,GAE1CS,KAAU,IAAI,OAAQN,EAAS,GAC/BO,KAAc,IAAI,OAAQ,MAAMT,KAAa,GAAK,GAElDU,KAAY;AAAA,YACX,IAAM,IAAI,OAAQ,QAAQV,KAAa,GAAK;AAAA,YAC5C,OAAS,IAAI,OAAQ,UAAUA,KAAa,GAAK;AAAA,YACjD,KAAO,IAAI,OAAQ,OAAOA,KAAa,OAAS;AAAA,YAChD,MAAQ,IAAI,OAAQ,MAAMC,EAAY;AAAA,YACtC,QAAU,IAAI,OAAQ,MAAMC,EAAS;AAAA,YACrC,OAAS,IAAI,OAAQ,2DACpBH,KAAa,iCAAiCA,KAAa,gBAC3DA,KAAa,eAAeA,KAAa,UAAU,GAAK;AAAA,YACzD,MAAQ,IAAI,OAAQ,SAASD,KAAW,MAAM,GAAK;AAAA;AAAA;AAAA,YAInD,cAAgB,IAAI,OAAQ,MAAMC,KACjC,qDAAqDA,KACrD,qBAAqBA,KAAa,oBAAoB,GAAK;AAAA,UAC5D,GAEDY,KAAQ,UACRC,KAAU,uCACVC,KAAU,UAEVC,KAAU,0BAGVC,KAAa,oCAEbC,KAAW,QAIXC,KAAY,IAAI,OAAQ,yBAAyBlB,KAAa,wBAAwB,GAAK,GAC3FmB,KAAY,SAAUC,GAAQC,GAAS;AACtC,gBAAIC,IAAO,OAAOF,EAAO,MAAO,CAAG,IAAG;AAEtC,mBAAOC;AAAA;AAAA;AAAA;AAAA,aASNC,IAAO,IACN,OAAO,aAAcA,IAAO,KAAS,IACrC,OAAO,aAAcA,KAAQ,KAAK,OAAQA,IAAO,OAAQ;UAC3D,GAIDC,KAAa,uDACbC,KAAa,SAAUC,GAAIC,GAAc;AACxC,mBAAKA,IAGCD,MAAO,OACJ,MAIDA,EAAG,MAAO,GAAG,EAAI,IAAG,OAC1BA,EAAG,WAAYA,EAAG,SAAS,CAAC,EAAG,SAAU,EAAI,IAAG,MAI3C,OAAOA;AAAA,UACd,GAMDE,KAAgB,WAAW;AAC1B,YAAA/C;UACA,GAEDgD,KAAqBC;AAAA,YACpB,SAAUnF,GAAO;AAChB,qBAAOA,EAAK,aAAa,MAAQA,EAAK,SAAS,YAAa,MAAK;AAAA,YACjE;AAAA,YACD,EAAE,KAAK,cAAc,MAAM,SAAU;AAAA,UACvC;AAGA,cAAI;AACH,YAAA3B,GAAK;AAAA,cACFJ,KAAME,GAAM,KAAMsE,GAAa,UAAY;AAAA,cAC7CA,GAAa;AAAA,YACf,GAKCxE,GAAKwE,GAAa,WAAW,MAAM,EAAG;AAAA,UACtC,QAAa;AACb,YAAApE,KAAO;AAAA,cAAE,OAAOJ,GAAI;AAAA;AAAA,gBAGnB,SAAU1K,GAAQ6R,GAAM;AACvB,kBAAAjC,GAAW,MAAO5P,GAAQ4K,GAAM,KAAMiH,CAAG;gBACzC;AAAA;AAAA;AAAA;AAAA,gBAID,SAAU7R,GAAQ6R,GAAM;AAKvB,2BAJInI,IAAI1J,EAAO,QACd1H,IAAI,GAGK0H,EAAQ0J,GAAG,IAAKmI,EAAKvZ,GAAG;AAAO;AACzC,kBAAA0H,EAAO,SAAS0J,IAAI;AAAA,gBACpB;AAAA;AAAA,YACH;AAAA,UACC;AAED,mBAASuE,GAAQ9B,GAAUC,GAASnO,GAAS6T,GAAO;AACnD,gBAAIC,GAAGzZ,GAAGmU,GAAMuF,GAAKzZ,GAAO0Z,IAAQC,GACnCC,KAAa/F,KAAWA,EAAQ,eAGhCgG,KAAWhG,IAAUA,EAAQ,WAAW;AAKzC,gBAHAnO,IAAUA,KAAW,IAGhB,OAAOkO,KAAa,YAAY,CAACA,KACrCiG,OAAa,KAAKA,OAAa,KAAKA,OAAa;AAEjD,qBAAOnU;AAIR,gBAAK,CAAC6T,MACLnD,EAAavC,CAAO,GACpBA,IAAUA,KAAWX,GAEhBoD,KAAiB;AAIrB,kBAAKuD,OAAa,OAAQ7Z,IAAQwY,GAAW,KAAM5E,CAAQ;AAG1D,oBAAO4F,IAAIxZ,EAAO;AAGjB,sBAAK6Z,OAAa;AACjB,wBAAO3F,IAAOL,EAAQ,eAAgB2F,CAAC;AAKtC,0BAAKtF,EAAK,OAAOsF;AAChB,+BAAA9T,EAAQ,KAAMwO,IACPxO;AAAA;AAGR,6BAAOA;AAAA,2BASHkU,OAAgB1F,IAAO0F,GAAW,eAAgBJ,CAAC,MACvD/C,GAAU5C,GAASK,CAAM,KACzBA,EAAK,OAAOsF;AAEZ,2BAAA9T,EAAQ,KAAMwO,IACPxO;AAAA,uBAKH;AAAA,sBAAK1F,EAAO;AAClB,2BAAAuS,GAAK,MAAO7M,GAASmO,EAAQ,qBAAsBD,CAAQ,IACpDlO;AAGD,uBAAO8T,IAAIxZ,EAAO,CAAG,MAAM8S,EAAQ,0BACzCe,EAAQ;AAER,2BAAAtB,GAAK,MAAO7M,GAASmO,EAAQ,uBAAwB2F,CAAC,IAC/C9T;AAAA;AAKT,kBAAKoN,EAAQ,OACZ,CAACoE,GAAwBtD,IAAW,GAAK,MACvC,CAAC2C,KAAa,CAACA,EAAU,KAAM3C,CAAQ;AAAA;AAAA,eAIvCiG,OAAa,KAAKhG,EAAQ,SAAS,YAAW,MAAO,WAAa;AAYpE,oBAVA8F,IAAc/F,GACdgG,KAAa/F,GASRgG,OAAa,MACf7B,GAAS,KAAMpE,CAAU,KAAImE,GAAa,KAAMnE,CAAQ,IAAO;AAqBjE,uBAlBAgG,KAAanB,GAAS,KAAM7E,CAAU,KAAIkG,GAAajG,EAAQ,UAAY,KAC1EA,IAII+F,OAAe/F,KAAW,CAACf,EAAQ,YAGhC2G,IAAM5F,EAAQ,aAAc,IAAI,KACtC4F,IAAMA,EAAI,QAASV,IAAYC,EAAU,IAEzCnF,EAAQ,aAAc,MAAQ4F,IAAM/C,EAAO,IAK7CgD,KAAS5D,EAAUlC,IACnB7T,IAAI2Z,GAAO,QACH3Z;AACP,oBAAA2Z,GAAQ3Z,CAAC,KAAO0Z,IAAM,MAAMA,IAAM,YAAa,MAC9CM,GAAYL,GAAQ3Z,CAAC;AAEvB,kBAAA4Z,IAAcD,GAAO,KAAM;gBAC3B;AAED,oBAAI;AACH,yBAAAnH,GAAK;AAAA,oBAAO7M;AAAA,oBACXkU,GAAW,iBAAkBD,CAAa;AAAA,kBAChD,GACYjU;AAAA,gBACP,QAAoB;AACpB,kBAAAwR,GAAwBtD,GAAU;gBACvC,UAAc;AACT,kBAAK6F,MAAQ/C,MACZ7C,EAAQ,gBAAiB;gBAE1B;AAAA,cACD;AAAA,YACD;AAIF,mBAAOmC,EAAQpC,EAAS,QAASiE,IAAO,IAAI,GAAIhE,GAASnO,GAAS6T;UAClE;AAQD,mBAASxC,KAAc;AACtB,gBAAIiD,IAAO,CAAA;AAEX,qBAASC,EAAOC,GAAK3E,GAAQ;AAG5B,qBAAKyE,EAAK,KAAME,IAAM,GAAK,IAAGvE,EAAK,eAGlC,OAAOsE,EAAOD,EAAK,MAAK,IAEhBC,EAAOC,IAAM,GAAG,IAAK3E;AAAA,YAC9B;AACD,mBAAO0E;AAAA,UACP;AAMD,mBAASE,GAAcC,GAAK;AAC3B,mBAAAA,EAAI1D,EAAS,IAAG,IACT0D;AAAA,UACP;AAMD,mBAASC,GAAQD,GAAK;AACrB,gBAAIE,IAAKpH,EAAS,cAAe,UAAU;AAE3C,gBAAI;AACH,qBAAO,CAAC,CAACkH,EAAIE;YACb,QAAa;AACb,qBAAO;AAAA,YACT,UAAW;AAGT,cAAKA,EAAG,cACPA,EAAG,WAAW,YAAaA,IAI5BA,IAAK;AAAA,YACL;AAAA,UACD;AAOD,mBAASC,GAAWC,GAAOtgB,GAAU;AAIpC,qBAHIiY,IAAMqI,EAAM,MAAO,GAAK,GAC3Bza,IAAIoS,EAAI,QAEDpS;AACP,cAAA4V,EAAK,WAAYxD,EAAKpS,CAAG,CAAA,IAAK7F;AAAA,UAE/B;AAQD,mBAASugB,GAAchW,GAAG7G,GAAI;AAC7B,gBAAI8c,IAAM9c,KAAK6G,GACdkW,IAAOD,KAAOjW,EAAE,aAAa,KAAK7G,EAAE,aAAa,KAChD6G,EAAE,cAAc7G,EAAE;AAGpB,gBAAK+c;AACJ,qBAAOA;AAIR,gBAAKD;AACJ,qBAAUA,IAAMA,EAAI;AACnB,oBAAKA,MAAQ9c;AACZ,yBAAO;AAAA;AAKV,mBAAO6G,IAAI,IAAI;AAAA,UACf;AAMD,mBAASmW,GAAmBnF,GAAO;AAClC,mBAAO,SAAUvB,GAAO;AACvB,kBAAII,IAAOJ,EAAK,SAAS,YAAW;AACpC,qBAAOI,MAAS,WAAWJ,EAAK,SAASuB;AAAA,YAC3C;AAAA,UACC;AAMD,mBAASoF,GAAoBpF,GAAO;AACnC,mBAAO,SAAUvB,GAAO;AACvB,kBAAII,IAAOJ,EAAK,SAAS,YAAW;AACpC,sBAASI,MAAS,WAAWA,MAAS,aAAcJ,EAAK,SAASuB;AAAA,YACpE;AAAA,UACC;AAMD,mBAASqF,GAAsBC,GAAW;AAGzC,mBAAO,SAAU7G,GAAO;AAKvB,qBAAK,UAAUA,IASTA,EAAK,cAAcA,EAAK,aAAa,KAGpC,WAAWA,IACV,WAAWA,EAAK,aACbA,EAAK,WAAW,aAAa6G,IAE7B7G,EAAK,aAAa6G,IAMpB7G,EAAK,eAAe6G;AAAA;AAAA,cAI1B7G,EAAK,eAAe,CAAC6G,KACrB3B,GAAoBlF,CAAM,MAAK6G,IAG1B7G,EAAK,aAAa6G,IAKd,WAAW7G,IACfA,EAAK,aAAa6G,IAInB;AAAA,YACT;AAAA,UACC;AAMD,mBAASC,GAAwBZ,GAAK;AACrC,mBAAOD,GAAc,SAAUc,GAAW;AACzC,qBAAAA,IAAW,CAACA,GACLd,GAAc,SAAUZ,GAAM9Z,GAAU;AAM9C,yBALI0R,GACH+J,IAAed,EAAI,CAAA,GAAIb,EAAK,QAAQ0B,CAAU,GAC9Clb,IAAImb,EAAa,QAGVnb;AACP,kBAAKwZ,EAAQpI,IAAI+J,EAAcnb,CAAG,CAAA,MACjCwZ,EAAMpI,CAAG,IAAG,EAAG1R,EAAS0R,CAAC,IAAKoI,EAAMpI,CAAC;AAAA,cAG1C;YACA;UACC;AAOD,mBAAS2I,GAAajG,GAAU;AAC/B,mBAAOA,KAAW,OAAOA,EAAQ,uBAAyB,OAAeA;AAAA,UACzE;AAGD,UAAAf,IAAU4C,GAAO,UAAU,IAO3BG,IAAQH,GAAO,QAAQ,SAAUxB,GAAO;AACvC,gBAAIiH,IAAYjH,EAAK,cACpBmC,KAAYnC,EAAK,iBAAiBA,GAAO;AAK1C,mBAAO,CAACkE,GAAM,KAAM+C,KAAa9E,KAAWA,EAAQ,YAAY;UACjE,GAOAD,IAAcV,GAAO,cAAc,SAAUtW,GAAO;AACnD,gBAAIgc,GAAYC,GACf/H,IAAMlU,IAAOA,EAAK,iBAAiBA,IAAOuX;AAO3C,mBAAKrD,KAAOJ,KAAYI,EAAI,aAAa,KAAK,CAACA,EAAI,oBAKnDJ,IAAWI,GACX+C,IAAUnD,EAAS,iBACnBoD,KAAiB,CAACT,EAAO3C,IAQpByD,MAAgBzD,MAClBmI,IAAYnI,EAAS,gBAAiBmI,EAAU,QAAQA,MAGrDA,EAAU,mBACdA,EAAU,iBAAkB,UAAUlC,IAAe,EAAK,IAG/CkC,EAAU,eACrBA,EAAU,YAAa,YAAYlC,MASrCrG,EAAQ,QAAQuH,GAAQ,SAAUC,GAAK;AACtC,qBAAAjE,EAAQ,YAAaiE,GAAK,YAAapH,EAAS,cAAe,KAAK,IAC7D,OAAOoH,EAAG,mBAAqB,OACrC,CAACA,EAAG,iBAAkB,qBAAqB,EAAG;AAAA,YACjD,IAQCxH,EAAQ,aAAauH,GAAQ,SAAUC,GAAK;AAC3C,qBAAAA,EAAG,YAAY,KACR,CAACA,EAAG,aAAc;YAC3B,IAMCxH,EAAQ,uBAAuBuH,GAAQ,SAAUC,GAAK;AACrD,qBAAAA,EAAG,YAAapH,EAAS,cAAe,EAAI,CAAA,GACrC,CAACoH,EAAG,qBAAsB,GAAG,EAAG;AAAA,YACzC,IAGCxH,EAAQ,yBAAyByF,GAAQ,KAAMrF,EAAS,sBAAsB,GAM9EJ,EAAQ,UAAUuH,GAAQ,SAAUC,GAAK;AACxC,qBAAAjE,EAAQ,YAAaiE,GAAK,KAAK5D,IACxB,CAACxD,EAAS,qBAAqB,CAACA,EAAS,kBAAmBwD,EAAS,EAAC;AAAA,YAC/E,IAGM5D,EAAQ,WACZ6C,EAAK,OAAQ,KAAS,SAAU9R,GAAK;AACpC,kBAAIyX,IAASzX,EAAG,QAAS6U,IAAWC,EAAS;AAC7C,qBAAO,SAAUzE,GAAO;AACvB,uBAAOA,EAAK,aAAc,IAAI,MAAOoH;AAAA,cACzC;AAAA,YACA,GACE3F,EAAK,KAAM,KAAS,SAAU9R,GAAIgQ,GAAU;AAC3C,kBAAK,OAAOA,EAAQ,iBAAmB,OAAeyC,IAAiB;AACtE,oBAAIpC,IAAOL,EAAQ,eAAgBhQ,CAAE;AACrC,uBAAOqQ,IAAO,CAAEA,CAAM,IAAG;cACzB;AAAA,YACJ,MAEEyB,EAAK,OAAQ,KAAU,SAAU9R,GAAK;AACrC,kBAAIyX,IAASzX,EAAG,QAAS6U,IAAWC,EAAS;AAC7C,qBAAO,SAAUzE,GAAO;AACvB,oBAAI9U,IAAO,OAAO8U,EAAK,mBAAqB,OAC3CA,EAAK,iBAAkB;AACxB,uBAAO9U,KAAQA,EAAK,UAAUkc;AAAA,cAClC;AAAA,YACA,GAIE3F,EAAK,KAAM,KAAS,SAAU9R,GAAIgQ,GAAU;AAC3C,kBAAK,OAAOA,EAAQ,iBAAmB,OAAeyC,IAAiB;AACtE,oBAAIlX,GAAMW,GAAGgU,GACZG,KAAOL,EAAQ,eAAgBhQ;AAEhC,oBAAKqQ,IAAO;AAIX,sBADA9U,IAAO8U,GAAK,iBAAkB,OACzB9U,KAAQA,EAAK,UAAUyE;AAC3B,2BAAO,CAAEqQ,EAAI;AAMd,uBAFAH,IAAQF,EAAQ,kBAAmBhQ,IACnC9D,IAAI,GACMmU,KAAOH,EAAOhU;AAEvB,wBADAX,IAAO8U,GAAK,iBAAkB,OACzB9U,KAAQA,EAAK,UAAUyE;AAC3B,6BAAO,CAAEqQ,EAAI;AAAA,gBAGf;AAED,uBAAO;cACP;AAAA,YACJ,IAICyB,EAAK,KAAM,MAAU7C,EAAQ,uBAC5B,SAAUyI,GAAK1H,GAAU;AACxB,kBAAK,OAAOA,EAAQ,uBAAyB;AAC5C,uBAAOA,EAAQ,qBAAsB0H;AAG/B,kBAAKzI,EAAQ;AACnB,uBAAOe,EAAQ,iBAAkB0H;YAElC,IAED,SAAUA,GAAK1H,GAAU;AACxB,kBAAIK,GACHsH,IAAM,CAAE,GACRzb,IAAI,GAGJ2F,KAAUmO,EAAQ,qBAAsB0H;AAGzC,kBAAKA,MAAQ,KAAM;AAClB,uBAAUrH,IAAOxO,GAAS3F;AACzB,kBAAKmU,EAAK,aAAa,KACtBsH,EAAI,KAAMtH;AAIZ,uBAAOsH;AAAA,cACP;AACD,qBAAO9V;AAAA,YACV,GAGCiQ,EAAK,KAAM,QAAY7C,EAAQ,0BAA0B,SAAUzE,GAAWwF,GAAU;AACvF,kBAAK,OAAOA,EAAQ,yBAA2B,OAAeyC;AAC7D,uBAAOzC,EAAQ,uBAAwBxF;YAE1C,GAQCmI,KAAgB,CAAA,GAOhBD,IAAY,CAAA,IAELzD,EAAQ,MAAMyF,GAAQ,KAAMrF,EAAS,uBAI3CmH,GAAQ,SAAUC,GAAK;AAEtB,kBAAI3e;AAOJ,cAAA0a,EAAQ,YAAaiE,CAAE,EAAG,YAAY,YAAY5D,KAAU,uBAC1CA,KAAU,mEAOvB4D,EAAG,iBAAkB,sBAAsB,EAAG,UAClD/D,EAAU,KAAM,WAAWiB,KAAa,YAAc,GAKjD8C,EAAG,iBAAkB,YAAY,EAAG,UACzC/D,EAAU,KAAM,QAAQiB,KAAa,eAAeD,KAAW,MAI1D+C,EAAG,iBAAkB,UAAU5D,KAAU,IAAM,EAAC,UACrDH,EAAU,KAAM,OAQjB5a,IAAQuX,EAAS,cAAe,UAChCvX,EAAM,aAAc,QAAQ,KAC5B2e,EAAG,YAAa3e,IACV2e,EAAG,iBAAkB,WAAW,EAAG,UACxC/D,EAAU,KAAM,QAAQiB,KAAa,UAAUA,KAAa,OAC3DA,KAAa,YAAc,GAMvB8C,EAAG,iBAAkB,UAAU,EAAG,UACvC/D,EAAU,KAAM,aAMX+D,EAAG,iBAAkB,OAAO5D,KAAU,IAAM,EAAC,UAClDH,EAAU,KAAM,aAKjB+D,EAAG,iBAAkB,SACrB/D,EAAU,KAAM;YACnB,IAEE8D,GAAQ,SAAUC,GAAK;AACtB,cAAAA,EAAG,YAAY;AAKf,kBAAI3e,IAAQuX,EAAS,cAAe,OAAO;AAC3C,cAAAvX,EAAM,aAAc,QAAQ,WAC5B2e,EAAG,YAAa3e,CAAK,EAAG,aAAc,QAAQ,MAIzC2e,EAAG,iBAAkB,UAAU,EAAG,UACtC/D,EAAU,KAAM,SAASiB,KAAa,aAAa,GAK/C8C,EAAG,iBAAkB,UAAU,EAAG,WAAW,KACjD/D,EAAU,KAAM,YAAY,cAK7BF,EAAQ,YAAaiE,GAAK,WAAW,IAChCA,EAAG,iBAAkB,WAAW,EAAG,WAAW,KAClD/D,EAAU,KAAM,YAAY,cAK7B+D,EAAG,iBAAkB,SACrB/D,EAAU,KAAM;YACnB,MAGQzD,EAAQ,kBAAkByF,GAAQ,KAAQ9Y,KAAU4W,EAAQ,WAClEA,EAAQ,yBACRA,EAAQ,sBACRA,EAAQ,oBACRA,EAAQ,iBAAiB,MAEzBgE,GAAQ,SAAUC,GAAK;AAItB,cAAAxH,EAAQ,oBAAoBrT,GAAQ,KAAM6a,GAAI,GAAG,GAIjD7a,GAAQ,KAAM6a,GAAI,cAClB9D,GAAc,KAAM,MAAMmB;YAC7B,IAGCpB,IAAYA,EAAU,UAAU,IAAI,OAAQA,EAAU,KAAM,GAAG,IAC/DC,KAAgBA,GAAc,UAAU,IAAI,OAAQA,GAAc,KAAM,GAAG,IAI3E4E,IAAa7C,GAAQ,KAAMlC,EAAQ,uBAAuB,GAK1DI,KAAW2E,KAAc7C,GAAQ,KAAMlC,EAAQ,QAAU,IACxD,SAAU5R,GAAG7G,GAAI;AAChB,kBAAI6d,IAAQhX,EAAE,aAAa,IAAIA,EAAE,kBAAkBA,GAClDiX,IAAM9d,KAAKA,EAAE;AACd,qBAAO6G,MAAMiX,KAAO,CAAC,EAAGA,KAAOA,EAAI,aAAa,MAC/CD,EAAM,WACLA,EAAM,SAAUC,CAAK,IACrBjX,EAAE,2BAA2BA,EAAE,wBAAyBiX,CAAK,IAAG;AAAA,YAElE,IACD,SAAUjX,GAAG7G,GAAI;AAChB,kBAAKA;AACJ,uBAAUA,IAAIA,EAAE;AACf,sBAAKA,MAAM6G;AACV,2BAAO;AAAA;AAIV,qBAAO;AAAA,YACV,GAMC0S,KAAYiE,IACZ,SAAU3W,GAAG7G,GAAI;AAGhB,kBAAK6G,MAAM7G;AACV,uBAAAuY,IAAe,IACR;AAIR,kBAAIwF,IAAU,CAAClX,EAAE,0BAA0B,CAAC7G,EAAE;AAC9C,qBAAK+d,MASLA,KAAYlX,EAAE,iBAAiBA,OAAS7G,EAAE,iBAAiBA,KAC1D6G,EAAE,wBAAyB7G,CAAG;AAAA;AAAA,gBAG9B;AAAA,iBAGI+d,IAAU,KACZ,CAAC7I,EAAQ,gBAAgBlV,EAAE,wBAAyB6G,CAAC,MAAOkX,IAOzDlX,KAAKyO,KAAYzO,EAAE,iBAAiBkS,MACxCF,GAAUE,IAAclS,KACjB,KAOH7G,KAAKsV,KAAYtV,EAAE,iBAAiB+Y,MACxCF,GAAUE,IAAc/Y,KACjB,IAIDsY,IACJ1D,GAAS0D,GAAWzR,CAAC,IAAK+N,GAAS0D,GAAWtY,CAAG,IACnD,IAGK+d,IAAU,IAAI,KAAK;AAAA,YAC1B,IACD,SAAUlX,GAAG7G,GAAI;AAGhB,kBAAK6G,MAAM7G;AACV,uBAAAuY,IAAe,IACR;AAGR,kBAAIuE,GACH3a,IAAI,GACJ6b,IAAMnX,EAAE,YACRiX,KAAM9d,EAAE,YACRie,IAAK,CAAEpX,CAAG,GACVqX,KAAK,CAAEle;AAGR,kBAAK,CAACge,KAAO,CAACF;AAMb,uBAAOjX,KAAKyO,IAAW,KACtBtV,KAAKsV,IAAW;AAAA;AAAA,kBAEhB0I,IAAM,KACNF,KAAM,IACNxF,IACE1D,GAAS0D,GAAWzR,CAAC,IAAK+N,GAAS0D,GAAWtY,CAAG,IACnD;AAAA;AAGK,kBAAKge,MAAQF;AACnB,uBAAOjB,GAAchW,GAAG7G;AAKzB,mBADA8c,IAAMjW,GACIiW,IAAMA,EAAI;AACnB,gBAAAmB,EAAG,QAASnB;AAGb,mBADAA,IAAM9c,GACI8c,IAAMA,EAAI;AACnB,gBAAAoB,GAAG,QAASpB;AAIb,qBAAQmB,EAAI9b,CAAC,MAAO+b,GAAI/b,CAAC;AACxB,gBAAAA;AAGD,qBAAOA;AAAA;AAAA,gBAGN0a,GAAcoB,EAAI9b,CAAG,GAAE+b,GAAI/b,CAAC,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOhC8b,EAAI9b,CAAC,KAAM4W,KAAe,KAC1BmF,GAAI/b,MAAO4W,KAAe;AAAA;AAAA,kBAE1B;AAAA;AAAA;AAAA,YACH,IAEQzD;AAAA,UACR,GAEAwC,GAAO,UAAU,SAAUrQ,GAAMlH,GAAW;AAC3C,mBAAOuX,GAAQrQ,GAAM,MAAM,MAAMlH,CAAQ;AAAA,UAC1C,GAEAuX,GAAO,kBAAkB,SAAUxB,GAAM7O,GAAO;AAG/C,gBAFA+Q,EAAalC,CAAI,GAEZpB,EAAQ,mBAAmBwD,MAC/B,CAACY,GAAwB7R,IAAO,GAAK,MACnC,CAACmR,MAAiB,CAACA,GAAc,KAAMnR,CAAI,OAC3C,CAACkR,KAAiB,CAACA,EAAU,KAAMlR,CAAM;AAE3C,kBAAI;AACH,oBAAI2O,IAAMvU,GAAQ,KAAMyU,GAAM7O,CAAI;AAGlC,oBAAK2O,KAAOlB,EAAQ;AAAA;AAAA,gBAInBoB,EAAK,YAAYA,EAAK,SAAS,aAAa;AAC5C,yBAAOF;AAAA,cAER,QAAa;AACb,gBAAAkD,GAAwB7R,GAAM;cAC9B;AAGF,mBAAOqQ,GAAQrQ,GAAM6N,GAAU,MAAM,CAAEgB,CAAM,CAAA,EAAG,SAAS;AAAA,UAC1D,GAEAwB,GAAO,WAAW,SAAU7B,GAASK,GAAO;AAO3C,oBAAOL,EAAQ,iBAAiBA,MAAaX,KAC5CkD,EAAavC,CAAO,GAEd4C,GAAU5C,GAASK;UAC3B,GAEAwB,GAAO,OAAO,SAAUxB,GAAMI,GAAO;AAOpC,aAAOJ,EAAK,iBAAiBA,MAAUhB,KACtCkD,EAAalC,CAAI;AAGlB,gBAAIkG,IAAKzE,EAAK,WAAYrB,EAAK,YAAW,CAAI,GAG7Cf,IAAM6G,KAAMzH,GAAO,KAAMgD,EAAK,YAAYrB,EAAK,aAAe,IAC7D8F,EAAIlG,GAAMI,GAAM,CAACgC,EAAgB,IACjC;AAEF,mBAAO/C,MAAQ,SACdA,IACAT,EAAQ,cAAc,CAACwD,KACtBpC,EAAK,aAAcI,CAAM,KACvBf,IAAMW,EAAK,iBAAkBI,CAAM,MAAMf,EAAI,YAC9CA,EAAI,QACJ;AAAA,UACJ,GAEAmC,GAAO,SAAS,SAAUqG,GAAM;AAC/B,oBAASA,IAAM,IAAK,QAAShD,IAAYC,EAAU;AAAA,UACpD,GAEAtD,GAAO,QAAQ,SAAUb,GAAM;AAC9B,kBAAM,IAAI,MAAO,4CAA4CA;UAC9D,GAMAa,GAAO,aAAa,SAAUhQ,GAAU;AACvC,gBAAIwO,GACH8H,IAAa,CAAE,GACf7K,IAAI,GACJpR,IAAI;AAOL,gBAJAoW,IAAe,CAACrD,EAAQ,kBACxBoD,IAAY,CAACpD,EAAQ,cAAcpN,EAAQ,MAAO,IAClDA,EAAQ,KAAMyR,KAEThB,GAAe;AACnB,qBAAUjC,IAAOxO,EAAS3F;AACzB,gBAAKmU,MAASxO,EAAS3F,OACtBoR,IAAI6K,EAAW,KAAMjc;AAGvB,qBAAQoR;AACP,gBAAAzL,EAAQ,OAAQsW,EAAY7K,CAAG,GAAE,CAAC;AAAA,YAEnC;AAID,mBAAA+E,IAAY,MAELxQ;AAAA,UACR,GAMAkQ,IAAUF,GAAO,UAAU,SAAUxB,GAAO;AAC3C,gBAAI9U,GACH4U,IAAM,IACNjU,IAAI,GACJ8Z,IAAW3F,EAAK;AAEjB,gBAAM2F;AAQC,kBAAKA,MAAa,KAAKA,MAAa,KAAKA,MAAa,IAAK;AAIjE,oBAAK,OAAO3F,EAAK,eAAgB;AAChC,yBAAOA,EAAK;AAIZ,qBAAMA,IAAOA,EAAK,YAAYA,GAAMA,IAAOA,EAAK;AAC/C,kBAAAF,KAAO4B,EAAS1B;cAGlB,WAAW2F,MAAa,KAAKA,MAAa;AAC1C,uBAAO3F,EAAK;AAAA,kBAnBZ,QAAU9U,IAAO8U,EAAMnU;AAGtB,cAAAiU,KAAO4B,EAASxW;AAqBlB,mBAAO4U;AAAA,UACR,GAEA2B,IAAOD,GAAO,YAAY;AAAA;AAAA,YAGzB,aAAa;AAAA,YAEb,cAAcyE;AAAA,YAEd,OAAOhC;AAAA,YAEP,YAAY,CAAE;AAAA,YAEd,MAAM,CAAE;AAAA,YAER,UAAU;AAAA,cACT,KAAK,EAAE,KAAK,cAAc,OAAO,GAAM;AAAA,cACvC,KAAK,EAAE,KAAK,aAAc;AAAA,cAC1B,KAAK,EAAE,KAAK,mBAAmB,OAAO,GAAM;AAAA,cAC5C,KAAK,EAAE,KAAK,kBAAmB;AAAA,YAC/B;AAAA,YAED,WAAW;AAAA,cACV,MAAQ,SAAUnY,GAAQ;AACzB,uBAAAA,EAAO,CAAG,IAAGA,EAAO,CAAG,EAAC,QAAS0Y,IAAWC,KAG5C3Y,EAAO,CAAC,KAAOA,EAAO,CAAG,KAAIA,EAAO,CAAG,KACtCA,EAAO,CAAC,KAAM,IAAK,QAAS0Y,IAAWC,KAEnC3Y,EAAO,CAAG,MAAK,SACnBA,EAAO,CAAC,IAAK,MAAMA,EAAO,CAAG,IAAG,MAG1BA,EAAM,MAAO,GAAG,CAAC;AAAA,cACxB;AAAA,cAED,OAAS,SAAUA,GAAQ;AAY1B,uBAAAA,EAAO,CAAC,IAAKA,EAAO,CAAG,EAAC,YAAW,GAE9BA,EAAO,GAAI,MAAO,GAAG,CAAG,MAAK,SAG3BA,EAAO,MACZ0V,GAAO,MAAO1V,EAAO,CAAG,CAAA,GAKzBA,EAAO,CAAC,IAAK,EAAGA,EAAO,CAAG,IACzBA,EAAO,CAAG,KAAKA,EAAO,CAAC,KAAM,KAC7B,KAAMA,EAAO,OAAQ,UAAUA,EAAO,CAAC,MAAO,SAC/CA,EAAO,CAAG,IAAG,EAAKA,EAAO,CAAG,IAAGA,EAAO,CAAG,KAAMA,EAAO,CAAG,MAAK,UAGnDA,EAAO,MAClB0V,GAAO,MAAO1V,EAAO,CAAG,CAAA,GAGlBA;AAAA,cACP;AAAA,cAED,QAAU,SAAUA,GAAQ;AAC3B,oBAAIic,GACHC,IAAW,CAAClc,EAAO,CAAG,KAAIA,EAAO,CAAC;AAEnC,uBAAKmY,GAAW,MAAU,KAAMnY,EAAO,CAAC,KAChC,QAIHA,EAAO,KACXA,EAAO,CAAG,IAAGA,EAAO,CAAG,KAAIA,EAAO,CAAG,KAAI,KAG9Bkc,KAAYjE,GAAQ,KAAMiE,CAAU;AAAA,iBAG7CD,IAASnG,EAAUoG,GAAU;iBAG7BD,IAASC,EAAS,QAAS,KAAKA,EAAS,SAASD,CAAQ,IAAGC,EAAS,YAGxElc,EAAO,CAAG,IAAGA,EAAO,CAAG,EAAC,MAAO,GAAGic,IAClCjc,EAAO,CAAC,IAAKkc,EAAS,MAAO,GAAGD,KAI1Bjc,EAAM,MAAO,GAAG,CAAC;AAAA,cACxB;AAAA,YACD;AAAA,YAED,QAAQ;AAAA,cAEP,KAAO,SAAUmc,GAAmB;AACnC,oBAAIC,IAAWD,EAAiB,QAASzD,IAAWC,EAAS,EAAG;AAChE,uBAAOwD,MAAqB,MAC3B,WAAW;AACV,yBAAO;AAAA,gBACP,IACD,SAAUjI,GAAO;AAChB,yBAAOA,EAAK,YAAYA,EAAK,SAAS,YAAa,MAAKkI;AAAA,gBAC7D;AAAA,cACG;AAAA,cAED,OAAS,SAAU/N,GAAY;AAC9B,oBAAIgO,IAAUvF,GAAYzI,IAAY,GAAG;AAEzC,uBAAOgO,MACJA,IAAU,IAAI,OAAQ,QAAQ7E,KAC/B,MAAMnJ,IAAY,MAAMmJ,KAAa,KAAO,MAAMV;AAAA,kBACjDzI;AAAA,kBAAW,SAAU6F,GAAO;AAC3B,2BAAOmI,EAAQ;AAAA,sBACd,OAAOnI,EAAK,aAAc,YAAYA,EAAK,aAC3C,OAAOA,EAAK,eAAiB,OAC5BA,EAAK,aAAc,OAAS,KAC7B;AAAA,oBACR;AAAA,kBACA;AAAA;cACG;AAAA,cAED,MAAQ,SAAUI,GAAMgI,GAAUC,GAAQ;AACzC,uBAAO,SAAUrI,GAAO;AACvB,sBAAI9I,IAASsK,GAAO,KAAMxB,GAAMI,CAAI;AAEpC,yBAAKlJ,KAAU,OACPkR,MAAa,OAEfA,KAINlR,KAAU,IAIHkR,MAAa,MAAMlR,MAAWmR,IACpCD,MAAa,OAAOlR,MAAWmR,IAC/BD,MAAa,OAAOC,KAASnR,EAAO,QAASmR,CAAK,MAAO,IACzDD,MAAa,OAAOC,KAASnR,EAAO,QAASmR,CAAO,IAAG,KACvDD,MAAa,OAAOC,KAASnR,EAAO,MAAO,CAACmR,EAAM,MAAM,MAAOA,IAC/DD,MAAa,QAAS,MAAMlR,EAAO,QAASwM,IAAa,GAAG,IAAK,KAAM,QAAS2E,CAAK,IAAK,KAC1FD,MAAa,OAAOlR,MAAWmR,KAASnR,EAAO,MAAO,GAAGmR,EAAM,SAAS,CAAG,MAAKA,IAAQ,MACxF,MAdO;AAAA,gBAiBZ;AAAA,cACG;AAAA,cAED,OAAS,SAAU9G,GAAM+G,GAAMC,GAAWxH,GAAOyH,GAAO;AACvD,oBAAIC,IAASlH,EAAK,MAAO,GAAG,CAAG,MAAK,OACnCmH,IAAUnH,EAAK,MAAO,EAAI,MAAK,QAC/BoH,IAASL,MAAS;AAEnB,uBAAOvH,MAAU,KAAKyH,MAAS;AAAA;AAAA,kBAG9B,SAAUxI,GAAO;AAChB,2BAAO,CAAC,CAACA,EAAK;AAAA,kBACd;AAAA,oBAED,SAAUA,GAAM4I,IAAUC,GAAM;AAC/B,sBAAI9C,IAAO+C,IAAaC,IAAY7d,IAAM8d,IAAWxM,IACpDyM,KAAMR,MAAWC,IAAU,gBAAgB,mBAC3CrZ,KAAS2Q,EAAK,YACdI,KAAOuI,KAAU3I,EAAK,SAAS,YAAa,GAC5CkJ,KAAW,CAACL,KAAO,CAACF,GACpBlC,KAAO;AAER,sBAAKpX,IAAS;AAGb,wBAAKoZ,GAAS;AACb,6BAAQQ,MAAM;AAEb,6BADA/d,KAAO8U,GACG9U,KAAOA,GAAM+d;AACtB,8BAAKN,IACJzd,GAAK,SAAS,YAAW,MAAOkV,KAChClV,GAAK,aAAa;AAElB,mCAAO;AAKT,wBAAAsR,KAAQyM,KAAM1H,MAAS,UAAU,CAAC/E,MAAS;AAAA,sBAC3C;AACD,6BAAO;AAAA,oBACP;AAKD,wBAHAA,KAAQ,CAAEkM,IAAUrZ,GAAO,aAAaA,GAAO,YAG1CqZ,KAAWQ;AAkBf,2BAbAhe,KAAOmE,IACP0Z,KAAa7d,GAAMsX,EAAS,MAAMtX,GAAMsX,EAAO,IAAK,CAAA,IAIpDsG,KAAcC,GAAY7d,GAAK,QAAU,MACtC6d,GAAY7d,GAAK,QAAU,IAAG,CAAE,IAEnC6a,KAAQ+C,GAAavH,CAAM,KAAI,IAC/ByH,KAAYjD,GAAO,CAAC,MAAOrD,MAAWqD,GAAO,IAC7CU,KAAOuC,MAAajD,GAAO,IAC3B7a,KAAO8d,MAAa3Z,GAAO,WAAY2Z,EAAS,GAEtC9d,KAAO,EAAE8d,MAAa9d,MAAQA,GAAM+d,EAAK;AAAA,uBAGhDxC,KAAOuC,KAAY,MAAOxM,GAAM,IAAG;AAGrC,4BAAKtR,GAAK,aAAa,KAAK,EAAEub,MAAQvb,OAAS8U,GAAO;AACrD,0BAAA8I,GAAavH,CAAI,IAAK,CAAEmB,IAASsG,IAAWvC,EAAI;AAChD;AAAA,wBACA;AAAA,+BAMGyC,OAGJhe,KAAO8U,GACP+I,KAAa7d,GAAMsX,EAAS,MAAMtX,GAAMsX,EAAO,IAAK,CAAA,IAIpDsG,KAAcC,GAAY7d,GAAK,QAAU,MACtC6d,GAAY7d,GAAK,QAAU,IAAG,CAAE,IAEnC6a,KAAQ+C,GAAavH,CAAM,KAAI,IAC/ByH,KAAYjD,GAAO,CAAC,MAAOrD,MAAWqD,GAAO,IAC7CU,KAAOuC,KAKHvC,OAAS;AAGb,8BAAUvb,KAAO,EAAE8d,MAAa9d,MAAQA,GAAM+d,EAAK,MAChDxC,KAAOuC,KAAY,MAAOxM,GAAM,IAAG,MAE9B,GAAAmM,IACNzd,GAAK,SAAS,YAAW,MAAOkV,KAChClV,GAAK,aAAa,MAClB,EAAEub,OAGGyC,OACJH,KAAa7d,GAAMsX,EAAS,MACzBtX,GAAMsX,MAAY,CAAA,IAIrBsG,KAAcC,GAAY7d,GAAK,QAAU,MACtC6d,GAAY7d,GAAK,QAAU,IAAG,CAAE,IAEnC4d,GAAavH,CAAM,IAAG,CAAEmB,IAAS+D,EAAI,IAGjCvb,OAAS8U;AAlBf;AA2BH,2BAAAyG,MAAQ+B,GACD/B,OAAS1F,KAAW0F,KAAO1F,MAAU,KAAK0F,KAAO1F,KAAS;AAAA,kBACjE;AAAA,gBACN;AAAA,cACG;AAAA,cAED,QAAU,SAAUoI,GAAQpC,GAAW;AAMtC,oBAAIqC,GACHlD,IAAKzE,EAAK,QAAS0H,CAAM,KAAM1H,EAAK,WAAY0H,EAAO,aAAe,KACrE3H,GAAO,MAAO,yBAAyB2H;AAKzC,uBAAKjD,EAAI1D,MACD0D,EAAIa,KAIPb,EAAG,SAAS,KAChBkD,IAAO,CAAED,GAAQA,GAAQ,IAAIpC,CAAQ,GAC9BtF,EAAK,WAAW,eAAgB0H,EAAO,YAAW,CAAI,IAC5DlD,GAAc,SAAUZ,GAAM9Z,GAAU;AAIvC,2BAHI8d,GACHC,IAAUpD,EAAIb,GAAM0B,CAAU,GAC9Blb,IAAIyd,EAAQ,QACLzd;AACP,oBAAAwd,IAAM/K,GAAS+G,GAAMiE,EAASzd,CAAG,CAAA,GACjCwZ,EAAMgE,CAAK,IAAG,EAAG9d,EAAS8d,CAAG,IAAKC,EAASzd,CAAC;AAAA,gBAEnD,CAAQ,IACH,SAAUmU,GAAO;AAChB,yBAAOkG,EAAIlG,GAAM,GAAGoJ,CAAI;AAAA,gBAC9B,KAGUlD;AAAA,cACP;AAAA,YACD;AAAA,YAED,SAAS;AAAA;AAAA,cAGR,KAAOD,GAAc,SAAUvG,GAAW;AAKzC,oBAAIjY,IAAQ,CAAE,GACb+J,IAAU,CAAE,GACZ+X,IAAU1H,EAASnC,EAAS,QAASiE,IAAO,IAAI;AAEjD,uBAAO4F,EAAS/G,EAAS,IACxByD,GAAc,SAAUZ,GAAM9Z,GAASqd,GAAUC,GAAM;AAMtD,2BALI7I,GACHwJ,KAAYD,EAASlE,GAAM,MAAMwD,GAAK,CAAA,CAAI,GAC1Chd,IAAIwZ,EAAK,QAGFxZ;AACP,qBAAOmU,IAAOwJ,GAAW3d,QACxBwZ,EAAMxZ,CAAC,IAAK,EAAGN,EAASM,CAAC,IAAKmU;AAAA,gBAGrC,CAAO,IACH,SAAUA,GAAM4I,GAAUC,GAAM;AAC/B,yBAAAphB,EAAO,CAAG,IAAGuY,GACbuJ,EAAS9hB,GAAO,MAAMohB,GAAKrX,CAAO,GAGlC/J,EAAO,CAAG,IAAG,MACN,CAAC+J,EAAQ;gBACrB;AAAA,cACA,CAAK;AAAA,cAEH,KAAOyU,GAAc,SAAUvG,GAAW;AACzC,uBAAO,SAAUM,GAAO;AACvB,yBAAOwB,GAAQ9B,GAAUM,CAAI,EAAG,SAAS;AAAA,gBAC7C;AAAA,cACA,CAAK;AAAA,cAEH,UAAYiG,GAAc,SAAUwD,GAAO;AAC1C,uBAAAA,IAAOA,EAAK,QAASjF,IAAWC,EAAS,GAClC,SAAUzE,GAAO;AACvB,0BAASA,EAAK,eAAe0B,EAAS1B,CAAM,GAAG,QAASyJ,KAAS;AAAA,gBACrE;AAAA,cACA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cASH,MAAQxD,GAAc,SAAU/P,GAAO;AAGtC,uBAAM8N,GAAY,KAAM9N,KAAQ,EAAE,KACjCsL,GAAO,MAAO,uBAAuBtL,IAEtCA,IAAOA,EAAK,QAASsO,IAAWC,EAAS,EAAG,eACrC,SAAUzE,GAAO;AACvB,sBAAI0J;AACJ;AACC,wBAAOA,IAAWtH,KACjBpC,EAAK,OACLA,EAAK,aAAc,UAAU,KAAMA,EAAK,aAAc;AAEtD,6BAAA0J,IAAWA,EAAS,eACbA,MAAaxT,KAAQwT,EAAS,QAASxT,IAAO,GAAK,MAAK;AAAA,0BAErD8J,IAAOA,EAAK,eAAgBA,EAAK,aAAa;AAC1D,yBAAO;AAAA,gBACX;AAAA,cACA,CAAK;AAAA;AAAA,cAGH,QAAU,SAAUA,GAAO;AAC1B,oBAAI2J,IAAO5L,EAAO,YAAYA,EAAO,SAAS;AAC9C,uBAAO4L,KAAQA,EAAK,MAAO,CAAG,MAAK3J,EAAK;AAAA,cACxC;AAAA,cAED,MAAQ,SAAUA,GAAO;AACxB,uBAAOA,MAASmC;AAAA,cAChB;AAAA,cAED,OAAS,SAAUnC,GAAO;AACzB,uBAAOA,MAAShB,EAAS,kBACtB,CAACA,EAAS,YAAYA,EAAS,SAAQ,MACzC,CAAC,EAAGgB,EAAK,QAAQA,EAAK,QAAQ,CAACA,EAAK;AAAA,cACrC;AAAA;AAAA,cAGD,SAAW4G,GAAsB,EAAO;AAAA,cACxC,UAAYA,GAAsB,EAAM;AAAA,cAExC,SAAW,SAAU5G,GAAO;AAI3B,oBAAIkI,IAAWlI,EAAK,SAAS,YAAW;AACxC,uBAASkI,MAAa,WAAW,CAAC,CAAClI,EAAK,WACrCkI,MAAa,YAAY,CAAC,CAAClI,EAAK;AAAA,cACnC;AAAA,cAED,UAAY,SAAUA,GAAO;AAI5B,uBAAKA,EAAK,cAETA,EAAK,WAAW,eAGVA,EAAK,aAAa;AAAA,cACzB;AAAA;AAAA,cAGD,OAAS,SAAUA,GAAO;AAMzB,qBAAMA,IAAOA,EAAK,YAAYA,GAAMA,IAAOA,EAAK;AAC/C,sBAAKA,EAAK,WAAW;AACpB,2BAAO;AAGT,uBAAO;AAAA,cACP;AAAA,cAED,QAAU,SAAUA,GAAO;AAC1B,uBAAO,CAACyB,EAAK,QAAS,MAAWzB,CAAI;AAAA,cACrC;AAAA;AAAA,cAGD,QAAU,SAAUA,GAAO;AAC1B,uBAAOoE,GAAQ,KAAMpE,EAAK,QAAQ;AAAA,cAClC;AAAA,cAED,OAAS,SAAUA,GAAO;AACzB,uBAAOmE,GAAQ,KAAMnE,EAAK,QAAQ;AAAA,cAClC;AAAA,cAED,QAAU,SAAUA,GAAO;AAC1B,oBAAII,IAAOJ,EAAK,SAAS,YAAW;AACpC,uBAAOI,MAAS,WAAWJ,EAAK,SAAS,YAAYI,MAAS;AAAA,cAC9D;AAAA,cAED,MAAQ,SAAUJ,GAAO;AACxB,oBAAI4J;AACJ,uBAAO5J,EAAK,SAAS,YAAW,MAAO,WACtCA,EAAK,SAAS;AAAA;AAAA,kBAIV4J,IAAO5J,EAAK,aAAc,MAAQ,MAAM,QAC3C4J,EAAK,kBAAkB;AAAA,cACzB;AAAA;AAAA,cAGD,OAAS9C,GAAwB,WAAW;AAC3C,uBAAO,CAAE,CAAC;AAAA,cACb,CAAK;AAAA,cAEH,MAAQA,GAAwB,SAAU+C,GAAepJ,GAAS;AACjE,uBAAO,CAAEA,IAAS;cACrB,CAAK;AAAA,cAEH,IAAMqG,GAAwB,SAAU+C,GAAepJ,GAAQsG,GAAW;AACzE,uBAAO,CAAEA,IAAW,IAAIA,IAAWtG,IAASsG,CAAQ;AAAA,cACvD,CAAK;AAAA,cAEH,MAAQD,GAAwB,SAAUE,GAAcvG,GAAS;AAEhE,yBADI5U,IAAI,GACAA,IAAI4U,GAAQ5U,KAAK;AACxB,kBAAAmb,EAAa,KAAMnb;AAEpB,uBAAOmb;AAAA,cACV,CAAK;AAAA,cAEH,KAAOF,GAAwB,SAAUE,GAAcvG,GAAS;AAE/D,yBADI5U,IAAI,GACAA,IAAI4U,GAAQ5U,KAAK;AACxB,kBAAAmb,EAAa,KAAMnb;AAEpB,uBAAOmb;AAAA,cACV,CAAK;AAAA,cAEH,IAAMF,GAAwB,SAAUE,GAAcvG,GAAQsG,GAAW;AAMxE,yBALIlb,IAAIkb,IAAW,IAClBA,IAAWtG,IACXsG,IAAWtG,IACVA,IACAsG,GACM,EAAElb,KAAK;AACd,kBAAAmb,EAAa,KAAMnb;AAEpB,uBAAOmb;AAAA,cACV,CAAK;AAAA,cAEH,IAAMF,GAAwB,SAAUE,GAAcvG,GAAQsG,GAAW;AAExE,yBADIlb,IAAIkb,IAAW,IAAIA,IAAWtG,IAASsG,GACnC,EAAElb,IAAI4U;AACb,kBAAAuG,EAAa,KAAMnb;AAEpB,uBAAOmb;AAAA,cACV,CAAK;AAAA,YACH;AAAA,UACF,GAEAvF,EAAK,QAAS,MAAUA,EAAK,QAAS;AAGtC,eAAM,KAAK,EAAE,OAAO,IAAM,UAAU,IAAM,MAAM,IAAM,UAAU,IAAM,OAAO,GAAI;AAChF,YAAAA,EAAK,QAAS,CAAG,IAAGiF,GAAmB,CAAC;AAEzC,eAAM,KAAK,EAAE,QAAQ,IAAM,OAAO,GAAI;AACrC,YAAAjF,EAAK,QAAS,CAAG,IAAGkF,GAAoB,CAAC;AAI1C,mBAASmD,KAAa;AAAA,UAAE;AACxB,UAAAA,GAAW,YAAYrI,EAAK,UAAUA,EAAK,SAC3CA,EAAK,aAAa,IAAIqI,MAEtBlI,IAAWJ,GAAO,WAAW,SAAU9B,GAAUqK,GAAY;AAC5D,gBAAIT,GAASxd,GAAOke,GAAQzI,GAC3B0I,GAAOzE,GAAQ0E,GACfC,KAASrH,GAAYpD,IAAW;AAEjC,gBAAKyK;AACJ,qBAAOJ,IAAY,IAAII,GAAO,MAAO,CAAC;AAOvC,iBAJAF,IAAQvK,GACR8F,IAAS,CAAA,GACT0E,IAAazI,EAAK,WAEVwI,KAAQ;AAGf,eAAK,CAACX,MAAaxd,IAAQ8X,GAAO,KAAMqG,CAAK,QACvCne,MAGJme,IAAQA,EAAM,MAAOne,EAAO,GAAI,MAAQ,KAAIme,IAE7CzE,EAAO,KAAQwE,IAAS,CAAA,KAGzBV,IAAU,KAGHxd,IAAQ+X,GAAa,KAAMoG,CAAK,OACtCX,IAAUxd,EAAM,SAChBke,EAAO,KAAM;AAAA,gBACZ,OAAOV;AAAA;AAAA,gBAGP,MAAMxd,EAAO,CAAC,EAAG,QAAS6X,IAAO,GAAK;AAAA,cAC1C,IACGsG,IAAQA,EAAM,MAAOX,EAAQ,MAAM;AAIpC,mBAAM/H,KAAQE,EAAK;AAClB,iBAAO3V,IAAQmY,GAAW1C,CAAM,EAAC,KAAM0I,CAAO,OAAQ,CAACC,EAAY3I,CAAM,MACtEzV,IAAQoe,EAAY3I,CAAM,EAAEzV,CAAK,QACnCwd,IAAUxd,EAAM,SAChBke,EAAO,KAAM;AAAA,kBACZ,OAAOV;AAAA,kBACP,MAAM/H;AAAA,kBACN,SAASzV;AAAA,gBACd,IACIme,IAAQA,EAAM,MAAOX,EAAQ,MAAM;AAIrC,kBAAK,CAACA;AACL;AAAA,YAED;AAKD,mBAAOS,IACNE,EAAM,SACNA,IACCzI,GAAO,MAAO9B,CAAU;AAAA;AAAA,cAGxBoD,GAAYpD,GAAU8F,CAAQ,EAAC,MAAO,CAAC;AAAA;AAAA,UAC1C;AAEA,mBAASK,GAAYmE,GAAS;AAI7B,qBAHIne,IAAI,GACPqU,IAAM8J,EAAO,QACbtK,IAAW,IACJ7T,IAAIqU,GAAKrU;AAChB,cAAA6T,KAAYsK,EAAQne,CAAG,EAAC;AAEzB,mBAAO6T;AAAA,UACP;AAED,mBAASyF,GAAeoE,GAASa,GAAYC,GAAO;AACnD,gBAAIpB,IAAMmB,EAAW,KACpBE,IAAOF,EAAW,MAClBpE,IAAMsE,KAAQrB,GACdsB,IAAmBF,KAAQrE,MAAQ,cACnCwE,IAAW7H;AAEZ,mBAAOyH,EAAW;AAAA;AAAA,cAGjB,SAAUpK,GAAML,IAASkJ,GAAM;AAC9B,uBAAU7I,IAAOA,EAAMiJ;AACtB,sBAAKjJ,EAAK,aAAa,KAAKuK;AAC3B,2BAAOhB,EAASvJ,GAAML,IAASkJ,CAAG;AAGpC,uBAAO;AAAA,cACP;AAAA;AAAA;AAAA,cAGD,SAAU7I,GAAML,IAASkJ,GAAM;AAC9B,oBAAI4B,IAAU3B,IAAaC,IAC1B2B,KAAW,CAAEhI,IAAS8H;AAGvB,oBAAK3B;AACJ,yBAAU7I,IAAOA,EAAMiJ;AACtB,yBAAKjJ,EAAK,aAAa,KAAKuK,MACtBhB,EAASvJ,GAAML,IAASkJ,CAAG;AAC/B,6BAAO;AAAA;AAKV,yBAAU7I,IAAOA,EAAMiJ;AACtB,wBAAKjJ,EAAK,aAAa,KAAKuK;AAQ3B,0BAPAxB,KAAa/I,EAAMwC,EAAS,MAAMxC,EAAMwC,EAAO,IAAK,CAAA,IAIpDsG,KAAcC,GAAY/I,EAAK,QAAU,MACtC+I,GAAY/I,EAAK,QAAU,IAAG,CAAE,IAE9BsK,KAAQA,MAAStK,EAAK,SAAS,YAAW;AAC9C,wBAAAA,IAAOA,EAAMiJ,CAAK,KAAIjJ;AAAA,2BAChB;AAAA,6BAAOyK,KAAW3B,GAAa9C,CAAK,MAC1CyE,GAAU,CAAC,MAAO/H,MAAW+H,GAAU,CAAG,MAAKD;AAG/C,iCAASE,GAAU,CAAC,IAAKD,GAAU,CAAC;AAOpC,4BAHA3B,GAAa9C,CAAK,IAAG0E,IAGdA,GAAU,KAAMnB,EAASvJ,GAAML,IAASkJ;AAC9C,iCAAO;AAAA;AAMZ,uBAAO;AAAA,cACV;AAAA;AAAA,UACC;AAED,mBAAS8B,GAAgBC,GAAW;AACnC,mBAAOA,EAAS,SAAS,IACxB,SAAU5K,GAAML,GAASkJ,GAAM;AAE9B,uBADIhd,IAAI+e,EAAS,QACT/e;AACP,oBAAK,CAAC+e,EAAU/e,CAAC,EAAImU,GAAML,GAASkJ;AACnC,yBAAO;AAGT,qBAAO;AAAA,YACP,IACD+B,EAAU,CAAC;AAAA,UACZ;AAED,mBAASC,GAAkBnL,GAAUoL,GAAUtZ,GAAU;AAGxD,qBAFI3F,IAAI,GACPqU,IAAM4K,EAAS,QACRjf,IAAIqU,GAAKrU;AAChB,cAAA2V,GAAQ9B,GAAUoL,EAAUjf,CAAG,GAAE2F,CAAO;AAEzC,mBAAOA;AAAA,UACP;AAED,mBAASuZ,GAAUvB,GAAWwB,GAAKC,GAAQtL,GAASkJ,GAAM;AAOzD,qBANI7I,GACHkL,IAAe,CAAE,GACjBrf,IAAI,GACJqU,IAAMsJ,EAAU,QAChB2B,KAASH,KAAO,MAETnf,IAAIqU,GAAKrU;AAChB,eAAOmU,IAAOwJ,EAAW3d,QACnB,CAACof,KAAUA,EAAQjL,GAAML,GAASkJ,CAAG,OACzCqC,EAAa,KAAMlL,IACdmL,MACJH,EAAI,KAAMnf;AAMd,mBAAOqf;AAAA,UACP;AAED,mBAASE,GAAYC,GAAW3L,GAAU6J,GAAS+B,GAAYC,GAAYC,GAAe;AACzF,mBAAKF,KAAc,CAACA,EAAY9I,QAC/B8I,IAAaF,GAAYE,KAErBC,KAAc,CAACA,EAAY/I,QAC/B+I,IAAaH,GAAYG,GAAYC,KAE/BvF,GAAc,SAAUZ,GAAM7T,GAASmO,GAASkJ,IAAM;AAC5D,kBAAI4C,GAAM5f,IAAGmU,IACZ0L,KAAS,CAAE,GACXC,KAAU,CAAE,GACZC,KAAcpa,EAAQ,QAGtBqO,KAAQwF,KAAQwF;AAAA,gBACfnL,KAAY;AAAA,gBACZC,EAAQ,WAAW,CAAEA,CAAO,IAAKA;AAAA,gBACjC,CAAE;AAAA,cACF,GAGDkM,KAAYR,MAAehG,KAAQ,CAAC3F,KACnCqL,GAAUlL,IAAO6L,IAAQL,GAAW1L,GAASkJ,EAAK,IAClDhJ,IAEDiM,KAAavC;AAAA;AAAA,gBAGZgC,MAAgBlG,IAAOgG,IAAYO,MAAeN;AAAA;AAAA,kBAGjD,CAAE;AAAA;AAAA;AAAA,kBAGF9Z;AAAA;AAAA,kBACDqa;AAQF,kBALKtC,KACJA,EAASsC,IAAWC,IAAYnM,GAASkJ,EAAG,GAIxCyC;AAMJ,qBALAG,IAAOV,GAAUe,IAAYH,KAC7BL,EAAYG,GAAM,CAAA,GAAI9L,GAASkJ,EAAG,GAGlChd,KAAI4f,EAAK,QACD5f;AACP,mBAAOmU,KAAOyL,EAAM5f,SACnBigB,GAAYH,GAAS9f,EAAC,KAAO,EAAGggB,GAAWF,GAAS9f,EAAC,KAAOmU;AAK/D,kBAAKqF;AACJ,oBAAKkG,KAAcF,GAAY;AAC9B,sBAAKE,GAAa;AAKjB,yBAFAE,IAAO,CAAA,GACP5f,KAAIigB,GAAW,QACPjgB;AACP,uBAAOmU,KAAO8L,GAAYjgB,QAGzB4f,EAAK,KAAQI,GAAWhgB,EAAG,IAAGmU,EAAI;AAGpC,oBAAAuL,EAAY,MAAQO,KAAa,CAAE,GAAIL,GAAM5C,EAAG;AAAA,kBAChD;AAID,uBADAhd,KAAIigB,GAAW,QACPjgB;AACP,qBAAOmU,KAAO8L,GAAYjgB,EAAG,OAC1B4f,IAAOF,IAAajN,GAAS+G,GAAMrF,EAAM,IAAG0L,GAAQ7f,OAAQ,OAE9DwZ,EAAMoG,CAAI,IAAK,EAAGja,EAASia,CAAI,IAAKzL;AAAA,gBAGtC;AAAA;AAID,gBAAA8L,KAAaf;AAAA,kBACZe,OAAeta,IACdsa,GAAW,OAAQF,IAAaE,GAAW,MAAQ,IACnDA;AAAA,gBACL,GACQP,IACJA,EAAY,MAAM/Z,GAASsa,IAAYjD,EAAG,IAE1CxK,GAAK,MAAO7M,GAASsa;YAGzB;UACC;AAED,mBAASC,GAAmB/B,GAAS;AAyBpC,qBAxBIgC,GAAczC,GAAStM,GAC1BiD,IAAM8J,EAAO,QACbiC,IAAkBxK,EAAK,SAAUuI,EAAQ,CAAC,EAAG,IAAM,GACnDkC,IAAmBD,KAAmBxK,EAAK,SAAU,GAAK,GAC1D5V,IAAIogB,IAAkB,IAAI,GAG1BE,IAAehH,GAAe,SAAUnF,IAAO;AAC9C,qBAAOA,OAASgM;AAAA,YACnB,GAAKE,GAAkB,EAAM,GAC3BE,KAAkBjH,GAAe,SAAUnF,IAAO;AACjD,qBAAO1B,GAAS0N,GAAchM,EAAM,IAAG;AAAA,YAC1C,GAAKkM,GAAkB,EAAM,GAC3BtB,IAAW,CAAE,SAAU5K,IAAML,IAASkJ,IAAM;AAC3C,kBAAI/I,KAAQ,CAACmM,MAAqBpD,MAAOlJ,OAAYoC,QAClDiK,IAAerM,IAAU,WAC1BwM,EAAcnM,IAAML,IAASkJ,EAAK,IAClCuD,GAAiBpM,IAAML,IAASkJ,EAAK;AAGvC,qBAAAmD,IAAe,MACRlM;AAAA,YACV,IAESjU,IAAIqU,GAAKrU;AAChB,kBAAO0d,IAAU9H,EAAK,SAAUuI,EAAQne,CAAC,EAAG;AAC3C,gBAAA+e,IAAW,CAAEzF,GAAewF,GAAgBC,CAAU,GAAErB,CAAO;mBACzD;AAIN,oBAHAA,IAAU9H,EAAK,OAAQuI,EAAQne,CAAC,EAAG,MAAO,MAAO,MAAMme,EAAQne,CAAG,EAAC,OAAO,GAGrE0d,EAAS/G,KAAY;AAIzB,uBADAvF,IAAI,EAAEpR,GACEoR,IAAIiD,KACN,CAAAuB,EAAK,SAAUuI,EAAQ/M,CAAG,EAAC,IAAI,GADpBA;AAChB;AAID,yBAAOmO;AAAA,oBACNvf,IAAI,KAAK8e,GAAgBC,CAAU;AAAA,oBACnC/e,IAAI,KAAKga;AAAA;AAAA,sBAGTmE,EACE,MAAO,GAAGne,IAAI,CAAG,EACjB,OAAQ,EAAE,OAAOme,EAAQne,IAAI,GAAI,SAAS,MAAM,MAAM,IAAM;AAAA,oBACnE,EAAO,QAAS8X,IAAO,IAAM;AAAA,oBACxB4F;AAAA,oBACA1d,IAAIoR,KAAK8O,GAAmB/B,EAAO,MAAOne,GAAGoR,EAAK;AAAA,oBAClDA,IAAIiD,KAAO6L,GAAqB/B,IAASA,EAAO,MAAO/M,EAAO;AAAA,oBAC9DA,IAAIiD,KAAO2F,GAAYmE,CAAQ;AAAA,kBACpC;AAAA,gBACI;AACD,gBAAAY,EAAS,KAAMrB;cACf;AAGF,mBAAOoB,GAAgBC;UACvB;AAED,mBAASyB,GAA0BC,GAAiBC,GAAc;AACjE,gBAAIC,IAAQD,EAAY,SAAS,GAChCE,IAAYH,EAAgB,SAAS,GACrCI,IAAe,SAAUrH,GAAM1F,GAASkJ,GAAKrX,GAASmb,IAAY;AACjE,kBAAI3M,GAAM/C,IAAGsM,IACZqD,KAAe,GACf/gB,KAAI,KACJ2d,KAAYnE,KAAQ,CAAE,GACtBwH,KAAa,CAAE,GACfC,KAAgB/K,GAGhBlC,KAAQwF,KAAQoH,KAAahL,EAAK,KAAM,IAAS,KAAKkL,EAAW,GAGjEI,KAAkBrK,MAAWoK,MAAiB,OAAO,IAAI,KAAK,OAAQ,KAAI,KAC1E5M,KAAML,GAAM;AAcb,mBAZK8M,OAMJ5K,IAAmBpC,KAAWX,KAAYW,KAAWgN,KAM9C9gB,OAAMqU,OAASF,IAAOH,GAAOhU,EAAG,MAAM,MAAMA,MAAM;AACzD,oBAAK4gB,KAAazM,GAAO;AAWxB,uBAVA/C,KAAI,GAMC,CAAC0C,KAAWK,EAAK,iBAAiBhB,MACtCkD,EAAalC,CAAI,GACjB6I,IAAM,CAACzG,KAEEmH,KAAU+C,EAAiBrP;AACpC,wBAAKsM,GAASvJ,GAAML,KAAWX,GAAU6J,CAAG,GAAK;AAChD,sBAAArX,EAAQ,KAAMwO;AACd;AAAA,oBACA;AAEF,kBAAK2M,OACJjK,KAAUqK;AAAA,gBAEX;AAGD,gBAAKP,OAGGxM,IAAO,CAACuJ,MAAWvJ,MACzB4M,MAIIvH,KACJmE,GAAU,KAAMxJ;cAGlB;AAaD,kBATA4M,MAAgB/gB,IASX2gB,KAAS3gB,OAAM+gB,IAAe;AAElC,qBADA3P,KAAI,GACMsM,KAAUgD,EAAatP;AAChC,kBAAAsM,GAASC,IAAWqD,IAAYlN,GAASkJ,CAAG;AAG7C,oBAAKxD,GAAO;AAGX,sBAAKuH,KAAe;AACnB,2BAAQ/gB;AACP,sBAAQ2d,GAAW3d,EAAC,KAAMghB,GAAYhhB,EAAG,MACxCghB,GAAYhhB,EAAG,IAAGqX,GAAI,KAAM1R,CAAO;AAMtC,kBAAAqb,KAAa9B,GAAU8B;gBACvB;AAGD,gBAAAxO,GAAK,MAAO7M,GAASqb,KAGhBF,MAAa,CAACtH,KAAQwH,GAAW,SAAS,KAC5CD,KAAeL,EAAY,SAAW,KAExC/K,GAAO,WAAYhQ;cAEpB;AAGD,qBAAKmb,OACJjK,KAAUqK,IACVhL,IAAmB+K,KAGbtD;AAAA,YACV;AAEC,mBAAOgD,IACNvG,GAAcyG,CAAc,IAC5BA;AAAA,UACD;AAED,iBAAA7K,IAAUL,GAAO,UAAU,SAAU9B,GAAU5T,GAAgC;AAC9E,gBAAID,GACH0gB,IAAc,CAAE,GAChBD,IAAkB,CAAE,GACpBnC,IAASpH,GAAerD,IAAW;AAEpC,gBAAK,CAACyK,GAAS;AAOd,mBAJMre,MACLA,IAAQ8V,EAAUlC,KAEnB7T,IAAIC,EAAM,QACFD;AACP,gBAAAse,IAAS4B,GAAmBjgB,EAAOD,CAAG,CAAA,GACjCse,EAAQ3H,MACZ+J,EAAY,KAAMpC,KAElBmC,EAAgB,KAAMnC;AAKxB,cAAAA,IAASpH;AAAA,gBACRrD;AAAA,gBACA2M,GAA0BC,GAAiBC,CAAa;AAAA,cAC3D,GAGEpC,EAAO,WAAWzK;AAAA,YAClB;AACD,mBAAOyK;AAAA,UACR,GAWArI,IAASN,GAAO,SAAS,SAAU9B,GAAUC,GAASnO,GAAS6T,GAAO;AACrE,gBAAIxZ,GAAGme,GAAQgD,GAAOzL,GAAM0L,GAC3BC,KAAW,OAAOxN,KAAa,cAAcA,GAC7C5T,IAAQ,CAACuZ,KAAQzD,EAAYlC,IAAWwN,GAAS,YAAYxN;AAM9D,gBAJAlO,IAAUA,KAAW,IAIhB1F,EAAM,WAAW,GAAI;AAIzB,kBADAke,IAASle,EAAO,KAAMA,EAAO,GAAI,MAAO,IACnCke,EAAO,SAAS,MAAOgD,IAAQhD,EAAQ,IAAM,SAAS,QAC1DrK,EAAQ,aAAa,KAAKyC,MAAkBX,EAAK,SAAUuI,EAAQ,GAAI,OAAS;AAIhF,oBAFArK,KAAY8B,EAAK,KAAM,GAAQuL,EAAM,QAAS,CAAG,EAC/C,QAASxI,IAAWC,EAAW,GAAE9E,CAAO,KAAM,CAAA,GAAM,IAChDA;AAIC,kBAAKuN,OACXvN,IAAUA,EAAQ;AAAA,oBAJlB,QAAOnO;AAOR,gBAAAkO,IAAWA,EAAS,MAAOsK,EAAO,QAAQ,MAAM;cAChD;AAID,mBADAne,IAAIoY,GAAW,aAAiB,KAAMvE,KAAa,IAAIsK,EAAO,QACtDne,QACPmhB,IAAQhD,EAAQne,IAGX,CAAA4V,EAAK,SAAYF,IAAOyL,EAAM,IAAI;AAGvC,qBAAOC,IAAOxL,EAAK,KAAMF,CAAI,OAGrB8D,IAAO4H;AAAA,kBACbD,EAAM,QAAS,CAAC,EAAG,QAASxI,IAAWC,EAAW;AAAA,kBAClDF,GAAS,KAAMyF,EAAQ,CAAC,EAAG,SAAUpE,GAAajG,EAAQ,UAAY,KACrEA;AAAA,gBACN,IAAU;AAKL,sBAFAqK,EAAO,OAAQne,GAAG,IAClB6T,IAAW2F,EAAK,UAAUQ,GAAYmE,CAAM,GACvC,CAACtK;AACL,2BAAArB,GAAK,MAAO7M,GAAS6T,IACd7T;AAGR;AAAA,gBACA;AAAA,YAGH;AAID,oBAAE0b,MAAYrL,EAASnC,GAAU5T,CAAO;AAAA,cACvCuZ;AAAA,cACA1F;AAAA,cACA,CAACyC;AAAA,cACD5Q;AAAA,cACA,CAACmO,KAAW4E,GAAS,KAAM7E,CAAU,KAAIkG,GAAajG,EAAQ,UAAU,KAAMA;AAAA,YAChF,GACQnO;AAAA,UACR,GAKAoN,EAAQ,aAAa4D,GAAQ,MAAO,EAAI,EAAC,KAAMS,IAAY,KAAM,EAAE,MAAOT,IAI1E5D,EAAQ,mBAAmB,CAAC,CAACqD,GAG7BC,KAIAtD,EAAQ,eAAeuH,GAAQ,SAAUC,GAAK;AAG7C,mBAAOA,EAAG,wBAAyBpH,EAAS,cAAe,UAAU,CAAI,IAAG;AAAA,UAC7E,IAKMmH,GAAQ,SAAUC,GAAK;AAC5B,mBAAAA,EAAG,YAAY,oBACRA,EAAG,WAAW,aAAc,MAAM,MAAO;AAAA,UACjD,MACCC,GAAW,0BAA0B,SAAUrG,GAAMI,GAAMuB,GAAQ;AAClE,gBAAK,CAACA;AACL,qBAAO3B,EAAK,aAAcI,GAAMA,EAAK,YAAW,MAAO,SAAS,IAAI;UAEvE,KAKK,CAACxB,EAAQ,cAAc,CAACuH,GAAQ,SAAUC,GAAK;AACnD,mBAAAA,EAAG,YAAY,YACfA,EAAG,WAAW,aAAc,SAAS,EAAE,GAChCA,EAAG,WAAW,aAAc,OAAO,MAAO;AAAA,UAClD,OACCC,GAAW,SAAS,SAAUrG,GAAMmN,GAAOxL,GAAQ;AAClD,gBAAK,CAACA,KAAS3B,EAAK,SAAS,YAAW,MAAO;AAC9C,qBAAOA,EAAK;AAAA,UAEf,IAKMmG,GAAQ,SAAUC,GAAK;AAC5B,mBAAOA,EAAG,aAAc,UAAU,KAAM;AAAA,UACzC,MACCC,GAAWhD,IAAU,SAAUrD,GAAMI,GAAMuB,GAAQ;AAClD,gBAAItC;AACJ,gBAAK,CAACsC;AACL,qBAAO3B,EAAMI,CAAI,MAAO,KAAOA,EAAK,YAAa,KAC9Cf,IAAMW,EAAK,iBAAkBI,CAAM,MAAMf,EAAI,YAC9CA,EAAI,QACJ;AAAA,UAEL,IAGOmC;AAAA,QAEN,EAAIzD,CAAM;AAAA;AAIX,MAAA0B,EAAO,OAAO+B,IACd/B,EAAO,OAAO+B,GAAO,WAGrB/B,EAAO,KAAM,GAAG,IAAKA,EAAO,KAAK,SACjCA,EAAO,aAAaA,EAAO,SAAS+B,GAAO,YAC3C/B,EAAO,OAAO+B,GAAO,SACrB/B,EAAO,WAAW+B,GAAO,OACzB/B,EAAO,WAAW+B,GAAO,UACzB/B,EAAO,iBAAiB+B,GAAO;AAK/B,UAAIyH,KAAM,SAAUjJ,GAAMiJ,GAAKmE,GAAQ;AAItC,iBAHI9D,IAAU,CAAE,GACf+D,IAAWD,MAAU,SAEZpN,IAAOA,EAAMiJ,CAAK,MAAMjJ,EAAK,aAAa;AACnD,cAAKA,EAAK,aAAa,GAAI;AAC1B,gBAAKqN,KAAY5N,EAAQO,CAAM,EAAC,GAAIoN,CAAK;AACxC;AAED,YAAA9D,EAAQ,KAAMtJ;UACd;AAEF,eAAOsJ;AAAA,MACR,GAGIgE,KAAW,SAAUC,GAAGvN,GAAO;AAGlC,iBAFIsJ,IAAU,CAAA,GAENiE,GAAGA,IAAIA,EAAE;AAChB,UAAKA,EAAE,aAAa,KAAKA,MAAMvN,KAC9BsJ,EAAQ,KAAMiE;AAIhB,eAAOjE;AAAA,MACR,GAGIkE,KAAgB/N,EAAO,KAAK,MAAM;AAItC,eAASyI,GAAUlI,GAAMI,GAAO;AAE9B,eAAOJ,EAAK,YAAYA,EAAK,SAAS,kBAAkBI,EAAK;MAE/D;AACA,UAAIqN,IAAe;AAKnB,eAASC,EAAQzjB,GAAU0jB,GAAWC,GAAM;AAC3C,eAAK/O,EAAY8O,KACTlO,EAAO,KAAMxV,GAAU,SAAU+V,GAAMnU,GAAI;AACjD,iBAAO,CAAC,CAAC8hB,EAAU,KAAM3N,GAAMnU,GAAGmU,CAAM,MAAK4N;AAAA,QAChD,KAIMD,EAAU,WACPlO,EAAO,KAAMxV,GAAU,SAAU+V,GAAO;AAC9C,iBAASA,MAAS2N,MAAgBC;AAAA,QACrC,KAIM,OAAOD,KAAc,WAClBlO,EAAO,KAAMxV,GAAU,SAAU+V,GAAO;AAC9C,iBAAS1B,EAAQ,KAAMqP,GAAW3N,KAAS,OAAS4N;AAAA,QACvD,KAIQnO,EAAO,OAAQkO,GAAW1jB,GAAU2jB,CAAG;AAAA,MAC9C;AAED,MAAAnO,EAAO,SAAS,SAAUtO,GAAM0O,GAAO+N,GAAM;AAC5C,YAAI5N,IAAOH,EAAO;AAMlB,eAJK+N,MACJzc,IAAO,UAAUA,IAAO,MAGpB0O,EAAM,WAAW,KAAKG,EAAK,aAAa,IACrCP,EAAO,KAAK,gBAAiBO,GAAM7O,KAAS,CAAE6O,CAAM,IAAG,KAGxDP,EAAO,KAAK,QAAStO,GAAMsO,EAAO,KAAMI,GAAO,SAAUG,GAAO;AACtE,iBAAOA,EAAK,aAAa;AAAA,QACzB,CAAA;MACF,GAEAP,EAAO,GAAG,OAAQ;AAAA,QACjB,MAAM,SAAUC,GAAW;AAC1B,cAAI,GAAGI,GACNI,IAAM,KAAK,QACX2N,IAAO;AAER,cAAK,OAAOnO,KAAa;AACxB,mBAAO,KAAK,UAAWD,EAAQC,CAAU,EAAC,OAAQ,WAAW;AAC5D,mBAAM,IAAI,GAAG,IAAIQ,GAAK;AACrB,oBAAKT,EAAO,SAAUoO,EAAM,CAAG,GAAE,IAAI;AACpC,yBAAO;AAAA,YAGT,CAAA;AAKF,eAFA/N,IAAM,KAAK,UAAW,CAAA,IAEhB,IAAI,GAAG,IAAII,GAAK;AACrB,YAAAT,EAAO,KAAMC,GAAUmO,EAAM,CAAC,GAAI/N;AAGnC,iBAAOI,IAAM,IAAIT,EAAO,WAAYK,CAAK,IAAGA;AAAA,QAC5C;AAAA,QACD,QAAQ,SAAUJ,GAAW;AAC5B,iBAAO,KAAK,UAAWgO,EAAQ,MAAMhO,KAAY,CAAE,GAAE,EAAK;QAC1D;AAAA,QACD,KAAK,SAAUA,GAAW;AACzB,iBAAO,KAAK,UAAWgO,EAAQ,MAAMhO,KAAY,CAAE,GAAE,EAAI;QACzD;AAAA,QACD,IAAI,SAAUA,GAAW;AACxB,iBAAO,CAAC,CAACgO;AAAA,YACR;AAAA;AAAA;AAAA,YAIA,OAAOhO,KAAa,YAAY8N,GAAc,KAAM9N,CAAU,IAC7DD,EAAQC,CAAU,IAClBA,KAAY,CAAE;AAAA,YACf;AAAA,UACA,EAAC;AAAA,QACF;AAAA,MACF;AAOA,UAAIoO,GAMHxJ,IAAa,uCAEbrT,IAAOwO,EAAO,GAAG,OAAO,SAAUC,GAAUC,GAASoO,GAAO;AAC3D,YAAIjiB,GAAOkU;AAGX,YAAK,CAACN;AACL,iBAAO;AAQR,YAHAqO,IAAOA,KAAQD,GAGV,OAAOpO,KAAa;AAaxB,cAZKA,EAAU,CAAC,MAAO,OACtBA,EAAUA,EAAS,SAAS,CAAG,MAAK,OACpCA,EAAS,UAAU,IAGnB5T,IAAQ,CAAE,MAAM4T,GAAU,IAAI,IAG9B5T,IAAQwY,EAAW,KAAM5E,IAIrB5T,MAAWA,EAAO,CAAC,KAAM,CAAC6T;AAG9B,gBAAK7T,EAAO,IAAM;AAYjB,kBAXA6T,IAAUA,aAAmBF,IAASE,EAAS,CAAC,IAAKA,GAIrDF,EAAO,MAAO,MAAMA,EAAO;AAAA,gBAC1B3T,EAAO,CAAG;AAAA,gBACV6T,KAAWA,EAAQ,WAAWA,EAAQ,iBAAiBA,IAAUX;AAAA,gBACjE;AAAA,cACN,IAGUyO,EAAW,KAAM3hB,EAAO,CAAG,CAAA,KAAM2T,EAAO,cAAeE;AAC3D,qBAAM7T,KAAS6T;AAGd,kBAAKd,EAAY,KAAM/S,CAAK,KAC3B,KAAMA,CAAO,EAAE6T,EAAS7T,CAAO,CAAA,IAI/B,KAAK,KAAMA,GAAO6T,EAAS7T,CAAO,CAAA;AAKrC,qBAAO;AAAA,YAGZ;AACK,qBAAAkU,IAAOhB,GAAS,eAAgBlT,EAAO,CAAG,CAAA,GAErCkU,MAGJ,KAAM,CAAG,IAAGA,GACZ,KAAK,SAAS,IAER;AAAA,cAIF,QAAK,CAACL,KAAWA,EAAQ,UACtBA,KAAWoO,GAAO,KAAMrO,CAAQ,IAKlC,KAAK,YAAaC,CAAS,EAAC,KAAMD,CAAQ;AAAA,aAI5C;AAAA,cAAKA,EAAS;AACpB,wBAAM,CAAG,IAAGA,GACZ,KAAK,SAAS,GACP;AAID,cAAKb,EAAYa;AACvB,mBAAOqO,EAAK,UAAU,SACrBA,EAAK,MAAOrO,CAAU;AAAA;AAAA,cAGtBA,EAAUD,CAAM;AAAA;AAAA;AAGlB,eAAOA,EAAO,UAAWC,GAAU,IAAI;AAAA,MACzC;AAGA,MAAAzO,EAAK,YAAYwO,EAAO,IAGxBqO,IAAarO,EAAQT;AAGrB,UAAIgP,KAAe,kCAGlBC,KAAmB;AAAA,QAClB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAEA,MAAAxO,EAAO,GAAG,OAAQ;AAAA,QACjB,KAAK,SAAUlM,GAAS;AACvB,cAAIS,IAAUyL,EAAQlM,GAAQ,IAAM,GACnC2a,IAAIla,EAAQ;AAEb,iBAAO,KAAK,OAAQ,WAAW;AAE9B,qBADInI,IAAI,GACAA,IAAIqiB,GAAGriB;AACd,kBAAK4T,EAAO,SAAU,MAAMzL,EAASnI,CAAG,CAAA;AACvC,uBAAO;AAAA,UAGZ;QACE;AAAA,QAED,SAAS,SAAUsiB,GAAWxO,GAAU;AACvC,cAAI6G,GACH3a,IAAI,GACJqiB,IAAI,KAAK,QACT5E,IAAU,CAAE,GACZtV,IAAU,OAAOma,KAAc,YAAY1O,EAAQ0O,CAAS;AAG7D,cAAK,CAACX,GAAc,KAAMW;AACzB,mBAAQtiB,IAAIqiB,GAAGriB;AACd,mBAAM2a,IAAM,KAAM3a,IAAK2a,KAAOA,MAAQ7G,GAAS6G,IAAMA,EAAI;AAGxD,oBAAKA,EAAI,WAAW,OAAQxS,IAC3BA,EAAQ,MAAOwS,CAAK,IAAG;AAAA;AAAA,kBAGvBA,EAAI,aAAa,KAChB/G,EAAO,KAAK,gBAAiB+G,GAAK2H,CAAW;AAAA,oBAAK;AAEnD,kBAAA7E,EAAQ,KAAM9C;AACd;AAAA,gBACA;AAAA;AAKJ,iBAAO,KAAK,UAAW8C,EAAQ,SAAS,IAAI7J,EAAO,WAAY6J,KAAYA;QAC3E;AAAA;AAAA,QAGD,OAAO,SAAUtJ,GAAO;AAGvB,iBAAMA,IAKD,OAAOA,KAAS,WACb1B,EAAQ,KAAMmB,EAAQO,CAAI,GAAI,KAAM,CAAC,KAItC1B,EAAQ;AAAA,YAAM;AAAA;AAAA,YAGpB0B,EAAK,SAASA,EAAM,CAAG,IAAGA;AAAA,UAC7B,IAbY,KAAM,CAAG,KAAI,KAAM,CAAC,EAAG,aAAe,KAAK,MAAK,EAAG,QAAS,EAAC,SAAS;AAAA,QAchF;AAAA,QAED,KAAK,SAAUN,GAAUC,GAAU;AAClC,iBAAO,KAAK;AAAA,YACXF,EAAO;AAAA,cACNA,EAAO,MAAO,KAAK,IAAK,GAAEA,EAAQC,GAAUC,EAAW;AAAA,YACvD;AAAA,UACJ;AAAA,QACE;AAAA,QAED,SAAS,SAAUD,GAAW;AAC7B,iBAAO,KAAK;AAAA,YAAKA,KAAY,OAC5B,KAAK,aAAa,KAAK,WAAW,OAAQA,CAAU;AAAA,UACvD;AAAA,QACE;AAAA,MACF;AAEA,eAAS0O,GAAS5H,GAAKyC,GAAM;AAC5B,gBAAUzC,IAAMA,EAAKyC,CAAK,MAAMzC,EAAI,aAAa;AAAI;AACrD,eAAOA;AAAA,MACP;AAED,MAAA/G,EAAO,KAAM;AAAA,QACZ,QAAQ,SAAUO,GAAO;AACxB,cAAI3Q,IAAS2Q,EAAK;AAClB,iBAAO3Q,KAAUA,EAAO,aAAa,KAAKA,IAAS;AAAA,QACnD;AAAA,QACD,SAAS,SAAU2Q,GAAO;AACzB,iBAAOiJ,GAAKjJ,GAAM;QAClB;AAAA,QACD,cAAc,SAAUA,GAAMsB,GAAI8L,GAAQ;AACzC,iBAAOnE,GAAKjJ,GAAM,cAAcoN,CAAK;AAAA,QACrC;AAAA,QACD,MAAM,SAAUpN,GAAO;AACtB,iBAAOoO,GAASpO,GAAM;QACtB;AAAA,QACD,MAAM,SAAUA,GAAO;AACtB,iBAAOoO,GAASpO,GAAM;QACtB;AAAA,QACD,SAAS,SAAUA,GAAO;AACzB,iBAAOiJ,GAAKjJ,GAAM;QAClB;AAAA,QACD,SAAS,SAAUA,GAAO;AACzB,iBAAOiJ,GAAKjJ,GAAM;QAClB;AAAA,QACD,WAAW,SAAUA,GAAMsB,GAAI8L,GAAQ;AACtC,iBAAOnE,GAAKjJ,GAAM,eAAeoN,CAAK;AAAA,QACtC;AAAA,QACD,WAAW,SAAUpN,GAAMsB,GAAI8L,GAAQ;AACtC,iBAAOnE,GAAKjJ,GAAM,mBAAmBoN,CAAK;AAAA,QAC1C;AAAA,QACD,UAAU,SAAUpN,GAAO;AAC1B,iBAAOsN,IAAYtN,EAAK,cAAc,CAAA,GAAK,YAAYA;QACvD;AAAA,QACD,UAAU,SAAUA,GAAO;AAC1B,iBAAOsN,GAAUtN,EAAK;QACtB;AAAA,QACD,UAAU,SAAUA,GAAO;AAC1B,iBAAKA,EAAK,mBAAmB;AAAA;AAAA;AAAA,UAK5B9B,EAAU8B,EAAK,mBAERA,EAAK,mBAMRkI,GAAUlI,GAAM,gBACpBA,IAAOA,EAAK,WAAWA,IAGjBP,EAAO,MAAO,CAAE,GAAEO,EAAK,UAAU;AAAA,QACxC;AAAA,MACF,GAAG,SAAUI,GAAM8F,GAAK;AACvB,QAAAzG,EAAO,GAAIW,CAAM,IAAG,SAAUgN,GAAO1N,GAAW;AAC/C,cAAI4J,IAAU7J,EAAO,IAAK,MAAMyG,GAAIkH;AAEpC,iBAAKhN,EAAK,MAAO,EAAE,MAAO,YACzBV,IAAW0N,IAGP1N,KAAY,OAAOA,KAAa,aACpC4J,IAAU7J,EAAO,OAAQC,GAAU4J,CAAO,IAGtC,KAAK,SAAS,MAGZ2E,GAAkB7N,MACvBX,EAAO,WAAY6J,IAIf0E,GAAa,KAAM5N,MACvBkJ,EAAQ,QAAO,IAIV,KAAK,UAAWA;QACzB;AAAA,MACA;AACA,UAAI+E,IAAkB;AAKtB,eAASC,GAAenO,GAAU;AACjC,YAAIoO,IAAS,CAAA;AACb,eAAA9O,EAAO,KAAMU,EAAQ,MAAOkO,CAAa,KAAM,CAAE,GAAE,SAAUG,GAAGC,GAAO;AACtE,UAAAF,EAAQE,CAAM,IAAG;AAAA,QACnB,IACQF;AAAA,MACP;AAwBD,MAAA9O,EAAO,YAAY,SAAUU,GAAU;AAItC,QAAAA,IAAU,OAAOA,KAAY,WAC5BmO,GAAenO,CAAS,IACxBV,EAAO,OAAQ,IAAIU;AAEpB,YACCuO,GAGAC,GAGAC,GAGAC,GAGAzL,IAAO,CAAE,GAGT0L,IAAQ,CAAE,GAGVC,IAAc,IAGdC,IAAO,WAAW;AAQjB,eALAH,IAASA,KAAU1O,EAAQ,MAI3ByO,IAAQF,IAAS,IACTI,EAAM,QAAQC,IAAc;AAEnC,iBADAJ,IAASG,EAAM,SACP,EAAEC,IAAc3L,EAAK;AAG5B,cAAKA,EAAM2L,CAAa,EAAC,MAAOJ,EAAQ,CAAC,GAAIA,EAAQ,CAAG,CAAA,MAAO,MAC9DxO,EAAQ,gBAGR4O,IAAc3L,EAAK,QACnBuL,IAAS;AAMZ,UAAMxO,EAAQ,WACbwO,IAAS,KAGVD,IAAS,IAGJG,MAGCF,IACJvL,IAAO,CAAA,IAIPA,IAAO;AAAA,QAGT,GAGDyK,IAAO;AAAA;AAAA,UAGN,KAAK,WAAW;AACf,mBAAKzK,MAGCuL,KAAU,CAACD,MACfK,IAAc3L,EAAK,SAAS,GAC5B0L,EAAM,KAAMH,KAGX,SAASM,EAAK7F,GAAO;AACtB,cAAA3J,EAAO,KAAM2J,GAAM,SAAUoF,GAAGpN,GAAM;AACrC,gBAAKvC,EAAYuC,MACX,CAACjB,EAAQ,UAAU,CAAC0N,EAAK,IAAKzM,OAClCgC,EAAK,KAAMhC,KAEDA,KAAOA,EAAI,UAAU7B,GAAQ6B,CAAK,MAAK,YAGlD6N,EAAK7N,CAAG;AAAA,cAEhB;YACM,EAAI,SAAS,GAETuN,KAAU,CAACD,KACfM,MAGK;AAAA,UACP;AAAA;AAAA,UAGD,QAAQ,WAAW;AAClB,mBAAAvP,EAAO,KAAM,WAAW,SAAU+O,GAAGpN,GAAM;AAE1C,uBADI9Z,IACMA,IAAQmY,EAAO,QAAS2B,GAAKgC,GAAM9b,MAAY;AACxD,gBAAA8b,EAAK,OAAQ9b,GAAO,IAGfA,KAASynB,KACbA;AAAA,YAGP,IACW;AAAA,UACP;AAAA;AAAA;AAAA,UAID,KAAK,SAAU7I,GAAK;AACnB,mBAAOA,IACNzG,EAAO,QAASyG,GAAI9C,CAAI,IAAK,KAC7BA,EAAK,SAAS;AAAA,UACf;AAAA;AAAA,UAGD,OAAO,WAAW;AACjB,mBAAKA,MACJA,IAAO,CAAA,IAED;AAAA,UACP;AAAA;AAAA;AAAA;AAAA,UAKD,SAAS,WAAW;AACnB,mBAAAyL,IAASC,IAAQ,IACjB1L,IAAOuL,IAAS,IACT;AAAA,UACP;AAAA,UACD,UAAU,WAAW;AACpB,mBAAO,CAACvL;AAAA,UACR;AAAA;AAAA;AAAA;AAAA,UAKD,MAAM,WAAW;AAChB,mBAAAyL,IAASC,IAAQ,IACZ,CAACH,KAAU,CAACD,MAChBtL,IAAOuL,IAAS,KAEV;AAAA,UACP;AAAA,UACD,QAAQ,WAAW;AAClB,mBAAO,CAAC,CAACE;AAAA,UACT;AAAA;AAAA,UAGD,UAAU,SAAUlP,GAASyJ,GAAO;AACnC,mBAAMyF,MACLzF,IAAOA,KAAQ,IACfA,IAAO,CAAEzJ,GAASyJ,EAAK,QAAQA,EAAK,MAAK,IAAKA,IAC9C0F,EAAM,KAAM1F,IACNsF,KACLM,MAGK;AAAA,UACP;AAAA;AAAA,UAGD,MAAM,WAAW;AAChB,mBAAAnB,EAAK,SAAU,MAAM,YACd;AAAA,UACP;AAAA;AAAA,UAGD,OAAO,WAAW;AACjB,mBAAO,CAAC,CAACe;AAAA,UACT;AAAA,QACJ;AAEC,eAAOf;AAAA,MACR;AAGA,eAASqB,GAAUC,GAAI;AACtB,eAAOA;AAAA,MACP;AACD,eAASC,GAASC,GAAK;AACtB,cAAMA;AAAA,MACN;AAED,eAASC,GAAYjO,GAAOkO,GAASC,GAAQC,GAAU;AACtD,YAAIC;AAEJ,YAAI;AAGH,UAAKrO,KAASxC,EAAc6Q,IAASrO,EAAM,OAAO,IACjDqO,EAAO,KAAMrO,GAAQ,KAAMkO,GAAU,KAAMC,KAGhCnO,KAASxC,EAAc6Q,IAASrO,EAAM,IAAI,IACrDqO,EAAO,KAAMrO,GAAOkO,GAASC,CAAM,IAQnCD,EAAQ,MAAO,QAAW,CAAElO,CAAK,EAAG,MAAOoO,CAAO;QAMnD,SAASpO,GAAQ;AAIjB,UAAAmO,EAAO,MAAO,QAAW,CAAEnO,CAAO,CAAA;AAAA,QAClC;AAAA,MACD;AAED,MAAA5B,EAAO,OAAQ;AAAA,QAEd,UAAU,SAAUkQ,GAAO;AAC1B,cAAIC,IAAS;AAAA;AAAA;AAAA,YAIX;AAAA,cAAE;AAAA,cAAU;AAAA,cAAYnQ,EAAO,UAAW,QAAU;AAAA,cACnDA,EAAO,UAAW,QAAU;AAAA,cAAE;AAAA,YAAG;AAAA,YAClC;AAAA,cAAE;AAAA,cAAW;AAAA,cAAQA,EAAO,UAAW,aAAe;AAAA,cACrDA,EAAO,UAAW;cAAiB;AAAA,cAAG;AAAA,YAAY;AAAA,YACnD;AAAA,cAAE;AAAA,cAAU;AAAA,cAAQA,EAAO,UAAW,aAAe;AAAA,cACpDA,EAAO,UAAW;cAAiB;AAAA,cAAG;AAAA,YAAY;AAAA,UACnD,GACDoQ,IAAQ,WACR9iB,IAAU;AAAA,YACT,OAAO,WAAW;AACjB,qBAAO8iB;AAAA,YACP;AAAA,YACD,QAAQ,WAAW;AAClB,qBAAAC,EAAS,KAAM,SAAW,EAAC,KAAM,SAAS,GACnC;AAAA,YACP;AAAA,YACD,OAAS,SAAU5J,GAAK;AACvB,qBAAOnZ,EAAQ,KAAM,MAAMmZ,CAAE;AAAA,YAC7B;AAAA;AAAA,YAGD,MAAM,WAA6C;AAClD,kBAAI6J,IAAM;AAEV,qBAAOtQ,EAAO,SAAU,SAAUuQ,GAAW;AAC5C,gBAAAvQ,EAAO,KAAMmQ,GAAQ,SAAUtO,GAAI2O,GAAQ;AAG1C,sBAAI/J,IAAKrH,EAAYkR,EAAKE,EAAO,EAAK,CAAA,KAAMF,EAAKE,EAAO,CAAG,CAAA;AAK3D,kBAAAH,EAAUG,EAAO,CAAG,CAAA,EAAI,WAAW;AAClC,wBAAIC,IAAWhK,KAAMA,EAAG,MAAO,MAAM;AACrC,oBAAKgK,KAAYrR,EAAYqR,EAAS,OAAO,IAC5CA,EAAS,QAAS,EAChB,SAAUF,EAAS,MAAQ,EAC3B,KAAMA,EAAS,OAAS,EACxB,KAAMA,EAAS,UAEjBA,EAAUC,EAAO,CAAG,IAAG,MAAQ;AAAA,sBAC9B;AAAA,sBACA/J,IAAK,CAAEgK,CAAQ,IAAK;AAAA,oBAC9B;AAAA,kBAEA;gBACA,IACMH,IAAM;AAAA,cACZ,CAAQ,EAAC,QAAO;AAAA,YACX;AAAA,YACD,MAAM,SAAUI,GAAaC,GAAYC,GAAa;AACrD,kBAAIC,IAAW;AACf,uBAASf,EAASgB,GAAOT,GAAU9pB,GAASwqB,GAAU;AACrD,uBAAO,WAAW;AACjB,sBAAIC,IAAO,MACVrH,KAAO,WACPsH,IAAa,WAAW;AACvB,wBAAIR,IAAU/d;AAKd,wBAAK,EAAAoe,IAAQD,IAQb;AAAA,0BAJAJ,KAAWlqB,EAAQ,MAAOyqB,GAAMrH,EAAI,GAI/B8G,OAAaJ,EAAS;AAC1B,8BAAM,IAAI,UAAW;AAOtB,sBAAA3d,KAAO+d;AAAA;AAAA;AAAA,uBAKJ,OAAOA,MAAa,YACrB,OAAOA,MAAa,eACrBA,GAAS,MAGLrR,EAAY1M,MAGXqe,IACJre,GAAK;AAAA,wBACJ+d;AAAA,wBACAX,EAASe,GAAUR,GAAUZ,IAAUsB,CAAS;AAAA,wBAChDjB,EAASe,GAAUR,GAAUV,IAASoB,CAAS;AAAA,sBAC3D,KAMWF,KAEAne,GAAK;AAAA,wBACJ+d;AAAA,wBACAX,EAASe,GAAUR,GAAUZ,IAAUsB,CAAS;AAAA,wBAChDjB,EAASe,GAAUR,GAAUV,IAASoB,CAAS;AAAA,wBAC/CjB;AAAA,0BAASe;AAAA,0BAAUR;AAAA,0BAAUZ;AAAA,0BAC5BY,EAAS;AAAA,wBAAY;AAAA,sBAClC,MAQe9pB,MAAYkpB,OAChBuB,IAAO,QACPrH,KAAO,CAAE8G,OAKRM,KAAWV,EAAS,aAAeW,GAAMrH,EAAI;AAAA;AAAA,kBAEhD,GAGDuH,KAAUH,IACTE,IACA,WAAW;AACV,wBAAI;AACH,sBAAAA;oBACA,SAAShiB,IAAI;AAEb,sBAAK+Q,EAAO,SAAS,iBACpBA,EAAO,SAAS;AAAA,wBAAe/Q;AAAA,wBAC9BiiB,GAAQ;AAAA,sBAAU,GAMfJ,IAAQ,KAAKD,MAIZtqB,MAAYopB,OAChBqB,IAAO,QACPrH,KAAO,CAAE1a,MAGVohB,EAAS,WAAYW,GAAMrH;oBAE5B;AAAA,kBACX;AAMO,kBAAKmH,IACJI,QAKKlR,EAAO,SAAS,iBACpBkR,GAAQ,aAAalR,EAAO,SAAS,aAAY,IAElD1B,EAAO,WAAY4S;gBAE3B;AAAA,cACM;AAED,qBAAOlR,EAAO,SAAU,SAAUuQ,GAAW;AAG5C,gBAAAJ,EAAQ,CAAC,EAAI,CAAC,EAAG;AAAA,kBAChBL;AAAA,oBACC;AAAA,oBACAS;AAAA,oBACAnR,EAAYwR,CAAY,IACvBA,IACAnB;AAAA,oBACDc,EAAS;AAAA,kBACT;AAAA,gBACR,GAGMJ,EAAQ,CAAC,EAAI,CAAC,EAAG;AAAA,kBAChBL;AAAA,oBACC;AAAA,oBACAS;AAAA,oBACAnR,EAAYsR,CAAa,IACxBA,IACAjB;AAAA,kBACD;AAAA,gBACR,GAGMU,EAAQ,CAAC,EAAI,CAAC,EAAG;AAAA,kBAChBL;AAAA,oBACC;AAAA,oBACAS;AAAA,oBACAnR,EAAYuR,CAAY,IACvBA,IACAhB;AAAA,kBACD;AAAA,gBACR;AAAA,cACA,CAAQ,EAAC,QAAO;AAAA,YACX;AAAA;AAAA;AAAA,YAID,SAAS,SAAUtQ,GAAM;AACxB,qBAAOA,KAAO,OAAOW,EAAO,OAAQX,GAAK/R,CAAS,IAAGA;AAAA,YACrD;AAAA,UACD,GACD+iB,IAAW,CAAA;AAGZ,iBAAArQ,EAAO,KAAMmQ,GAAQ,SAAU/jB,GAAGokB,GAAQ;AACzC,gBAAI7M,IAAO6M,EAAO,CAAG,GACpBW,IAAcX,EAAO;AAKtB,YAAAljB,EAASkjB,EAAO,CAAG,CAAA,IAAK7M,EAAK,KAGxBwN,KACJxN,EAAK;AAAA,cACJ,WAAW;AAIV,gBAAAyM,IAAQe;AAAA,cACR;AAAA;AAAA;AAAA,cAIDhB,EAAQ,IAAI/jB,GAAK,CAAG,EAAC;AAAA;AAAA;AAAA,cAIrB+jB,EAAQ,IAAI/jB,GAAK,CAAG,EAAC;AAAA;AAAA,cAGrB+jB,EAAQ,CAAC,EAAI,CAAC,EAAG;AAAA;AAAA,cAGjBA,EAAQ,CAAC,EAAI,CAAC,EAAG;AAAA,YACtB,GAMGxM,EAAK,IAAK6M,EAAO,CAAG,EAAC,IAAI,GAKzBH,EAAUG,EAAO,CAAG,CAAA,IAAK,WAAW;AACnC,qBAAAH,EAAUG,EAAO,CAAG,IAAG,MAAQ,EAAE,SAASH,IAAW,SAAY,MAAM,YAChE;AAAA,YACX,GAKGA,EAAUG,EAAO,CAAC,IAAK,MAAQ,IAAG7M,EAAK;AAAA,UAC1C,IAGErW,EAAQ,QAAS+iB,IAGZH,KACJA,EAAK,KAAMG,GAAUA,IAIfA;AAAA,QACP;AAAA;AAAA,QAGD,MAAM,SAAUe,GAAc;AAC7B,cAGCC,IAAY,UAAU,QAGtBjlB,IAAIilB,GAGJC,IAAkB,MAAOllB,CAAG,GAC5BmlB,IAAgB7S,EAAM,KAAM,SAAW,GAGvC8S,IAASxR,EAAO,SAAU,GAG1ByR,IAAa,SAAUrlB,GAAI;AAC1B,mBAAO,SAAUwV,GAAQ;AACxB,cAAA0P,EAAiBllB,CAAG,IAAG,MACvBmlB,EAAenlB,KAAM,UAAU,SAAS,IAAIsS,EAAM,KAAM,SAAW,IAAGkD,GAC9D,EAAEyP,KACTG,EAAO,YAAaF,GAAiBC;YAE3C;AAAA,UACA;AAGE,cAAKF,KAAa,MACjBxB;AAAA,YAAYuB;AAAA,YAAaI,EAAO,KAAMC,EAAYrlB,EAAK,EAAC;AAAA,YAASolB,EAAO;AAAA,YACvE,CAACH;AAAA,UAAS,GAGNG,EAAO,MAAK,MAAO,aACvBpS,EAAYmS,EAAenlB,CAAG,KAAImlB,EAAenlB,CAAC,EAAG;AAErD,mBAAOolB,EAAO;AAKhB,iBAAQplB;AACP,YAAAyjB,GAAY0B,EAAenlB,IAAKqlB,EAAYrlB,IAAKolB,EAAO;AAGzD,iBAAOA,EAAO;QACd;AAAA,MACF;AAKA,UAAIE,KAAc;AAElB,MAAA1R,EAAO,SAAS,gBAAgB,SAAU2R,GAAOC,GAAQ;AAIxD,QAAKtT,EAAO,WAAWA,EAAO,QAAQ,QAAQqT,KAASD,GAAY,KAAMC,EAAM,IAAI,KAClFrT,EAAO,QAAQ,KAAM,gCAAgCqT,EAAM,SAASA,EAAM,OAAOC;MAEnF,GAKA5R,EAAO,iBAAiB,SAAU2R,GAAQ;AACzC,QAAArT,EAAO,WAAY,WAAW;AAC7B,gBAAMqT;AAAA,QACR;MACA;AAMA,UAAIE,KAAY7R,EAAO;AAEvB,MAAAA,EAAO,GAAG,QAAQ,SAAUyG,GAAK;AAEhC,eAAAoL,GACE,KAAMpL,CAAI,EAKV,MAAO,SAAUkL,GAAQ;AACzB,UAAA3R,EAAO,eAAgB2R;QAC1B,IAEQ;AAAA,MACR,GAEA3R,EAAO,OAAQ;AAAA;AAAA,QAGd,SAAS;AAAA;AAAA;AAAA,QAIT,WAAW;AAAA;AAAA,QAGX,OAAO,SAAU8R,GAAO;AAGvB,WAAKA,MAAS,KAAO,EAAE9R,EAAO,YAAYA,EAAO,aAKjDA,EAAO,UAAU,IAGZ,EAAA8R,MAAS,MAAQ,EAAE9R,EAAO,YAAY,MAK3C6R,GAAU,YAAatS,IAAU,CAAES,CAAQ,CAAA;AAAA,QAC3C;AAAA,MACF,IAEAA,EAAO,MAAM,OAAO6R,GAAU;AAG9B,eAASE,KAAY;AACpB,QAAAxS,GAAS,oBAAqB,oBAAoBwS,KAClDzT,EAAO,oBAAqB,QAAQyT,KACpC/R,EAAO,MAAK;AAAA,MACZ;AAMD,MAAKT,GAAS,eAAe,cAC1BA,GAAS,eAAe,aAAa,CAACA,GAAS,gBAAgB,WAGjEjB,EAAO,WAAY0B,EAAO,UAK1BT,GAAS,iBAAkB,oBAAoBwS,KAG/CzT,EAAO,iBAAkB,QAAQyT;AAQlC,UAAIC,KAAS,SAAU5R,GAAOqG,GAAIF,GAAK3E,GAAOqQ,GAAWC,GAAUC,GAAM;AACxE,YAAI/lB,IAAI,GACPqU,IAAML,EAAM,QACZgS,IAAO7L,KAAO;AAGf,YAAKzG,GAAQyG,CAAK,MAAK,UAAW;AACjC,UAAA0L,IAAY;AACZ,eAAM7lB,KAAKma;AACV,YAAAyL,GAAQ5R,GAAOqG,GAAIra,GAAGma,EAAKna,CAAC,GAAI,IAAM8lB,GAAUC;QAInD,WAAavQ,MAAU,WACrBqQ,IAAY,IAEN7S,EAAYwC,OACjBuQ,IAAM,KAGFC,MAGCD,KACJ1L,EAAG,KAAMrG,GAAOwB,IAChB6E,IAAK,SAIL2L,IAAO3L,GACPA,IAAK,SAAUlG,GAAM8R,GAAMzQ,GAAQ;AAClC,iBAAOwQ,EAAK,KAAMpS,EAAQO,CAAM,GAAEqB,CAAK;AAAA,QAC5C,KAIO6E;AACJ,iBAAQra,IAAIqU,GAAKrU;AAChB,YAAAqa;AAAA,cACCrG,EAAOhU;cAAKma;AAAA,cAAK4L,IACjBvQ,IACAA,EAAM,KAAMxB,EAAOhU,IAAKA,GAAGqa,EAAIrG,EAAOhU,IAAKma,EAAO;AAAA,YACvD;AAKC,eAAK0L,IACG7R,IAIHgS,IACG3L,EAAG,KAAMrG,KAGVK,IAAMgG,EAAIrG,EAAO,CAAC,GAAImG,CAAK,IAAG2L;AAAA,MACtC,GAIII,KAAY,SACfC,KAAa;AAGd,eAASC,GAAYC,GAAMC,GAAS;AACnC,eAAOA,EAAO;MACd;AAKD,eAASC,GAAWC,GAAS;AAC5B,eAAOA,EAAO,QAASN,IAAW,KAAO,EAAC,QAASC,IAAYC;MAC/D;AACD,UAAIK,KAAa,SAAUC,GAAQ;AAQlC,eAAOA,EAAM,aAAa,KAAKA,EAAM,aAAa,KAAK,CAAG,CAACA,EAAM;AAAA,MAClE;AAKA,eAASC,KAAO;AACf,aAAK,UAAU/S,EAAO,UAAU+S,GAAK;AAAA,MACrC;AAED,MAAAA,GAAK,MAAM,GAEXA,GAAK,YAAY;AAAA,QAEhB,OAAO,SAAUD,GAAQ;AAGxB,cAAIlR,IAAQkR,EAAO,KAAK,OAAO;AAG/B,iBAAMlR,MACLA,IAAQ,CAAA,GAKHiR,GAAYC,OAIXA,EAAM,WACVA,EAAO,KAAK,OAAS,IAAGlR,IAMxB,OAAO,eAAgBkR,GAAO,KAAK,SAAS;AAAA,YAC3C,OAAOlR;AAAA,YACP,cAAc;AAAA,UACpB,MAKSA;AAAA,QACP;AAAA,QACD,KAAK,SAAUkR,GAAOtsB,GAAMob,GAAQ;AACnC,cAAIoR,GACH1M,IAAQ,KAAK,MAAOwM;AAIrB,cAAK,OAAOtsB,KAAS;AACpB,YAAA8f,EAAOqM,GAAWnsB,CAAM,CAAA,IAAKob;AAAA;AAM7B,iBAAMoR,KAAQxsB;AACb,cAAA8f,EAAOqM,GAAWK,CAAI,CAAI,IAAGxsB,EAAMwsB,CAAI;AAGzC,iBAAO1M;AAAA,QACP;AAAA,QACD,KAAK,SAAUwM,GAAOvM,GAAM;AAC3B,iBAAOA,MAAQ,SACd,KAAK,MAAOuM,CAAO;AAAA;AAAA,YAGnBA,EAAO,KAAK,OAAO,KAAMA,EAAO,KAAK,SAAWH,GAAWpM,CAAG;;QAC/D;AAAA,QACD,QAAQ,SAAUuM,GAAOvM,GAAK3E,GAAQ;AAarC,iBAAK2E,MAAQ,UACPA,KAAO,OAAOA,KAAQ,YAAc3E,MAAU,SAE5C,KAAK,IAAKkR,GAAOvM,CAAG,KAS5B,KAAK,IAAKuM,GAAOvM,GAAK3E,CAAK,GAIpBA,MAAU,SAAYA,IAAQ2E;AAAA,QACrC;AAAA,QACD,QAAQ,SAAUuM,GAAOvM,GAAM;AAC9B,cAAIna,GACHka,IAAQwM,EAAO,KAAK;AAErB,cAAKxM,MAAU,QAIf;AAAA,gBAAKC,MAAQ;AAoBZ,mBAjBK,MAAM,QAASA,KAInBA,IAAMA,EAAI,IAAKoM,OAEfpM,IAAMoM,GAAWpM,IAIjBA,IAAMA,KAAOD,IACZ,CAAEC,CAAK,IACLA,EAAI,MAAOqI,CAAe,KAAI,CAAE,IAGpCxiB,IAAIma,EAAI,QAEAna;AACP,uBAAOka,EAAOC,EAAKna,CAAC;AAKtB,aAAKma,MAAQ,UAAavG,EAAO,cAAesG,CAAK,OAM/CwM,EAAM,WACVA,EAAO,KAAK,OAAS,IAAG,SAExB,OAAOA,EAAO,KAAK;;QAGrB;AAAA,QACD,SAAS,SAAUA,GAAQ;AAC1B,cAAIxM,IAAQwM,EAAO,KAAK,OAAO;AAC/B,iBAAOxM,MAAU,UAAa,CAACtG,EAAO,cAAesG,CAAK;AAAA,QAC1D;AAAA,MACF;AACA,UAAI2M,IAAW,IAAIF,MAEfG,KAAW,IAAIH,MAcfI,KAAS,iCACZC,KAAa;AAEd,eAASC,EAAS7sB,GAAO;AACxB,eAAKA,MAAS,SACN,KAGHA,MAAS,UACN,KAGHA,MAAS,SACN,OAIHA,MAAS,CAACA,IAAO,KACd,CAACA,IAGJ2sB,GAAO,KAAM3sB,KACV,KAAK,MAAOA,KAGbA;AAAA,MACP;AAED,eAAS8sB,EAAU/S,GAAMgG,GAAK/f,GAAO;AACpC,YAAIma;AAIJ,YAAKna,MAAS,UAAa+Z,EAAK,aAAa;AAI5C,cAHAI,IAAO,UAAU4F,EAAI,QAAS6M,IAAY,KAAK,EAAG,eAClD5sB,IAAO+Z,EAAK,aAAcI,IAErB,OAAOna,KAAS,UAAW;AAC/B,gBAAI;AACH,cAAAA,IAAO6sB,EAAS7sB;YACpB,QAAiB;AAAA,YAAE;AAGhB,YAAA0sB,GAAS,IAAK3S,GAAMgG,GAAK/f,CAAI;AAAA,UAChC;AACG,YAAAA,IAAO;AAGT,eAAOA;AAAA,MACP;AAED,MAAAwZ,EAAO,OAAQ;AAAA,QACd,SAAS,SAAUO,GAAO;AACzB,iBAAO2S,GAAS,QAAS3S,CAAI,KAAM0S,EAAS,QAAS1S;QACrD;AAAA,QAED,MAAM,SAAUA,GAAMI,GAAMna,GAAO;AAClC,iBAAO0sB,GAAS,OAAQ3S,GAAMI,GAAMna,CAAI;AAAA,QACxC;AAAA,QAED,YAAY,SAAU+Z,GAAMI,GAAO;AAClC,UAAAuS,GAAS,OAAQ3S,GAAMI;QACvB;AAAA;AAAA;AAAA,QAID,OAAO,SAAUJ,GAAMI,GAAMna,GAAO;AACnC,iBAAOysB,EAAS,OAAQ1S,GAAMI,GAAMna,CAAI;AAAA,QACxC;AAAA,QAED,aAAa,SAAU+Z,GAAMI,GAAO;AACnC,UAAAsS,EAAS,OAAQ1S,GAAMI;QACvB;AAAA,MACF,IAEAX,EAAO,GAAG,OAAQ;AAAA,QACjB,MAAM,SAAUuG,GAAK3E,GAAQ;AAC5B,cAAIxV,GAAGuU,GAAMna,GACZ+Z,IAAO,KAAM,CAAG,GAChBsG,IAAQtG,KAAQA,EAAK;AAGtB,cAAKgG,MAAQ,QAAY;AACxB,gBAAK,KAAK,WACT/f,IAAO0sB,GAAS,IAAK3S,IAEhBA,EAAK,aAAa,KAAK,CAAC0S,EAAS,IAAK1S,GAAM,kBAAmB;AAEnE,mBADAnU,IAAIya,EAAM,QACFza;AAIP,gBAAKya,EAAOza,OACXuU,IAAOkG,EAAOza,CAAG,EAAC,MACbuU,EAAK,QAAS,OAAO,MAAO,MAChCA,IAAOgS,GAAWhS,EAAK,MAAO,CAAG,CAAA,GACjC2S,EAAU/S,GAAMI,GAAMna,EAAMma,CAAM,CAAA;AAIrC,cAAAsS,EAAS,IAAK1S,GAAM,gBAAgB,EAAI;AAAA,YACxC;AAGF,mBAAO/Z;AAAA,UACP;AAGD,iBAAK,OAAO+f,KAAQ,WACZ,KAAK,KAAM,WAAW;AAC5B,YAAA2M,GAAS,IAAK,MAAM3M;UACxB,KAGSyL,GAAQ,MAAM,SAAUpQ,GAAQ;AACtC,gBAAIpb;AAOJ,gBAAK+Z,KAAQqB,MAAU;AAYtB,qBARApb,IAAO0sB,GAAS,IAAK3S,GAAMgG,CAAG,GACzB/f,MAAS,WAMdA,IAAO8sB,EAAU/S,GAAMgG,IAClB/f,MAAS,UACNA,IAIR;AAID,iBAAK,KAAM,WAAW;AAGrB,cAAA0sB,GAAS,IAAK,MAAM3M,GAAK3E,CAAK;AAAA,YAClC;UACA,GAAK,MAAMA,GAAO,UAAU,SAAS,GAAG,MAAM;QAC5C;AAAA,QAED,YAAY,SAAU2E,GAAM;AAC3B,iBAAO,KAAK,KAAM,WAAW;AAC5B,YAAA2M,GAAS,OAAQ,MAAM3M;UAC1B;QACE;AAAA,MACF,IAGAvG,EAAO,OAAQ;AAAA,QACd,OAAO,SAAUO,GAAMuB,GAAMtb,GAAO;AACnC,cAAI6oB;AAEJ,cAAK9O;AACJ,mBAAAuB,KAASA,KAAQ,QAAS,SAC1BuN,IAAQ4D,EAAS,IAAK1S,GAAMuB,CAAI,GAG3Btb,MACC,CAAC6oB,KAAS,MAAM,QAAS7oB,CAAI,IACjC6oB,IAAQ4D,EAAS,OAAQ1S,GAAMuB,GAAM9B,EAAO,UAAWxZ,CAAI,KAE3D6oB,EAAM,KAAM7oB,KAGP6oB,KAAS,CAAA;AAAA,QAEjB;AAAA,QAED,SAAS,SAAU9O,GAAMuB,GAAO;AAC/B,UAAAA,IAAOA,KAAQ;AAEf,cAAIuN,IAAQrP,EAAO,MAAOO,GAAMuB,CAAM,GACrCyR,IAAclE,EAAM,QACpB5I,IAAK4I,EAAM,MAAO,GAClBmE,IAAQxT,EAAO,YAAaO,GAAMuB,CAAM,GACxCjL,IAAO,WAAW;AACjB,YAAAmJ,EAAO,QAASO,GAAMuB;UAC1B;AAGE,UAAK2E,MAAO,iBACXA,IAAK4I,EAAM,SACXkE,MAGI9M,MAIC3E,MAAS,QACbuN,EAAM,QAAS,eAIhB,OAAOmE,EAAM,MACb/M,EAAG,KAAMlG,GAAM1J,GAAM2c,CAAK,IAGtB,CAACD,KAAeC,KACpBA,EAAM,MAAM;QAEb;AAAA;AAAA,QAGD,aAAa,SAAUjT,GAAMuB,GAAO;AACnC,cAAIyE,IAAMzE,IAAO;AACjB,iBAAOmR,EAAS,IAAK1S,GAAMgG,CAAK,KAAI0M,EAAS,OAAQ1S,GAAMgG,GAAK;AAAA,YAC/D,OAAOvG,EAAO,UAAW,aAAe,EAAC,IAAK,WAAW;AACxD,cAAAiT,EAAS,OAAQ1S,GAAM,CAAEuB,IAAO,SAASyE,CAAG;YAChD,CAAM;AAAA,UACN;QACE;AAAA,MACF,IAEAvG,EAAO,GAAG,OAAQ;AAAA,QACjB,OAAO,SAAU8B,GAAMtb,GAAO;AAC7B,cAAIitB,IAAS;AAQb,iBANK,OAAO3R,KAAS,aACpBtb,IAAOsb,GACPA,IAAO,MACP2R,MAGI,UAAU,SAASA,IAChBzT,EAAO,MAAO,KAAM,CAAG,GAAE8B,CAAI,IAG9Btb,MAAS,SACf,OACA,KAAK,KAAM,WAAW;AACrB,gBAAI6oB,IAAQrP,EAAO,MAAO,MAAM8B,GAAMtb;AAGtC,YAAAwZ,EAAO,YAAa,MAAM8B,IAErBA,MAAS,QAAQuN,EAAO,CAAC,MAAO,gBACpCrP,EAAO,QAAS,MAAM8B;UAE3B;QACE;AAAA,QACD,SAAS,SAAUA,GAAO;AACzB,iBAAO,KAAK,KAAM,WAAW;AAC5B,YAAA9B,EAAO,QAAS,MAAM8B;UACzB;QACE;AAAA,QACD,YAAY,SAAUA,GAAO;AAC5B,iBAAO,KAAK,MAAOA,KAAQ,MAAM,CAAE,CAAA;AAAA,QACnC;AAAA;AAAA;AAAA,QAID,SAAS,SAAUA,GAAMzC,GAAM;AAC9B,cAAIwI,GACH6L,IAAQ,GACRC,IAAQ3T,EAAO,SAAU,GACzBxV,IAAW,MACX4B,IAAI,KAAK,QACT0jB,IAAU,WAAW;AACpB,YAAQ,EAAE4D,KACTC,EAAM,YAAanpB,GAAU,CAAEA,CAAU,CAAA;AAAA,UAE9C;AAQE,eANK,OAAOsX,KAAS,aACpBzC,IAAMyC,GACNA,IAAO,SAERA,IAAOA,KAAQ,MAEP1V;AACP,YAAAyb,IAAMoL,EAAS,IAAKzoB,EAAU4B,IAAK0V,IAAO,eACrC+F,KAAOA,EAAI,UACf6L,KACA7L,EAAI,MAAM,IAAKiI;AAGjB,iBAAAA,KACO6D,EAAM,QAAStU;QACtB;AAAA,MACF;AACA,UAAIuU,IAAS,sCAAwC,QAEjDC,IAAU,IAAI,OAAQ,mBAAmBD,IAAO,eAAe,MAG/DE,IAAY,CAAE,OAAO,SAAS,UAAU,MAAM,GAE9CC,IAAkBxU,GAAS,iBAI1ByU,KAAa,SAAUzT,GAAO;AAChC,eAAOP,EAAO,SAAUO,EAAK,eAAeA,CAAI;AAAA,MAChD,GACD0T,KAAW,EAAE,UAAU;AAOxB,MAAKF,EAAgB,gBACpBC,KAAa,SAAUzT,GAAO;AAC7B,eAAOP,EAAO,SAAUO,EAAK,eAAeA,CAAM,KACjDA,EAAK,YAAa0T,QAAe1T,EAAK;AAAA,MAC1C;AAEA,UAAI2T,KAAqB,SAAU3T,GAAMoG,GAAK;AAI5C,eAAApG,IAAOoG,KAAMpG,GAGNA,EAAK,MAAM,YAAY,UAC7BA,EAAK,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,QAMvByT,GAAYzT,CAAM,KAElBP,EAAO,IAAKO,GAAM,SAAS,MAAO;AAAA,MACrC;AAIA,eAAS4T,GAAW5T,GAAMyS,GAAMoB,GAAYC,GAAQ;AACnD,YAAIC,GAAUxkB,GACbykB,IAAgB,IAChBC,IAAeH,IACd,WAAW;AACV,iBAAOA,EAAM;QACb,IACD,WAAW;AACV,iBAAOrU,EAAO,IAAKO,GAAMyS,GAAM,EAAE;AAAA,QACjC,GACFyB,IAAUD,EAAc,GACxBE,IAAON,KAAcA,EAAY,CAAG,MAAMpU,EAAO,UAAWgT,CAAI,IAAK,KAAK,OAG1E2B,IAAgBpU,EAAK,aAClBP,EAAO,UAAWgT,CAAI,KAAM0B,MAAS,QAAQ,CAACD,MAChDZ,EAAQ,KAAM7T,EAAO,IAAKO,GAAMyS,CAAI;AAEtC,YAAK2B,KAAiBA,EAAe,CAAC,MAAOD,GAAO;AAYnD,eARAD,IAAUA,IAAU,GAGpBC,IAAOA,KAAQC,EAAe,IAG9BA,IAAgB,CAACF,KAAW,GAEpBF;AAIP,YAAAvU,EAAO,MAAOO,GAAMyS,GAAM2B,IAAgBD,CAAI,IACvC,IAAI5kB,MAAY,KAAMA,IAAQ0kB,EAAc,IAAGC,KAAW,SAAW,MAC3EF,IAAgB,IAEjBI,IAAgBA,IAAgB7kB;AAIjC,UAAA6kB,IAAgBA,IAAgB,GAChC3U,EAAO,MAAOO,GAAMyS,GAAM2B,IAAgBD,CAAI,GAG9CN,IAAaA,KAAc;QAC3B;AAED,eAAKA,MACJO,IAAgB,CAACA,KAAiB,CAACF,KAAW,GAG9CH,IAAWF,EAAY,CAAG,IACzBO,KAAkBP,EAAY,CAAG,IAAG,KAAMA,EAAY,CAAG,IACzD,CAACA,EAAY,IACTC,MACJA,EAAM,OAAOK,GACbL,EAAM,QAAQM,GACdN,EAAM,MAAMC,KAGPA;AAAA,MACP;AAGD,UAAIM,KAAoB,CAAA;AAExB,eAASC,GAAmBtU,GAAO;AAClC,YAAIyL,GACHrM,IAAMY,EAAK,eACXkI,IAAWlI,EAAK,UAChBuU,IAAUF,GAAmBnM;AAE9B,eAAKqM,MAIL9I,IAAOrM,EAAI,KAAK,YAAaA,EAAI,cAAe8I,CAAQ,IACxDqM,IAAU9U,EAAO,IAAKgM,GAAM,SAAS,GAErCA,EAAK,WAAW,YAAaA,IAExB8I,MAAY,WAChBA,IAAU,UAEXF,GAAmBnM,CAAU,IAAGqM,GAEzBA;AAAA,MACP;AAED,eAASC,GAAUvqB,GAAUwqB,GAAO;AAOnC,iBANIF,GAASvU,GACZ0U,IAAS,CAAE,GACXptB,IAAQ,GACRmZ,IAASxW,EAAS,QAGX3C,IAAQmZ,GAAQnZ;AAEvB,UADA0Y,IAAO/V,EAAU3C,IACX0Y,EAAK,UAIXuU,IAAUvU,EAAK,MAAM,SAChByU,KAKCF,MAAY,WAChBG,EAAQptB,CAAK,IAAKorB,EAAS,IAAK1S,GAAM,SAAW,KAAI,MAC/C0U,EAAQptB,OACb0Y,EAAK,MAAM,UAAU,MAGlBA,EAAK,MAAM,YAAY,MAAM2T,GAAoB3T,OACrD0U,EAAQptB,CAAK,IAAKgtB,GAAmBtU,CAAI,MAGrCuU,MAAY,WAChBG,EAAQptB,CAAO,IAAG,QAGlBorB,EAAS,IAAK1S,GAAM,WAAWuU,CAAO;AAMzC,aAAMjtB,IAAQ,GAAGA,IAAQmZ,GAAQnZ;AAChC,UAAKotB,EAAQptB,CAAO,KAAI,SACvB2C,EAAU3C,CAAK,EAAG,MAAM,UAAUotB,EAAQptB;AAI5C,eAAO2C;AAAA,MACP;AAED,MAAAwV,EAAO,GAAG,OAAQ;AAAA,QACjB,MAAM,WAAW;AAChB,iBAAO+U,GAAU,MAAM;QACvB;AAAA,QACD,MAAM,WAAW;AAChB,iBAAOA,GAAU;QACjB;AAAA,QACD,QAAQ,SAAU3E,GAAQ;AACzB,iBAAK,OAAOA,KAAU,YACdA,IAAQ,KAAK,KAAM,IAAG,KAAK,KAAI,IAGhC,KAAK,KAAM,WAAW;AAC5B,YAAK8D,GAAoB,QACxBlU,EAAQ,MAAO,SAEfA,EAAQ,MAAO;UAEnB;QACE;AAAA,MACF;AACA,UAAIkV,KAAmB,yBAEnBC,KAAa,kCAEbC,KAAgB;AAIpB,OAAE,WAAW;AACZ,YAAIC,IAAW9V,GAAS,uBAAwB,GAC/C+V,IAAMD,EAAS,YAAa9V,GAAS,cAAe,KAAK,CAAI,GAC7DvX,IAAQuX,GAAS,cAAe;AAMjC,QAAAvX,EAAM,aAAc,QAAQ,UAC5BA,EAAM,aAAc,WAAW,YAC/BA,EAAM,aAAc,QAAQ,MAE5BstB,EAAI,YAAattB,IAIjBmX,GAAQ,aAAamW,EAAI,UAAW,IAAO,UAAW,EAAI,EAAG,UAAU,SAIvEA,EAAI,YAAY,0BAChBnW,GAAQ,iBAAiB,CAAC,CAACmW,EAAI,UAAW,EAAM,EAAC,UAAU,cAK3DA,EAAI,YAAY,qBAChBnW,GAAQ,SAAS,CAAC,CAACmW,EAAI;AAAA,MACxB;AAIA,UAAIC,KAAU;AAAA;AAAA;AAAA;AAAA,QAKb,OAAO,CAAE,GAAG,WAAW,UAAY;AAAA,QACnC,KAAK,CAAE,GAAG,qBAAqB,qBAAuB;AAAA,QACtD,IAAI,CAAE,GAAG,kBAAkB,kBAAoB;AAAA,QAC/C,IAAI,CAAE,GAAG,sBAAsB,uBAAyB;AAAA,QAExD,UAAU,CAAE,GAAG,IAAI,EAAI;AAAA,MACxB;AAEA,MAAAA,GAAQ,QAAQA,GAAQ,QAAQA,GAAQ,WAAWA,GAAQ,UAAUA,GAAQ,OAC7EA,GAAQ,KAAKA,GAAQ,IAGfpW,GAAQ,WACboW,GAAQ,WAAWA,GAAQ,SAAS,CAAE,GAAG,gCAAgC;AAI1E,eAASC,GAAQtV,GAAS0H,GAAM;AAI/B,YAAIvH;AAYJ,eAVK,OAAOH,EAAQ,uBAAyB,MAC5CG,IAAMH,EAAQ,qBAAsB0H,KAAO,GAAG,IAEnC,OAAO1H,EAAQ,mBAAqB,MAC/CG,IAAMH,EAAQ,iBAAkB0H,KAAO,GAAG,IAG1CvH,IAAM,CAAA,GAGFuH,MAAQ,UAAaA,KAAOa,GAAUvI,GAAS0H,KAC5C5H,EAAO,MAAO,CAAEE,CAAS,GAAEG,CAAG,IAG/BA;AAAA,MACP;AAID,eAASoV,GAAerV,GAAOsV,GAAc;AAI5C,iBAHItpB,IAAI,GACPqiB,IAAIrO,EAAM,QAEHhU,IAAIqiB,GAAGriB;AACd,UAAA6mB,EAAS;AAAA,YACR7S,EAAOhU,CAAG;AAAA,YACV;AAAA,YACA,CAACspB,KAAezC,EAAS,IAAKyC,EAAatpB,CAAG,GAAE,YAAc;AAAA,UACjE;AAAA,MAEC;AAGD,UAAIqY,IAAQ;AAEZ,eAASkR,EAAevV,GAAOF,GAAS0V,GAASC,GAAWC,GAAU;AAOrE,iBANIvV,GAAMsH,GAAKD,GAAKmO,GAAMC,GAAUxY,GACnC6X,IAAWnV,EAAQ,uBAAwB,GAC3C+V,IAAQ,CAAE,GACV7pB,IAAI,GACJqiB,IAAIrO,EAAM,QAEHhU,IAAIqiB,GAAGriB;AAGd,cAFAmU,IAAOH,EAAOhU,IAETmU,KAAQA,MAAS;AAGrB,gBAAKT,GAAQS,CAAM,MAAK;AAIvB,cAAAP,EAAO,MAAOiW,GAAO1V,EAAK,WAAW,CAAEA,CAAI,IAAKA;qBAGrC,CAACkE,EAAM,KAAMlE,CAAI;AAC5B,cAAA0V,EAAM,KAAM/V,EAAQ,eAAgBK,CAAM,CAAA;AAAA,iBAGpC;AAUN,mBATAsH,IAAMA,KAAOwN,EAAS,YAAanV,EAAQ,cAAe,KAAK,IAG/D0H,KAAQuN,GAAS,KAAM5U,CAAM,KAAI,CAAE,IAAI,EAAI,GAAI,CAAG,EAAC,YAAW,GAC9DwV,IAAOR,GAAS3N,MAAS2N,GAAQ,UACjC1N,EAAI,YAAYkO,EAAM,KAAM/V,EAAO,cAAeO,CAAM,IAAGwV,EAAM,IAGjEvY,IAAIuY,EAAM,IACFvY;AACP,gBAAAqK,IAAMA,EAAI;AAKX,cAAA7H,EAAO,MAAOiW,GAAOpO,EAAI,UAAU,GAGnCA,IAAMwN,EAAS,YAGfxN,EAAI,cAAc;AAAA,YAClB;AAQH,aAHAwN,EAAS,cAAc,IAEvBjpB,IAAI,GACMmU,IAAO0V,EAAO7pB,QAAU;AAGjC,cAAKypB,KAAa7V,EAAO,QAASO,GAAMsV,CAAS,IAAK,IAAK;AAC1D,YAAKC,KACJA,EAAQ,KAAMvV;AAEf;AAAA,UACA;AAaD,cAXAyV,IAAWhC,GAAYzT,IAGvBsH,IAAM2N,GAAQH,EAAS,YAAa9U,CAAI,GAAI,WAGvCyV,KACJP,GAAe5N,CAAG,GAId+N;AAEJ,iBADApY,IAAI,GACM+C,IAAOsH,EAAKrK;AACrB,cAAK4X,GAAY,KAAM7U,EAAK,QAAQ,EAAE,KACrCqV,EAAQ,KAAMrV;QAIjB;AAED,eAAO8U;AAAA,MACP;AAGD,UACCa,KAAY,QACZC,KAAc,kDACdC,KAAiB;AAElB,eAASC,KAAa;AACrB,eAAO;AAAA,MACP;AAED,eAASC,KAAc;AACtB,eAAO;AAAA,MACP;AAQD,eAASC,GAAYhW,GAAMuB,GAAO;AACjC,eAASvB,MAASiW,GAAmB,MAAS1U,MAAS;AAAA,MACvD;AAKD,eAAS0U,KAAoB;AAC5B,YAAI;AACH,iBAAOjX,GAAS;AAAA,QAClB,QAAiB;AAAA,QAAG;AAAA,MACnB;AAED,eAASkX,GAAIlW,GAAMmW,GAAOzW,GAAUzZ,GAAMigB,GAAIkQ,GAAM;AACnD,YAAIC,GAAQ9U;AAGZ,YAAK,OAAO4U,KAAU,UAAW;AAGhC,UAAK,OAAOzW,KAAa,aAGxBzZ,IAAOA,KAAQyZ,GACfA,IAAW;AAEZ,eAAM6B,KAAQ4U;AACb,YAAAD,GAAIlW,GAAMuB,GAAM7B,GAAUzZ,GAAMkwB,EAAO5U,IAAQ6U;AAEhD,iBAAOpW;AAAA,QACP;AAqBD,YAnBK/Z,KAAQ,QAAQigB,KAAM,QAG1BA,IAAKxG,GACLzZ,IAAOyZ,IAAW,UACPwG,KAAM,SACZ,OAAOxG,KAAa,YAGxBwG,IAAKjgB,GACLA,IAAO,WAIPigB,IAAKjgB,GACLA,IAAOyZ,GACPA,IAAW,UAGRwG,MAAO;AACX,UAAAA,IAAK6P;AAAA,iBACM,CAAC7P;AACZ,iBAAOlG;AAGR,eAAKoW,MAAQ,MACZC,IAASnQ,GACTA,IAAK,SAAUoQ,GAAQ;AAGtB,iBAAA7W,EAAQ,EAAC,IAAK6W,IACPD,EAAO,MAAO,MAAM,SAAS;AAAA,QACvC,GAGEnQ,EAAG,OAAOmQ,EAAO,SAAUA,EAAO,OAAO5W,EAAO,UAE1CO,EAAK,KAAM,WAAW;AAC5B,UAAAP,EAAO,MAAM,IAAK,MAAM0W,GAAOjQ,GAAIjgB,GAAMyZ;QAC3C;MACC;AAMD,MAAAD,EAAO,QAAQ;AAAA,QAEd,QAAQ,CAAE;AAAA,QAEV,KAAK,SAAUO,GAAMmW,GAAOnwB,GAASC,GAAMyZ,GAAW;AAErD,cAAI6W,GAAaC,GAAalP,GAC7BmP,GAAQC,GAAGC,GACXnG,GAASoG,GAAUrV,GAAMsV,GAAYC,IACrCC,IAAWrE,EAAS,IAAK1S;AAG1B,cAAMsS,GAAYtS;AAuClB,iBAlCKha,EAAQ,YACZuwB,IAAcvwB,GACdA,IAAUuwB,EAAY,SACtB7W,IAAW6W,EAAY,WAKnB7W,KACJD,EAAO,KAAK,gBAAiB+T,GAAiB9T,CAAQ,GAIjD1Z,EAAQ,SACbA,EAAQ,OAAOyZ,EAAO,UAIfgX,IAASM,EAAS,YACzBN,IAASM,EAAS,SAAS,uBAAO,OAAQ,IAAI,KAEvCP,IAAcO,EAAS,YAC9BP,IAAcO,EAAS,SAAS,SAAUroB,IAAI;AAI7C,qBAAO,OAAO+Q,IAAW,OAAeA,EAAO,MAAM,cAAc/Q,GAAE,OACpE+Q,EAAO,MAAM,SAAS,MAAOO,GAAM,SAAW,IAAG;AAAA,YACtD,IAIEmW,KAAUA,KAAS,IAAK,MAAO9H,CAAe,KAAI,CAAE,KACpDqI,IAAIP,EAAM,QACFO;AAMP,cALApP,IAAMuO,GAAe,KAAMM,EAAOO,CAAC,CAAI,KAAI,IAC3CnV,IAAOuV,KAAWxP,EAAK,IACvBuP,KAAevP,EAAK,CAAG,KAAI,IAAK,MAAO,KAAM,QAGvC/F,MAKNiP,IAAU/Q,EAAO,MAAM,QAAS8B,CAAI,KAAM,CAAA,GAG1CA,KAAS7B,IAAW8Q,EAAQ,eAAeA,EAAQ,aAAcjP,GAGjEiP,IAAU/Q,EAAO,MAAM,QAAS8B,CAAI,KAAM,CAAA,GAG1CoV,IAAYlX,EAAO,OAAQ;AAAA,gBAC1B,MAAM8B;AAAA,gBACN,UAAUuV;AAAA,gBACV,MAAM7wB;AAAA,gBACN,SAASD;AAAA,gBACT,MAAMA,EAAQ;AAAA,gBACd,UAAU0Z;AAAA,gBACV,cAAcA,KAAYD,EAAO,KAAK,MAAM,aAAa,KAAMC,CAAU;AAAA,gBACzE,WAAWmX,EAAW,KAAM,GAAK;AAAA,cACjC,GAAEN,CAAW,IAGNK,IAAWH,EAAQlV,CAAM,OAChCqV,IAAWH,EAAQlV,CAAM,IAAG,IAC5BqV,EAAS,gBAAgB,IAGpB,CAACpG,EAAQ,SACbA,EAAQ,MAAM,KAAMxQ,GAAM/Z,GAAM4wB,GAAYL,CAAa,MAAK,OAEzDxW,EAAK,oBACTA,EAAK,iBAAkBuB,GAAMiV,KAK3BhG,EAAQ,QACZA,EAAQ,IAAI,KAAMxQ,GAAM2W,CAAS,GAE3BA,EAAU,QAAQ,SACvBA,EAAU,QAAQ,OAAO3wB,EAAQ,QAK9B0Z,IACJkX,EAAS,OAAQA,EAAS,iBAAiB,GAAGD,KAE9CC,EAAS,KAAMD,IAIhBlX,EAAO,MAAM,OAAQ8B,CAAI,IAAK;AAAA,QAG/B;AAAA;AAAA,QAGD,QAAQ,SAAUvB,GAAMmW,GAAOnwB,GAAS0Z,GAAUsX,GAAc;AAE/D,cAAI/Z,GAAGga,GAAW3P,GACjBmP,GAAQC,GAAGC,GACXnG,GAASoG,GAAUrV,GAAMsV,GAAYC,IACrCC,IAAWrE,EAAS,QAAS1S,CAAM,KAAI0S,EAAS,IAAK1S;AAEtD,cAAK,GAAC+W,KAAY,EAAGN,IAASM,EAAS,UAOvC;AAAA,iBAFAZ,KAAUA,KAAS,IAAK,MAAO9H,CAAe,KAAI,CAAE,KACpDqI,IAAIP,EAAM,QACFO,OAAM;AAMb,kBALApP,IAAMuO,GAAe,KAAMM,EAAOO,CAAC,CAAI,KAAI,IAC3CnV,IAAOuV,KAAWxP,EAAK,IACvBuP,KAAevP,EAAK,CAAG,KAAI,IAAK,MAAO,KAAM,QAGxC,CAAC/F,GAAO;AACZ,qBAAMA,KAAQkV;AACb,kBAAAhX,EAAO,MAAM,OAAQO,GAAMuB,IAAO4U,EAAOO,IAAK1wB,GAAS0Z,GAAU,EAAI;AAEtE;AAAA,cACA;AAUD,mBARA8Q,IAAU/Q,EAAO,MAAM,QAAS8B,CAAI,KAAM,CAAA,GAC1CA,KAAS7B,IAAW8Q,EAAQ,eAAeA,EAAQ,aAAcjP,GACjEqV,IAAWH,EAAQlV,CAAM,KAAI,IAC7B+F,IAAMA,EAAK,CAAG,KACb,IAAI,OAAQ,YAAYuP,EAAW,KAAM,eAAe,IAAK,YAG9DI,IAAYha,IAAI2Z,EAAS,QACjB3Z;AACP,gBAAA0Z,IAAYC,EAAU3Z,KAEf+Z,KAAeF,OAAaH,EAAU,cAC1C,CAAC3wB,KAAWA,EAAQ,SAAS2wB,EAAU,UACvC,CAACrP,KAAOA,EAAI,KAAMqP,EAAU,SAAS,OACrC,CAACjX,KAAYA,MAAaiX,EAAU,YACrCjX,MAAa,QAAQiX,EAAU,cAChCC,EAAS,OAAQ3Z,GAAG,IAEf0Z,EAAU,YACdC,EAAS,iBAELpG,EAAQ,UACZA,EAAQ,OAAO,KAAMxQ,GAAM2W,CAAS;AAOvC,cAAKM,KAAa,CAACL,EAAS,YACtB,CAACpG,EAAQ,YACbA,EAAQ,SAAS,KAAMxQ,GAAM6W,GAAYE,EAAS,MAAQ,MAAK,OAE/DtX,EAAO,YAAaO,GAAMuB,GAAMwV,EAAS,MAAM,GAGhD,OAAON,EAAQlV;YAEhB;AAGD,YAAK9B,EAAO,cAAegX,MAC1B/D,EAAS,OAAQ1S,GAAM;;QAExB;AAAA,QAED,UAAU,SAAUkX,GAAc;AAEjC,cAAI,GAAGja,GAAG6C,GAAKwJ,GAASqN,GAAWQ,GAClC/N,IAAO,IAAI,MAAO,UAAU,MAAQ,GAGpCkN,IAAQ7W,EAAO,MAAM,IAAKyX,CAAa,GAEvCN,KACElE,EAAS,IAAK,MAAM,QAAU,KAAI,uBAAO,OAAQ,IAAM,GACrD4D,EAAM,IAAI,KAAM,CAAE,GACtB9F,IAAU/Q,EAAO,MAAM,QAAS6W,EAAM,IAAM,KAAI;AAKjD,eAFAlN,EAAM,CAAG,IAAGkN,GAEN,IAAI,GAAG,IAAI,UAAU,QAAQ;AAClC,YAAAlN,EAAM,CAAC,IAAK,UAAW,CAAC;AAMzB,cAHAkN,EAAM,iBAAiB,MAGlB,EAAA9F,EAAQ,eAAeA,EAAQ,YAAY,KAAM,MAAM8F,CAAO,MAAK,KASxE;AAAA,iBAJAa,IAAe1X,EAAO,MAAM,SAAS,KAAM,MAAM6W,GAAOM,IAGxD,IAAI,IACMtN,IAAU6N,EAAc,GAAG,MAAQ,CAACb,EAAM;AAInD,mBAHAA,EAAM,gBAAgBhN,EAAQ,MAE9BrM,IAAI,IACM0Z,IAAYrN,EAAQ,SAAUrM,GAAK,MAC5C,CAACqZ,EAAM;AAIP,iBAAK,CAACA,EAAM,cAAcK,EAAU,cAAc,MACjDL,EAAM,WAAW,KAAMK,EAAU,SAAS,OAE1CL,EAAM,YAAYK,GAClBL,EAAM,OAAOK,EAAU,MAEvB7W,MAAUL,EAAO,MAAM,QAASkX,EAAU,aAAc,CAAA,GAAK,UAC5DA,EAAU,SAAU,MAAOrN,EAAQ,MAAMF,CAAI,GAEzCtJ,MAAQ,WACLwW,EAAM,SAASxW,OAAU,OAC/BwW,EAAM,eAAc,GACpBA,EAAM,gBAAe;AAQ1B,mBAAK9F,EAAQ,gBACZA,EAAQ,aAAa,KAAM,MAAM8F,CAAK,GAGhCA,EAAM;AAAA;AAAA,QACb;AAAA,QAED,UAAU,SAAUA,GAAOM,GAAW;AACrC,cAAI/qB,GAAG8qB,GAAW9O,GAAKuP,GAAiBC,GACvCF,IAAe,CAAE,GACjBG,IAAgBV,EAAS,eACzBpQ,IAAM8P,EAAM;AAGb,cAAKgB;AAAA;AAAA,UAIJ9Q,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA,UAOJ,EAAG8P,EAAM,SAAS,WAAWA,EAAM,UAAU;AAE7C,mBAAQ9P,MAAQ,MAAMA,IAAMA,EAAI,cAAc;AAI7C,kBAAKA,EAAI,aAAa,KAAK,EAAG8P,EAAM,SAAS,WAAW9P,EAAI,aAAa,KAAS;AAGjF,qBAFA4Q,IAAkB,CAAA,GAClBC,IAAmB,CAAA,GACbxrB,IAAI,GAAGA,IAAIyrB,GAAezrB;AAC/B,kBAAA8qB,IAAYC,EAAU/qB,IAGtBgc,IAAM8O,EAAU,WAAW,KAEtBU,EAAkBxP,CAAK,MAAK,WAChCwP,EAAkBxP,KAAQ8O,EAAU,eACnClX,EAAQoI,GAAK,IAAI,EAAG,MAAOrB,CAAK,IAAG,KACnC/G,EAAO,KAAMoI,GAAK,MAAM,MAAM,CAAErB,CAAG,CAAI,EAAC,SAErC6Q,EAAkBxP,MACtBuP,EAAgB,KAAMT;AAGxB,gBAAKS,EAAgB,UACpBD,EAAa,KAAM,EAAE,MAAM3Q,GAAK,UAAU4Q,EAAe;cAE1D;AAAA;AAKH,iBAAA5Q,IAAM,MACD8Q,IAAgBV,EAAS,UAC7BO,EAAa,KAAM,EAAE,MAAM3Q,GAAK,UAAUoQ,EAAS,MAAOU,CAAe,EAAA,IAGnEH;AAAA,QACP;AAAA,QAED,SAAS,SAAU/W,GAAMmX,GAAO;AAC/B,iBAAO,eAAgB9X,EAAO,MAAM,WAAWW,GAAM;AAAA,YACpD,YAAY;AAAA,YACZ,cAAc;AAAA,YAEd,KAAKvB,EAAY0Y,CAAM,IACtB,WAAW;AACV,kBAAK,KAAK;AACR,uBAAOA,EAAM,KAAK;YAEpB,IACD,WAAW;AACV,kBAAK,KAAK;AACR,uBAAO,KAAK,cAAenX;YAE7B;AAAA,YAEF,KAAK,SAAUiB,GAAQ;AACtB,qBAAO,eAAgB,MAAMjB,GAAM;AAAA,gBAClC,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,OAAOiB;AAAA,cACZ;YACI;AAAA,UACJ;QACE;AAAA,QAED,KAAK,SAAUmW,GAAgB;AAC9B,iBAAOA,EAAe/X,EAAO,OAAS,IACrC+X,IACA,IAAI/X,EAAO,MAAO+X;QACnB;AAAA,QAED,SAAS;AAAA,UACR,MAAM;AAAA;AAAA,YAGL,UAAU;AAAA,UACV;AAAA,UACD,OAAO;AAAA;AAAA,YAGN,OAAO,SAAUvxB,GAAO;AAIvB,kBAAImgB,IAAK,QAAQngB;AAGjB,qBAAK0uB,GAAe,KAAMvO,EAAG,IAAM,KAClCA,EAAG,SAAS8B,GAAU9B,GAAI,OAAO,KAGjCqR,GAAgBrR,GAAI,SAAS0P,KAIvB;AAAA,YACP;AAAA,YACD,SAAS,SAAU7vB,GAAO;AAIzB,kBAAImgB,IAAK,QAAQngB;AAGjB,qBAAK0uB,GAAe,KAAMvO,EAAG,IAAM,KAClCA,EAAG,SAAS8B,GAAU9B,GAAI,OAAO,KAEjCqR,GAAgBrR,GAAI,UAId;AAAA,YACP;AAAA;AAAA;AAAA,YAID,UAAU,SAAUkQ,GAAQ;AAC3B,kBAAI/iB,IAAS+iB,EAAM;AACnB,qBAAO3B,GAAe,KAAMphB,EAAO,IAAM,KACxCA,EAAO,SAAS2U,GAAU3U,GAAQ,OAAS,KAC3Cmf,EAAS,IAAKnf,GAAQ,OAAS,KAC/B2U,GAAU3U,GAAQ;YACnB;AAAA,UACD;AAAA,UAED,cAAc;AAAA,YACb,cAAc,SAAU+iB,GAAQ;AAI/B,cAAKA,EAAM,WAAW,UAAaA,EAAM,kBACxCA,EAAM,cAAc,cAAcA,EAAM;AAAA,YAEzC;AAAA,UACD;AAAA,QACD;AAAA,MACF;AAMA,eAASmB,GAAgBrR,GAAI7E,GAAMyU,GAAa;AAG/C,YAAK,CAACA,GAAa;AAClB,UAAKtD,EAAS,IAAKtM,GAAI7E,CAAI,MAAO,UACjC9B,EAAO,MAAM,IAAK2G,GAAI7E,GAAMuU,EAAU;AAEvC;AAAA,QACA;AAGD,QAAApD,EAAS,IAAKtM,GAAI7E,GAAM,EAAK,GAC7B9B,EAAO,MAAM,IAAK2G,GAAI7E,GAAM;AAAA,UAC3B,WAAW;AAAA,UACX,SAAS,SAAU+U,GAAQ;AAC1B,gBAAIoB,GAAUxgB,GACbygB,IAAQjF,EAAS,IAAK,MAAMnR,CAAI;AAEjC,gBAAO+U,EAAM,YAAY,KAAO,KAAM/U,CAAI;AAKzC,kBAAMoW,EAAM;AAiCL,iBAAOlY,EAAO,MAAM,QAAS8B,CAAM,KAAI,CAAE,GAAG,gBAClD+U,EAAM,gBAAe;AAAA,uBA7BrBqB,IAAQxZ,EAAM,KAAM,YACpBuU,EAAS,IAAK,MAAMnR,GAAMoW,CAAK,GAK/BD,IAAW1B,EAAY,MAAMzU,IAC7B,KAAMA,CAAI,KACVrK,IAASwb,EAAS,IAAK,MAAMnR,CAAI,GAC5BoW,MAAUzgB,KAAUwgB,IACxBhF,EAAS,IAAK,MAAMnR,GAAM,EAAK,IAE/BrK,IAAS,CAAA,GAELygB,MAAUzgB;AAGd,uBAAAof,EAAM,yBAAwB,GAC9BA,EAAM,eAAc,GACbpf,EAAO;AAAA,kBAeV,CAAKygB,EAAM,WAGjBjF,EAAS,IAAK,MAAMnR,GAAM;AAAA,cACzB,OAAO9B,EAAO,MAAM;AAAA;AAAA;AAAA,gBAInBA,EAAO,OAAQkY,EAAO,CAAG,GAAElY,EAAO,MAAM,SAAW;AAAA,gBACnDkY,EAAM,MAAO,CAAG;AAAA,gBAChB;AAAA,cACA;AAAA,YACN,IAGIrB,EAAM,yBAAwB;AAAA,UAE/B;AAAA,QACH;MACC;AAED,MAAA7W,EAAO,cAAc,SAAUO,GAAMuB,GAAMqW,GAAS;AAGnD,QAAK5X,EAAK,uBACTA,EAAK,oBAAqBuB,GAAMqW;MAElC,GAEAnY,EAAO,QAAQ,SAAUY,GAAKwX,GAAQ;AAGrC,YAAK,EAAG,gBAAgBpY,EAAO;AAC9B,iBAAO,IAAIA,EAAO,MAAOY,GAAKwX,CAAK;AAIpC,QAAKxX,KAAOA,EAAI,QACf,KAAK,gBAAgBA,GACrB,KAAK,OAAOA,EAAI,MAIhB,KAAK,qBAAqBA,EAAI,oBAC5BA,EAAI,qBAAqB;AAAA,QAGzBA,EAAI,gBAAgB,KACrByV,KACAC,IAKD,KAAK,SAAW1V,EAAI,UAAUA,EAAI,OAAO,aAAa,IACrDA,EAAI,OAAO,aACXA,EAAI,QAEL,KAAK,gBAAgBA,EAAI,eACzB,KAAK,gBAAgBA,EAAI,iBAIzB,KAAK,OAAOA,GAIRwX,KACJpY,EAAO,OAAQ,MAAMoY,IAItB,KAAK,YAAYxX,KAAOA,EAAI,aAAa,KAAK,OAG9C,KAAMZ,EAAO,OAAS,IAAG;AAAA,MAC1B,GAIAA,EAAO,MAAM,YAAY;AAAA,QACxB,aAAaA,EAAO;AAAA,QACpB,oBAAoBsW;AAAA,QACpB,sBAAsBA;AAAA,QACtB,+BAA+BA;AAAA,QAC/B,aAAa;AAAA,QAEb,gBAAgB,WAAW;AAC1B,cAAIrnB,IAAI,KAAK;AAEb,eAAK,qBAAqBonB,IAErBpnB,KAAK,CAAC,KAAK,eACfA,EAAE,eAAc;AAAA,QAEjB;AAAA,QACD,iBAAiB,WAAW;AAC3B,cAAIA,IAAI,KAAK;AAEb,eAAK,uBAAuBonB,IAEvBpnB,KAAK,CAAC,KAAK,eACfA,EAAE,gBAAe;AAAA,QAElB;AAAA,QACD,0BAA0B,WAAW;AACpC,cAAIA,IAAI,KAAK;AAEb,eAAK,gCAAgConB,IAEhCpnB,KAAK,CAAC,KAAK,eACfA,EAAE,yBAAwB,GAG3B,KAAK,gBAAe;AAAA,QACpB;AAAA,MACF,GAGA+Q,EAAO,KAAM;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,KAAK;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,WAAW;AAAA,QACX,aAAa;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,QACT,eAAe;AAAA,QACf,WAAW;AAAA,QACX,SAAS;AAAA,QAET,OAAO,SAAU6W,GAAQ;AACxB,cAAIwB,IAASxB,EAAM;AAGnB,iBAAKA,EAAM,SAAS,QAAQX,GAAU,KAAMW,EAAM,QAC1CA,EAAM,YAAY,OAAOA,EAAM,WAAWA,EAAM,UAInD,CAACA,EAAM,SAASwB,MAAW,UAAalC,GAAY,KAAMU,EAAM,QAC/DwB,IAAS,IACN,IAGHA,IAAS,IACN,IAGHA,IAAS,IACN,IAGD,IAGDxB,EAAM;AAAA,QACb;AAAA,MACF,GAAG7W,EAAO,MAAM,UAEhBA,EAAO,KAAM,EAAE,OAAO,WAAW,MAAM,WAAY,GAAE,SAAU8B,GAAMwW,GAAe;AACnF,QAAAtY,EAAO,MAAM,QAAS8B,KAAS;AAAA;AAAA,UAG9B,OAAO,WAAW;AAKjB,mBAAAkW,GAAgB,MAAMlW,GAAMyU,KAGrB;AAAA,UACP;AAAA,UACD,SAAS,WAAW;AAGnB,mBAAAyB,GAAgB,MAAMlW,IAGf;AAAA,UACP;AAAA,UAED,cAAcwW;AAAA,QAChB;AAAA,MACA,IAUAtY,EAAO,KAAM;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,cAAc;AAAA,MACf,GAAG,SAAUuY,GAAMC,GAAM;AACxB,QAAAxY,EAAO,MAAM,QAASuY,KAAS;AAAA,UAC9B,cAAcC;AAAA,UACd,UAAUA;AAAA,UAEV,QAAQ,SAAU3B,GAAQ;AACzB,gBAAIxW,GACHvM,IAAS,MACT2kB,IAAU5B,EAAM,eAChBK,IAAYL,EAAM;AAInB,oBAAK,CAAC4B,KAAaA,MAAY3kB,KAAU,CAACkM,EAAO,SAAUlM,GAAQ2kB,CAAO,OACzE5B,EAAM,OAAOK,EAAU,UACvB7W,IAAM6W,EAAU,QAAQ,MAAO,MAAM,SAAS,GAC9CL,EAAM,OAAO2B,IAEPnY;AAAA,UACP;AAAA,QACH;AAAA,MACA,IAEAL,EAAO,GAAG,OAAQ;AAAA,QAEjB,IAAI,SAAU0W,GAAOzW,GAAUzZ,GAAMigB,GAAK;AACzC,iBAAOgQ,GAAI,MAAMC,GAAOzW,GAAUzZ,GAAMigB;QACxC;AAAA,QACD,KAAK,SAAUiQ,GAAOzW,GAAUzZ,GAAMigB,GAAK;AAC1C,iBAAOgQ,GAAI,MAAMC,GAAOzW,GAAUzZ,GAAMigB,GAAI;QAC5C;AAAA,QACD,KAAK,SAAUiQ,GAAOzW,GAAUwG,GAAK;AACpC,cAAIyQ,GAAWpV;AACf,cAAK4U,KAASA,EAAM,kBAAkBA,EAAM;AAG3C,mBAAAQ,IAAYR,EAAM,WAClB1W,EAAQ0W,EAAM,cAAc,EAAG;AAAA,cAC9BQ,EAAU,YACTA,EAAU,WAAW,MAAMA,EAAU,YACrCA,EAAU;AAAA,cACXA,EAAU;AAAA,cACVA,EAAU;AAAA,YACd,GACU;AAER,cAAK,OAAOR,KAAU,UAAW;AAGhC,iBAAM5U,KAAQ4U;AACb,mBAAK,IAAK5U,GAAM7B,GAAUyW,EAAO5U,CAAI;AAEtC,mBAAO;AAAA,UACP;AACD,kBAAK7B,MAAa,MAAS,OAAOA,KAAa,gBAG9CwG,IAAKxG,GACLA,IAAW,SAEPwG,MAAO,OACXA,IAAK6P,KAEC,KAAK,KAAM,WAAW;AAC5B,YAAAtW,EAAO,MAAM,OAAQ,MAAM0W,GAAOjQ,GAAIxG;UACzC;QACE;AAAA,MACF;AAGA,UAKCyY,KAAe,yBAGfC,KAAW,qCACXC,KAAe;AAGhB,eAASC,GAAoBtY,GAAMhL,GAAU;AAC5C,eAAKkT,GAAUlI,GAAM,OAAS,KAC7BkI,GAAUlT,EAAQ,aAAa,KAAKA,IAAUA,EAAQ,YAAY,SAE3DyK,EAAQO,GAAO,SAAU,SAAW,CAAG,KAAIA;AAAA,MAInD;AAGD,eAASuY,GAAevY,GAAO;AAC9B,eAAAA,EAAK,QAASA,EAAK,aAAc,MAAQ,MAAK,QAAS,MAAMA,EAAK,MAC3DA;AAAA,MACP;AACD,eAASwY,GAAexY,GAAO;AAC9B,gBAAOA,EAAK,QAAQ,IAAK,MAAO,GAAG,CAAG,MAAK,UAC1CA,EAAK,OAAOA,EAAK,KAAK,MAAO,CAAC,IAE9BA,EAAK,gBAAiB,SAGhBA;AAAA,MACP;AAED,eAASyY,GAAgBpY,GAAKqY,GAAO;AACpC,YAAI7sB,GAAGqiB,GAAG3M,GAAMoX,GAAUC,GAAUC,GAAUpC;AAE9C,YAAKiC,EAAK,aAAa,GAKvB;AAAA,cAAKhG,EAAS,QAASrS,OACtBsY,IAAWjG,EAAS,IAAKrS,IACzBoW,IAASkC,EAAS,QAEblC,IAAS;AACb,YAAA/D,EAAS,OAAQgG,GAAM;AAEvB,iBAAMnX,KAAQkV;AACb,mBAAM5qB,IAAI,GAAGqiB,IAAIuI,EAAQlV,GAAO,QAAQ1V,IAAIqiB,GAAGriB;AAC9C,gBAAA4T,EAAO,MAAM,IAAKiZ,GAAMnX,GAAMkV,EAAQlV,CAAI,EAAI1V,CAAC;UAGjD;AAIF,UAAK8mB,GAAS,QAAStS,OACtBuY,IAAWjG,GAAS,OAAQtS,IAC5BwY,IAAWpZ,EAAO,OAAQ,CAAE,GAAEmZ,CAAQ,GAEtCjG,GAAS,IAAK+F,GAAMG;;MAErB;AAGD,eAASC,GAAUzY,GAAKqY,GAAO;AAC9B,YAAIxQ,IAAWwQ,EAAK,SAAS,YAAW;AAGxC,QAAKxQ,MAAa,WAAWyM,GAAe,KAAMtU,EAAI,QACrDqY,EAAK,UAAUrY,EAAI,WAGR6H,MAAa,WAAWA,MAAa,gBAChDwQ,EAAK,eAAerY,EAAI;AAAA,MAEzB;AAED,eAAS0Y,GAAU/oB,GAAYoZ,GAAMrJ,GAAUwV,GAAU;AAGxD,QAAAnM,IAAOhL,EAAMgL;AAEb,YAAI0L,GAAU/T,GAAOsU,GAAS2D,GAAY9tB,GAAMkU,GAC/CvT,IAAI,GACJqiB,IAAIle,EAAW,QACfipB,IAAW/K,IAAI,GACf7M,IAAQ+H,EAAM,CAAG,GACjB8P,IAAkBra,EAAYwC;AAG/B,YAAK6X,KACDhL,IAAI,KAAK,OAAO7M,KAAU,YAC3B,CAACzC,GAAQ,cAAcwZ,GAAS,KAAM/W,CAAO;AAC/C,iBAAOrR,EAAW,KAAM,SAAU1I,IAAQ;AACzC,gBAAIumB,IAAO7d,EAAW,GAAI1I,EAAK;AAC/B,YAAK4xB,MACJ9P,EAAM,KAAM/H,EAAM,KAAM,MAAM/Z,IAAOumB,EAAK,KAAI,KAE/CkL,GAAUlL,GAAMzE,GAAMrJ,GAAUwV,CAAO;AAAA,UAC1C;AAGC,YAAKrH,MACJ4G,IAAWM,EAAehM,GAAMpZ,EAAY,GAAI,eAAe,IAAOA,GAAYulB,IAClFxU,IAAQ+T,EAAS,YAEZA,EAAS,WAAW,WAAW,MACnCA,IAAW/T,IAIPA,KAASwU,IAAU;AAOvB,eANAF,IAAU5V,EAAO,IAAKwV,GAAQH,GAAU,QAAQ,GAAIyD,KACpDS,IAAa3D,EAAQ,QAKbxpB,IAAIqiB,GAAGriB;AACd,YAAAX,IAAO4pB,GAEFjpB,MAAMotB,MACV/tB,IAAOuU,EAAO,MAAOvU,GAAM,IAAM,EAAI,GAGhC8tB,KAIJvZ,EAAO,MAAO4V,GAASJ,GAAQ/pB,GAAM,QAAQ,KAI/C6U,EAAS,KAAM/P,EAAYnE,CAAC,GAAIX,GAAMW;AAGvC,cAAKmtB;AAOJ,iBANA5Z,IAAMiW,EAASA,EAAQ,SAAS,CAAC,EAAG,eAGpC5V,EAAO,IAAK4V,GAASmD,KAGf3sB,IAAI,GAAGA,IAAImtB,GAAYntB;AAC5B,cAAAX,IAAOmqB,EAASxpB,IACXgpB,GAAY,KAAM3pB,EAAK,QAAQ,EAAI,KACvC,CAACwnB,EAAS,OAAQxnB,GAAM,YAAc,KACtCuU,EAAO,SAAUL,GAAKlU,OAEjBA,EAAK,QAASA,EAAK,QAAQ,IAAK,YAAa,MAAM,WAGlDuU,EAAO,YAAY,CAACvU,EAAK,YAC7BuU,EAAO,SAAUvU,EAAK,KAAK;AAAA,gBAC1B,OAAOA,EAAK,SAASA,EAAK,aAAc,OAAS;AAAA,cACjD,GAAEkU,CAAG,IAGPF,GAAShU,EAAK,YAAY,QAASmtB,IAAc,EAAI,GAAEntB,GAAMkU;QAKjE;AAGF,eAAOpP;AAAA,MACP;AAED,eAASmpB,GAAQnZ,GAAMN,GAAU0Z,GAAW;AAK3C,iBAJIluB,GACHwqB,IAAQhW,IAAWD,EAAO,OAAQC,GAAUM,CAAI,IAAKA,GACrDnU,IAAI,IAEKX,IAAOwqB,EAAO7pB,CAAC,MAAQ,MAAMA;AACtC,UAAK,CAACutB,KAAYluB,EAAK,aAAa,KACnCuU,EAAO,UAAWwV,GAAQ/pB,CAAM,CAAA,GAG5BA,EAAK,eACJkuB,KAAY3F,GAAYvoB,MAC5BgqB,GAAeD,GAAQ/pB,GAAM,QAAU,CAAA,GAExCA,EAAK,WAAW,YAAaA;AAI/B,eAAO8U;AAAA,MACP;AAED,MAAAP,EAAO,OAAQ;AAAA,QACd,eAAe,SAAU4Z,GAAO;AAC/B,iBAAOA;AAAA,QACP;AAAA,QAED,OAAO,SAAUrZ,GAAMsZ,GAAeC,GAAoB;AACzD,cAAI1tB,GAAGqiB,GAAGsL,GAAaC,GACtBjZ,IAAQR,EAAK,UAAW,EAAM,GAC9B0Z,IAASjG,GAAYzT;AAGtB,cAAK,CAACpB,GAAQ,mBAAoBoB,EAAK,aAAa,KAAKA,EAAK,aAAa,OACzE,CAACP,EAAO,SAAUO;AAMnB,iBAHAyZ,IAAexE,GAAQzU,IACvBgZ,IAAcvE,GAAQjV,IAEhBnU,IAAI,GAAGqiB,IAAIsL,EAAY,QAAQ3tB,IAAIqiB,GAAGriB;AAC3C,cAAAitB,GAAUU,EAAa3tB,CAAC,GAAI4tB,EAAc5tB,CAAG,CAAA;AAK/C,cAAKytB;AACJ,gBAAKC;AAIJ,mBAHAC,IAAcA,KAAevE,GAAQjV,IACrCyZ,IAAeA,KAAgBxE,GAAQzU,IAEjC3U,IAAI,GAAGqiB,IAAIsL,EAAY,QAAQ3tB,IAAIqiB,GAAGriB;AAC3C,gBAAA4sB,GAAgBe,EAAa3tB,CAAC,GAAI4tB,EAAc5tB,CAAG,CAAA;AAAA;AAGpD,cAAA4sB,GAAgBzY,GAAMQ;AAKxB,iBAAAiZ,IAAexE,GAAQzU,GAAO,WACzBiZ,EAAa,SAAS,KAC1BvE,GAAeuE,GAAc,CAACC,KAAUzE,GAAQjV,GAAM,QAAQ,IAIxDQ;AAAA,QACP;AAAA,QAED,WAAW,SAAUX,GAAQ;AAK5B,mBAJI5Z,GAAM+Z,GAAMuB,GACfiP,IAAU/Q,EAAO,MAAM,SACvB5T,IAAI,IAEKmU,IAAOH,EAAOhU,CAAC,OAAS,QAAWA;AAC5C,gBAAKymB,GAAYtS,IAAS;AACzB,kBAAO/Z,IAAO+Z,EAAM0S,EAAS,OAAO,GAAO;AAC1C,oBAAKzsB,EAAK;AACT,uBAAMsb,KAAQtb,EAAK;AAClB,oBAAKuqB,EAASjP,KACb9B,EAAO,MAAM,OAAQO,GAAMuB,CAAI,IAI/B9B,EAAO,YAAaO,GAAMuB,GAAMtb,EAAK,MAAM;AAO9C,gBAAA+Z,EAAM0S,EAAS,OAAS,IAAG;AAAA,cAC3B;AACD,cAAK1S,EAAM2S,GAAS,aAInB3S,EAAM2S,GAAS,OAAS,IAAG;AAAA,YAE5B;AAAA,QAEF;AAAA,MACF,IAEAlT,EAAO,GAAG,OAAQ;AAAA,QACjB,QAAQ,SAAUC,GAAW;AAC5B,iBAAOyZ,GAAQ,MAAMzZ,GAAU,EAAI;AAAA,QACnC;AAAA,QAED,QAAQ,SAAUA,GAAW;AAC5B,iBAAOyZ,GAAQ,MAAMzZ;QACrB;AAAA,QAED,MAAM,SAAU2B,GAAQ;AACvB,iBAAOoQ,GAAQ,MAAM,SAAUpQ,GAAQ;AACtC,mBAAOA,MAAU,SAChB5B,EAAO,KAAM,IAAM,IACnB,KAAK,QAAQ,KAAM,WAAW;AAC7B,eAAK,KAAK,aAAa,KAAK,KAAK,aAAa,MAAM,KAAK,aAAa,OACrE,KAAK,cAAc4B;AAAA,YAEzB;UACG,GAAE,MAAMA,GAAO,UAAU,MAAM;AAAA,QAChC;AAAA,QAED,QAAQ,WAAW;AAClB,iBAAO0X,GAAU,MAAM,WAAW,SAAU/Y,GAAO;AAClD,gBAAK,KAAK,aAAa,KAAK,KAAK,aAAa,MAAM,KAAK,aAAa,GAAI;AACzE,kBAAIzM,IAAS+kB,GAAoB,MAAMtY,CAAI;AAC3C,cAAAzM,EAAO,YAAayM;YACpB;AAAA,UACJ;QACE;AAAA,QAED,SAAS,WAAW;AACnB,iBAAO+Y,GAAU,MAAM,WAAW,SAAU/Y,GAAO;AAClD,gBAAK,KAAK,aAAa,KAAK,KAAK,aAAa,MAAM,KAAK,aAAa,GAAI;AACzE,kBAAIzM,IAAS+kB,GAAoB,MAAMtY,CAAI;AAC3C,cAAAzM,EAAO,aAAcyM,GAAMzM,EAAO,UAAU;AAAA,YAC5C;AAAA,UACJ;QACE;AAAA,QAED,QAAQ,WAAW;AAClB,iBAAOwlB,GAAU,MAAM,WAAW,SAAU/Y,GAAO;AAClD,YAAK,KAAK,cACT,KAAK,WAAW,aAAcA,GAAM,IAAI;AAAA,UAE5C;QACE;AAAA,QAED,OAAO,WAAW;AACjB,iBAAO+Y,GAAU,MAAM,WAAW,SAAU/Y,GAAO;AAClD,YAAK,KAAK,cACT,KAAK,WAAW,aAAcA,GAAM,KAAK,WAAW;AAAA,UAExD;QACE;AAAA,QAED,OAAO,WAAW;AAIjB,mBAHIA,GACH,IAAI,IAEKA,IAAO,KAAM,CAAC,MAAQ,MAAM;AACrC,YAAKA,EAAK,aAAa,MAGtBP,EAAO,UAAWwV,GAAQjV,GAAM,EAAO,CAAA,GAGvCA,EAAK,cAAc;AAIrB,iBAAO;AAAA,QACP;AAAA,QAED,OAAO,SAAUsZ,GAAeC,GAAoB;AACnD,iBAAAD,IAAgBA,KAAwB,IACxCC,IAAoBA,KAA4BD,GAEzC,KAAK,IAAK,WAAW;AAC3B,mBAAO7Z,EAAO,MAAO,MAAM6Z,GAAeC,CAAiB;AAAA,UAC9D;QACE;AAAA,QAED,MAAM,SAAUlY,GAAQ;AACvB,iBAAOoQ,GAAQ,MAAM,SAAUpQ,GAAQ;AACtC,gBAAIrB,IAAO,KAAM,CAAC,KAAM,CAAE,GACzBnU,IAAI,GACJqiB,IAAI,KAAK;AAEV,gBAAK7M,MAAU,UAAarB,EAAK,aAAa;AAC7C,qBAAOA,EAAK;AAIb,gBAAK,OAAOqB,KAAU,YAAY,CAAC8W,GAAa,KAAM9W,CAAO,KAC5D,CAAC2T,IAAWJ,GAAS,KAAMvT,CAAO,KAAI,CAAE,IAAI,EAAE,GAAM,GAAI,YAAa,CAAA,GAAK;AAE1E,cAAAA,IAAQ5B,EAAO,cAAe4B;AAE9B,kBAAI;AACH,uBAAQxV,IAAIqiB,GAAGriB;AACd,kBAAAmU,IAAO,KAAMnU,CAAG,KAAI,IAGfmU,EAAK,aAAa,MACtBP,EAAO,UAAWwV,GAAQjV,GAAM,EAAO,CAAA,GACvCA,EAAK,YAAYqB;AAInB,gBAAArB,IAAO;AAAA,cAGZ,QAAkB;AAAA,cAAE;AAAA,YAChB;AAED,YAAKA,KACJ,KAAK,MAAK,EAAG,OAAQqB,CAAK;AAAA,UAE3B,GAAE,MAAMA,GAAO,UAAU,MAAM;AAAA,QAChC;AAAA,QAED,aAAa,WAAW;AACvB,cAAIkU,IAAU,CAAA;AAGd,iBAAOwD,GAAU,MAAM,WAAW,SAAU/Y,GAAO;AAClD,gBAAI3Q,IAAS,KAAK;AAElB,YAAKoQ,EAAO,QAAS,MAAM8V,CAAO,IAAK,MACtC9V,EAAO,UAAWwV,GAAQ,IAAM,CAAA,GAC3B5lB,KACJA,EAAO,aAAc2Q,GAAM;UAK7B,GAAEuV,CAAO;AAAA,QACV;AAAA,MACF,IAEA9V,EAAO,KAAM;AAAA,QACZ,UAAU;AAAA,QACV,WAAW;AAAA,QACX,cAAc;AAAA,QACd,aAAa;AAAA,QACb,YAAY;AAAA,MACb,GAAG,SAAUW,GAAMuZ,GAAW;AAC7B,QAAAla,EAAO,GAAIW,CAAM,IAAG,SAAUV,GAAW;AAOxC,mBANIG,GACHC,IAAM,CAAE,GACR8Z,IAASna,EAAQC,CAAU,GAC3B8I,IAAOoR,EAAO,SAAS,GACvB/tB,IAAI,GAEGA,KAAK2c,GAAM3c;AAClB,YAAAgU,IAAQhU,MAAM2c,IAAO,OAAO,KAAK,MAAO,KACxC/I,EAAQma,EAAQ/tB,CAAC,CAAI,EAAE8tB,CAAQ,EAAI9Z,IAInCxB,EAAK,MAAOyB,GAAKD,EAAM,IAAK,CAAA;AAG7B,iBAAO,KAAK,UAAWC;QACzB;AAAA,MACA;AACA,UAAI+Z,KAAY,IAAI,OAAQ,OAAOxG,IAAO,mBAAmB,MAEzDyG,KAAY,SAAU9Z,GAAO;AAK/B,YAAI+Z,IAAO/Z,EAAK,cAAc;AAE9B,gBAAK,CAAC+Z,KAAQ,CAACA,EAAK,YACnBA,IAAOhc,IAGDgc,EAAK,iBAAkB/Z;MAChC,GAEIga,KAAO,SAAUha,GAAMG,GAASJ,GAAW;AAC9C,YAAID,GAAKM,GACR6Z,IAAM,CAAA;AAGP,aAAM7Z,KAAQD;AACb,UAAA8Z,EAAK7Z,CAAM,IAAGJ,EAAK,MAAOI,CAAI,GAC9BJ,EAAK,MAAOI,CAAM,IAAGD,EAASC,CAAI;AAGnC,QAAAN,IAAMC,EAAS,KAAMC;AAGrB,aAAMI,KAAQD;AACb,UAAAH,EAAK,MAAOI,CAAM,IAAG6Z,EAAK7Z,CAAI;AAG/B,eAAON;AAAA,MACR,GAGIoa,KAAY,IAAI,OAAQ3G,EAAU,KAAM,GAAG,GAAI;AAInD,OAAE,WAAW;AAIZ,iBAAS4G,IAAoB;AAG5B,cAAMpF,GAIN;AAAA,YAAA3jB,EAAU,MAAM,UAAU,gFAE1B2jB,EAAI,MAAM,UACT,6HAGDvB,EAAgB,YAAapiB,CAAW,EAAC,YAAa2jB,CAAG;AAEzD,gBAAIqF,IAAWrc,EAAO,iBAAkBgX,CAAG;AAC3C,YAAAsF,IAAmBD,EAAS,QAAQ,MAGpCE,IAAwBC,EAAoBH,EAAS,UAAU,MAAO,IAItErF,EAAI,MAAM,QAAQ,OAClByF,IAAoBD,EAAoBH,EAAS,KAAK,MAAO,IAI7DK,IAAuBF,EAAoBH,EAAS,KAAK,MAAO,IAMhErF,EAAI,MAAM,WAAW,YACrB2F,IAAmBH,EAAoBxF,EAAI,cAAc,CAAC,MAAO,IAEjEvB,EAAgB,YAAapiB,IAI7B2jB,IAAM;AAAA;AAAA,QACN;AAED,iBAASwF,EAAoBI,GAAU;AACtC,iBAAO,KAAK,MAAO,WAAYA,CAAS,CAAA;AAAA,QACxC;AAED,YAAIN,GAAkBI,GAAsBC,GAAkBF,GAC7DI,GAAyBN,GACzBlpB,IAAY4N,GAAS,cAAe,KAAO,GAC3C+V,IAAM/V,GAAS,cAAe;AAG/B,QAAM+V,EAAI,UAMVA,EAAI,MAAM,iBAAiB,eAC3BA,EAAI,UAAW,EAAI,EAAG,MAAM,iBAAiB,IAC7CnW,GAAQ,kBAAkBmW,EAAI,MAAM,mBAAmB,eAEvDtV,EAAO,OAAQb,IAAS;AAAA,UACvB,mBAAmB,WAAW;AAC7B,mBAAAub,KACOM;AAAA,UACP;AAAA,UACD,gBAAgB,WAAW;AAC1B,mBAAAN,KACOK;AAAA,UACP;AAAA,UACD,eAAe,WAAW;AACzB,mBAAAL,KACOE;AAAA,UACP;AAAA,UACD,oBAAoB,WAAW;AAC9B,mBAAAF,KACOG;AAAA,UACP;AAAA,UACD,eAAe,WAAW;AACzB,mBAAAH,KACOO;AAAA,UACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOD,sBAAsB,WAAW;AAChC,gBAAIG,GAAOC,GAAIC,GAASC;AACxB,mBAAKJ,KAA2B,SAC/BC,IAAQ7b,GAAS,cAAe,UAChC8b,IAAK9b,GAAS,cAAe,OAC7B+b,IAAU/b,GAAS,cAAe,QAElC6b,EAAM,MAAM,UAAU,mCACtBC,EAAG,MAAM,SAAS,OAClBC,EAAQ,MAAM,SAAS,OAEvBvH,EACE,YAAaqH,CAAO,EACpB,YAAaC,CAAI,EACjB,YAAaC,CAAO,GAEtBC,IAAUjd,EAAO,iBAAkB+c,IACnCF,IAA0B,SAAUI,EAAQ,MAAM,IAAK,GAEvDxH,EAAgB,YAAaqH,KAEvBD;AAAA,UACP;AAAA,QACH;MACA;AAGA,eAASK,GAAQjb,GAAMI,GAAM8a,GAAW;AACvC,YAAIC,GAAOC,GAAUC,GAAUvb,GAM9Bwb,IAAQtb,EAAK;AAEd,eAAAkb,IAAWA,KAAYpB,GAAW9Z,IAK7Bkb,MACJpb,IAAMob,EAAS,iBAAkB9a,CAAI,KAAM8a,EAAU9a,IAEhDN,MAAQ,MAAM,CAAC2T,GAAYzT,CAAI,MACnCF,IAAML,EAAO,MAAOO,GAAMI,CAAI,IAQ1B,CAACxB,GAAQ,eAAgB,KAAIib,GAAU,KAAM/Z,CAAG,KAAMoa,GAAU,KAAM9Z,OAG1E+a,IAAQG,EAAM,OACdF,IAAWE,EAAM,UACjBD,IAAWC,EAAM,UAGjBA,EAAM,WAAWA,EAAM,WAAWA,EAAM,QAAQxb,GAChDA,IAAMob,EAAS,OAGfI,EAAM,QAAQH,GACdG,EAAM,WAAWF,GACjBE,EAAM,WAAWD,KAIZvb,MAAQ;AAAA;AAAA;AAAA,UAIdA,IAAM;AAAA,YACNA;AAAA,MACD;AAGD,eAASyb,GAAcC,GAAaC,GAAS;AAG5C,eAAO;AAAA,UACN,KAAK,WAAW;AACf,gBAAKD,EAAW,GAAK;AAIpB,qBAAO,KAAK;AACZ;AAAA,YACA;AAGD,oBAAS,KAAK,MAAMC,GAAS,MAAO,MAAM;UAC1C;AAAA,QACH;AAAA,MACC;AAGD,UAAIC,KAAc,CAAE,UAAU,OAAO,IAAM,GAC1CC,KAAa3c,GAAS,cAAe,KAAO,EAAC,OAC7C4c,KAAc,CAAA;AAGf,eAASC,GAAgBzb,GAAO;AAM/B,iBAHI0b,IAAU1b,EAAM,CAAG,EAAC,YAAW,IAAKA,EAAK,MAAO,CAAG,GACtDvU,IAAI6vB,GAAY,QAET7vB;AAEP,cADAuU,IAAOsb,GAAa7vB,CAAG,IAAGiwB,GACrB1b,KAAQub;AACZ,mBAAOvb;AAAA,MAGT;AAGD,eAAS2b,GAAe3b,GAAO;AAC9B,YAAI4b,IAAQvc,EAAO,SAAUW,CAAI,KAAMwb,GAAaxb;AAEpD,eAAK4b,MAGA5b,KAAQub,KACLvb,IAEDwb,GAAaxb,CAAM,IAAGyb,GAAgBzb,CAAI,KAAMA;AAAA,MACvD;AAGD,UAKC6b,KAAe,6BACfC,KAAc,OACdC,KAAU,EAAE,UAAU,YAAY,YAAY,UAAU,SAAS,QAAS,GAC1EC,KAAqB;AAAA,QACpB,eAAe;AAAA,QACf,YAAY;AAAA,MACd;AAEA,eAASC,GAAmBpc,GAAOoB,GAAOib,GAAW;AAIpD,YAAI/wB,IAAU+nB,EAAQ,KAAMjS,CAAK;AACjC,eAAO9V;AAAA;AAAA,UAGN,KAAK,IAAK,GAAGA,EAAS,CAAG,KAAK+wB,KAAY,EAAG,KAAO/wB,EAAS,CAAC,KAAM;AAAA,YACpE8V;AAAA,MACD;AAED,eAASkb,GAAoBvc,GAAMwc,GAAWC,GAAKC,GAAaC,GAAQC,GAAc;AACrF,YAAI/wB,IAAI2wB,MAAc,UAAU,IAAI,GACnCK,IAAQ,GACRzjB,IAAQ;AAGT,YAAKqjB,OAAUC,IAAc,WAAW;AACvC,iBAAO;AAGR,eAAQ7wB,IAAI,GAAGA,KAAK;AAGnB,UAAK4wB,MAAQ,aACZrjB,KAASqG,EAAO,IAAKO,GAAMyc,IAAMlJ,EAAW1nB,CAAG,GAAE,IAAM8wB,KAIlDD,KAmBAD,MAAQ,cACZrjB,KAASqG,EAAO,IAAKO,GAAM,YAAYuT,EAAW1nB,CAAG,GAAE,IAAM8wB,KAIzDF,MAAQ,aACZrjB,KAASqG,EAAO,IAAKO,GAAM,WAAWuT,EAAW1nB,KAAM,SAAS,IAAM8wB,CAAM,OAtB7EvjB,KAASqG,EAAO,IAAKO,GAAM,YAAYuT,EAAW1nB,CAAG,GAAE,IAAM8wB,IAGxDF,MAAQ,YACZrjB,KAASqG,EAAO,IAAKO,GAAM,WAAWuT,EAAW1nB,KAAM,SAAS,IAAM8wB,CAAM,IAI5EE,KAASpd,EAAO,IAAKO,GAAM,WAAWuT,EAAW1nB,KAAM,SAAS,IAAM8wB,CAAM;AAoB/E,eAAK,CAACD,KAAeE,KAAe,MAInCxjB,KAAS,KAAK,IAAK,GAAG,KAAK;AAAA,UAC1B4G,EAAM,WAAWwc,EAAW,CAAG,EAAC,YAAW,IAAKA,EAAU,MAAO,EAAK,IACtEI,IACAxjB,IACAyjB,IACA;AAAA;AAAA;AAAA,QAIA,CAAA,KAAM,IAGDzjB;AAAA,MACP;AAED,eAAS0jB,GAAkB9c,GAAMwc,GAAWK,GAAQ;AAGnD,YAAIF,IAAS7C,GAAW9Z,CAAM,GAI7B+c,IAAkB,CAACne,GAAQ,kBAAiB,KAAMie,GAClDH,IAAcK,KACbtd,EAAO,IAAKO,GAAM,aAAa,IAAO2c,CAAM,MAAO,cACpDK,IAAmBN,GAEnBrd,IAAM4b,GAAQjb,GAAMwc,GAAWG,CAAQ,GACvCM,IAAa,WAAWT,EAAW,CAAG,EAAC,YAAW,IAAKA,EAAU,MAAO;AAIzE,YAAK3C,GAAU,KAAMxa,IAAQ;AAC5B,cAAK,CAACwd;AACL,mBAAOxd;AAER,UAAAA,IAAM;AAAA,QACN;AAMD,gBAAO,CAACT,GAAQ,kBAAiB,KAAM8d;AAAA;AAAA;AAAA;AAAA,QAMtC,CAAC9d,GAAQ,qBAAoB,KAAMsJ,GAAUlI,GAAM,IAAM;AAAA;AAAA,QAIzDX,MAAQ;AAAA;AAAA,QAIR,CAAC,WAAYA,CAAK,KAAII,EAAO,IAAKO,GAAM,WAAW,IAAO2c,CAAM,MAAO;AAAA,QAGvE3c,EAAK,eAAgB,EAAC,WAEtB0c,IAAcjd,EAAO,IAAKO,GAAM,aAAa,IAAO2c,CAAQ,MAAK,cAKjEK,IAAmBC,KAAcjd,GAC5Bgd,MACJ3d,IAAMW,EAAMid,MAKd5d,IAAM,WAAYA,CAAK,KAAI,GAGlBA,IACRkd;AAAA,UACCvc;AAAA,UACAwc;AAAA,UACAK,MAAWH,IAAc,WAAW;AAAA,UACpCM;AAAA,UACAL;AAAA;AAAA,UAGAtd;AAAA,QACA,IACE;AAAA,MACJ;AAED,MAAAI,EAAO,OAAQ;AAAA;AAAA;AAAA,QAId,UAAU;AAAA,UACT,SAAS;AAAA,YACR,KAAK,SAAUO,GAAMkb,GAAW;AAC/B,kBAAKA,GAAW;AAGf,oBAAIpb,IAAMmb,GAAQjb,GAAM,SAAS;AACjC,uBAAOF,MAAQ,KAAK,MAAMA;AAAA,cAC1B;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA;AAAA,QAGD,WAAW;AAAA,UACV,yBAA2B;AAAA,UAC3B,aAAe;AAAA,UACf,aAAe;AAAA,UACf,UAAY;AAAA,UACZ,YAAc;AAAA,UACd,YAAc;AAAA,UACd,UAAY;AAAA,UACZ,YAAc;AAAA,UACd,eAAiB;AAAA,UACjB,iBAAmB;AAAA,UACnB,SAAW;AAAA,UACX,YAAc;AAAA,UACd,cAAgB;AAAA,UAChB,YAAc;AAAA,UACd,SAAW;AAAA,UACX,OAAS;AAAA,UACT,SAAW;AAAA,UACX,QAAU;AAAA,UACV,QAAU;AAAA,UACV,MAAQ;AAAA,QACR;AAAA;AAAA;AAAA,QAID,UAAU,CAAE;AAAA;AAAA,QAGZ,OAAO,SAAUE,GAAMI,GAAMiB,GAAOwb,GAAQ;AAG3C,cAAK,GAAC7c,KAAQA,EAAK,aAAa,KAAKA,EAAK,aAAa,KAAK,CAACA,EAAK,QAKlE;AAAA,gBAAIF,GAAKyB,GAAM0R,GACdiK,IAAW9K,GAAWhS,CAAM,GAC5B+c,IAAejB,GAAY,KAAM9b,CAAM,GACvCkb,IAAQtb,EAAK;AAad,gBARMmd,MACL/c,IAAO2b,GAAemB,KAIvBjK,IAAQxT,EAAO,SAAUW,CAAM,KAAIX,EAAO,SAAUyd,IAG/C7b,MAAU,QAAY;AAY1B,kBAXAE,IAAO,OAAOF,GAGTE,MAAS,aAAczB,IAAMwT,EAAQ,KAAMjS,OAAavB,EAAK,OACjEuB,IAAQuS,GAAW5T,GAAMI,GAAMN,CAAG,GAGlCyB,IAAO,WAIHF,KAAS,QAAQA,MAAUA;AAC/B;AAMD,cAAKE,MAAS,YAAY,CAAC4b,MAC1B9b,KAASvB,KAAOA,EAAK,OAASL,EAAO,UAAWyd,CAAU,IAAG,KAAK,QAI9D,CAACte,GAAQ,mBAAmByC,MAAU,MAAMjB,EAAK,QAAS,YAAc,MAAK,MACjFkb,EAAOlb,CAAM,IAAG,aAIZ,CAAC6S,KAAS,EAAG,SAASA,OACxB5R,IAAQ4R,EAAM,IAAKjT,GAAMqB,GAAOwb,CAAO,OAAO,YAE3CM,IACJ7B,EAAM,YAAalb,GAAMiB,KAEzBia,EAAOlb,CAAM,IAAGiB;AAAA,YAIrB;AAGG,qBAAK4R,KAAS,SAASA,MACpBnT,IAAMmT,EAAM,IAAKjT,GAAM,IAAO6c,CAAO,OAAO,SAEvC/c,IAIDwb,EAAOlb;;QAEf;AAAA,QAED,KAAK,SAAUJ,GAAMI,GAAMyc,GAAOF,GAAS;AAC1C,cAAItd,GAAKO,GAAKqT,GACbiK,IAAW9K,GAAWhS,CAAM,GAC5B+c,IAAejB,GAAY,KAAM9b;AA4BlC,iBAvBM+c,MACL/c,IAAO2b,GAAemB,KAIvBjK,IAAQxT,EAAO,SAAUW,CAAM,KAAIX,EAAO,SAAUyd,IAG/CjK,KAAS,SAASA,MACtB5T,IAAM4T,EAAM,IAAKjT,GAAM,IAAM6c,CAAK,IAI9Bxd,MAAQ,WACZA,IAAM4b,GAAQjb,GAAMI,GAAMuc,CAAM,IAI5Btd,MAAQ,YAAYe,KAAQgc,OAChC/c,IAAM+c,GAAoBhc,KAItByc,MAAU,MAAMA,KACpBjd,IAAM,WAAYP,IACXwd,MAAU,MAAQ,SAAUjd,CAAG,IAAKA,KAAO,IAAIP,KAGhDA;AAAA,QACP;AAAA,MACF,IAEAI,EAAO,KAAM,CAAE,UAAU,OAAO,GAAI,SAAU6B,GAAIkb,GAAY;AAC7D,QAAA/c,EAAO,SAAU+c,KAAc;AAAA,UAC9B,KAAK,SAAUxc,GAAMkb,GAAU2B,GAAQ;AACtC,gBAAK3B;AAIJ,qBAAOe,GAAa,KAAMxc,EAAO,IAAKO,GAAM,UAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQtD,CAACA,EAAK,iBAAiB,UAAU,CAACA,EAAK,sBAAuB,EAAC,SAChEga,GAAMha,GAAMmc,IAAS,WAAW;AAC/B,uBAAOW,GAAkB9c,GAAMwc,GAAWK,CAAK;AAAA,cACtD,CAAS,IACHC,GAAkB9c,GAAMwc,GAAWK;UAEtC;AAAA,UAED,KAAK,SAAU7c,GAAMqB,GAAOwb,GAAQ;AACnC,gBAAItxB,GACHoxB,IAAS7C,GAAW9Z,CAAM,GAI1Bod,IAAqB,CAACxe,GAAQ,cAAe,KAC5C+d,EAAO,aAAa,YAGrBI,IAAkBK,KAAsBP,GACxCH,IAAcK,KACbtd,EAAO,IAAKO,GAAM,aAAa,IAAO2c,CAAM,MAAO,cACpDL,IAAWO,IACVN;AAAA,cACCvc;AAAA,cACAwc;AAAA,cACAK;AAAA,cACAH;AAAA,cACAC;AAAA,YACA,IACD;AAIF,mBAAKD,KAAeU,MACnBd,KAAY,KAAK;AAAA,cAChBtc,EAAM,WAAWwc,EAAW,CAAG,EAAC,YAAW,IAAKA,EAAU,MAAO,EAAK,IACtE,WAAYG,EAAQH,EAAa,IACjCD,GAAoBvc,GAAMwc,GAAW,UAAU,IAAOG,CAAQ,IAC9D;AAAA,YACL,IAIQL,MAAc/wB,IAAU+nB,EAAQ,KAAMjS,CAAK,OAC7C9V,EAAS,MAAO,UAAW,SAE7ByU,EAAK,MAAOwc,CAAW,IAAGnb,GAC1BA,IAAQ5B,EAAO,IAAKO,GAAMwc,CAAS,IAG7BH,GAAmBrc,GAAMqB,GAAOib,CAAQ;AAAA,UAC/C;AAAA,QACH;AAAA,MACA,IAEA7c,EAAO,SAAS,aAAa8b;AAAA,QAAc3c,GAAQ;AAAA,QAClD,SAAUoB,GAAMkb,GAAW;AAC1B,cAAKA;AACJ,oBAAS,WAAYD,GAAQjb,GAAM,YAAY,CAAI,KAClDA,EAAK,sBAAqB,EAAG,OAC5Bga,GAAMha,GAAM,EAAE,YAAY,EAAG,GAAE,WAAW;AACzC,qBAAOA,EAAK,sBAAuB,EAAC;AAAA,YAC1C,CAAQ,KACA;AAAA,QAEN;AAAA,MACF,GAGAP,EAAO,KAAM;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,MACT,GAAG,SAAUvY,GAAQm2B,GAAS;AAC7B,QAAA5d,EAAO,SAAUvY,IAASm2B,KAAW;AAAA,UACpC,QAAQ,SAAUhc,GAAQ;AAOzB,qBANIxV,IAAI,GACPyxB,IAAW,CAAE,GAGbC,IAAQ,OAAOlc,KAAU,WAAWA,EAAM,MAAO,GAAG,IAAK,CAAEA,IAEpDxV,IAAI,GAAGA;AACd,cAAAyxB,EAAUp2B,IAASqsB,EAAW1nB,CAAC,IAAKwxB,CAAQ,IAC3CE,EAAO1xB,CAAG,KAAI0xB,EAAO1xB,IAAI,MAAO0xB,EAAO;AAGzC,mBAAOD;AAAA,UACP;AAAA,QACH,GAEMp2B,MAAW,aACfuY,EAAO,SAAUvY,IAASm2B,CAAM,EAAG,MAAMhB;AAAA,MAE3C,IAEA5c,EAAO,GAAG,OAAQ;AAAA,QACjB,KAAK,SAAUW,GAAMiB,GAAQ;AAC5B,iBAAOoQ,GAAQ,MAAM,SAAUzR,GAAMI,GAAMiB,GAAQ;AAClD,gBAAIsb,GAAQzc,GACX8K,IAAM,CAAE,GACRnf,IAAI;AAEL,gBAAK,MAAM,QAASuU,IAAS;AAI5B,mBAHAuc,IAAS7C,GAAW9Z,IACpBE,IAAME,EAAK,QAEHvU,IAAIqU,GAAKrU;AAChB,gBAAAmf,EAAK5K,EAAMvU,CAAG,CAAA,IAAK4T,EAAO,IAAKO,GAAMI,EAAMvU,CAAC,GAAI,IAAO8wB,CAAM;AAG9D,qBAAO3R;AAAA,YACP;AAED,mBAAO3J,MAAU,SAChB5B,EAAO,MAAOO,GAAMI,GAAMiB,CAAO,IACjC5B,EAAO,IAAKO,GAAMI;UACnB,GAAEA,GAAMiB,GAAO,UAAU,SAAS,CAAC;AAAA,QACpC;AAAA,MACF;AAGA,eAASmc,GAAOxd,GAAMG,GAASsS,GAAMgL,GAAKC,GAAS;AAClD,eAAO,IAAIF,GAAM,UAAU,KAAMxd,GAAMG,GAASsS,GAAMgL,GAAKC;MAC3D;AACD,MAAAje,EAAO,QAAQ+d,IAEfA,GAAM,YAAY;AAAA,QACjB,aAAaA;AAAA,QACb,MAAM,SAAUxd,GAAMG,GAASsS,GAAMgL,GAAKC,GAAQvJ,GAAO;AACxD,eAAK,OAAOnU,GACZ,KAAK,OAAOyS,GACZ,KAAK,SAASiL,KAAUje,EAAO,OAAO,UACtC,KAAK,UAAUU,GACf,KAAK,QAAQ,KAAK,MAAM,KAAK,IAAG,GAChC,KAAK,MAAMsd,GACX,KAAK,OAAOtJ,MAAU1U,EAAO,UAAWgT,CAAM,IAAG,KAAK;AAAA,QACtD;AAAA,QACD,KAAK,WAAW;AACf,cAAIQ,IAAQuK,GAAM,UAAW,KAAK,IAAI;AAEtC,iBAAOvK,KAASA,EAAM,MACrBA,EAAM,IAAK,IAAM,IACjBuK,GAAM,UAAU,SAAS,IAAK,IAAI;AAAA,QACnC;AAAA,QACD,KAAK,SAAUG,GAAU;AACxB,cAAIC,GACH3K,IAAQuK,GAAM,UAAW,KAAK,IAAI;AAEnC,iBAAK,KAAK,QAAQ,WACjB,KAAK,MAAMI,IAAQne,EAAO,OAAQ,KAAK,MAAQ;AAAA,YAC9Cke;AAAA,YAAS,KAAK,QAAQ,WAAWA;AAAA,YAAS;AAAA,YAAG;AAAA,YAAG,KAAK,QAAQ;AAAA,UACjE,IAEG,KAAK,MAAMC,IAAQD,GAEpB,KAAK,OAAQ,KAAK,MAAM,KAAK,SAAUC,IAAQ,KAAK,OAE/C,KAAK,QAAQ,QACjB,KAAK,QAAQ,KAAK,KAAM,KAAK,MAAM,KAAK,KAAK,OAGzC3K,KAASA,EAAM,MACnBA,EAAM,IAAK,QAEXuK,GAAM,UAAU,SAAS,IAAK,IAAI,GAE5B;AAAA,QACP;AAAA,MACF,GAEAA,GAAM,UAAU,KAAK,YAAYA,GAAM,WAEvCA,GAAM,YAAY;AAAA,QACjB,UAAU;AAAA,UACT,KAAK,SAAU1J,GAAQ;AACtB,gBAAI5c;AAIJ,mBAAK4c,EAAM,KAAK,aAAa,KAC5BA,EAAM,KAAMA,EAAM,IAAM,KAAI,QAAQA,EAAM,KAAK,MAAOA,EAAM,IAAI,KAAM,OAC/DA,EAAM,KAAMA,EAAM,IAAI,KAO9B5c,IAASuI,EAAO,IAAKqU,EAAM,MAAMA,EAAM,MAAM,KAGtC,CAAC5c,KAAUA,MAAW,SAAS,IAAIA;AAAA,UAC1C;AAAA,UACD,KAAK,SAAU4c,GAAQ;AAKtB,YAAKrU,EAAO,GAAG,KAAMqU,EAAM,IAAI,IAC9BrU,EAAO,GAAG,KAAMqU,EAAM,IAAI,EAAIA,KACnBA,EAAM,KAAK,aAAa,MAClCrU,EAAO,SAAUqU,EAAM,IAAM,KAC7BA,EAAM,KAAK,MAAOiI,GAAejI,EAAM,IAAM,CAAA,KAAM,QACpDrU,EAAO,MAAOqU,EAAM,MAAMA,EAAM,MAAMA,EAAM,MAAMA,EAAM,QAExDA,EAAM,KAAMA,EAAM,IAAI,IAAKA,EAAM;AAAA,UAElC;AAAA,QACD;AAAA,MACF,GAIA0J,GAAM,UAAU,YAAYA,GAAM,UAAU,aAAa;AAAA,QACxD,KAAK,SAAU1J,GAAQ;AACtB,UAAKA,EAAM,KAAK,YAAYA,EAAM,KAAK,eACtCA,EAAM,KAAMA,EAAM,IAAI,IAAKA,EAAM;AAAA,QAElC;AAAA,MACF,GAEArU,EAAO,SAAS;AAAA,QACf,QAAQ,SAAUvM,GAAI;AACrB,iBAAOA;AAAA,QACP;AAAA,QACD,OAAO,SAAUA,GAAI;AACpB,iBAAO,MAAM,KAAK,IAAKA,IAAI,KAAK,EAAI,IAAG;AAAA,QACvC;AAAA,QACD,UAAU;AAAA,MACX,GAEAuM,EAAO,KAAK+d,GAAM,UAAU,MAG5B/d,EAAO,GAAG,OAAO;AAKjB,UACCoe,IAAOC,IACPC,KAAW,0BACXC,KAAO;AAER,eAASC,KAAW;AACnB,QAAKH,OACC9e,GAAS,WAAW,MAASjB,EAAO,wBACxCA,EAAO,sBAAuBkgB,MAE9BlgB,EAAO,WAAYkgB,IAAUxe,EAAO,GAAG,QAAQ,GAGhDA,EAAO,GAAG;MAEX;AAGD,eAASye,KAAc;AACtB,eAAAngB,EAAO,WAAY,WAAW;AAC7B,UAAA8f,KAAQ;AAAA,QACV,IACUA,KAAQ,KAAK;MACtB;AAGD,eAASM,GAAO5c,GAAM6c,GAAe;AACpC,YAAIC,GACHxyB,IAAI,GACJya,IAAQ,EAAE,QAAQ/E;AAKnB,aADA6c,IAAeA,IAAe,IAAI,GAC1BvyB,IAAI,GAAGA,KAAK,IAAIuyB;AACvB,UAAAC,IAAQ9K,EAAW1nB,IACnBya,EAAO,WAAW+X,CAAO,IAAG/X,EAAO,YAAY+X,CAAO,IAAG9c;AAG1D,eAAK6c,MACJ9X,EAAM,UAAUA,EAAM,QAAQ/E,IAGxB+E;AAAA,MACP;AAED,eAASgY,GAAajd,GAAOoR,GAAM8L,GAAY;AAK9C,iBAJIzK,GACH9jB,KAAewuB,GAAU,SAAU/L,CAAM,KAAI,IAAK,OAAQ+L,GAAU,SAAU,IAAO,GACrFl3B,IAAQ,GACRmZ,IAASzQ,EAAW,QACb1I,IAAQmZ,GAAQnZ;AACvB,cAAOwsB,IAAQ9jB,EAAY1I,CAAO,EAAC,KAAMi3B,GAAW9L,GAAMpR;AAGzD,mBAAOyS;AAAA,MAGT;AAED,eAAS2K,GAAkBze,GAAM6X,GAAO6G,GAAO;AAC9C,YAAIjM,GAAMpR,GAAOsd,GAAQ1L,GAAO2L,GAASC,GAAWC,GAAgBvK,GACnEwK,IAAQ,WAAWlH,KAAS,YAAYA,GACxCmH,IAAO,MACPhH,IAAO,CAAE,GACTsD,IAAQtb,EAAK,OACbif,KAASjf,EAAK,YAAY2T,GAAoB3T,CAAM,GACpDkf,IAAWxM,EAAS,IAAK1S,GAAM,QAAQ;AAGxC,QAAM0e,EAAK,UACVzL,IAAQxT,EAAO,YAAaO,GAAM,IAAI,GACjCiT,EAAM,YAAY,SACtBA,EAAM,WAAW,GACjB2L,IAAU3L,EAAM,MAAM,MACtBA,EAAM,MAAM,OAAO,WAAW;AAC7B,UAAMA,EAAM,YACX2L;QAEL,IAEE3L,EAAM,YAEN+L,EAAK,OAAQ,WAAW;AAGvB,UAAAA,EAAK,OAAQ,WAAW;AACvB,YAAA/L,EAAM,YACAxT,EAAO,MAAOO,GAAM,IAAI,EAAG,UAChCiT,EAAM,MAAM;UAEjB;QACA;AAIC,aAAMR,KAAQoF;AAEb,cADAxW,IAAQwW,EAAOpF,IACVsL,GAAS,KAAM1c,IAAU;AAG7B,gBAFA,OAAOwW,EAAOpF,IACdkM,IAASA,KAAUtd,MAAU,UACxBA,OAAY4d,KAAS,SAAS;AAIlC,kBAAK5d,MAAU,UAAU6d,KAAYA,EAAUzM,CAAM,MAAK;AACzD,gBAAAwM,KAAS;AAAA;AAIT;AAGF,YAAAjH,EAAMvF,CAAI,IAAKyM,KAAYA,EAAUzM,MAAUhT,EAAO,MAAOO,GAAMyS;UACnE;AAKF,YADAoM,IAAY,CAACpf,EAAO,cAAeoY,CAAK,GACnC,GAACgH,KAAapf,EAAO,cAAeuY,CAAI,IAK7C;AAAA,UAAK+G,KAAS/e,EAAK,aAAa,MAM/B0e,EAAK,WAAW,CAAEpD,EAAM,UAAUA,EAAM,WAAWA,EAAM,YAGzDwD,IAAiBI,KAAYA,EAAS,SACjCJ,KAAkB,SACtBA,IAAiBpM,EAAS,IAAK1S,GAAM,SAAS,IAE/CuU,IAAU9U,EAAO,IAAKO,GAAM,SAAS,GAChCuU,MAAY,WACXuK,IACJvK,IAAUuK,KAIVtK,GAAU,CAAExU,IAAQ,KACpB8e,IAAiB9e,EAAK,MAAM,WAAW8e,GACvCvK,IAAU9U,EAAO,IAAKO,GAAM,SAAS,GACrCwU,GAAU,CAAExU,CAAI,OAKbuU,MAAY,YAAYA,MAAY,kBAAkBuK,KAAkB,SACvErf,EAAO,IAAKO,GAAM,OAAO,MAAO,WAG9B6e,MACLG,EAAK,KAAM,WAAW;AACrB,YAAA1D,EAAM,UAAUwD;AAAA,UACtB,IACUA,KAAkB,SACtBvK,IAAU+G,EAAM,SAChBwD,IAAiBvK,MAAY,SAAS,KAAKA,KAG7C+G,EAAM,UAAU,kBAKdoD,EAAK,aACTpD,EAAM,WAAW,UACjB0D,EAAK,OAAQ,WAAW;AACvB,YAAA1D,EAAM,WAAWoD,EAAK,SAAU,CAAC,GACjCpD,EAAM,YAAYoD,EAAK,SAAU,CAAC,GAClCpD,EAAM,YAAYoD,EAAK,SAAU,CAAC;AAAA,UACrC,KAICG,IAAY;AACZ,eAAMpM,KAAQuF;AAGb,YAAM6G,MACAK,IACC,YAAYA,MAChBD,KAASC,EAAS,UAGnBA,IAAWxM,EAAS,OAAQ1S,GAAM,UAAU,EAAE,SAAS8e,EAAc,IAIjEH,MACJO,EAAS,SAAS,CAACD,KAIfA,MACJzK,GAAU,CAAExU,IAAQ,KAKrBgf,EAAK,KAAM,WAAW;AAKrB,cAAMC,MACLzK,GAAU,CAAExU,CAAI,IAEjB0S,EAAS,OAAQ1S,GAAM;AACvB,mBAAMyS,KAAQuF;AACb,gBAAAvY,EAAO,MAAOO,GAAMyS,GAAMuF,EAAMvF,CAAI;YAEzC,KAIEoM,IAAYP,GAAaW,KAASC,EAAUzM,CAAI,IAAK,GAAGA,GAAMuM,IACtDvM,KAAQyM,MACfA,EAAUzM,CAAI,IAAKoM,EAAU,OACxBI,OACJJ,EAAU,MAAMA,EAAU,OAC1BA,EAAU,QAAQ;AAAA;AAAA,MAIrB;AAED,eAASM,GAAYtH,GAAOuH,GAAgB;AAC3C,YAAI93B,GAAO8Y,GAAMsd,GAAQrc,GAAO4R;AAGhC,aAAM3rB,KAASuwB;AAed,cAdAzX,IAAOgS,GAAW9qB,IAClBo2B,IAAS0B,EAAehf,IACxBiB,IAAQwW,EAAOvwB,IACV,MAAM,QAAS+Z,OACnBqc,IAASrc,EAAO,IAChBA,IAAQwW,EAAOvwB,CAAO,IAAG+Z,EAAO,CAAC,IAG7B/Z,MAAU8Y,MACdyX,EAAOzX,CAAM,IAAGiB,GAChB,OAAOwW,EAAOvwB,KAGf2rB,IAAQxT,EAAO,SAAUW,IACpB6S,KAAS,YAAYA,GAAQ;AACjC,YAAA5R,IAAQ4R,EAAM,OAAQ5R,IACtB,OAAOwW,EAAOzX;AAId,iBAAM9Y,KAAS+Z;AACd,cAAQ/Z,KAASuwB,MAChBA,EAAOvwB,CAAK,IAAK+Z,EAAO/Z,CAAK,GAC7B83B,EAAe93B,CAAO,IAAGo2B;AAAA,UAG9B;AACG,YAAA0B,EAAehf,CAAM,IAAGsd;AAAA,MAG1B;AAED,eAASc,GAAWxe,GAAMqf,GAAYlf,GAAU;AAC/C,YAAIjJ,GACHooB,GACAh4B,IAAQ,GACRmZ,IAAS+d,GAAU,WAAW,QAC9B1O,IAAWrQ,EAAO,SAAU,EAAC,OAAQ,WAAW;AAG/C,iBAAO8f,EAAK;AAAA,QACf,CAAK,GACHA,IAAO,WAAW;AACjB,cAAKD;AACJ,mBAAO;AAYR,mBAVIE,IAAc3B,MAASK,GAAa,GACvCpN,IAAY,KAAK,IAAK,GAAGyN,EAAU,YAAYA,EAAU,WAAWiB,CAAa,GAIjF/T,IAAOqF,IAAYyN,EAAU,YAAY,GACzCZ,IAAU,IAAIlS,GACdnkB,KAAQ,GACRmZ,IAAS8d,EAAU,OAAO,QAEnBj3B,KAAQmZ,GAAQnZ;AACvB,YAAAi3B,EAAU,OAAQj3B,EAAO,EAAC,IAAKq2B,CAAO;AAMvC,iBAHA7N,EAAS,WAAY9P,GAAM,CAAEue,GAAWZ,GAAS7M,CAAS,IAGrD6M,IAAU,KAAKld,IACZqQ,KAIFrQ,KACLqP,EAAS,WAAY9P,GAAM,CAAEue,GAAW,GAAG,CAAC,IAI7CzO,EAAS,YAAa9P,GAAM,CAAEue,CAAW,CAAA,GAClC;AAAA,QACP,GACDA,IAAYzO,EAAS,QAAS;AAAA,UAC7B,MAAM9P;AAAA,UACN,OAAOP,EAAO,OAAQ,CAAA,GAAI4f,CAAY;AAAA,UACtC,MAAM5f,EAAO,OAAQ,IAAM;AAAA,YAC1B,eAAe,CAAE;AAAA,YACjB,QAAQA,EAAO,OAAO;AAAA,UACtB,GAAEU,CAAS;AAAA,UACZ,oBAAoBkf;AAAA,UACpB,iBAAiBlf;AAAA,UACjB,WAAW0d,MAASK,GAAa;AAAA,UACjC,UAAU/d,EAAQ;AAAA,UAClB,QAAQ,CAAE;AAAA,UACV,aAAa,SAAUsS,GAAMgL,GAAM;AAClC,gBAAI3J,IAAQrU,EAAO;AAAA,cAAOO;AAAA,cAAMue,EAAU;AAAA,cAAM9L;AAAA,cAAMgL;AAAA,cACpDc,EAAU,KAAK,cAAe9L,CAAM,KAAI8L,EAAU,KAAK;AAAA;AACzD,mBAAAA,EAAU,OAAO,KAAMzK,IAChBA;AAAA,UACP;AAAA,UACD,MAAM,SAAU2L,GAAU;AACzB,gBAAIn4B,IAAQ,GAIXmZ,IAASgf,IAAUlB,EAAU,OAAO,SAAS;AAC9C,gBAAKe;AACJ,qBAAO;AAGR,iBADAA,IAAU,IACFh4B,IAAQmZ,GAAQnZ;AACvB,cAAAi3B,EAAU,OAAQj3B,CAAO,EAAC,IAAK,CAAC;AAIjC,mBAAKm4B,KACJ3P,EAAS,WAAY9P,GAAM,CAAEue,GAAW,GAAG,CAAC,IAC5CzO,EAAS,YAAa9P,GAAM,CAAEue,GAAWkB,CAAS,CAAA,KAElD3P,EAAS,WAAY9P,GAAM,CAAEue,GAAWkB,CAAS,CAAA,GAE3C;AAAA,UACP;AAAA,QACJ,CAAK,GACH5H,IAAQ0G,EAAU;AAInB,aAFAY,GAAYtH,GAAO0G,EAAU,KAAK,aAAa,GAEvCj3B,IAAQmZ,GAAQnZ;AAEvB,cADA4P,IAASsnB,GAAU,WAAYl3B,GAAQ,KAAMi3B,GAAWve,GAAM6X,GAAO0G,EAAU,IAAI,GAC9ErnB;AACJ,mBAAK2H,EAAY3H,EAAO,UACvBuI,EAAO,YAAa8e,EAAU,MAAMA,EAAU,KAAK,KAAK,EAAG,OAC1DrnB,EAAO,KAAK,KAAMA,KAEbA;AAIT,eAAAuI,EAAO,IAAKoY,GAAOyG,IAAaC,CAAS,GAEpC1f,EAAY0f,EAAU,KAAK,KAAK,KACpCA,EAAU,KAAK,MAAM,KAAMve,GAAMue,CAAS,GAI3CA,EACE,SAAUA,EAAU,KAAK,QAAU,EACnC,KAAMA,EAAU,KAAK,MAAMA,EAAU,KAAK,QAAU,EACpD,KAAMA,EAAU,KAAK,IAAM,EAC3B,OAAQA,EAAU,KAAK,SAEzB9e,EAAO,GAAG;AAAA,UACTA,EAAO,OAAQ8f,GAAM;AAAA,YACpB,MAAMvf;AAAA,YACN,MAAMue;AAAA,YACN,OAAOA,EAAU,KAAK;AAAA,UACzB,CAAK;AAAA,QACL,GAEQA;AAAA,MACP;AAED,MAAA9e,EAAO,YAAYA,EAAO,OAAQ+e,IAAW;AAAA,QAE5C,UAAU;AAAA,UACT,KAAK,CAAE,SAAU/L,GAAMpR,GAAQ;AAC9B,gBAAIyS,IAAQ,KAAK,YAAarB,GAAMpR,CAAK;AACzC,mBAAAuS,GAAWE,EAAM,MAAMrB,GAAMa,EAAQ,KAAMjS,IAASyS,IAC7CA;AAAA,UACV,CAAK;AAAA,QACH;AAAA,QAED,SAAS,SAAU+D,GAAO9X,GAAW;AACpC,UAAKlB,EAAYgZ,MAChB9X,IAAW8X,GACXA,IAAQ,CAAE,QAEVA,IAAQA,EAAM,MAAOxJ;AAOtB,mBAJIoE,GACHnrB,IAAQ,GACRmZ,IAASoX,EAAM,QAERvwB,IAAQmZ,GAAQnZ;AACvB,YAAAmrB,IAAOoF,EAAOvwB,IACdk3B,GAAU,SAAU/L,CAAM,IAAG+L,GAAU,SAAU/L,CAAM,KAAI,IAC3D+L,GAAU,SAAU/L,CAAM,EAAC,QAAS1S,CAAQ;AAAA,QAE7C;AAAA,QAED,YAAY,CAAE0e,EAAkB;AAAA,QAEhC,WAAW,SAAU1e,GAAU2f,GAAU;AACxC,UAAKA,IACJlB,GAAU,WAAW,QAASze,KAE9Bye,GAAU,WAAW,KAAMze;QAE5B;AAAA,MACF,IAEAN,EAAO,QAAQ,SAAUkgB,GAAOjC,GAAQxX,GAAK;AAC5C,YAAI0Z,IAAMD,KAAS,OAAOA,KAAU,WAAWlgB,EAAO,OAAQ,IAAIkgB,KAAU;AAAA,UAC3E,UAAUzZ,KAAM,CAACA,KAAMwX,KACtB7e,EAAY8gB,CAAK,KAAMA;AAAA,UACxB,UAAUA;AAAA,UACV,QAAQzZ,KAAMwX,KAAUA,KAAU,CAAC7e,EAAY6e,CAAM,KAAMA;AAAA,QAC7D;AAGC,eAAKje,EAAO,GAAG,MACdmgB,EAAI,WAAW,IAGV,OAAOA,EAAI,YAAa,aACvBA,EAAI,YAAYngB,EAAO,GAAG,SAC9BmgB,EAAI,WAAWngB,EAAO,GAAG,OAAQmgB,EAAI,YAGrCA,EAAI,WAAWngB,EAAO,GAAG,OAAO,YAM9BmgB,EAAI,SAAS,QAAQA,EAAI,UAAU,QACvCA,EAAI,QAAQ,OAIbA,EAAI,MAAMA,EAAI,UAEdA,EAAI,WAAW,WAAW;AACzB,UAAK/gB,EAAY+gB,EAAI,QACpBA,EAAI,IAAI,KAAM,OAGVA,EAAI,SACRngB,EAAO,QAAS,MAAMmgB,EAAI,KAAK;AAAA,QAElC,GAEQA;AAAA,MACR,GAEAngB,EAAO,GAAG,OAAQ;AAAA,QACjB,QAAQ,SAAUkgB,GAAOE,GAAInC,GAAQ3d,GAAW;AAG/C,iBAAO,KAAK,OAAQ4T,EAAoB,EAAC,IAAK,WAAW,CAAG,EAAC,KAAM,EAGjE,IAAK,EAAC,QAAS,EAAE,SAASkM,EAAE,GAAIF,GAAOjC,GAAQ3d;QACjD;AAAA,QACD,SAAS,SAAU0S,GAAMkN,GAAOjC,GAAQ3d,GAAW;AAClD,cAAI+f,IAAQrgB,EAAO,cAAegT,CAAM,GACvCsN,IAAStgB,EAAO,MAAOkgB,GAAOjC,GAAQ3d,CAAU,GAChDigB,IAAc,WAAW;AAGxB,gBAAIhB,IAAOR,GAAW,MAAM/e,EAAO,OAAQ,IAAIgT,IAAQsN;AAGvD,aAAKD,KAASpN,EAAS,IAAK,MAAM,QAAQ,MACzCsM,EAAK,KAAM;UAEhB;AACG,iBAAAgB,EAAY,SAASA,GAEfF,KAASC,EAAO,UAAU,KAChC,KAAK,KAAMC,CAAa,IACxB,KAAK,MAAOD,EAAO,OAAOC,CAAW;AAAA,QACtC;AAAA,QACD,MAAM,SAAUze,GAAM0e,GAAYR,GAAU;AAC3C,cAAIS,IAAY,SAAUjN,GAAQ;AACjC,gBAAIkN,IAAOlN,EAAM;AACjB,mBAAOA,EAAM,MACbkN,EAAMV,CAAO;AAAA,UAChB;AAEE,iBAAK,OAAOle,KAAS,aACpBke,IAAUQ,GACVA,IAAa1e,GACbA,IAAO,SAEH0e,KACJ,KAAK,MAAO1e,KAAQ,MAAM,CAAE,CAAA,GAGtB,KAAK,KAAM,WAAW;AAC5B,gBAAI6e,IAAU,IACb94B,IAAQia,KAAQ,QAAQA,IAAO,cAC/B8e,IAAS5gB,EAAO,QAChBxZ,IAAOysB,EAAS,IAAK;AAEtB,gBAAKprB;AACJ,cAAKrB,EAAMqB,CAAO,KAAIrB,EAAMqB,CAAK,EAAG,QACnC44B,EAAWj6B,EAAMqB,CAAK;;AAGvB,mBAAMA,KAASrB;AACd,gBAAKA,EAAMqB,CAAO,KAAIrB,EAAMqB,GAAQ,QAAQ02B,GAAK,KAAM12B,MACtD44B,EAAWj6B,EAAMqB,CAAK;AAKzB,iBAAMA,IAAQ+4B,EAAO,QAAQ/4B;AAC5B,cAAK+4B,EAAQ/4B,GAAQ,SAAS,SAC3Bia,KAAQ,QAAQ8e,EAAQ/4B,CAAK,EAAG,UAAUia,OAE5C8e,EAAQ/4B,CAAO,EAAC,KAAK,KAAMm4B,CAAO,GAClCW,IAAU,IACVC,EAAO,OAAQ/4B,GAAO;AAOxB,aAAK84B,KAAW,CAACX,MAChBhgB,EAAO,QAAS,MAAM8B;UAE1B;QACE;AAAA,QACD,QAAQ,SAAUA,GAAO;AACxB,iBAAKA,MAAS,OACbA,IAAOA,KAAQ,OAET,KAAK,KAAM,WAAW;AAC5B,gBAAIja,GACHrB,IAAOysB,EAAS,IAAK,IAAM,GAC3B5D,IAAQ7oB,EAAMsb,IAAO,OAAS,GAC9B0R,IAAQhtB,EAAMsb,IAAO,YAAc,GACnC8e,IAAS5gB,EAAO,QAChBgB,IAASqO,IAAQA,EAAM,SAAS;AAajC,iBAVA7oB,EAAK,SAAS,IAGdwZ,EAAO,MAAO,MAAM8B,GAAM,CAAE,CAAA,GAEvB0R,KAASA,EAAM,QACnBA,EAAM,KAAK,KAAM,MAAM,EAAI,GAItB3rB,IAAQ+4B,EAAO,QAAQ/4B;AAC5B,cAAK+4B,EAAQ/4B,CAAO,EAAC,SAAS,QAAQ+4B,EAAQ/4B,CAAK,EAAG,UAAUia,MAC/D8e,EAAQ/4B,CAAO,EAAC,KAAK,KAAM,EAAI,GAC/B+4B,EAAO,OAAQ/4B,GAAO;AAKxB,iBAAMA,IAAQ,GAAGA,IAAQmZ,GAAQnZ;AAChC,cAAKwnB,EAAOxnB,CAAO,KAAIwnB,EAAOxnB,CAAK,EAAG,UACrCwnB,EAAOxnB,CAAO,EAAC,OAAO,KAAM,IAAI;AAKlC,mBAAOrB,EAAK;AAAA,UACf;QACE;AAAA,MACF,IAEAwZ,EAAO,KAAM,CAAE,UAAU,QAAQ,SAAU,SAAU6B,GAAIlB,GAAO;AAC/D,YAAIkgB,IAAQ7gB,EAAO,GAAIW,CAAI;AAC3B,QAAAX,EAAO,GAAIW,CAAI,IAAK,SAAUuf,GAAOjC,GAAQ3d,GAAW;AACvD,iBAAO4f,KAAS,QAAQ,OAAOA,KAAU,YACxCW,EAAM,MAAO,MAAM,SAAW,IAC9B,KAAK,QAASnC,GAAO/d,GAAM,EAAI,GAAIuf,GAAOjC,GAAQ3d;QACrD;AAAA,MACA,IAGAN,EAAO,KAAM;AAAA,QACZ,WAAW0e,GAAO,MAAQ;AAAA,QAC1B,SAASA,GAAO,MAAQ;AAAA,QACxB,aAAaA,GAAO,QAAU;AAAA,QAC9B,QAAQ,EAAE,SAAS,OAAQ;AAAA,QAC3B,SAAS,EAAE,SAAS,OAAQ;AAAA,QAC5B,YAAY,EAAE,SAAS,SAAU;AAAA,MAClC,GAAG,SAAU/d,GAAMyX,GAAQ;AAC1B,QAAApY,EAAO,GAAIW,CAAI,IAAK,SAAUuf,GAAOjC,GAAQ3d,GAAW;AACvD,iBAAO,KAAK,QAAS8X,GAAO8H,GAAOjC,GAAQ3d;QAC7C;AAAA,MACA,IAEAN,EAAO,SAAS,IAChBA,EAAO,GAAG,OAAO,WAAW;AAC3B,YAAI8gB,GACH,IAAI,GACJF,IAAS5gB,EAAO;AAIjB,aAFAoe,KAAQ,KAAK,OAEL,IAAIwC,EAAO,QAAQ;AAC1B,UAAAE,IAAQF,EAAQ,IAGX,CAACE,EAAO,KAAIF,EAAQ,CAAC,MAAOE,KAChCF,EAAO,OAAQ,KAAK,CAAC;AAIvB,QAAMA,EAAO,UACZ5gB,EAAO,GAAG,QAEXoe,KAAQ;AAAA,MACT,GAEApe,EAAO,GAAG,QAAQ,SAAU8gB,GAAQ;AACnC,QAAA9gB,EAAO,OAAO,KAAM8gB,IACpB9gB,EAAO,GAAG;MACX,GAEAA,EAAO,GAAG,WAAW,IACrBA,EAAO,GAAG,QAAQ,WAAW;AAC5B,QAAKqe,OAILA,KAAa,IACbG;MACD,GAEAxe,EAAO,GAAG,OAAO,WAAW;AAC3B,QAAAqe,KAAa;AAAA,MACd,GAEAre,EAAO,GAAG,SAAS;AAAA,QAClB,MAAM;AAAA,QACN,MAAM;AAAA;AAAA,QAGN,UAAU;AAAA,MACX,GAKAA,EAAO,GAAG,QAAQ,SAAU+gB,GAAMjf,GAAO;AACxC,eAAAif,IAAO/gB,EAAO,MAAKA,EAAO,GAAG,OAAQ+gB,CAAI,KAAMA,GAC/Cjf,IAAOA,KAAQ,MAER,KAAK,MAAOA,GAAM,SAAUjL,GAAM2c,GAAQ;AAChD,cAAIwN,IAAU1iB,EAAO,WAAYzH,GAAMkqB,CAAI;AAC3C,UAAAvN,EAAM,OAAO,WAAW;AACvB,YAAAlV,EAAO,aAAc0iB;UACxB;AAAA,QACA;MACA,GAGE,WAAW;AACZ,YAAIh5B,IAAQuX,GAAS,cAAe,OAAS,GAC5C8C,IAAS9C,GAAS,cAAe,QAAU,GAC3C4gB,IAAM9d,EAAO,YAAa9C,GAAS,cAAe,QAAQ;AAE3D,QAAAvX,EAAM,OAAO,YAIbmX,GAAQ,UAAUnX,EAAM,UAAU,IAIlCmX,GAAQ,cAAcghB,EAAI,UAI1Bn4B,IAAQuX,GAAS,cAAe,UAChCvX,EAAM,QAAQ,KACdA,EAAM,OAAO,SACbmX,GAAQ,aAAanX,EAAM,UAAU;AAAA,MACtC;AAGA,UAAIi5B,IACHC,KAAalhB,EAAO,KAAK;AAE1B,MAAAA,EAAO,GAAG,OAAQ;AAAA,QACjB,MAAM,SAAUW,GAAMiB,GAAQ;AAC7B,iBAAOoQ,GAAQ,MAAMhS,EAAO,MAAMW,GAAMiB,GAAO,UAAU,SAAS;QAClE;AAAA,QAED,YAAY,SAAUjB,GAAO;AAC5B,iBAAO,KAAK,KAAM,WAAW;AAC5B,YAAAX,EAAO,WAAY,MAAMW;UAC5B;QACE;AAAA,MACF,IAEAX,EAAO,OAAQ;AAAA,QACd,MAAM,SAAUO,GAAMI,GAAMiB,GAAQ;AACnC,cAAIvB,GAAKmT,GACR2N,IAAQ5gB,EAAK;AAGd,cAAK,EAAA4gB,MAAU,KAAKA,MAAU,KAAKA,MAAU,IAK7C;AAAA,gBAAK,OAAO5gB,EAAK,eAAiB;AACjC,qBAAOP,EAAO,KAAMO,GAAMI,GAAMiB,CAAK;AAUtC,iBALKuf,MAAU,KAAK,CAACnhB,EAAO,SAAUO,CAAI,OACzCiT,IAAQxT,EAAO,UAAWW,EAAK,YAAW,CAAI,MAC3CX,EAAO,KAAK,MAAM,KAAK,KAAMW,CAAM,IAAGsgB,KAAW,UAGhDrf,MAAU,QAAY;AAC1B,kBAAKA,MAAU,MAAO;AACrB,gBAAA5B,EAAO,WAAYO,GAAMI;AACzB;AAAA,cACA;AAED,qBAAK6S,KAAS,SAASA,MACpBnT,IAAMmT,EAAM,IAAKjT,GAAMqB,GAAOjB,CAAM,OAAO,SACtCN,KAGRE,EAAK,aAAcI,GAAMiB,IAAQ,EAAE,GAC5BA;AAAA,YACP;AAED,mBAAK4R,KAAS,SAASA,MAAWnT,IAAMmT,EAAM,IAAKjT,GAAMI,CAAM,OAAO,OAC9DN,KAGRA,IAAML,EAAO,KAAK,KAAMO,GAAMI,CAAI,GAG3BN,KAAc;AAAA;AAAA,QACrB;AAAA,QAED,WAAW;AAAA,UACV,MAAM;AAAA,YACL,KAAK,SAAUE,GAAMqB,GAAQ;AAC5B,kBAAK,CAACzC,GAAQ,cAAcyC,MAAU,WACrC6G,GAAUlI,GAAM,UAAY;AAC5B,oBAAIX,IAAMW,EAAK;AACf,uBAAAA,EAAK,aAAc,QAAQqB,IACtBhC,MACJW,EAAK,QAAQX,IAEPgC;AAAA,cACP;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QAED,YAAY,SAAUrB,GAAMqB,GAAQ;AACnC,cAAIjB,GACHvU,IAAI,GAIJg1B,IAAYxf,KAASA,EAAM,MAAOgN,CAAa;AAEhD,cAAKwS,KAAa7gB,EAAK,aAAa;AACnC,mBAAUI,IAAOygB,EAAWh1B;AAC3B,cAAAmU,EAAK,gBAAiBI;QAGxB;AAAA,MACF,IAGAsgB,KAAW;AAAA,QACV,KAAK,SAAU1gB,GAAMqB,GAAOjB,GAAO;AAClC,iBAAKiB,MAAU,KAGd5B,EAAO,WAAYO,GAAMI,KAEzBJ,EAAK,aAAcI,GAAMA,IAEnBA;AAAA,QACP;AAAA,MACF,GAEAX,EAAO,KAAMA,EAAO,KAAK,MAAM,KAAK,OAAO,MAAO,MAAM,GAAI,SAAU6B,GAAIlB,GAAO;AAChF,YAAI0gB,IAASH,GAAYvgB,CAAM,KAAIX,EAAO,KAAK;AAE/C,QAAAkhB,GAAYvgB,CAAM,IAAG,SAAUJ,GAAMI,GAAMuB,GAAQ;AAClD,cAAI7B,GAAK8X,GACRmJ,IAAgB3gB,EAAK;AAEtB,iBAAMuB,MAGLiW,IAAS+I,GAAYI,IACrBJ,GAAYI,CAAe,IAAGjhB,GAC9BA,IAAMghB,EAAQ9gB,GAAMI,GAAMuB,CAAO,KAAI,OACpCof,IACA,MACDJ,GAAYI,CAAe,IAAGnJ,IAExB9X;AAAA,QACT;AAAA,MACA;AAKA,UAAIkhB,KAAa,uCAChBC,KAAa;AAEd,MAAAxhB,EAAO,GAAG,OAAQ;AAAA,QACjB,MAAM,SAAUW,GAAMiB,GAAQ;AAC7B,iBAAOoQ,GAAQ,MAAMhS,EAAO,MAAMW,GAAMiB,GAAO,UAAU,SAAS;QAClE;AAAA,QAED,YAAY,SAAUjB,GAAO;AAC5B,iBAAO,KAAK,KAAM,WAAW;AAC5B,mBAAO,KAAMX,EAAO,QAASW,CAAM,KAAIA,CAAI;AAAA,UAC9C;QACE;AAAA,MACF,IAEAX,EAAO,OAAQ;AAAA,QACd,MAAM,SAAUO,GAAMI,GAAMiB,GAAQ;AACnC,cAAIvB,GAAKmT,GACR2N,IAAQ5gB,EAAK;AAGd,cAAK,EAAA4gB,MAAU,KAAKA,MAAU,KAAKA,MAAU;AAW7C,oBAPKA,MAAU,KAAK,CAACnhB,EAAO,SAAUO,CAAI,OAGzCI,IAAOX,EAAO,QAASW,CAAI,KAAMA,GACjC6S,IAAQxT,EAAO,UAAWW,KAGtBiB,MAAU,SACT4R,KAAS,SAASA,MACpBnT,IAAMmT,EAAM,IAAKjT,GAAMqB,GAAOjB,CAAM,OAAO,SACtCN,IAGCE,EAAMI,CAAM,IAAGiB,IAGpB4R,KAAS,SAASA,MAAWnT,IAAMmT,EAAM,IAAKjT,GAAMI,CAAM,OAAO,OAC9DN,IAGDE,EAAMI;QACb;AAAA,QAED,WAAW;AAAA,UACV,UAAU;AAAA,YACT,KAAK,SAAUJ,GAAO;AAOrB,kBAAIkhB,IAAWzhB,EAAO,KAAK,KAAMO,GAAM;AAEvC,qBAAKkhB,IACG,SAAUA,GAAU,MAI3BF,GAAW,KAAMhhB,EAAK,QAAU,KAChCihB,GAAW,KAAMjhB,EAAK,QAAU,KAChCA,EAAK,OAEE,IAGD;AAAA,YACP;AAAA,UACD;AAAA,QACD;AAAA,QAED,SAAS;AAAA,UACR,KAAO;AAAA,UACP,OAAS;AAAA,QACT;AAAA,MACF,IAUMpB,GAAQ,gBACba,EAAO,UAAU,WAAW;AAAA,QAC3B,KAAK,SAAUO,GAAO;AAIrB,cAAI3Q,IAAS2Q,EAAK;AAClB,iBAAK3Q,KAAUA,EAAO,cACrBA,EAAO,WAAW,eAEZ;AAAA,QACP;AAAA,QACD,KAAK,SAAU2Q,GAAO;AAIrB,cAAI3Q,IAAS2Q,EAAK;AAClB,UAAK3Q,MACJA,EAAO,eAEFA,EAAO,cACXA,EAAO,WAAW;AAAA,QAGpB;AAAA,MACH,IAGAoQ,EAAO,KAAM;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,GAAG,WAAW;AACb,QAAAA,EAAO,QAAS,KAAK,YAAa,CAAA,IAAK;AAAA,MACxC;AAOC,eAAS0hB,GAAkB9f,GAAQ;AAClC,YAAI2I,IAAS3I,EAAM,MAAOgN,CAAa,KAAM,CAAA;AAC7C,eAAOrE,EAAO,KAAM;MACpB;AAGF,eAASoX,GAAUphB,GAAO;AACzB,eAAOA,EAAK,gBAAgBA,EAAK,aAAc,OAAS,KAAI;AAAA,MAC5D;AAED,eAASqhB,GAAgBhgB,GAAQ;AAChC,eAAK,MAAM,QAASA,KACZA,IAEH,OAAOA,KAAU,WACdA,EAAM,MAAOgN,CAAa,KAAM,CAAA,IAEjC;MACP;AAED,MAAA5O,EAAO,GAAG,OAAQ;AAAA,QACjB,UAAU,SAAU4B,GAAQ;AAC3B,cAAIigB,GAASthB,GAAMwG,GAAK+a,GAAUC,GAAOvkB,GAAGwkB,GAC3C51B,IAAI;AAEL,cAAKgT,EAAYwC;AAChB,mBAAO,KAAK,KAAM,SAAUpE,GAAI;AAC/B,cAAAwC,EAAQ,IAAI,EAAG,SAAU4B,EAAM,KAAM,MAAMpE,GAAGmkB,GAAU,IAAI,CAAI,CAAA;AAAA,YACpE;AAKE,cAFAE,IAAUD,GAAgBhgB,IAErBigB,EAAQ;AACZ,mBAAUthB,IAAO,KAAMnU;AAItB,kBAHA01B,IAAWH,GAAUphB,IACrBwG,IAAMxG,EAAK,aAAa,KAAO,MAAMmhB,GAAkBI,KAAa,KAE/D/a,GAAM;AAEV,qBADAvJ,IAAI,GACMukB,IAAQF,EAASrkB;AAC1B,kBAAKuJ,EAAI,QAAS,MAAMgb,IAAQ,GAAK,IAAG,MACvChb,KAAOgb,IAAQ;AAKjB,gBAAAC,IAAaN,GAAkB3a,IAC1B+a,MAAaE,KACjBzhB,EAAK,aAAc,SAASyhB;cAE7B;AAAA;AAIH,iBAAO;AAAA,QACP;AAAA,QAED,aAAa,SAAUpgB,GAAQ;AAC9B,cAAIigB,GAASthB,GAAMwG,GAAK+a,GAAUC,GAAOvkB,GAAGwkB,GAC3C51B,IAAI;AAEL,cAAKgT,EAAYwC;AAChB,mBAAO,KAAK,KAAM,SAAUpE,GAAI;AAC/B,cAAAwC,EAAQ,IAAI,EAAG,YAAa4B,EAAM,KAAM,MAAMpE,GAAGmkB,GAAU,IAAI,CAAI,CAAA;AAAA,YACvE;AAGE,cAAK,CAAC,UAAU;AACf,mBAAO,KAAK,KAAM,SAAS,EAAE;AAK9B,cAFAE,IAAUD,GAAgBhgB,IAErBigB,EAAQ;AACZ,mBAAUthB,IAAO,KAAMnU;AAMtB,kBALA01B,IAAWH,GAAUphB,IAGrBwG,IAAMxG,EAAK,aAAa,KAAO,MAAMmhB,GAAkBI,KAAa,KAE/D/a,GAAM;AAEV,qBADAvJ,IAAI,GACMukB,IAAQF,EAASrkB;AAG1B,yBAAQuJ,EAAI,QAAS,MAAMgb,IAAQ,GAAG,IAAK;AAC1C,oBAAAhb,IAAMA,EAAI,QAAS,MAAMgb,IAAQ,KAAK;AAKxC,gBAAAC,IAAaN,GAAkB3a,IAC1B+a,MAAaE,KACjBzhB,EAAK,aAAc,SAASyhB;cAE7B;AAAA;AAIH,iBAAO;AAAA,QACP;AAAA,QAED,aAAa,SAAUpgB,GAAOqgB,GAAW;AACxC,cAAIngB,IAAO,OAAOF,GACjBsgB,IAAepgB,MAAS,YAAY,MAAM,QAASF,CAAK;AAEzD,iBAAK,OAAOqgB,KAAa,aAAaC,IAC9BD,IAAW,KAAK,SAAUrgB,CAAO,IAAG,KAAK,YAAaA,KAGzDxC,EAAYwC,KACT,KAAK,KAAM,SAAUxV,GAAI;AAC/B,YAAA4T,EAAQ,IAAI,EAAG;AAAA,cACd4B,EAAM,KAAM,MAAMxV,GAAGu1B,GAAU,IAAM,GAAEM,CAAU;AAAA,cACjDA;AAAA,YACL;AAAA,UACA,KAGS,KAAK,KAAM,WAAW;AAC5B,gBAAIvnB,GAAWtO,GAAGgiB,GAAM+T;AAExB,gBAAKD;AAOJ,mBAJA91B,IAAI,GACJgiB,IAAOpO,EAAQ,OACfmiB,IAAaP,GAAgBhgB,IAEnBlH,IAAYynB,EAAY/1B;AAGjC,gBAAKgiB,EAAK,SAAU1T,KACnB0T,EAAK,YAAa1T,KAElB0T,EAAK,SAAU1T;gBAKX,EAAKkH,MAAU,UAAaE,MAAS,eAC3CpH,IAAYinB,GAAU,OACjBjnB,KAGJuY,EAAS,IAAK,MAAM,iBAAiBvY,CAAS,GAO1C,KAAK,gBACT,KAAK;AAAA,cAAc;AAAA,cAClBA,KAAakH,MAAU,KACvB,KACAqR,EAAS,IAAK,MAAM,eAAiB,KAAI;AAAA,YAC/C;AAAA,UAGA;QACE;AAAA,QAED,UAAU,SAAUhT,GAAW;AAC9B,cAAIvF,GAAW6F,GACdnU,IAAI;AAGL,eADAsO,IAAY,MAAMuF,IAAW,KACnBM,IAAO,KAAMnU;AACtB,gBAAKmU,EAAK,aAAa,MACpB,MAAMmhB,GAAkBC,GAAUphB,CAAM,CAAA,IAAK,KAAM,QAAS7F,KAAc;AAC3E,qBAAO;AAIV,iBAAO;AAAA,QACP;AAAA,MACF;AAKA,UAAI0nB,KAAU;AAEd,MAAApiB,EAAO,GAAG,OAAQ;AAAA,QACjB,KAAK,SAAU4B,GAAQ;AACtB,cAAI4R,GAAOnT,GAAKoZ,GACflZ,IAAO,KAAM;AAEd,iBAAM,UAAU,UA0BhBkZ,IAAkBra,EAAYwC,IAEvB,KAAK,KAAM,SAAUxV,GAAI;AAC/B,gBAAIwT;AAEJ,YAAK,KAAK,aAAa,MAIlB6Z,IACJ7Z,IAAMgC,EAAM,KAAM,MAAMxV,GAAG4T,EAAQ,IAAI,EAAG,IAAG,KAE7CJ,IAAMgC,GAIFhC,KAAO,OACXA,IAAM,KAEK,OAAOA,KAAQ,WAC1BA,KAAO,KAEI,MAAM,QAASA,OAC1BA,IAAMI,EAAO,IAAKJ,GAAK,SAAUgC,GAAQ;AACxC,qBAAOA,KAAS,OAAO,KAAKA,IAAQ;AAAA,YACzC,KAGG4R,IAAQxT,EAAO,SAAU,KAAK,IAAM,KAAIA,EAAO,SAAU,KAAK,SAAS,YAAa,CAAA,IAG/E,CAACwT,KAAS,EAAG,SAASA,MAAWA,EAAM,IAAK,MAAM5T,GAAK,OAAO,MAAO,YACzE,KAAK,QAAQA;AAAA,UAEjB,MA3DQW,KACJiT,IAAQxT,EAAO,SAAUO,EAAK,IAAM,KACnCP,EAAO,SAAUO,EAAK,SAAS,YAAa,CAAA,GAExCiT,KACJ,SAASA,MACPnT,IAAMmT,EAAM,IAAKjT,GAAM,OAAS,OAAO,SAElCF,KAGRA,IAAME,EAAK,OAGN,OAAOF,KAAQ,WACZA,EAAI,QAAS+hB,IAAS,EAAE,IAIzB/hB,KAAc,OAGtB;AAAA,QAsCD;AAAA,MACF,IAEAL,EAAO,OAAQ;AAAA,QACd,UAAU;AAAA,UACT,QAAQ;AAAA,YACP,KAAK,SAAUO,GAAO;AAErB,kBAAIX,IAAMI,EAAO,KAAK,KAAMO,GAAM;AAClC,qBAAOX;AAAA;AAAA;AAAA;AAAA,cAON8hB,GAAkB1hB,EAAO,KAAMO,CAAM,CAAA;AAAA,YACtC;AAAA,UACD;AAAA,UACD,QAAQ;AAAA,YACP,KAAK,SAAUA,GAAO;AACrB,kBAAIqB,GAAOygB,GAAQj2B,GAClBsU,IAAUH,EAAK,SACf1Y,IAAQ0Y,EAAK,eACboW,IAAMpW,EAAK,SAAS,cACpB0U,IAAS0B,IAAM,OAAO,CAAE,GACxB2L,IAAM3L,IAAM9uB,IAAQ,IAAI6Y,EAAQ;AAUjC,mBARK7Y,IAAQ,IACZuE,IAAIk2B,IAGJl2B,IAAIuqB,IAAM9uB,IAAQ,GAIXuE,IAAIk2B,GAAKl2B;AAKhB,oBAJAi2B,IAAS3hB,EAAStU,KAIXi2B,EAAO,YAAYj2B,MAAMvE;AAAA,gBAG9B,CAACw6B,EAAO,aACN,CAACA,EAAO,WAAW,YACpB,CAAC5Z,GAAU4Z,EAAO,YAAY,UAAY,IAAK;AAMjD,sBAHAzgB,IAAQ5B,EAAQqiB,CAAQ,EAAC,IAAG,GAGvB1L;AACJ,2BAAO/U;AAIR,kBAAAqT,EAAO,KAAMrT;gBACb;AAGF,qBAAOqT;AAAA,YACP;AAAA,YAED,KAAK,SAAU1U,GAAMqB,GAAQ;AAM5B,uBALI2gB,GAAWF,GACd3hB,IAAUH,EAAK,SACf0U,IAASjV,EAAO,UAAW4B,CAAO,GAClCxV,IAAIsU,EAAQ,QAELtU;AACP,gBAAAi2B,IAAS3hB,EAAStU,KAIbi2B,EAAO,WACXriB,EAAO,QAASA,EAAO,SAAS,OAAO,IAAKqiB,CAAQ,GAAEpN,CAAQ,IAAG,QAEjEsN,IAAY;AAOd,qBAAMA,MACLhiB,EAAK,gBAAgB,KAEf0U;AAAA,YACP;AAAA,UACD;AAAA,QACD;AAAA,MACF,IAGAjV,EAAO,KAAM,CAAE,SAAS,UAAY,GAAE,WAAW;AAChD,QAAAA,EAAO,SAAU,QAAS;AAAA,UACzB,KAAK,SAAUO,GAAMqB,GAAQ;AAC5B,gBAAK,MAAM,QAASA;AACnB,qBAASrB,EAAK,UAAUP,EAAO,QAASA,EAAQO,CAAM,EAAC,IAAK,GAAEqB,CAAO,IAAG;AAAA,UAEzE;AAAA,QACH,GACOzC,GAAQ,YACba,EAAO,SAAU,IAAM,EAAC,MAAM,SAAUO,GAAO;AAC9C,iBAAOA,EAAK,aAAc,OAAO,MAAO,OAAO,OAAOA,EAAK;AAAA,QAC9D;AAAA,MAEA,IAQApB,GAAQ,UAAU,eAAeb;AAGjC,UAAIkkB,KAAc,mCACjBC,KAA0B,SAAUxzB,GAAI;AACvC,QAAAA,EAAE,gBAAe;AAAA,MACnB;AAEA,MAAA+Q,EAAO,OAAQA,EAAO,OAAO;AAAA,QAE5B,SAAS,SAAU6W,GAAOrwB,GAAM+Z,GAAMmiB,GAAe;AAEpD,cAAIt2B,GAAG2a,GAAKc,GAAK8a,GAAYC,GAAQzK,GAAQpH,GAAS8R,GACrDC,IAAY,CAAEviB,KAAQhB,EAAU,GAChCuC,IAAO9C,GAAO,KAAM6X,GAAO,UAAWA,EAAM,OAAOA,GACnDO,IAAapY,GAAO,KAAM6X,GAAO,WAAW,IAAKA,EAAM,UAAU,MAAO,GAAG,IAAK,CAAA;AAKjF,cAHA9P,IAAM8b,IAAchb,IAAMtH,IAAOA,KAAQhB,IAGpC,EAAAgB,EAAK,aAAa,KAAKA,EAAK,aAAa,MAKzC,CAAAiiB,GAAY,KAAM1gB,IAAO9B,EAAO,MAAM,eAItC8B,EAAK,QAAS,GAAK,IAAG,OAG1BsV,IAAatV,EAAK,MAAO,MACzBA,IAAOsV,EAAW,SAClBA,EAAW,KAAI,IAEhBwL,IAAS9gB,EAAK,QAAS,GAAK,IAAG,KAAK,OAAOA,GAG3C+U,IAAQA,EAAO7W,EAAO,OAAS,IAC9B6W,IACA,IAAI7W,EAAO,MAAO8B,GAAM,OAAO+U,KAAU,YAAYA,IAGtDA,EAAM,YAAY6L,IAAe,IAAI,GACrC7L,EAAM,YAAYO,EAAW,KAAM,GAAG,GACtCP,EAAM,aAAaA,EAAM,YACxB,IAAI,OAAQ,YAAYO,EAAW,KAAM,eAAiB,IAAG,SAAW,IACxE,MAGDP,EAAM,SAAS,QACTA,EAAM,WACXA,EAAM,SAAStW,IAIhB/Z,IAAOA,KAAQ,OACd,CAAEqwB,CAAO,IACT7W,EAAO,UAAWxZ,GAAM,CAAEqwB,CAAO,CAAA,GAGlC9F,IAAU/Q,EAAO,MAAM,QAAS8B,CAAI,KAAM,CAAA,GACrC,GAAC4gB,KAAgB3R,EAAQ,WAAWA,EAAQ,QAAQ,MAAOxQ,GAAM/Z,CAAM,MAAK,MAMjF;AAAA,gBAAK,CAACk8B,KAAgB,CAAC3R,EAAQ,YAAY,CAACzR,GAAUiB,IAAS;AAM9D,mBAJAoiB,IAAa5R,EAAQ,gBAAgBjP,GAC/B0gB,GAAY,KAAMG,IAAa7gB,CAAI,MACxCiF,IAAMA,EAAI,aAEHA,GAAKA,IAAMA,EAAI;AACtB,gBAAA+b,EAAU,KAAM/b,IAChBc,IAAMd;AAIP,cAAKc,OAAUtH,EAAK,iBAAiBhB,OACpCujB,EAAU,KAAMjb,EAAI,eAAeA,EAAI,gBAAgBvJ;YAExD;AAID,iBADAlS,IAAI,IACM2a,IAAM+b,EAAW12B,GAAG,MAAQ,CAACyqB,EAAM;AAC5C,cAAAgM,IAAc9b,GACd8P,EAAM,OAAOzqB,IAAI,IAChBu2B,IACA5R,EAAQ,YAAYjP,GAGrBqW,KACElF,EAAS,IAAKlM,GAAK,QAAU,KAAI,uBAAO,OAAQ,IAAM,GACpD8P,EAAM,IAAM,KACf5D,EAAS,IAAKlM,GAAK,WACfoR,KACJA,EAAO,MAAOpR,GAAKvgB,IAIpB2xB,IAASyK,KAAU7b,EAAK6b,IACnBzK,KAAUA,EAAO,SAAStF,GAAY9L,CAAG,MAC7C8P,EAAM,SAASsB,EAAO,MAAOpR,GAAKvgB,CAAI,GACjCqwB,EAAM,WAAW,MACrBA,EAAM,eAAc;AAIvB,mBAAAA,EAAM,OAAO/U,GAGR,CAAC4gB,KAAgB,CAAC7L,EAAM,mBAAkB,MAEvC,CAAC9F,EAAQ,YACfA,EAAQ,SAAS,MAAO+R,EAAU,IAAK,GAAEt8B,CAAI,MAAO,OACpDqsB,GAAYtS,CAAI,KAIXqiB,KAAUxjB,EAAYmB,EAAMuB,CAAM,CAAA,KAAM,CAACxC,GAAUiB,OAGvDsH,IAAMtH,EAAMqiB,IAEP/a,MACJtH,EAAMqiB,CAAQ,IAAG,OAIlB5iB,EAAO,MAAM,YAAY8B,GAEpB+U,EAAM,0BACVgM,EAAY,iBAAkB/gB,GAAM2gB,KAGrCliB,EAAMuB,CAAI,KAEL+U,EAAM,0BACVgM,EAAY,oBAAqB/gB,GAAM2gB,KAGxCziB,EAAO,MAAM,YAAY,QAEpB6H,MACJtH,EAAMqiB,CAAQ,IAAG/a,KAMdgP,EAAM;AAAA;AAAA,QACb;AAAA;AAAA;AAAA,QAID,UAAU,SAAU/U,GAAMvB,GAAMsW,GAAQ;AACvC,cAAI5nB,IAAI+Q,EAAO;AAAA,YACd,IAAIA,EAAO,MAAO;AAAA,YAClB6W;AAAA,YACA;AAAA,cACC,MAAM/U;AAAA,cACN,aAAa;AAAA,YACb;AAAA,UACJ;AAEE,UAAA9B,EAAO,MAAM,QAAS/Q,GAAG,MAAMsR,CAAI;AAAA,QACnC;AAAA,MAEF,IAEAP,EAAO,GAAG,OAAQ;AAAA,QAEjB,SAAS,SAAU8B,GAAMtb,GAAO;AAC/B,iBAAO,KAAK,KAAM,WAAW;AAC5B,YAAAwZ,EAAO,MAAM,QAAS8B,GAAMtb,GAAM,IAAI;AAAA,UACzC;QACE;AAAA,QACD,gBAAgB,SAAUsb,GAAMtb,GAAO;AACtC,cAAI+Z,IAAO,KAAM;AACjB,cAAKA;AACJ,mBAAOP,EAAO,MAAM,QAAS8B,GAAMtb,GAAM+Z,GAAM;QAEhD;AAAA,MACF,IAWMpB,GAAQ,WACba,EAAO,KAAM,EAAE,OAAO,WAAW,MAAM,WAAY,GAAE,SAAUuY,GAAMC,GAAM;AAG1E,YAAIjyB,IAAU,SAAUswB,GAAQ;AAC/B,UAAA7W,EAAO,MAAM,SAAUwY,GAAK3B,EAAM,QAAQ7W,EAAO,MAAM,IAAK6W,CAAO,CAAA;AAAA,QACtE;AAEE,QAAA7W,EAAO,MAAM,QAASwY,KAAQ;AAAA,UAC7B,OAAO,WAAW;AAIjB,gBAAI7Y,IAAM,KAAK,iBAAiB,KAAK,YAAY,MAChDojB,IAAW9P,EAAS,OAAQtT,GAAK6Y,CAAG;AAErC,YAAMuK,KACLpjB,EAAI,iBAAkB4Y,GAAMhyB,GAAS,EAAI,GAE1C0sB,EAAS,OAAQtT,GAAK6Y,IAAOuK,KAAY,KAAM;UAC/C;AAAA,UACD,UAAU,WAAW;AACpB,gBAAIpjB,IAAM,KAAK,iBAAiB,KAAK,YAAY,MAChDojB,IAAW9P,EAAS,OAAQtT,GAAK6Y,CAAG,IAAK;AAE1C,YAAMuK,IAKL9P,EAAS,OAAQtT,GAAK6Y,GAAKuK,CAAQ,KAJnCpjB,EAAI,oBAAqB4Y,GAAMhyB,GAAS,EAAI,GAC5C0sB,EAAS,OAAQtT,GAAK6Y;UAKvB;AAAA,QACJ;AAAA,MACA;AAEA,UAAIwK,KAAW1kB,EAAO,UAElB2kB,KAAQ,EAAE,MAAM,KAAK,IAAK,EAAA,GAE1BC,KAAW;AAKf,MAAAljB,EAAO,WAAW,SAAUxZ,GAAO;AAClC,YAAI4iB;AACJ,YAAK,CAAC5iB,KAAQ,OAAOA,KAAS;AAC7B,iBAAO;AAKR,YAAI;AACH,UAAA4iB,IAAQ,IAAI9K,EAAO,UAAW,EAAG,gBAAiB9X,GAAM;QACxD,QAAa;AACb,UAAA4iB,IAAM;AAAA,QACN;AAED,gBAAK,CAACA,KAAOA,EAAI,qBAAsB,aAAa,EAAG,WACtDpJ,EAAO,MAAO,kBAAkBxZ,IAE1B4iB;AAAA,MACR;AAGA,UACC+Z,KAAW,SACXC,KAAQ,UACRC,KAAkB,yCAClBC,KAAe;AAEhB,eAASC,GAAa97B,GAAQ4X,GAAKmkB,GAAahU,GAAM;AACrD,YAAI7O;AAEJ,YAAK,MAAM,QAAStB;AAGnB,UAAAW,EAAO,KAAMX,GAAK,SAAUjT,GAAGsjB,GAAI;AAClC,YAAK8T,KAAeL,GAAS,KAAM17B,CAAM,IAGxC+nB,EAAK/nB,GAAQioB,KAKb6T;AAAA,cACC97B,IAAS,OAAQ,OAAOioB,KAAM,YAAYA,KAAK,OAAOtjB,IAAI,MAAO;AAAA,cACjEsjB;AAAA,cACA8T;AAAA,cACAhU;AAAA,YACL;AAAA,UAEA;iBAEa,CAACgU,KAAe1jB,GAAQT,CAAG,MAAO;AAG7C,eAAMsB,KAAQtB;AACb,YAAAkkB,GAAa97B,IAAS,MAAMkZ,IAAO,KAAKtB,EAAKsB,CAAM,GAAE6iB,GAAahU;;AAMnE,UAAAA,EAAK/nB,GAAQ4X;MAEd;AAID,MAAAW,EAAO,QAAQ,SAAUlP,GAAG0yB,GAAc;AACzC,YAAI/7B,GACHg8B,IAAI,CAAE,GACNjU,IAAM,SAAUjJ,GAAKmd,GAAkB;AAGtC,cAAI9hB,IAAQxC,EAAYskB,CAAiB,IACxCA,EAAiB,IACjBA;AAED,UAAAD,EAAGA,EAAE,MAAM,IAAK,mBAAoBld,CAAK,IAAG,MAC3C,mBAAoB3E,KAAgB,EAAU;AAAA,QAClD;AAEC,YAAK9Q,KAAK;AACT,iBAAO;AAIR,YAAK,MAAM,QAASA,CAAC,KAAQA,EAAE,UAAU,CAACkP,EAAO,cAAelP,CAAC;AAGhE,UAAAkP,EAAO,KAAMlP,GAAG,WAAW;AAC1B,YAAA0e,EAAK,KAAK,MAAM,KAAK,KAAK;AAAA,UAC7B;;AAME,eAAM/nB,KAAUqJ;AACf,YAAAyyB,GAAa97B,GAAQqJ,EAAGrJ,CAAM,GAAI+7B,GAAahU;AAKjD,eAAOiU,EAAE,KAAM;MAChB,GAEAzjB,EAAO,GAAG,OAAQ;AAAA,QACjB,WAAW,WAAW;AACrB,iBAAOA,EAAO,MAAO,KAAK,eAAgB,CAAA;AAAA,QAC1C;AAAA,QACD,gBAAgB,WAAW;AAC1B,iBAAO,KAAK,IAAK,WAAW;AAG3B,gBAAIxV,IAAWwV,EAAO,KAAM,MAAM,UAAU;AAC5C,mBAAOxV,IAAWwV,EAAO,UAAWxV,CAAQ,IAAK;AAAA,UACpD,CAAK,EACF,OAAQ,WAAW;AACnB,gBAAIsX,IAAO,KAAK;AAGhB,mBAAO,KAAK,QAAQ,CAAC9B,EAAQ,IAAM,EAAC,GAAI,WAAa,KACpDsjB,GAAa,KAAM,KAAK,QAAU,KAAI,CAACD,GAAgB,KAAMvhB,CAAM,MACjE,KAAK,WAAW,CAACoT,GAAe,KAAMpT,CAAM;AAAA,UAClD,CAAK,EACF,IAAK,SAAUD,GAAItB,GAAO;AAC1B,gBAAIX,IAAMI,EAAQ,IAAM,EAAC,IAAG;AAE5B,mBAAKJ,KAAO,OACJ,OAGH,MAAM,QAASA,KACZI,EAAO,IAAKJ,GAAK,SAAUA,GAAM;AACvC,qBAAO,EAAE,MAAMW,EAAK,MAAM,OAAOX,EAAI,QAASwjB,IAAO;AAAA,CAAM;YAChE,KAGU,EAAE,MAAM7iB,EAAK,MAAM,OAAOX,EAAI,QAASwjB,IAAO;AAAA,CAAM;UAC9D,CAAK,EAAC,IAAG;AAAA,QACP;AAAA,MACF;AAGA,UACCO,KAAM,QACNC,KAAQ,QACRC,KAAa,iBACbC,KAAW,8BAGXC,KAAiB,6DACjBC,KAAa,kBACbC,KAAY,SAWZC,KAAa,CAAE,GAOfC,KAAa,CAAE,GAGfC,KAAW,KAAK,OAAQ,GAAK,GAG7BC,KAAe9kB,GAAS,cAAe;AACvC,MAAA8kB,GAAa,OAAOrB,GAAS;AAG9B,eAASsB,GAA6BC,GAAY;AAGjD,eAAO,SAAUC,GAAoBtU,GAAO;AAE3C,UAAK,OAAOsU,KAAuB,aAClCtU,IAAOsU,GACPA,IAAqB;AAGtB,cAAIC,GACHr4B,IAAI,GACJs4B,IAAYF,EAAmB,YAAW,EAAG,MAAO5V,CAAe,KAAI;AAExE,cAAKxP,EAAY8Q;AAGhB,mBAAUuU,IAAWC,EAAWt4B;AAG/B,cAAKq4B,EAAU,CAAG,MAAK,OACtBA,IAAWA,EAAS,MAAO,CAAC,KAAM,MAChCF,EAAWE,CAAQ,IAAKF,EAAWE,CAAQ,KAAM,CAAE,GAAG,QAASvU,OAI/DqU,EAAWE,CAAQ,IAAKF,EAAWE,CAAQ,KAAM,CAAE,GAAG,KAAMvU;QAInE;AAAA,MACC;AAGD,eAASyU,GAA+BJ,GAAW7jB,GAASkkB,GAAiBC,GAAQ;AAEpF,YAAIC,IAAY,CAAE,GACjBC,IAAqBR,MAAcJ;AAEpC,iBAASa,EAASP,GAAW;AAC5B,cAAIQ;AACJ,iBAAAH,EAAWL,CAAU,IAAG,IACxBzkB,EAAO,KAAMukB,EAAWE,CAAU,KAAI,IAAI,SAAU1V,GAAGmW,GAAqB;AAC3E,gBAAIC,IAAsBD,EAAoBxkB,GAASkkB,GAAiBC,CAAK;AAC7E,gBAAK,OAAOM,KAAwB,YACnC,CAACJ,KAAoB,CAACD,EAAWK;AAEjC,qBAAAzkB,EAAQ,UAAU,QAASykB,IAC3BH,EAASG,CAAmB,GACrB;AACD,gBAAKJ;AACX,qBAAO,EAAGE,IAAWE;AAAA,UAEzB,IACSF;AAAA,QACP;AAED,eAAOD,EAAStkB,EAAQ,UAAW,CAAG,CAAA,KAAM,CAACokB,EAAW,GAAG,KAAME,EAAS,GAAG;AAAA,MAC7E;AAKD,eAASI,GAAYtxB,GAAQ8M,GAAM;AAClC,YAAI2F,GAAKtF,GACRokB,IAAcrlB,EAAO,aAAa,eAAe,CAAA;AAElD,aAAMuG,KAAO3F;AACZ,UAAKA,EAAK2F,CAAK,MAAK,YACjB8e,EAAa9e,KAAQzS,IAAWmN,MAAUA,IAAO,CAAE,IAAQsF,CAAG,IAAK3F,EAAK2F,CAAG;AAG/E,eAAKtF,KACJjB,EAAO,OAAQ,IAAMlM,GAAQmN,CAAI,GAG3BnN;AAAA,MACP;AAMD,eAASwxB,GAAqB7B,GAAGoB,GAAOU,GAAY;AAOnD,iBALIC,GAAI1jB,GAAM2jB,GAAeC,GAC5BC,IAAWlC,EAAE,UACbiB,IAAYjB,EAAE,WAGPiB,EAAW,CAAG,MAAK;AAC1B,UAAAA,EAAU,MAAK,GACVc,MAAO,WACXA,IAAK/B,EAAE,YAAYoB,EAAM,kBAAmB,cAAc;AAK5D,YAAKW;AACJ,eAAM1jB,KAAQ6jB;AACb,gBAAKA,EAAU7jB,MAAU6jB,EAAU7jB,GAAO,KAAM0jB,IAAO;AACtD,cAAAd,EAAU,QAAS5iB;AACnB;AAAA,YACA;AAAA;AAKH,YAAK4iB,EAAW,CAAG,KAAIa;AACtB,UAAAE,IAAgBf,EAAW;aACrB;AAGN,eAAM5iB,KAAQyjB,GAAY;AACzB,gBAAK,CAACb,EAAW,CAAG,KAAIjB,EAAE,WAAY3hB,IAAO,MAAM4iB,EAAW,CAAC,IAAO;AACrE,cAAAe,IAAgB3jB;AAChB;AAAA,YACA;AACD,YAAM4jB,MACLA,IAAgB5jB;AAAA,UAEjB;AAGD,UAAA2jB,IAAgBA,KAAiBC;AAAA,QACjC;AAKD,YAAKD;AACJ,iBAAKA,MAAkBf,EAAW,MACjCA,EAAU,QAASe,IAEbF,EAAWE;MAEnB;AAKD,eAASG,GAAanC,GAAGoC,GAAUhB,GAAOiB,GAAY;AACrD,YAAIC,GAAOt0B,GAASu0B,GAAMne,GAAKoe,GAC9BC,IAAa,CAAE,GAGfxB,IAAYjB,EAAE,UAAU;AAGzB,YAAKiB,EAAW;AACf,eAAMsB,KAAQvC,EAAE;AACf,YAAAyC,EAAYF,EAAK,YAAa,CAAA,IAAKvC,EAAE,WAAYuC;AAOnD,aAHAv0B,IAAUizB,EAAU,SAGZjzB;AAcP,cAZKgyB,EAAE,eAAgBhyB,OACtBozB,EAAOpB,EAAE,eAAgBhyB,CAAS,CAAA,IAAKo0B,IAInC,CAACI,KAAQH,KAAarC,EAAE,eAC5BoC,IAAWpC,EAAE,WAAYoC,GAAUpC,EAAE,QAAQ,IAG9CwC,IAAOx0B,GACPA,IAAUizB,EAAU,SAEfjzB;AAGJ,gBAAKA,MAAY;AAEhB,cAAAA,IAAUw0B;AAAA,qBAGCA,MAAS,OAAOA,MAASx0B,GAAU;AAM9C,kBAHAu0B,IAAOE,EAAYD,IAAO,MAAMx0B,CAAO,KAAMy0B,EAAY,OAAOz0B,IAG3D,CAACu0B;AACL,qBAAMD,KAASG;AAId,sBADAre,IAAMke,EAAM,MAAO,MACdle,EAAK,CAAG,MAAKpW,MAGjBu0B,IAAOE,EAAYD,IAAO,MAAMpe,EAAK,CAAC,CAAI,KACzCqe,EAAY,OAAOre,EAAK,CAAG,CAAA,GACvBme,IAAO;AAGX,oBAAKA,MAAS,KACbA,IAAOE,EAAYH,KAGRG,EAAYH,CAAO,MAAK,OACnCt0B,IAAUoW,EAAK,IACf6c,EAAU,QAAS7c,EAAK,CAAG,CAAA;AAE5B;AAAA,kBACA;AAAA;AAMJ,kBAAKme,MAAS;AAGb,oBAAKA,KAAQvC,EAAE;AACd,kBAAAoC,IAAWG,EAAMH;;AAEjB,sBAAI;AACH,oBAAAA,IAAWG,EAAMH;kBACjB,SAAS52B,GAAI;AACb,2BAAO;AAAA,sBACN,OAAO;AAAA,sBACP,OAAO+2B,IAAO/2B,IAAI,wBAAwBg3B,IAAO,SAASx0B;AAAA,oBAClE;AAAA,kBACO;AAAA,YAGH;AAAA;AAIH,eAAO,EAAE,OAAO,WAAW,MAAMo0B,EAAQ;AAAA,MACzC;AAED,MAAA7lB,EAAO,OAAQ;AAAA;AAAA,QAGd,QAAQ;AAAA;AAAA,QAGR,cAAc,CAAE;AAAA,QAChB,MAAM,CAAE;AAAA,QAER,cAAc;AAAA,UACb,KAAKgjB,GAAS;AAAA,UACd,MAAM;AAAA,UACN,SAASe,GAAe,KAAMf,GAAS,QAAU;AAAA,UACjD,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,OAAO;AAAA,UACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAcb,SAAS;AAAA,YACR,KAAKoB;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,KAAK;AAAA,YACL,MAAM;AAAA,UACN;AAAA,UAED,UAAU;AAAA,YACT,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,UACN;AAAA,UAED,gBAAgB;AAAA,YACf,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,UACN;AAAA;AAAA;AAAA,UAID,YAAY;AAAA;AAAA,YAGX,UAAU;AAAA;AAAA,YAGV,aAAa;AAAA;AAAA,YAGb,aAAa,KAAK;AAAA;AAAA,YAGlB,YAAYpkB,EAAO;AAAA,UACnB;AAAA;AAAA;AAAA;AAAA;AAAA,UAMD,aAAa;AAAA,YACZ,KAAK;AAAA,YACL,SAAS;AAAA,UACT;AAAA,QACD;AAAA;AAAA;AAAA;AAAA,QAKD,WAAW,SAAUlM,GAAQqyB,GAAW;AACvC,iBAAOA;AAAA;AAAA,YAGNf,GAAYA,GAAYtxB,GAAQkM,EAAO,YAAY,GAAImmB,CAAU;AAAA;AAAA;AAAA,YAGjEf,GAAYplB,EAAO,cAAclM;;QAClC;AAAA,QAED,eAAewwB,GAA6BJ,EAAY;AAAA,QACxD,eAAeI,GAA6BH,EAAY;AAAA;AAAA,QAGxD,MAAM,SAAUxzB,GAAK+P,GAAU;AAG9B,UAAK,OAAO/P,KAAQ,aACnB+P,IAAU/P,GACVA,IAAM,SAIP+P,IAAUA,KAAW;AAErB,cAAI0lB,GAGHC,GAGAC,GACAC,GAGAC,GAGAC,GAGA1U,GAGA2U,GAGAt6B,GAGAu6B,GAGAlD,IAAIzjB,EAAO,UAAW,CAAA,GAAIU,CAAS,GAGnCkmB,IAAkBnD,EAAE,WAAWA,GAG/BoD,IAAqBpD,EAAE,YACpBmD,EAAgB,YAAYA,EAAgB,UAC7C5mB,EAAQ4mB,CAAiB,IACzB5mB,EAAO,OAGTqQ,KAAWrQ,EAAO,SAAU,GAC5B8mB,IAAmB9mB,EAAO,UAAW,aAAe,GAGpD+mB,KAAatD,EAAE,cAAc,CAAE,GAG/BuD,KAAiB,CAAE,GACnBC,KAAsB,CAAE,GAGxBC,KAAW,YAGXrC,KAAQ;AAAA,YACP,YAAY;AAAA;AAAA,YAGZ,mBAAmB,SAAUte,IAAM;AAClC,kBAAIla;AACJ,kBAAK0lB,GAAY;AAChB,oBAAK,CAACwU;AAEL,uBADAA,IAAkB,CAAA,GACRl6B,KAAQy3B,GAAS,KAAMwC,CAAqB;AACrD,oBAAAC,EAAiBl6B,GAAO,CAAG,EAAC,YAAW,IAAK,GAAK,KAC9Ck6B,EAAiBl6B,GAAO,CAAC,EAAG,YAAa,IAAG,GAAG,KAAM,CAAE,GACvD,OAAQA,GAAO,CAAC;AAGrB,gBAAAA,KAAQk6B,EAAiBhgB,GAAI,YAAa,IAAG,GAAG;AAAA,cAChD;AACD,qBAAOla,MAAS,OAAO,OAAOA,GAAM,KAAM;YAC1C;AAAA;AAAA,YAGD,uBAAuB,WAAW;AACjC,qBAAO0lB,IAAYuU,IAAwB;AAAA,YAC3C;AAAA;AAAA,YAGD,kBAAkB,SAAU3lB,IAAMiB,IAAQ;AACzC,qBAAKmQ,KAAa,SACjBpR,KAAOsmB,GAAqBtmB,GAAK,aAAe,IAC/CsmB,GAAqBtmB,GAAK,YAAa,CAAA,KAAMA,IAC9CqmB,GAAgBrmB,EAAM,IAAGiB,KAEnB;AAAA,YACP;AAAA;AAAA,YAGD,kBAAkB,SAAUE,IAAO;AAClC,qBAAKiQ,KAAa,SACjB0R,EAAE,WAAW3hB,KAEP;AAAA,YACP;AAAA;AAAA,YAGD,YAAY,SAAUyJ,IAAM;AAC3B,kBAAI7L;AACJ,kBAAK6L;AACJ,oBAAKwG;AAGJ,kBAAA8S,GAAM,OAAQtZ,GAAKsZ,GAAM,MAAQ,CAAA;AAAA;AAIjC,uBAAMnlB,MAAQ6L;AACb,oBAAAwb,GAAYrnB,EAAM,IAAG,CAAEqnB,GAAYrnB,EAAI,GAAI6L,GAAK7L,EAAI;AAIvD,qBAAO;AAAA,YACP;AAAA;AAAA,YAGD,OAAO,SAAUynB,IAAa;AAC7B,kBAAIC,KAAYD,MAAcD;AAC9B,qBAAKd,KACJA,EAAU,MAAOgB,KAElBlkB,GAAM,GAAGkkB,KACF;AAAA,YACP;AAAA,UACL;AAkBE,cAfA/W,GAAS,QAASwU,KAKlBpB,EAAE,QAAU9yB,KAAO8yB,EAAE,OAAOT,GAAS,QAAS,IAC5C,QAASiB,IAAWjB,GAAS,WAAW,IAAI,GAG9CS,EAAE,OAAO/iB,EAAQ,UAAUA,EAAQ,QAAQ+iB,EAAE,UAAUA,EAAE,MAGzDA,EAAE,aAAcA,EAAE,YAAY,KAAM,YAAa,EAAC,MAAO7U,MAAmB,CAAE,EAAE,GAG3E6U,EAAE,eAAe,MAAO;AAC5B,YAAAgD,IAAYlnB,GAAS,cAAe;AAKpC,gBAAI;AACH,cAAAknB,EAAU,OAAOhD,EAAE,KAInBgD,EAAU,OAAOA,EAAU,MAC3BhD,EAAE,cAAcY,GAAa,WAAW,OAAOA,GAAa,QAC3DoC,EAAU,WAAW,OAAOA,EAAU;AAAA,YACvC,QAAa;AAIb,cAAAhD,EAAE,cAAc;AAAA,YAChB;AAAA,UACD;AAWD,cARKA,EAAE,QAAQA,EAAE,eAAe,OAAOA,EAAE,QAAS,aACjDA,EAAE,OAAOzjB,EAAO,MAAOyjB,EAAE,MAAMA,EAAE,eAIlCkB,GAA+BT,IAAYT,GAAG/iB,GAASmkB,EAAK,GAGvD9S;AACJ,mBAAO8S;AAKR,UAAA6B,IAAc1mB,EAAO,SAASyjB,EAAE,QAG3BiD,KAAe1mB,EAAO,aAAa,KACvCA,EAAO,MAAM,QAAS,cAIvByjB,EAAE,OAAOA,EAAE,KAAK,YAAW,GAG3BA,EAAE,aAAa,CAACO,GAAW,KAAMP,EAAE,OAKnC4C,IAAW5C,EAAE,IAAI,QAASG,IAAO,EAAE,GAG7BH,EAAE,aAwBIA,EAAE,QAAQA,EAAE,gBACrBA,EAAE,eAAe,IAAK,QAAS,mCAAqC,MAAK,MAC3EA,EAAE,OAAOA,EAAE,KAAK,QAASE,IAAK,SAvB9BgD,IAAWlD,EAAE,IAAI,MAAO4C,EAAS,MAAM,GAGlC5C,EAAE,SAAUA,EAAE,eAAe,OAAOA,EAAE,QAAS,cACnD4C,MAAcnD,GAAO,KAAMmD,CAAU,IAAG,MAAM,OAAQ5C,EAAE,MAGxD,OAAOA,EAAE,OAILA,EAAE,UAAU,OAChB4C,IAAWA,EAAS,QAASxC,IAAY,IAAI,GAC7C8C,KAAazD,GAAO,KAAMmD,CAAU,IAAG,MAAM,OAAQ,OAASpD,GAAM,SACnE0D,IAIFlD,EAAE,MAAM4C,IAAWM,IASflD,EAAE,eACDzjB,EAAO,aAAcqmB,MACzBxB,GAAM,iBAAkB,qBAAqB7kB,EAAO,aAAcqmB,CAAQ,IAEtErmB,EAAO,KAAMqmB,MACjBxB,GAAM,iBAAkB,iBAAiB7kB,EAAO,KAAMqmB,CAAQ,MAK3D5C,EAAE,QAAQA,EAAE,cAAcA,EAAE,gBAAgB,MAAS/iB,EAAQ,gBACjEmkB,GAAM,iBAAkB,gBAAgBpB,EAAE,WAAW,GAItDoB,GAAM;AAAA,YACL;AAAA,YACApB,EAAE,UAAW,MAAOA,EAAE,QAASA,EAAE,UAAW,EAAK,IAChDA,EAAE,QAASA,EAAE,UAAW,CAAC,CAAI,KAC1BA,EAAE,UAAW,OAAQ,MAAM,OAAOW,KAAW,aAAa,MAC7DX,EAAE,QAAS,GAAK;AAAA,UACpB;AAGE,eAAMr3B,KAAKq3B,EAAE;AACZ,YAAAoB,GAAM,iBAAkBz4B,GAAGq3B,EAAE,QAASr3B,CAAC;AAIxC,cAAKq3B,EAAE,eACJA,EAAE,WAAW,KAAMmD,GAAiB/B,IAAOpB,CAAG,MAAK,MAAS1R;AAG9D,mBAAO8S,GAAM;AAed,cAXAqC,KAAW,SAGXJ,EAAiB,IAAKrD,EAAE,WACxBoB,GAAM,KAAMpB,EAAE,UACdoB,GAAM,KAAMpB,EAAE,QAGd2C,IAAYzB,GAA+BR,IAAYV,GAAG/iB,GAASmkB,EAAK,GAGnE,CAACuB;AACL,YAAAljB,GAAM,IAAI;eACJ;AASN,gBARA2hB,GAAM,aAAa,GAGd6B,KACJG,EAAmB,QAAS,YAAY,CAAEhC,IAAOpB,CAAG,CAAA,GAIhD1R;AACJ,qBAAO8S;AAIR,YAAKpB,EAAE,SAASA,EAAE,UAAU,MAC3B+C,IAAeloB,EAAO,WAAY,WAAW;AAC5C,cAAAumB,GAAM,MAAO;YAClB,GAAOpB,EAAE;AAGN,gBAAI;AACH,cAAA1R,IAAY,IACZqU,EAAU,KAAMY,IAAgB9jB;YAChC,SAASjU,IAAI;AAGb,kBAAK8iB;AACJ,sBAAM9iB;AAIP,cAAAiU,GAAM,IAAIjU;YACV;AAAA,UACD;AAGD,mBAASiU,GAAMmkB,IAAQC,IAAkB/B,IAAWgC,IAAU;AAC7D,gBAAIzB,IAAW0B,IAAS7V,IAAOkU,IAAU4B,IACxCN,KAAaG;AAGd,YAAKvV,MAILA,IAAY,IAGPyU,KACJloB,EAAO,aAAckoB,IAKtBJ,IAAY,QAGZE,IAAwBiB,MAAW,IAGnC1C,GAAM,aAAawC,KAAS,IAAI,IAAI,GAGpCvB,KAAYuB,MAAU,OAAOA,KAAS,OAAOA,OAAW,KAGnD9B,OACJM,KAAWP,GAAqB7B,GAAGoB,IAAOU,EAAS,IAI/C,CAACO,MAAa9lB,EAAO,QAAS,UAAUyjB,EAAE,aAAc,OAC5DA,EAAE,WAAY,aAAe,IAAG,WAAW;AAAA,YAAA,IAI5CoC,KAAWD,GAAanC,GAAGoC,IAAUhB,IAAOiB,EAAS,GAGhDA,MAGCrC,EAAE,eACNgE,KAAW5C,GAAM,kBAAmB,kBAC/B4C,OACJznB,EAAO,aAAcqmB,CAAU,IAAGoB,KAEnCA,KAAW5C,GAAM,kBAAmB,SAC/B4C,OACJznB,EAAO,KAAMqmB,CAAU,IAAGoB,MAKvBJ,OAAW,OAAO5D,EAAE,SAAS,SACjC0D,KAAa,cAGFE,OAAW,MACtBF,KAAa,iBAIbA,KAAatB,GAAS,OACtB2B,KAAU3B,GAAS,MACnBlU,KAAQkU,GAAS,OACjBC,KAAY,CAACnU,QAKdA,KAAQwV,KACHE,MAAU,CAACF,QACfA,KAAa,SACRE,KAAS,MACbA,KAAS,MAMZxC,GAAM,SAASwC,IACfxC,GAAM,cAAeyC,MAAoBH,MAAe,IAGnDrB,KACJzV,GAAS,YAAauW,GAAiB,CAAEY,IAASL,IAAYtC,EAAK,KAEnExU,GAAS,WAAYuW,GAAiB,CAAE/B,IAAOsC,IAAYxV,EAAK,IAIjEkT,GAAM,WAAYkC,KAClBA,KAAa,QAERL,KACJG,EAAmB;AAAA,cAASf,KAAY,gBAAgB;AAAA,cACvD,CAAEjB,IAAOpB,GAAGqC,KAAY0B,KAAU7V,EAAO;AAAA,YAAA,GAI3CmV,EAAiB,SAAUF,GAAiB,CAAE/B,IAAOsC,EAAY,CAAA,GAE5DT,MACJG,EAAmB,QAAS,gBAAgB,CAAEhC,IAAOpB,CAAG,CAAA,GAGhD,EAAEzjB,EAAO,UAChBA,EAAO,MAAM,QAAS;UAGxB;AAED,iBAAO6kB;AAAA,QACP;AAAA,QAED,SAAS,SAAUl0B,GAAKnK,GAAM8Z,GAAW;AACxC,iBAAON,EAAO,IAAKrP,GAAKnK,GAAM8Z,GAAU;QACxC;AAAA,QAED,WAAW,SAAU3P,GAAK2P,GAAW;AACpC,iBAAON,EAAO,IAAKrP,GAAK,QAAW2P,GAAU;QAC7C;AAAA,MACF,IAEAN,EAAO,KAAM,CAAE,OAAO,MAAM,GAAI,SAAU6B,GAAIoO,GAAS;AACtD,QAAAjQ,EAAQiQ,CAAM,IAAK,SAAUtf,GAAKnK,GAAM8Z,GAAUwB,GAAO;AAGxD,iBAAK1C,EAAY5Y,OAChBsb,IAAOA,KAAQxB,GACfA,IAAW9Z,GACXA,IAAO,SAIDwZ,EAAO,KAAMA,EAAO,OAAQ;AAAA,YAClC,KAAKrP;AAAA,YACL,MAAMsf;AAAA,YACN,UAAUnO;AAAA,YACV,MAAMtb;AAAA,YACN,SAAS8Z;AAAA,UACT,GAAEN,EAAO,cAAerP,CAAG,KAAMA,CAAK,CAAA;AAAA,QACzC;AAAA,MACA,IAEAqP,EAAO,cAAe,SAAUyjB,GAAI;AACnC,YAAI;AACJ,aAAM,KAAKA,EAAE;AACZ,UAAK,EAAE,YAAa,MAAK,mBACxBA,EAAE,cAAcA,EAAE,QAAS,CAAC,KAAM;AAAA,MAGrC,IAGAzjB,EAAO,WAAW,SAAUrP,GAAK+P,GAASf,GAAM;AAC/C,eAAOK,EAAO,KAAM;AAAA,UACnB,KAAKrP;AAAA;AAAA,UAGL,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA;AAAA;AAAA;AAAA,UAKR,YAAY;AAAA,YACX,eAAe,WAAW;AAAA,YAAE;AAAA,UAC5B;AAAA,UACD,YAAY,SAAUk1B,GAAW;AAChC,YAAA7lB,EAAO,WAAY6lB,GAAUnlB,GAASf,CAAG;AAAA,UACzC;AAAA,QACH;MACA,GAGAK,EAAO,GAAG,OAAQ;AAAA,QACjB,SAAS,SAAU4Z,GAAO;AACzB,cAAI7D;AAEJ,iBAAK,KAAM,OACL3W,EAAYwa,OAChBA,IAAOA,EAAK,KAAM,KAAM,CAAG,CAAA,IAI5B7D,IAAO/V,EAAQ4Z,GAAM,KAAM,CAAG,EAAC,aAAe,EAAC,GAAI,CAAC,EAAG,MAAO,EAAI,GAE7D,KAAM,CAAG,EAAC,cACd7D,EAAK,aAAc,KAAM,CAAG,CAAA,GAG7BA,EAAK,IAAK,WAAW;AAGpB,qBAFIxV,IAAO,MAEHA,EAAK;AACZ,cAAAA,IAAOA,EAAK;AAGb,mBAAOA;AAAA,UACX,GAAO,OAAQ,QAGN;AAAA,QACP;AAAA,QAED,WAAW,SAAUqZ,GAAO;AAC3B,iBAAKxa,EAAYwa,KACT,KAAK,KAAM,SAAU,GAAI;AAC/B,YAAA5Z,EAAQ,IAAM,EAAC,UAAW4Z,EAAK,KAAM,MAAM,CAAC;UAChD,KAGS,KAAK,KAAM,WAAW;AAC5B,gBAAIxL,IAAOpO,EAAQ,IAAM,GACxB2lB,IAAWvX,EAAK;AAEjB,YAAKuX,EAAS,SACbA,EAAS,QAAS/L,KAGlBxL,EAAK,OAAQwL;UAEjB;QACE;AAAA,QAED,MAAM,SAAUA,GAAO;AACtB,cAAI8N,IAAiBtoB,EAAYwa;AAEjC,iBAAO,KAAK,KAAM,SAAUxtB,GAAI;AAC/B,YAAA4T,EAAQ,IAAI,EAAG,QAAS0nB,IAAiB9N,EAAK,KAAM,MAAMxtB,KAAMwtB;UACnE;QACE;AAAA,QAED,QAAQ,SAAU3Z,GAAW;AAC5B,sBAAK,OAAQA,CAAU,EAAC,IAAK,MAAM,EAAG,KAAM,WAAW;AACtD,YAAAD,EAAQ,IAAM,EAAC,YAAa,KAAK,UAAU;AAAA,UAC9C,IACS;AAAA,QACP;AAAA,MACF,IAGAA,EAAO,KAAK,QAAQ,SAAS,SAAUO,GAAO;AAC7C,eAAO,CAACP,EAAO,KAAK,QAAQ,QAASO,CAAI;AAAA,MAC1C,GACAP,EAAO,KAAK,QAAQ,UAAU,SAAUO,GAAO;AAC9C,eAAO,CAAC,EAAGA,EAAK,eAAeA,EAAK,gBAAgBA,EAAK,iBAAiB;AAAA,MAC3E,GAKAP,EAAO,aAAa,MAAM,WAAW;AACpC,YAAI;AACH,iBAAO,IAAI1B,EAAO;QACpB,QAAe;AAAA,QAAE;AAAA,MACjB;AAEA,UAAIqpB,KAAmB;AAAA;AAAA,QAGrB,GAAG;AAAA;AAAA;AAAA,QAIH,MAAM;AAAA,MACN,GACDC,KAAe5nB,EAAO,aAAa;AAEpC,MAAAb,GAAQ,OAAO,CAAC,CAACyoB,MAAkB,qBAAqBA,IACxDzoB,GAAQ,OAAOyoB,KAAe,CAAC,CAACA,IAEhC5nB,EAAO,cAAe,SAAUU,GAAU;AACzC,YAAIJ,GAAUunB;AAGd,YAAK1oB,GAAQ,QAAQyoB,MAAgB,CAAClnB,EAAQ;AAC7C,iBAAO;AAAA,YACN,MAAM,SAAU6mB,GAASO,GAAW;AACnC,kBAAI17B,GACH27B,IAAMrnB,EAAQ;AAWf,kBATAqnB,EAAI;AAAA,gBACHrnB,EAAQ;AAAA,gBACRA,EAAQ;AAAA,gBACRA,EAAQ;AAAA,gBACRA,EAAQ;AAAA,gBACRA,EAAQ;AAAA,cACb,GAGSA,EAAQ;AACZ,qBAAMtU,KAAKsU,EAAQ;AAClB,kBAAAqnB,EAAK37B,CAAG,IAAGsU,EAAQ,UAAWtU,CAAC;AAKjC,cAAKsU,EAAQ,YAAYqnB,EAAI,oBAC5BA,EAAI,iBAAkBrnB,EAAQ,WAQ1B,CAACA,EAAQ,eAAe,CAAC6mB,EAAS,kBAAkB,MACxDA,EAAS,kBAAoB,IAAG;AAIjC,mBAAMn7B,KAAKm7B;AACV,gBAAAQ,EAAI,iBAAkB37B,GAAGm7B,EAASn7B,CAAG,CAAA;AAItC,cAAAkU,IAAW,SAAUwB,GAAO;AAC3B,uBAAO,WAAW;AACjB,kBAAKxB,MACJA,IAAWunB,IAAgBE,EAAI,SAC9BA,EAAI,UAAUA,EAAI,UAAUA,EAAI,YAC/BA,EAAI,qBAAqB,MAEtBjmB,MAAS,UACbimB,EAAI,MAAK,IACEjmB,MAAS,UAKf,OAAOimB,EAAI,UAAW,WAC1BD,EAAU,GAAG,WAEbA;AAAA;AAAA,oBAGCC,EAAI;AAAA,oBACJA,EAAI;AAAA,kBACd,IAGQD;AAAA,oBACCH,GAAkBI,EAAI,MAAQ,KAAIA,EAAI;AAAA,oBACtCA,EAAI;AAAA;AAAA;AAAA;AAAA,qBAKFA,EAAI,gBAAgB,YAAa,UACnC,OAAOA,EAAI,gBAAiB,WAC3B,EAAE,QAAQA,EAAI,SAAU,IACxB,EAAE,MAAMA,EAAI,aAAc;AAAA,oBAC3BA,EAAI,sBAAuB;AAAA,kBACpC;AAAA,gBAGA;AAAA,cACA,GAGIA,EAAI,SAASznB,KACbunB,IAAgBE,EAAI,UAAUA,EAAI,YAAYznB,EAAU,UAKnDynB,EAAI,YAAY,SACpBA,EAAI,UAAUF,IAEdE,EAAI,qBAAqB,WAAW;AAGnC,gBAAKA,EAAI,eAAe,KAMvBzpB,EAAO,WAAY,WAAW;AAC7B,kBAAKgC,KACJunB;gBAET;cAEA,GAIIvnB,IAAWA,EAAU;AAErB,kBAAI;AAGH,gBAAAynB,EAAI,KAAMrnB,EAAQ,cAAcA,EAAQ,QAAQ;cAChD,SAASzR,GAAI;AAGb,oBAAKqR;AACJ,wBAAMrR;AAAA,cAEP;AAAA,YACD;AAAA,YAED,OAAO,WAAW;AACjB,cAAKqR,KACJA;YAED;AAAA,UACJ;AAAA,MAEA,IAMAN,EAAO,cAAe,SAAUyjB,GAAI;AACnC,QAAKA,EAAE,gBACNA,EAAE,SAAS,SAAS;AAAA,MAEtB,IAGAzjB,EAAO,UAAW;AAAA,QACjB,SAAS;AAAA,UACR,QAAQ;AAAA,QAER;AAAA,QACD,UAAU;AAAA,UACT,QAAQ;AAAA,QACR;AAAA,QACD,YAAY;AAAA,UACX,eAAe,SAAUgK,GAAO;AAC/B,mBAAAhK,EAAO,WAAYgK,IACZA;AAAA,UACP;AAAA,QACD;AAAA,MACF,IAGAhK,EAAO,cAAe,UAAU,SAAUyjB,GAAI;AAC7C,QAAKA,EAAE,UAAU,WAChBA,EAAE,QAAQ,KAENA,EAAE,gBACNA,EAAE,OAAO;AAAA,MAEX,IAGAzjB,EAAO,cAAe,UAAU,SAAUyjB,GAAI;AAG7C,YAAKA,EAAE,eAAeA,EAAE,aAAc;AACrC,cAAI5jB,GAAQS;AACZ,iBAAO;AAAA,YACN,MAAM,SAAUyO,GAAG+Y,GAAW;AAC7B,cAAAjoB,IAASG,EAAQ,UAAY,EAC3B,KAAMyjB,EAAE,eAAe,EAAI,EAC3B,KAAM,EAAE,SAASA,EAAE,eAAe,KAAKA,EAAE,KAAO,EAChD,GAAI,cAAcnjB,IAAW,SAAU0nB,GAAM;AAC7C,gBAAAnoB,EAAO,OAAM,GACbS,IAAW,MACN0nB,KACJF,EAAUE,EAAI,SAAS,UAAU,MAAM,KAAKA,EAAI;cAEvD,IAGIzoB,GAAS,KAAK,YAAaM,EAAQ,CAAG,CAAA;AAAA,YACtC;AAAA,YACD,OAAO,WAAW;AACjB,cAAKS,KACJA;YAED;AAAA,UACJ;AAAA,QACE;AAAA,MACF;AAKA,UAAI2nB,KAAe,CAAE,GACpBC,KAAS;AAGV,MAAAloB,EAAO,UAAW;AAAA,QACjB,OAAO;AAAA,QACP,eAAe,WAAW;AACzB,cAAIM,IAAW2nB,GAAa,IAAG,KAAQjoB,EAAO,UAAU,MAAQijB,GAAM;AACtE,sBAAM3iB,CAAU,IAAG,IACZA;AAAA,QACP;AAAA,MACF,IAGAN,EAAO,cAAe,cAAc,SAAUyjB,GAAG0E,GAAkBtD,GAAQ;AAE1E,YAAIuD,GAAcC,GAAaC,GAC9BC,IAAW9E,EAAE,UAAU,OAAWyE,GAAO,KAAMzE,EAAE,GAAK,IACrD,QACA,OAAOA,EAAE,QAAS,aACfA,EAAE,eAAe,IACjB,QAAS,mCAAmC,MAAO,KACrDyE,GAAO,KAAMzE,EAAE,IAAM,KAAI;AAI5B,YAAK8E,KAAY9E,EAAE,UAAW,CAAC,MAAO;AAGrC,iBAAA2E,IAAe3E,EAAE,gBAAgBrkB,EAAYqkB,EAAE,aAAe,IAC7DA,EAAE,cAAe,IACjBA,EAAE,eAGE8E,IACJ9E,EAAG8E,KAAa9E,EAAG8E,CAAQ,EAAG,QAASL,IAAQ,OAAOE,KAC3C3E,EAAE,UAAU,OACvBA,EAAE,QAASP,GAAO,KAAMO,EAAE,OAAQ,MAAM,OAAQA,EAAE,QAAQ,MAAM2E,IAIjE3E,EAAE,WAAY,aAAa,IAAK,WAAW;AAC1C,mBAAM6E,KACLtoB,EAAO,MAAOooB,IAAe,oBAEvBE,EAAmB;UAC7B,GAGE7E,EAAE,UAAW,CAAG,IAAG,QAGnB4E,IAAc/pB,EAAQ8pB,IACtB9pB,EAAQ8pB,CAAY,IAAK,WAAW;AACnC,YAAAE,IAAoB;AAAA,UACvB,GAGEzD,EAAM,OAAQ,WAAW;AAGxB,YAAKwD,MAAgB,SACpBroB,EAAQ1B,CAAM,EAAG,WAAY8pB,CAAY,IAIzC9pB,EAAQ8pB,CAAc,IAAGC,GAIrB5E,EAAG2E,OAGP3E,EAAE,gBAAgB0E,EAAiB,eAGnCF,GAAa,KAAMG,KAIfE,KAAqBlpB,EAAYipB,MACrCA,EAAaC,EAAmB,CAAC,IAGlCA,IAAoBD,IAAc;AAAA,UACrC,IAGS;AAAA,MAET,IAUAlpB,GAAQ,qBAAuB,WAAW;AACzC,YAAIqpB,IAAOjpB,GAAS,eAAe,mBAAoB,EAAI,EAAC;AAC5D,eAAAipB,EAAK,YAAY,8BACVA,EAAK,WAAW,WAAW;AAAA,MACnC,KAOAxoB,EAAO,YAAY,SAAUxZ,GAAM0Z,GAASuoB,GAAc;AACzD,YAAK,OAAOjiC,KAAS;AACpB,iBAAO;AAER,QAAK,OAAO0Z,KAAY,cACvBuoB,IAAcvoB,GACdA,IAAU;AAGX,YAAI0K,GAAM8d,GAAQ9S;AAwBlB,eAtBM1V,MAIAf,GAAQ,sBACZe,IAAUX,GAAS,eAAe,mBAAoB,EAAE,GAKxDqL,IAAO1K,EAAQ,cAAe,SAC9B0K,EAAK,OAAOrL,GAAS,SAAS,MAC9BW,EAAQ,KAAK,YAAa0K,MAE1B1K,IAAUX,KAIZmpB,IAAS1a,EAAW,KAAMxnB,IAC1BovB,IAAU,CAAC6S,KAAe,IAGrBC,IACG,CAAExoB,EAAQ,cAAewoB,EAAQ,CAAC,CAAI,CAAA,KAG9CA,IAAS/S,EAAe,CAAEnvB,CAAM,GAAE0Z,GAAS0V,CAAO,GAE7CA,KAAWA,EAAQ,UACvB5V,EAAQ4V,GAAU,UAGZ5V,EAAO,MAAO,CAAE,GAAE0oB,EAAO,UAAU;AAAA,MAC3C,GAMA1oB,EAAO,GAAG,OAAO,SAAUrP,GAAKg4B,GAAQroB,GAAW;AAClD,YAAIL,GAAU6B,GAAM+jB,GACnBzX,IAAO,MACPwa,IAAMj4B,EAAI,QAAS;AAEpB,eAAKi4B,IAAM,OACV3oB,IAAWyhB,GAAkB/wB,EAAI,MAAOi4B,CAAK,CAAA,GAC7Cj4B,IAAMA,EAAI,MAAO,GAAGi4B,CAAG,IAInBxpB,EAAYupB,MAGhBroB,IAAWqoB,GACXA,IAAS,UAGEA,KAAU,OAAOA,KAAW,aACvC7mB,IAAO,SAIHsM,EAAK,SAAS,KAClBpO,EAAO,KAAM;AAAA,UACZ,KAAKrP;AAAA;AAAA;AAAA;AAAA,UAKL,MAAMmR,KAAQ;AAAA,UACd,UAAU;AAAA,UACV,MAAM6mB;AAAA,QACT,GAAM,KAAM,SAAUE,GAAe;AAGlC,UAAAhD,IAAW,WAEXzX,EAAK,KAAMnO;AAAA;AAAA;AAAA,YAIVD,EAAQ,SAAU,OAAQA,EAAO,UAAW6oB,CAAc,CAAA,EAAG,KAAM5oB,CAAU;AAAA;AAAA;AAAA,YAG7E4oB;AAAA;QAKD,CAAA,EAAG,OAAQvoB,KAAY,SAAUukB,GAAOwC,GAAS;AACjD,UAAAjZ,EAAK,KAAM,WAAW;AACrB,YAAA9N,EAAS,MAAO,MAAMulB,KAAY,CAAEhB,EAAM,cAAcwC,GAAQxC,CAAK;UACzE;QACA,IAGQ;AAAA,MACR,GAKA7kB,EAAO,KAAK,QAAQ,WAAW,SAAUO,GAAO;AAC/C,eAAOP,EAAO,KAAMA,EAAO,QAAQ,SAAUyG,GAAK;AACjD,iBAAOlG,MAASkG,EAAG;AAAA,QACnB,CAAA,EAAG;AAAA,MACL,GAKAzG,EAAO,SAAS;AAAA,QACf,WAAW,SAAUO,GAAMG,GAAStU,GAAI;AACvC,cAAI08B,GAAaC,GAASC,GAAWC,GAAQC,GAAWC,GAAYC,GACnEC,IAAWrpB,EAAO,IAAKO,GAAM,UAAY,GACzC+oB,IAAUtpB,EAAQO,CAAM,GACxB6X,IAAQ,CAAA;AAGT,UAAKiR,MAAa,aACjB9oB,EAAK,MAAM,WAAW,aAGvB2oB,IAAYI,EAAQ,UACpBN,IAAYhpB,EAAO,IAAKO,GAAM,KAAK,GACnC4oB,IAAanpB,EAAO,IAAKO,GAAM,MAAM,GACrC6oB,KAAsBC,MAAa,cAAcA,MAAa,aAC3DL,IAAYG,GAAa,QAAS,MAAQ,IAAG,IAI3CC,KACJN,IAAcQ,EAAQ,YACtBL,IAASH,EAAY,KACrBC,IAAUD,EAAY,SAGtBG,IAAS,WAAYD,CAAW,KAAI,GACpCD,IAAU,WAAYI,CAAY,KAAI,IAGlC/pB,EAAYsB,OAGhBA,IAAUA,EAAQ,KAAMH,GAAMnU,GAAG4T,EAAO,OAAQ,CAAA,GAAIkpB,CAAS,KAGzDxoB,EAAQ,OAAO,SACnB0X,EAAM,MAAQ1X,EAAQ,MAAMwoB,EAAU,MAAQD,IAE1CvoB,EAAQ,QAAQ,SACpB0X,EAAM,OAAS1X,EAAQ,OAAOwoB,EAAU,OAASH,IAG7C,WAAWroB,IACfA,EAAQ,MAAM,KAAMH,GAAM6X,CAAK,KAG1B,OAAOA,EAAM,OAAQ,aACzBA,EAAM,OAAO,OAET,OAAOA,EAAM,QAAS,aAC1BA,EAAM,QAAQ,OAEfkR,EAAQ,IAAKlR;QAEd;AAAA,MACF,GAEApY,EAAO,GAAG,OAAQ;AAAA;AAAA,QAGjB,QAAQ,SAAUU,GAAU;AAG3B,cAAK,UAAU;AACd,mBAAOA,MAAY,SAClB,OACA,KAAK,KAAM,SAAUtU,GAAI;AACxB,cAAA4T,EAAO,OAAO,UAAW,MAAMU,GAAStU,CAAC;AAAA,YAC9C;AAGE,cAAIkQ,GAAMitB,GACThpB,IAAO,KAAM;AAEd,cAAMA;AAQN,mBAAMA,EAAK,eAAgB,EAAC,UAK5BjE,IAAOiE,EAAK,yBACZgpB,IAAMhpB,EAAK,cAAc,aAClB;AAAA,cACN,KAAKjE,EAAK,MAAMitB,EAAI;AAAA,cACpB,MAAMjtB,EAAK,OAAOitB,EAAI;AAAA,YACzB,KATU,EAAE,KAAK,GAAG,MAAM,EAAC;AAAA,QAUzB;AAAA;AAAA;AAAA,QAID,UAAU,WAAW;AACpB,cAAM,KAAM,IAIZ;AAAA,gBAAIC,GAAcC,GAAQ9pB,GACzBY,IAAO,KAAM,CAAG,GAChBmpB,IAAe,EAAE,KAAK,GAAG,MAAM,EAAC;AAGjC,gBAAK1pB,EAAO,IAAKO,GAAM,UAAU,MAAO;AAGvC,cAAAkpB,IAASlpB,EAAK;iBAER;AAON,mBANAkpB,IAAS,KAAK,UAId9pB,IAAMY,EAAK,eACXipB,IAAejpB,EAAK,gBAAgBZ,EAAI,iBAChC6pB,MACLA,MAAiB7pB,EAAI,QAAQ6pB,MAAiB7pB,EAAI,oBACpDK,EAAO,IAAKwpB,GAAc,UAAU,MAAO;AAE3C,gBAAAA,IAAeA,EAAa;AAE7B,cAAKA,KAAgBA,MAAiBjpB,KAAQipB,EAAa,aAAa,MAGvEE,IAAe1pB,EAAQwpB,CAAc,EAAC,OAAM,GAC5CE,EAAa,OAAO1pB,EAAO,IAAKwpB,GAAc,kBAAkB,KAChEE,EAAa,QAAQ1pB,EAAO,IAAKwpB,GAAc,mBAAmB;YAEnE;AAGD,mBAAO;AAAA,cACN,KAAKC,EAAO,MAAMC,EAAa,MAAM1pB,EAAO,IAAKO,GAAM,aAAa,EAAM;AAAA,cAC1E,MAAMkpB,EAAO,OAAOC,EAAa,OAAO1pB,EAAO,IAAKO,GAAM,cAAc,EAAM;AAAA,YACjF;AAAA;AAAA,QACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYD,cAAc,WAAW;AACxB,iBAAO,KAAK,IAAK,WAAW;AAG3B,qBAFIipB,IAAe,KAAK,cAEhBA,KAAgBxpB,EAAO,IAAKwpB,GAAc,UAAY,MAAK;AAClE,cAAAA,IAAeA,EAAa;AAG7B,mBAAOA,KAAgBzV;AAAA,UAC1B;QACE;AAAA,MACF,IAGA/T,EAAO,KAAM,EAAE,YAAY,eAAe,WAAW,cAAe,GAAE,SAAUiQ,GAAQ+C,GAAO;AAC9F,YAAIpe,IAAwBoe,MAAlB;AAEV,QAAAhT,EAAO,GAAIiQ,CAAQ,IAAG,SAAUrQ,GAAM;AACrC,iBAAOoS,GAAQ,MAAM,SAAUzR,GAAM0P,GAAQrQ,GAAM;AAGlD,gBAAI2pB;AAOJ,gBANKjqB,GAAUiB,KACdgpB,IAAMhpB,IACKA,EAAK,aAAa,MAC7BgpB,IAAMhpB,EAAK,cAGPX,MAAQ;AACZ,qBAAO2pB,IAAMA,EAAKvW,CAAM,IAAGzS,EAAM0P,CAAM;AAGxC,YAAKsZ,IACJA,EAAI;AAAA,cACF30B,IAAY20B,EAAI,cAAV3pB;AAAA,cACPhL,IAAMgL,IAAM2pB,EAAI;AAAA,YACrB,IAGIhpB,EAAM0P,CAAQ,IAAGrQ;AAAA,UAElB,GAAEqQ,GAAQrQ,GAAK,UAAU,MAAM;AAAA,QAClC;AAAA,MACA,IAQAI,EAAO,KAAM,CAAE,OAAO,MAAM,GAAI,SAAU6B,GAAImR,GAAO;AACpD,QAAAhT,EAAO,SAAUgT,CAAM,IAAG8I;AAAA,UAAc3c,GAAQ;AAAA,UAC/C,SAAUoB,GAAMkb,GAAW;AAC1B,gBAAKA;AACJ,qBAAAA,IAAWD,GAAQjb,GAAMyS,IAGlBoH,GAAU,KAAMqB,CAAU,IAChCzb,EAAQO,CAAM,EAAC,SAAQ,EAAIyS,CAAM,IAAG,OACpCyI;AAAA,UAEF;AAAA,QACH;AAAA,MACA,IAIAzb,EAAO,KAAM,EAAE,QAAQ,UAAU,OAAO,QAAS,GAAE,SAAUW,GAAMmB,GAAO;AACzE,QAAA9B,EAAO;AAAA,UAAM,EAAE,SAAS,UAAUW,GAAM,SAASmB,GAAM,IAAI,UAAUnB,EAAM;AAAA,UAC1E,SAAUgpB,GAAcC,GAAW;AAGnC,YAAA5pB,EAAO,GAAI4pB,CAAU,IAAG,SAAUC,GAAQjoB,GAAQ;AACjD,kBAAIqQ,IAAY,UAAU,WAAY0X,KAAgB,OAAOE,KAAW,YACvEzM,IAAQuM,MAAkBE,MAAW,MAAQjoB,MAAU,KAAO,WAAW;AAE1E,qBAAOoQ,GAAQ,MAAM,SAAUzR,GAAMuB,GAAMF,GAAQ;AAClD,oBAAIjC;AAEJ,uBAAKL,GAAUiB,KAGPqpB,EAAS,QAAS,OAAO,MAAO,IACtCrpB,EAAM,UAAUI,CAAM,IACtBJ,EAAK,SAAS,gBAAiB,WAAWI,CAAI,IAI3CJ,EAAK,aAAa,KACtBZ,IAAMY,EAAK,iBAIJ,KAAK;AAAA,kBACXA,EAAK,KAAM,WAAWI,CAAM;AAAA,kBAAEhB,EAAK,WAAWgB,CAAM;AAAA,kBACpDJ,EAAK,KAAM,WAAWI,CAAM;AAAA,kBAAEhB,EAAK,WAAWgB,CAAM;AAAA,kBACpDhB,EAAK,WAAWgB,CAAM;AAAA,gBAC5B,KAGWiB,MAAU;AAAA;AAAA,kBAGhB5B,EAAO,IAAKO,GAAMuB,GAAMsb,CAAO;AAAA;AAAA;AAAA,kBAG/Bpd,EAAO,MAAOO,GAAMuB,GAAMF,GAAOwb,CAAK;AAAA;AAAA,cACvC,GAAEtb,GAAMmQ,IAAY4X,IAAS,QAAW5X,CAAS;AAAA,YACrD;AAAA,UACA;AAAA;MACA,IAGAjS,EAAO,KAAM;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,GAAG,SAAU6B,GAAIC,GAAO;AACvB,QAAA9B,EAAO,GAAI8B,CAAM,IAAG,SAAU2E,GAAK;AAClC,iBAAO,KAAK,GAAI3E,GAAM2E,CAAE;AAAA,QAC1B;AAAA,MACA,IAKAzG,EAAO,GAAG,OAAQ;AAAA,QAEjB,MAAM,SAAU0W,GAAOlwB,GAAMigB,GAAK;AACjC,iBAAO,KAAK,GAAIiQ,GAAO,MAAMlwB,GAAMigB;QACnC;AAAA,QACD,QAAQ,SAAUiQ,GAAOjQ,GAAK;AAC7B,iBAAO,KAAK,IAAKiQ,GAAO,MAAMjQ,CAAE;AAAA,QAChC;AAAA,QAED,UAAU,SAAUxG,GAAUyW,GAAOlwB,GAAMigB,GAAK;AAC/C,iBAAO,KAAK,GAAIiQ,GAAOzW,GAAUzZ,GAAMigB;QACvC;AAAA,QACD,YAAY,SAAUxG,GAAUyW,GAAOjQ,GAAK;AAG3C,iBAAO,UAAU,WAAW,IAC3B,KAAK,IAAKxG,GAAU,IAAM,IAC1B,KAAK,IAAKyW,GAAOzW,KAAY,MAAMwG,CAAE;AAAA,QACtC;AAAA,QAED,OAAO,SAAUqjB,GAAQC,GAAQ;AAChC,iBAAO,KAAK,WAAYD,CAAM,EAAG,WAAYC,KAASD;QACtD;AAAA,MACF,IAEA9pB,EAAO;AAAA,QAAQ,wLAE8C,MAAO,GAAK;AAAA,QACxE,SAAU6B,GAAIlB,GAAO;AAGpB,UAAAX,EAAO,GAAIW,CAAM,IAAG,SAAUna,GAAMigB,GAAK;AACxC,mBAAO,UAAU,SAAS,IACzB,KAAK,GAAI9F,GAAM,MAAMna,GAAMigB,CAAI,IAC/B,KAAK,QAAS9F;UAClB;AAAA,QACA;AAAA;AAOA,UAAIuD,KAAQ;AAMZ,MAAAlE,EAAO,QAAQ,SAAUyG,GAAIvG,GAAU;AACtC,YAAI2H,GAAK8B,GAAMqgB;AAUf,YARK,OAAO9pB,KAAY,aACvB2H,IAAMpB,EAAIvG,IACVA,IAAUuG,GACVA,IAAKoB,IAKD,EAACzI,EAAYqH;AAKlB,iBAAAkD,IAAOjL,EAAM,KAAM,WAAW,CAAC,GAC/BsrB,IAAQ,WAAW;AAClB,mBAAOvjB,EAAG,MAAOvG,KAAW,MAAMyJ,EAAK,OAAQjL,EAAM,KAAM,SAAS,CAAI,CAAA;AAAA,UAC1E,GAGCsrB,EAAM,OAAOvjB,EAAG,OAAOA,EAAG,QAAQzG,EAAO,QAElCgqB;AAAA,MACR,GAEAhqB,EAAO,YAAY,SAAUiqB,GAAO;AACnC,QAAKA,IACJjqB,EAAO,cAEPA,EAAO,MAAO;MAEhB,GACAA,EAAO,UAAU,MAAM,SACvBA,EAAO,YAAY,KAAK,OACxBA,EAAO,WAAWyI,IAClBzI,EAAO,aAAaZ,GACpBY,EAAO,WAAWV,IAClBU,EAAO,YAAY2S,IACnB3S,EAAO,OAAOF,IAEdE,EAAO,MAAM,KAAK,KAElBA,EAAO,YAAY,SAAUX,GAAM;AAKlC,YAAIyC,IAAO9B,EAAO,KAAMX,CAAG;AAC3B,gBAASyC,MAAS,YAAYA,MAAS;AAAA;AAAA;AAAA,QAKtC,CAAC,MAAOzC,IAAM,WAAYA,CAAK,CAAA;AAAA,MACjC,GAEAW,EAAO,OAAO,SAAUgK,GAAO;AAC9B,eAAOA,KAAQ,OACd,MACEA,IAAO,IAAK,QAAS9F,IAAO,EAAE;AAAA,MAClC;AA0BA,UAGCgmB,KAAU5rB,EAAO,QAGjB6rB,KAAK7rB,EAAO;AAEb,aAAA0B,EAAO,aAAa,SAAUiB,GAAO;AACpC,eAAK3C,EAAO,MAAM0B,MACjB1B,EAAO,IAAI6rB,KAGPlpB,KAAQ3C,EAAO,WAAW0B,MAC9B1B,EAAO,SAAS4rB,KAGVlqB;AAAA,MACR,GAKK,OAAOzB,IAAa,QACxBD,EAAO,SAASA,EAAO,IAAI0B,IAMrBA;AAAA,IACP;;;;;;;AC3mVA,GAAC,SAAU7B,GAAS;AAMhB,IAAAC,EAAiB,UAAAD,EAAQisB,GAAiB,CAAA;AAAA,EAK7C,GAAC,SAAUpqB,GAAQ;AAKlB,QAAIqqB,IAAW,IACbC,IAAa,IACbC,IAAkB,GAClBC,IAAiB,KACjBC,IAAkB,GAEhBC,IAAI1qB,GACN2qB,IAAO,UACPC,IAAO,QACPC,KAAUH,EAAEE,CAAI,GAEdE,KAAgB,CAAA;AAGpB,aAASC,KAAgB;AACvB,UAAInV,IAAU+U,EAAK,iBAAkB,WAAY;AAAE,YAAIlH,IAAIkH,EAAK,qBAAqB,QAAQ;AAAG,eAAQlH,EAAE,SAAUA,EAAEA,EAAE,SAAS,CAAC,IAAI;AAAA,MAAM,KACxIuH,IAAOpV,IAAUA,EAAQ,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI;AACjD,aAAQoV,EAAK,MAAM,GAAG,EAAE,SAAS,IAAKA,EAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,MAAM;AAAA,IACtF;AAGD,QAAIC,KAAoBL,EAAK,yBAAyBA,EAAK,+BAA+BA,EAAK,4BAA4B,IACvHM,IAAsBN,EAAK,wBAAwBA,EAAK,8BAA8BA,EAAK,2BAA2B;AAE1H,QAAKK;AAcH,MAAKL,EAAK,yBAAsBM,IAAsB,SAAUh7B,GAAI;AAAA,MAAA;AAAA,SAd9C;AACtB,UAAIi7B,KAAc;AAClB,MAAAF,KAAoB,SAAU3qB,GAAUjV,GAAS;AAC/C,YAAI+/B,KAAW,oBAAI,KAAM,GAAC,QAAO,GAC7BC,IAAa,KAAK,IAAI,GAAG,MAAMD,IAAWD,GAAY,GACtDj7B,IAAK06B,EAAK;AAAA,UAAW,WAAY;AAAE,YAAAtqB,EAAS8qB,IAAWC,CAAU;AAAA,UAAI;AAAA,UACvEA;AAAA,QAAU;AACZ,eAAAF,KAAcC,IAAWC,GAClBn7B;AAAA,MACb,GACIg7B,IAAsB,SAAUh7B,GAAI;AAClC,QAAA06B,EAAK,aAAa16B,CAAE;AAAA,MAC1B;AAAA,IACA;AAIE,QAAIo7B,KAAsBV,EAAK,oBAAoBA,EAAK,0BAA0B,IAE9EW,KAAM,KAAK,OAAO,WAAY;AAAE,cAAO,oBAAI,KAAM,GAAC,QAAS;AAAA,OAE3DC,KAAiB;AAAA,MACnB,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,aAAa;AAAA,MACb,iBAAiB,IAAI;AAAA,MACrB,eAAe;AAAA;AAAA,MACf,cAAc;AAAA;AAAA,MACd,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,yBAAyB;AAAA,MACzB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,aAAa;AAAA,QACX,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,MACT;AAAA,MACD,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,oBAAoB;AAAA;AAAA,MAEpB,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,MACvB,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,yBAAyB;AAAA,MACzB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,YAAYT,GAAe;AAAA,MAC3B,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MACzB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACjB,GAEMU,KAAkB,IAElBC,KAAsB,WAAY;AAEpC,UAAID,GAAiB,QAAOA;AAE5B,UAAIE,IAAMhB,EAAK,cAAc,KAAK,GAChCiB,IAASD,EAAI,OACbE,IAAS,UAAU,WACnBC,IAAY,UAAU,UACtBjjC,IAAI,CAAA;AAEN,MAAAA,EAAE,iBAAiB,wBAAwB8hC,KAAQ,8BAA8BA,KAAQ,2BAA2BA,GAEpH9hC,EAAE,UAAW,WAAW+hC,GACxB/hC,EAAE,YAAaA,EAAE,WAAY,kBAAkB,WAC/CA,EAAE,cAAe,OAAO,UAAU,SAAS,KAAK+hC,EAAK,SAAS,MAAM,sBAEpE/hC,EAAE,OAAS,SAAS8hC,KAAU,iBAAiBgB,KAAQ,CAAC9iC,EAAE,SAC1DA,EAAE,UAAWA,EAAE,QAAQ,EAAE,yBAAyB+iC,IAClD/iC,EAAE,QAAQA,EAAE,QAAQ,CAACA,EAAE,YAAY,EAAE,kBAAkB8hC,MAAUA,EAAK,iBAAiB,IACvF9hC,EAAE,QAAQA,EAAE,QAAS,kBAAkB8hC,KAAUA,EAAK,iBAAiB,GACvE9hC,EAAE,QAAQA,EAAE,QAAS,iBAAiB+hC,KAAUD,EAAK,iBAAiB,GACtE9hC,EAAE,SAASA,EAAE,QAAS,iBAAiB+hC,KAAUD,EAAK,iBAAiB,IACvE9hC,EAAE,SAAU,yBAAyB8iC,KAAShB,EAAK,gBAAgB,IAEnE9hC,EAAE,WAAY,mBAAmB+hC,GAEjC/hC,EAAE,YAAa,mBAAmB+iC,GAElC/iC,EAAE,WAAW,CAACA,EAAE,YAAa,sBAAsB+iC,GAEnD/iC,EAAE,WAAWA,EAAE,YAAa,YAAY+hC,GACxC/hC,EAAE,aAAcA,EAAE,YAAa,iBAAiB+iC,GAChD/iC,EAAE,aAAc,CAACA,EAAE,cAAgBA,EAAE,YAAYA,EAAE,gBACnDA,EAAE,aAAc,CAACA,EAAE,cAAgBA,EAAE,YAAa,gBAAgB+iC,GAElE/iC,EAAE,WAAY,kBAAkB8hC,EAAK,mBAAqB,kBAAkBC,GAC5E/hC,EAAE,eAAe+hC,EAAK,gBAAgB,QAAK,UAAA,iBAAA,KAAA,UAAA,mBAAA,IAC3C/hC,EAAE,aAAc,CAACA,EAAE,gBAAiB+hC,EAAK,kBAAkB,KAE3D/hC,EAAE,QAAQ,SAAS,KAAKijC,CAAS,GAEjCjjC,EAAE,QAAQA,EAAE,YAAY,oBAAoB,KAAKijC,CAAS,GAC1DjjC,EAAE,SAASA,EAAE,SAAS,EAAE,UAAU,SAClCA,EAAE,SAASA,EAAE,SAAU,kBAAkB8hC,GACzC9hC,EAAE,SAASA,EAAE,SAAU,YAAY8hC,GACnC9hC,EAAE,UAAUA,EAAE,SAAS+hC,EAAK,OAE5B/hC,EAAE,YAAa,WAAW,KAAKgjC,CAAM,GAErChjC,EAAE,mBAAoB,sBAAsB8iC,GAE5C9iC,EAAE,UAAU,IACZA,EAAE,eAAe,IACjBA,EAAE,iBAAiB,IACnBA,EAAE,kBAAkB,IACpBA,EAAE,gBAAgB,IAClBA,EAAE,gBAAgB,IAElBA,EAAE,UAAU,aACZA,EAAE,eAAgB,eAAe+iC,KAAY,WAAY;AAEvD,iBADIhjB,KAAQ,CAAC,eAAe,mBAAmB,gBAAgB,YAAY,GAClE9X,KAAI,GAAG0F,IAAIoS,GAAM,QAAQ9X,KAAI0F,GAAG1F;AACvC,cAAI86B,EAAOhjB,GAAM9X,EAAC,CAAC,MAAM,QAAW;AAClC,YAAAjI,EAAE,UAAU+f,GAAM9X,EAAC;AACnB;AAAA,UACD;AAEH,QAAAjI,EAAE,eAAgB,CAAC,CAACA,EAAE;AAAA,MAC5B,KAEQA,EAAE,iBACJ+iC,EAAO/iC,EAAE,OAAO,IAAI,4BACpBA,EAAE,iBAAiB,cAAc,KAAK+iC,EAAO/iC,EAAE,OAAO,CAAC,IAGzDA,EAAE,kBAAkB,cACpBA,EAAE,cAAc,IAChBA,EAAE,gBAAgB,iBAElBA,EAAE,gBAAiB,gBAAgB+iC,KAAY,WAAY;AAEzD,QAAA/iC,EAAE,gBAAgB;AAIlB,iBAHI+f,KAAQ,CAAC,oBAAoB,gBAAgB,iBAAiB,eAAe,eAAe,iBAAiB,GAC7GnhB,KAAS,CAAC,YAAY,QAAQ,SAAS,OAAO,MAAM,SAAS,GAC7DskC,IAAM,CAAC,uBAAuB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,GACrHj7B,KAAI,GAAG0F,KAAIoS,GAAM,QAAQ9X,KAAI0F,IAAG1F;AACvC,cAAI8X,GAAM9X,EAAC,KAAK86B,GAAQ;AACtB,YAAA/iC,EAAE,kBAAkB+f,GAAM9X,EAAC,GAC3BjI,EAAE,cAAcpB,GAAOqJ,EAAC,GACxBjI,EAAE,gBAAgBkjC,EAAIj7B,EAAC;AACvB;AAAA,UACD;AAEH,QAAIjI,EAAE,eAAYA,EAAE,cAAcpB,GAAO,CAAC,IAE1CoB,EAAE,gBAAiBA,EAAE;AAAA,MAE3B;AAEI,eAASmjC,KAAmB;AAC1B,YAAIC,KAAM,CAAC,QAAQ,gBAAgB,WAAW;AAC9C,SAAKpjC,EAAE,YAAY,CAACA,EAAE,cAAeA,EAAE,UAAMojC,KAAM;AACnD,iBAASn7B,KAAI,GAAG2d,IAAIwd,GAAI,QAAQn7B,KAAI2d,GAAG3d,MAAK;AAC1C,cAAI2C,KAAIw4B,GAAIn7B,EAAC;AAEb,cADA86B,EAAO,SAASn4B,IACZm4B,EAAO,UAAUn4B,GAAG,QAAOA;AAAA,QAChC;AACD,eAAO;AAAA,MACR;AACD,aAAA5K,EAAE,kBAAkBmjC,MAEpBnjC,EAAE,kBAAmB,gBAAgB8iC,GAErC9iC,EAAE,sBAAuByiC,OAAwB,IAEjDK,IAAM,MAENF,KAAkB5iC,GAEXA;AAAA,IACX,GAEMqjC,IAAkB,SAAUC,GAAOC,GAAI;AAEzC,UAAIhe,IAAO;AAEX,WAAK,UAAU,SACf,KAAK,OAAO,cAEZ,KAAK,KAAKge;AAEV,UAAIC,IAAQ3B,EAAE,MAAM,GAEhBvK,IAAM,KAAK,MAAM;AAAA,QACnB,KAAKkM;AAAA,QACL,KAAK;AAAA,MACX;AAOI,UALA3B,EAAE,OAAOvK,GAAKqL,EAAc,GAG5BrL,EAAI,gBAAgB,IAEhBgM;AACR,iBAAAr7B,MAAAqvB;AACA,UAAAgM,EAAAr7B,EAAA,MAAA,WAAAqvB,EAAArvB,EAAA,IAAAq7B,EAAAr7B,EAAA;AA4DI,UAxDIqvB,EAAI,4BAAyBmL,KAAsB,KAEvD,KAAK,MAAMnL,EAAI,KACf,KAAK,QAAS,KAAK,OAAO,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,MAAM,IAC3D,KAAK,SAAS,aAAa,KAAMA,EAAI,MAAOA,EAAI,IAAI,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE,QAAQ,GACtF,KAAK,aAAcA,EAAI,QAAQ,IAC/B,KAAK,MAAMA,EAAI,QAAQ,KAAK,SAAS0K,KAAU,KAAK,MACpD,KAAK,YAAa,KAAK,UAAU,CAAC,KAAK,aAAcA,KAAU,KAAK,KACpE,KAAK,OAAOwB,GACZ,KAAK,WAAW,IAEhB,KAAK,UAAU,IAEf,KAAK,SAAS,IACd,KAAK,WAAa,KAAK,IAAI,CAAC,EAAE,YAAY,YAAc,KAAK,IAAI,CAAC,EAAE,YAAY,UAEhF,KAAK,aAAc,KAAK,IAAI,CAAC,EAAE,YAAY,YAE3C,KAAK,cAAc,IAEnB,KAAK,sBAAuBlM,EAAI,gBAAgB,UAGhD,KAAK,cAAc,IACnB,KAAK,YAAY,IACjB,KAAK,cAAc,IACnB,KAAK,eAAe,IACpB,KAAK,aAAa,IAClB,KAAK,gBAAgB,IACrB,KAAK,UAAU,IAGf,KAAK,gBAAgB,IACrB,KAAK,cAAc,IACnB,KAAK,iBAAiB,IAEtB,KAAK,WAAW,IAChB,KAAK,YAAY,IAGjB,KAAK,OAAO,IACZ,KAAK,OAAO,IAEZ,KAAK,SAAS;AAAA,QACZ,GAAG;AAAA,QACH,GAAG;AAAA,MACT,GACI,KAAK,cAAc;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,MACT,GACI,KAAK,eAAe,IACpB,KAAK,iBAAiB,GAIlBA,EAAI,WAAW,QAAQ;AACzB,YAAIrsB,KAAS,KAAK,IAAI,CAAC,KAAK82B,IAAO,KAAK,OAAO,KAAK,KAChD0B,KAAcx4B,GAAO,IAAI,cAAc,KAAKA,GAAO,IAAI,sBAAsB,KAAKA,GAAO,IAAI,kBAAkB,KAAKA,GAAO,IAAI,mBAAmB;AAEtJ,QAAIw4B,MAAe,mBAAmBA,MAAe,WAAWA,OAAgB,MAC9E,KAAK,YAAax4B,GAAO,IAAI,WAAW,KAAK,OAC7C,KAAK,aAAa,OAElB,KAAK,YAAaw4B,MAAe,iBAAiBA,MAAe,QAAQA,MAAe,WAAWA,MAAe,SAClH,KAAK,aAAcA,MAAe,iBAAiBA,MAAe,QAAQA,MAAe;AAAA,MAEjG;AACM,aAAK,YAAanM,EAAI,YAAY,IAClC,KAAK,aAAa;AAYpB,UARA,KAAK,gBAAgB,IAErB,KAAK,YAAY,IAEjB,KAAK,WAAW,IAChB,KAAK,kBAAkB,IACvB,KAAK,eAAe,IAEhBA,EAAI,gBAAgB;AACtB,aAAK,KAAKA,EAAI;AAAA;AAEd;AACE,eAAK,KAAK,YAAaqK;AAAA,eAChBG,EAAK,eAAe,KAAK,EAAE;AAGtC,WAAK,OAAO,IACZ,KAAK,SAAS,IACd,KAAK,gBAAgB,IACrB,KAAK,gBAAgB,IAErB,KAAK,OAAO,IACZ,KAAK,aAAa,IAElB,KAAK,WAAW,IAChB,KAAK,gBAAgB,IAGrB,KAAK,cAAc,IACnB,KAAK,SAAS,IACd,KAAK,SAAS,IACd,KAAK,eAAe,IAEpB,KAAK,iBAAiB,IAEtB,KAAK,YAAYxK,EAAI,WACrB,KAAK,YAAYA,EAAI,WAErB,KAAK,sBAAsB,IAC3B,KAAK,YAAY,GAEjB,KAAK,SAAS,IAEd,KAAK,QAAQ,IAEb,KAAK,YAAY,IACjB,KAAK,WAAW,IAEhB,KAAK,aAAa,GAClB,KAAK,aAAa,GAElB,KAAK,WAAWuL;AAEhB,UAAIa,IAAM7B,EAAE,OAAO,CAAA,GAAI,KAAK,QAAQ;AAEpC,WAAK,cAAe6B,EAAI,gBAAgBpM,EAAI,gBAC5C,KAAK,aAAc,KAAK,eAAe/R,EAAK,YAEvC,KAAK,YAEC,KAAK,aACd,KAAK,eAAe,EAAEme,EAAI,YAAYA,EAAI,QAAQA,EAAI,UAEtD,KAAK,eAAe,EAAEA,EAAI,YAAaA,EAAI,QAAQ,CAACA,EAAI,UAAU,CAACA,EAAI,UAJvE,KAAK,eAAe,IAOtB,KAAK,iBAAiB,IAKlB,CAACA,EAAI,aAAaA,EAAI,eAAeA,EAAI,cAC3C,KAAK,iBAAiB,KACbA,EAAI,YAAY,CAACA,EAAI,SAAS,CAACA,EAAI,cAAcA,EAAI,YAAYA,EAAI,eAC9E,KAAK,iBAAiB,KAInBpM,EAAI,uBACPoM,EAAI,kBAAkB,IACtBA,EAAI,iBAAiB,KAGvB,KAAK,YAAY,SAAU5rB,GAAM8F,GAAI+lB,GAAI;AACvC,YAAKpe,GACL;AAAA,cAAIqe,IAAKre,EAAK,UAAUzN,CAAI,KAAK;AACjC,UAAK8rB,MACHre,EAAK,UAAUzN,CAAI,IAAI;AAAA,YACrB,GAAGsqB,GAAkB,WAAY;AAC/B,cAAA7c,EAAK,UAAUzN,CAAI,EAAE,GAAG,KAAKyN,CAAI,GACjCA,EAAK,UAAUzN,CAAI,IAAI;AAAA,YACxB,GAAE6rB,CAAE;AAAA,UACf,GACQ/lB,EAAG,KAAK2H,CAAI,IAEdA,EAAK,UAAUzN,CAAI,EAAE,KAAK8F;AAAA;AAAA,MAChC,GAGI,KAAK,UAAU,SAAU9F,GAAM8F,GAAI;AACjC,QAAI2H,EAAK,SAASzN,CAAI,IAAGyN,EAAK,SAASzN,CAAI,IAAI8F,KAE7C2H,EAAK,SAASzN,CAAI,IAAI8F,GACtBwkB,GAAkB,WAAY;AAC5B,UAAK7c,MACLA,EAAK,SAASzN,CAAI,KAAKyN,EAAK,SAASzN,CAAI,EAAE,KAAKyN,CAAI,GACpDA,EAAK,SAASzN,CAAI,IAAI;AAAA,QAChC,CAAS;AAAA,MAET,GAEI,KAAK,YAAY,SAAUA,GAAM;AAC/B,QAAIyN,EAAK,SAASzN,CAAI,MAAGyN,EAAK,SAASzN,CAAI,IAAI;AAAA,MACrD,GAEI,KAAK,MAAM,SAAUgG,GAAI+lB,GAAM;AAC7B,iBAAS5e,KAAK4e;AACZ,UAAAte,EAAK,MAAM,IAAI,KAAK,CAACzH,GAAImH,GAAGnH,EAAG,IAAImH,CAAC,CAAC,CAAC,GACtCnH,EAAG,IAAImH,GAAG4e,EAAK5e,CAAC,CAAC;AAAA,MAEzB,GAEI,KAAK,YAAY,SAAUlO,GAAK;AAC9B,eAAQA,MAAQ,SAAawO,EAAK,aAAY,IAAKA,EAAK,aAAaxO,CAAG;AAAA,MAC9E,GAEI,KAAK,aAAa,SAAUA,GAAK;AAC/B,eAAQA,MAAQ,SAAawO,EAAK,cAAa,IAAKA,EAAK,cAAcxO,CAAG;AAAA,MAChF;AAGI,UAAI+sB,KAAc,SAAUC,GAAIC,GAAIC,GAAKC,GAAIC,GAAIC,GAAIC,IAAI;AAEvD,aAAK,KAAKN,GACV,KAAK,KAAKC,GACV,KAAK,MAAMC,GAEX,KAAK,KAAKC,KAAM,GAChB,KAAK,KAAKC,KAAM,GAChB,KAAK,KAAKC,KAAM,GAChB,KAAK,KAAKC,MAAM,GAEhB,KAAK,KAAK3B,MACV,KAAK,KAAKsB,IAAKD;AAAA,MACrB;AACI,MAAAD,GAAY,YAAY;AAAA,QACtB,IAAI,SAAU1V,GAAG;AACf,iBAAO,KAAK,IAAIA,MAAM,IAAIA,KAAKA;AAAA,QAChC;AAAA,QACD,IAAI,SAAUA,GAAG;AACf,iBAAO,KAAK,IAAIA,KAAKA,IAAIA;AAAA,QAC1B;AAAA,QACD,IAAI,SAAUA,GAAG;AACf,iBAAOA,IAAIA,IAAIA;AAAA,QAChB;AAAA,QACD,QAAQ,WAAY;AAClB,kBAAQsU,GAAG,IAAK,KAAK,MAAM,KAAK;AAAA,QACjC;AAAA,QACD,QAAQ,WAAY;AAClB,cAAI4B,KAAM5B,GAAK,IAAG,KAAK,MAAM,KAAK,KAC9B6B,IAAK,KAAK,GAAGD,CAAE,IAAI,KAAK,GAAGA,CAAE,IAAI,KAAK,GAAGA,CAAE;AAC/C,iBAAQA,KAAM,IAAK,KAAK,KAAK,KAAK,KAAM,KAAK,KAAKC,IAAM;AAAA,QACzD;AAAA,QACD,QAAQ,SAAUP,GAAIC,GAAK;AACzB,sBAAK,KAAK,KAAK,UACf,KAAK,KAAKD,GACV,KAAK,MAAMC,GACX,KAAK,KAAKvB,MACV,KAAK,KAAK,KAAK,KAAK,KAAK,IAClB;AAAA,QACR;AAAA,MACP;AAGI,eAAS8B,KAAkB;AACzB,YAAIhS,IAAKjN,EAAK,IAAI,IAAIme,EAAI,OAAO;AACjC,eAAIlR,KAAOA,EAAG,OAAO,GAAG,CAAC,KAAK,WACrBA,EAAG,QAAQ,iBAAiB,IAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,KAAK,IAElE;AAAA,MACR;AAED,UAAI,KAAK,YAAY;AAEnB,aAAK,IAAI,YAAY;AAAA,UACnB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,IAAI;AAAA,UACJ,IAAI;AAAA,QACZ,GAGUkR,EAAI,kBAAkBA,EAAI,SAAO,KAAK,IAAI,IAAI,+BAA+B,QAAQ,GAEzF,KAAK,eAAe,SAAUxjB,GAAM;AAClC,cAAI,CAACA,GAAM;AACT,gBAAIukB,IAAMD;AACV,gBAAIC,EAAK,QAAQA,EAAI,UAAU,KAAM,CAACA,EAAI,EAAE,IAAI,CAACA,EAAI,CAAC;AACtD,gBAAIlf,EAAK,eAAeA,EAAK,YAAY,GAAI,QAAOA,EAAK,YAAY,GAAG;UACzE;AACD,iBAAOA,EAAK,IAAI,UAAU;AAAA,QAClC,GAEM,KAAK,gBAAgB,SAAUrF,GAAM;AACnC,cAAI,CAACA,GAAM;AACT,gBAAIukB,IAAMD;AACV,gBAAIC,EAAK,QAAQA,EAAI,UAAU,KAAM,CAACA,EAAI,EAAE,IAAI,CAACA,EAAI,CAAC;AACtD,gBAAIlf,EAAK,eAAeA,EAAK,YAAY,GAAI,QAAOA,EAAK,YAAY,GAAG;UACzE;AACD,iBAAOA,EAAK,IAAI,UAAU;AAAA,QAClC,GAEM,KAAK,oBAAoB,SAAUzH,GAAI;AACrC,cAAI1X,IAAI07B,EAAK,YAAY,UAAU;AACnC,UAAA17B,EAAE,YAAY,UAAU,IAAO,IAAO27B,GAAM,CAAC,GAC7C37B,EAAE,YAAY,IACd0X,EAAG,cAAc1X,CAAC;AAAA,QAC1B;AAEM,YAAIs+B,KAAgB,KAAK,YAAa,IAAI;AAE1C,QAAIhB,EAAI,kBAAkBpM,EAAI,qBAC5B,KAAK,eAAe,SAAUvgB,GAAK4tB,GAAQ;AACzC,UAAApf,EAAK,IAAI,UAAU,IAAIxO,GACvBwO,EAAK,IAAI,UAAU,KAAMxO,IAAM,KAAM,MACrCwO,EAAK,IAAI,IAAIme,EAAI,SAAS,iBAAiBne,EAAK,IAAI,UAAU,KAAK,MAAMA,EAAK,IAAI,UAAU,KAAK,KAAK,GACjGof,KAAQpf,EAAK,kBAAkBA,EAAK,IAAI,CAAC,CAAC;AAAA,QACzD,GACQ,KAAK,gBAAgB,SAAUxO,GAAK4tB,GAAQ;AAC1C,UAAApf,EAAK,IAAI,UAAU,IAAIxO,GACvBwO,EAAK,IAAI,UAAU,KAAMxO,IAAM2tB,KAAgB,MAC/Cnf,EAAK,IAAI,IAAIme,EAAI,SAAS,iBAAiBne,EAAK,IAAI,UAAU,KAAK,MAAMA,EAAK,IAAI,UAAU,KAAK,KAAK,GACjGof,KAAQpf,EAAK,kBAAkBA,EAAK,IAAI,CAAC,CAAC;AAAA,QACzD,MAEQ,KAAK,eAAe,SAAUxO,GAAK4tB,GAAQ;AACzC,UAAApf,EAAK,IAAI,UAAU,IAAIxO,GACvBwO,EAAK,IAAI,UAAU,KAAMxO,IAAM,KAAM,MACrCwO,EAAK,IAAI,IAAIme,EAAI,SAAS,eAAene,EAAK,IAAI,UAAU,KAAK,MAAMA,EAAK,IAAI,UAAU,KAAK,GAAG,GAC7Fof,KAAQpf,EAAK,kBAAkBA,EAAK,IAAI,CAAC,CAAC;AAAA,QACzD,GACQ,KAAK,gBAAgB,SAAUxO,GAAK4tB,GAAQ;AAC1C,UAAApf,EAAK,IAAI,UAAU,IAAIxO,GACvBwO,EAAK,IAAI,UAAU,KAAMxO,IAAM2tB,KAAgB,MAC/Cnf,EAAK,IAAI,IAAIme,EAAI,SAAS,eAAene,EAAK,IAAI,UAAU,KAAK,MAAMA,EAAK,IAAI,UAAU,KAAK,GAAG,GAC7Fof,KAAQpf,EAAK,kBAAkBA,EAAK,IAAI,CAAC,CAAC;AAAA,QACzD;AAAA,MAEA;AAEM,aAAK,eAAe,WAAY;AAC9B,iBAAOA,EAAK,UAAU;QAC9B,GACM,KAAK,eAAe,SAAUxO,GAAK;AACjC,UAAAwO,EAAK,UAAU,UAAUxO,CAAG;AAAA,QACpC,GAEM,KAAK,gBAAgB,WAAY;AAC/B,cAAIA;AACJ,iBAAKwO,EAAK,eAECA,EAAK,SAAS,YACvBxO,IAAMwO,EAAK,KAAK,OAAO,KAAK,IAAIA,EAAK,UAAU,WAAU,CAAE,IAE3DxO,IAAMwO,EAAK,KAAK,OAAOA,EAAK,UAAU,eAJtCxO,IAAMwO,EAAK,UAAU,cAMhBxO;AAAA,QACf,GACM,KAAK,gBAAgB,SAAUA,GAAK;AAClC,iBAAO,WAAW,WAAY;AAC5B,gBAAKwO;AACL,qBAAIA,EAAK,iBACHA,EAAK,SAAS,YAChBxO,IAAM,EAAEwO,EAAK,KAAK,OAAOxO,KAEzBA,IAAMwO,EAAK,KAAK,OAAOxO,IAGpBwO,EAAK,UAAU,WAAWxO,CAAG;AAAA,UACrC,GAAE,CAAC;AAAA,QACZ;AAGI,WAAK,YAAY,SAAU3Q,GAAG;AAC5B,eAAKA,IACDA,EAAE,SAAeA,EAAE,SACnBA,EAAE,aAAmBA,EAAE,aACpB,KAHQ;AAAA,MAIrB,GAEI,KAAK,YAAY,SAAUA,GAAGiB,GAAI;AAChC,YAAI,CAACjB,EAAG,QAAO;AAEf,iBADI0X,IAAK1X,EAAE,UAAUA,EAAE,cAAcA,KAAK,IACnC0X,KAAMA,EAAG,MAAMzW;AACpB,UAAAyW,IAAKA,EAAG,cAAc;AAExB,eAAQA,MAAO;AAAA,MACrB;AAEI,eAAS8mB,KAAY;AACnB,YAAIC,IAAMtf,EAAK;AACf,YAAI,YAAYsf,EAAK,QAAOA,EAAI,OAAM;AACtC,eAAOA,EAAI,SAAS,KAAG;AACrB,cAAIA,EAAI,CAAC,EAAE,YAAY,EAAG,QAAO;AACjC,cAAIC,IAAKD,EAAI,IAAI,QAAQ;AACzB,cAAI,CAAC,MAAMC,CAAE,KAAKA,MAAO,EAAG,QAAO,SAASA,CAAE;AAC9C,UAAAD,IAAMA,EAAI;QACX;AACD,eAAO;AAAA,MACR;AAGD,UAAIE,KAAsB;AAAA,QACxB,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,OAAS;AAAA,MACf;AAEI,eAASC,GAAgBH,GAAK1a,GAAM8a,GAAW;AAC7C,YAAIC,IAAKL,EAAI,IAAI1a,CAAI,GACjBgb,IAAK,WAAWD,CAAE;AACtB,YAAI,MAAMC,CAAE,GAAG;AACb,UAAAA,IAAKJ,GAAoBG,CAAE,KAAK;AAChC,cAAIE,IAAOD,KAAM,IAAOF,IAAc1f,EAAK,IAAI,YAAW,IAAKA,EAAK,IAAI,YAAa,IAAKA,EAAK,IAAI,WAAU,IAAKA,EAAK,IAAI,eAAiB;AAC5I,iBAAIA,EAAK,SAAS4f,MAAIA,KAAM,IACpBC,IAAOD,IAAK;AAAA,QACrB;AACD,eAAOA;AAAA,MACR;AAED,WAAK,0BAA0B,WAAY;AACzC,eAAO;AAAA,UACL,KAAKpD,EAAK,eAAeD,EAAK,gBAAgB;AAAA,UAC9C,MAAMC,EAAK,eAAeD,EAAK,gBAAgB;AAAA,QACvD;AAAA,MACA,GAEI,KAAK,YAAY,WAAY;AAC3B,YAAIvc,EAAK,SAAS;AAChB,cAAI8f,IAAM9f,EAAK,IAAI,OAAM,GACrB+f,IAAO/f,EAAK;AAChB,iBAAA8f,EAAI,OAAOC,EAAK,KAChBD,EAAI,QAAQC,EAAK,MACVD;AAAA,QACR;AACD,YAAIE,IAAKhgB,EAAK,IAAI,OAAM;AACxB,YAAI,CAACA,EAAK,SAAU,QAAOggB;AAC3B,YAAIC,IAAKjgB,EAAK,SAAS,OAAM;AAC7B,eAAO;AAAA,UACL,KAAKggB,EAAG,MAAMC,EAAG;AAAA,UACjB,MAAMD,EAAG,OAAOC,EAAG;AAAA,QAC3B;AAAA,MACA,GAEI,KAAK,kBAAkB,SAAU5tB,GAAK;AACpC,YAAI6tB,GAAK1F;AACT,YAAIxa,EAAK;AACP,UAAAA,EAAK,KAAK,IAAI;AAAA,YACZ,QAAQA,EAAK,IAAI,iBAAiB+R,EAAI,YAAY,MAAMA,EAAI,YAAY;AAAA,UAClF,CAAS,GACG/R,EAAK,SAAOA,EAAK,MAAM,IAAI;AAAA,YAC7B,OAAOA,EAAK,IAAI,gBAAgB+R,EAAI,YAAY,OAAOA,EAAI,YAAY;AAAA,UACjF,CAAS;AAAA,aACI;AACL,cAAIoO,IAAOngB,EAAK;AA2BhB,cA1BAkgB,IAAM;AAAA,YACJ,KAAKC,EAAK;AAAA,YACV,MAAMA,EAAK,QAAQpO,EAAI,YAAY,OAAOA,EAAI,YAAY;AAAA,UACpE,GACQmO,EAAI,OAAOT,GAAgBzf,EAAK,KAAK,oBAAoB,EAAI,GAC7DkgB,EAAI,QAASlgB,EAAK,KAAK,QAASA,EAAK,IAAI,WAAU,IAAKyf,GAAgBzf,EAAK,KAAK,oBAAoB,IAAIA,EAAK,KAAK,QAAQyf,GAAgBzf,EAAK,KAAK,mBAAmB,GAEzKwa,IAAMzI,EAAI,YACNyI,MACEA,EAAI,QAAK0F,EAAI,OAAO1F,EAAI,MACxBA,EAAI,SAAM0F,EAAI,QAAQ1F,EAAI,QAG3Bxa,EAAK,eAAaA,EAAK,KAAK,IAAI;AAAA,YACnC,KAAKkgB,EAAI;AAAA,YACT,MAAMA,EAAI;AAAA,YACV,SAAU7tB,IAAOA,EAAI,IAAI2N,EAAK,IAAI,YAAW,MAAO+R,EAAI,YAAY,MAAMA,EAAI,YAAY;AAAA,UACpG,CAAS,GAEG/R,EAAK,QACPA,EAAK,KAAK,IAAI;AAAA,YACZ,KAAKkgB,EAAI,MAAM;AAAA,YACf,MAAOlgB,EAAK,KAAK,SAAS,IAAKkgB,EAAI,OAAO,KAAKA,EAAI,OAAOlgB,EAAK,KAAK,QAAQ;AAAA,UACxF,CAAW,GAGCA,EAAK,SAAS,CAACA,EAAK,aAAa;AACnC,YAAAkgB,IAAM;AAAA,cACJ,KAAKC,EAAK;AAAA,cACV,MAAMA,EAAK;AAAA,YACvB,GACU3F,IAAMzI,EAAI,aACNyI,MACEA,EAAI,QAAK0F,EAAI,OAAO1F,EAAI,MACxBA,EAAI,SAAM0F,EAAI,QAAQ1F,EAAI;AAEhC,gBAAIvgC,IAAK+lB,EAAK,MAAM,QAASkgB,EAAI,MAAMT,GAAgBzf,EAAK,KAAK,oBAAoB,EAAI,IAAIA,EAAK,IAAI,YAAW,IAAKA,EAAK,MAAM,SAASkgB,EAAI,MAAMT,GAAgBzf,EAAK,KAAK,oBAAoB,EAAI,GAClMhmB,IAAIkmC,EAAI,OAAOT,GAAgBzf,EAAK,KAAK,mBAAmB;AAChE,YAAAA,EAAK,MAAM,IAAI;AAAA,cACb,KAAK/lB,KAAK83B,EAAI,YAAY,MAAMA,EAAI,YAAY;AAAA,cAChD,MAAM/3B;AAAA,cACN,OAAOgmB,EAAK,MAAM;AAAA,YAC9B,CAAW;AAAA,UACF;AAAA,QAEF;AAAA,MACP,GAEI,KAAK,cAAc,SAAUnf,GAAGu/B,GAAKC,GAAI;AACvC,YAAIhoB,GAAIioB,GAAI3nB,GAAKunB;AAEjB,QAAIlgB,EAAK,gBAETA,EAAK,YAAYnf,CAAC,GAEZ,WAAWA,MACfA,EAAE,QAAQA,EAAE,UAAU07B,EAAK,gBAAgB,YAC3C17B,EAAE,QAAQA,EAAE,UAAU07B,EAAK,gBAAgB,YAGzC6D,KACF/nB,IAAMgoB,IAAMrgB,EAAK,eAAeA,EAAK,aACrCrH,IAAO0nB,KAAQx/B,EAAE,QAAQmf,EAAK,MAAM,OAAQ,EAAC,OAAQA,EAAK,cAAc,KAAMA,EAAK,YAAY,KAAOnf,EAAE,QAAQmf,EAAK,KAAK,OAAM,EAAG,MAAOA,EAAK,eAAe,KAAMA,EAAK,YAAY,GACrLA,EAAK,UAAU,YAAY,GAC3B3H,EAAGM,IAAI,CAAC,MAERN,IAAMgoB,IAAMrgB,EAAK,iBAAiBA,EAAK,YACvCrH,IAAO0nB,IAAMrgB,EAAK,OAAO,IAAIA,EAAK,OAAO,GACzCkgB,KAAOG,IAAMx/B,EAAE,QAAQmf,EAAK,MAAM,OAAM,EAAG,OAAOnf,EAAE,QAAQmf,EAAK,KAAK,OAAQ,EAAC,KAC/EsgB,IAAMD,IAAMrgB,EAAK,KAAK,IAAIA,EAAK,KAAK,GACpC3H,EAAIM,KAAOunB,KAAOI,IAAK,CAACA,CAAE;AAAA,MAGlC,GAEItgB,EAAK,aAAaA,EAAK,aAAa,GAEpCA,EAAK,oBAAqB,2BAA2Bwc,GACrDxc,EAAK,0BAA2B,0BAA0Bwc,GAE1Dxc,EAAK,eAAe,IAEpB,KAAK,OAAO,WAAY;AAKtB,YAHAA,EAAK,MAAM,MAAM,IAEbme,EAAI,eACJA,EAAI,aAAa,EAAE,YAAY5B,GAAO,QAAO;AAEjD,QAAAxK,EAAI,eAAeA,EAAI,gBAAgBA,EAAI,eAE3C/R,EAAK,eAAewc,EAAK,oBAAqBA,EAAK,iBAAiBD,EAAK,IAAI,EAAE,YAAY,MAAM;AAEjG,YAAIgE,IAAiB,EAAE,cAAc;AAuBrC,aAtBIpC,EAAI,UAAUA,EAAI,YAAQoC,EAAe,oBAAoB,IAAI,SAEjEvgB,EAAK,eACP,KAAK,IAAI,IAAIme,EAAI,iBAAiBA,EAAI,cAAc,wBAAwB,GACxEA,EAAI,iBAAene,EAAK,KAAKA,EAAK,KAAKme,EAAI,eAAene,EAAK,uBAAuB,EAAK,IAGjGA,EAAK,SAAS,QACV,CAACA,EAAK,UAAU+R,EAAI,UAAU,SAChC/R,EAAK,SAASqf,GAAW,KAAI,SAE7Brf,EAAK,SAAS+R,EAAI,QAGhB,CAAC/R,EAAK,UAAUA,EAAK,UAAU,UAAUA,EAAK,SAASqc,MACzDA,IAAkBrc,EAAK,SAGrBA,EAAK,QAAQA,EAAK,WAAW,KAAK+R,EAAI,UAAU,WAClD/R,EAAK,SAAS,SAGZ,CAACA,EAAK,UAAU,CAACme,EAAI,SAAS;AAEhC,cAAIqC,IAAOxgB,EAAK;AAChB,UAAIA,EAAK,WAAQwgB,IAAQxgB,EAAK,aAAcA,EAAK,MAAMA,EAAK,MAE5DA,EAAK,IAAIwgB,GAAMD,CAAc,GAEzBvgB,EAAK,WAAWme,EAAI,UAAUA,EAAI,SACpCne,EAAK,IAAIsc,EAAE,MAAM,GAAGiE,CAAc,GAGhCpC,EAAI,SAAS,CAACne,EAAK,UAAU,CAACA,EAAK,cAAYA,EAAK,IAAIie,GAAO;AAAA,YACjE,8BAA8B;AAAA,UACxC,CAAS;AAED,cAAIwC,IAASnE,EAAEC,EAAK,cAAc,KAAK,CAAC;AACxC,UAAAkE,EAAO,IAAI;AAAA,YACT,UAAU;AAAA,YACV,KAAK;AAAA,YACL,OAAS;AAAA,YACT,OAAO1O,EAAI;AAAA,YACX,QAAQ;AAAA,YACR,oBAAoBA,EAAI;AAAA,YACxB,QAAQA,EAAI;AAAA,YACZ,mBAAmB;AAAA,YACnB,yBAAyBA,EAAI;AAAA,YAC7B,sBAAsBA,EAAI;AAAA,YAC1B,iBAAiBA,EAAI;AAAA,UAC/B,CAAS,GAED0O,EAAO,SAAS,oBAAoB,GAEpCzgB,EAAK,SAASygB;AAEd,cAAIC,IAAOpE,EAAEC,EAAK,cAAc,KAAK,CAAC;AACtC,UAAAmE,EAAK,KAAK,MAAM1gB,EAAK,EAAE,GACvB0gB,EAAK,SAAS,sCAAsC;AAEpD,cAAIpf,GAAG5e,GAAGi+B,KAAK,CAAC,QAAQ,SAAS,OAAO,QAAQ;AAChD,mBAASjhB,MAAKihB;AACZ,YAAAj+B,IAAIi+B,GAAGjhB,EAAC,GACR4B,IAAIyQ,EAAI,YAAYrvB,CAAC,KAAK,GAC1B4e,KAAKof,EAAK,IAAI,aAAah+B,GAAG4e,IAAI,IAAI;AAGxC,UAAAof,EAAK,OAAOD,CAAM,GAElBC,EAAK,QAAQ,KAAK,IAAI,WAAW3O,EAAI,WAAW,GAAG0O,EAAO,WAAU,CAAE,GACtEC,EAAK,IAAI;AAAA,YACP,OAAOA,EAAK,QAAQ;AAAA,YACpB,QAAQ1gB,EAAK;AAAA,YACb,YAAY+R,EAAI;AAAA,YAChB,QAAQ;AAAA,UAClB,CAAS,GAED2O,EAAK,aAAa,IAClBA,EAAK,aAAa,IAElBA,EAAK,QAAS3O,EAAI,aAAa,SAAU,IAAI,GAE7C/R,EAAK,OAAO0gB,GAEZ1gB,EAAK,KAAK,OAAO;AAEjB,cAAI4gB,KAAO;AACX,UAAI7O,EAAI,WAAW,CAAC/R,EAAK,UAAU,CAACme,EAAI,YACtCyC,KAAOrE,EAAK,cAAc,KAAK,GAE/Bvc,EAAK,KAAK4gB,IAAM,SAAS5gB,EAAK,MAAM,GACpCA,EAAK,KAAK4gB,IAAM,cAAc,WAAY;AACxC,YAAA5gB,EAAK,KAAK,IAAI,WAAW+R,EAAI,gBAAgB;AAAA,UACzD,CAAW,GACD/R,EAAK,KAAK4gB,IAAM,cAAc,WAAY;AACxC,YAAA5gB,EAAK,KAAK,IAAI,WAAW+R,EAAI,gBAAgB;AAAA,UACzD,CAAW,GAED/R,EAAK,OAAOsc,EAAEsE,EAAI,GAClB5gB,EAAK,KAAK,IAAI;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQA,EAAK;AAAA,YACb,iBAAiB,SAAS+R,EAAI,aAAa;AAAA,YAC3C,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,oBAAoB;AAAA,UAChC,CAAW,GACGA,EAAI,gBAAc/R,EAAK,KAAKA,EAAK,KAAK,YAAYA,EAAK,MAAM,GAC7Dme,EAAI,YAAYpM,EAAI,gBACtB/R,EAAK,gBAAgB,SAAUnf,GAAG;AAChC,mBAAIA,EAAE,QAAQ,OAAKmf,EAAK,SAASnf,CAAC,GAC9BA,EAAE,QAAQ,OAAKmf,EAAK,UAAUnf,CAAC,GAC5Bmf,EAAK,YAAYnf,CAAC;AAAA,UACvC,GACYmf,EAAK,KAAKA,EAAK,KAAK,cAAcA,EAAK,aAAa,KAMxDA,EAAK,QAAQ;AACb,cAAI6gB;AAmDJ,cAjDI9O,EAAI,qBAEN/R,EAAK,IAAIwgB,GAAM;AAAA,YACb,WAAW;AAAA,UACvB,CAAW,GAEDC,IAASnE,EAAEC,EAAK,cAAc,KAAK,CAAC,GACpCkE,EAAO,IAAI;AAAA,YACT,UAAU;AAAA,YACV,KAAK;AAAA,YACL,QAAQ1O,EAAI;AAAA,YACZ,OAAO;AAAA,YACP,iBAAiBA,EAAI;AAAA,YACrB,QAAQA,EAAI;AAAA,YACZ,gBAAgB;AAAA,YAChB,yBAAyBA,EAAI;AAAA,YAC7B,sBAAsBA,EAAI;AAAA,YAC1B,iBAAiBA,EAAI;AAAA,UACjC,CAAW,GAEGoM,EAAI,WAASsC,EAAO,IAAI,YAAY,QAAQ,GAEhDA,EAAO,SAAS,oBAAoB,GAEpCzgB,EAAK,UAAUygB,GAEfI,KAAQvE,EAAEC,EAAK,cAAc,KAAK,CAAC,GACnCsE,GAAM,KAAK,MAAM7gB,EAAK,KAAK,KAAK,GAChC6gB,GAAM,SAAS,sCAAsC,GACrDA,GAAM,SAAS,KAAK,IAAI,WAAW9O,EAAI,WAAW,GAAG0O,EAAO,YAAW,CAAE,GACzEI,GAAM,IAAI;AAAA,YACR,QAAQA,GAAM,SAAS;AAAA,YACvB,QAAU7gB,EAAK;AAAA,YACf,YAAc+R,EAAI;AAAA,UAC9B,CAAW,GAED8O,GAAM,OAAOJ,CAAM,GAEnBI,GAAM,aAAa,IACnBA,GAAM,aAAa,IAEnBA,GAAM,QAAS9O,EAAI,cAAc,QAAS,IAAI,GAE9C/R,EAAK,QAAQ6gB,IAEb7gB,EAAK,MAAM,OAAO,KAIhBA,EAAK;AAEP,YAAA0gB,EAAK,IAAI;AAAA,cACP,UAAU;AAAA,cACV,KAAK;AAAA,cACL,QAAQ;AAAA,YACpB,CAAW,GAEDA,EAAK,IAAKA,EAAK,QAAS,EAAE,OAAO,MAAM,EAAE,MAAM,EAAG,CAAA,GAElD1gB,EAAK,KAAK,OAAO0gB,CAAI,GACjB1gB,EAAK,UACP6gB,GAAM,IAAI;AAAA,cACR,UAAU;AAAA,cACV,MAAM;AAAA,cACN,OAAO;AAAA,YACrB,CAAa,GAEDA,GAAM,IAAKA,GAAM,QAAS,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAG,CAAA,GAEpD7gB,EAAK,KAAK,OAAO6gB,EAAK;AAAA,eAEnB;AACL,gBAAI7gB,EAAK,YAAY;AACnB,cAAIA,EAAK,IAAI,IAAI,UAAU,KAAK,YAAUA,EAAK,IAAIA,EAAK,KAAK,EAAE,UAAY,WAAY,CAAA;AACvF,kBAAI8gB,KAAM9gB,EAAK,IAAI,CAAC,EAAE,YAAY,SAAUA,EAAK,OAAOA,EAAK;AAC7D,cAAAsc,EAAEwE,EAAE,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,GAC3B9gB,EAAK,SACPA,EAAK,KAAK,IAAI;AAAA,gBACZ,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,gBAAgB0gB,EAAK,QAAQ;AAAA,cAC7C,CAAe,GACDI,GAAG,OAAO9gB,EAAK,IAAI,IAErB0gB,EAAK,IAAI;AAAA,gBACP,UAAU;AAAA,gBACV,KAAK;AAAA,cACnB,CAAa,GACDA,EAAK,IAAKA,EAAK,QAAS,EAAE,OAAO,MAAM,EAAE,MAAM,EAAG,CAAA,GAClDI,GAAG,OAAOJ,CAAI,GACVG,OACFA,GAAM,IAAI;AAAA,gBACR,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,QAAQ;AAAA,cACxB,CAAe,GACDA,GAAM,IAAKA,GAAM,QAAS,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAG,CAAA,GACpDC,GAAG,OAAOD,EAAK;AAAA,YAE7B,OAAiB;AACL,cAAA7gB,EAAK,UAAWA,EAAK,IAAI,IAAI,UAAU,KAAK;AAC5C,kBAAI+gB,KAAS/gB,EAAK,UAAW,UAAU;AAEvC,cAAKA,EAAK,YAASA,EAAK,WAAWA,EAAK,YAAYA,EAAK,IAAI,CAAC,CAAC,IAC3DA,EAAK,aACPA,EAAK,OAAOA,EAAK,UACX,iBAAiB,KAAKA,EAAK,SAAS,IAAI,UAAU,CAAC,KAAIA,EAAK,IAAIA,EAAK,UAAU;AAAA,gBACnF,UAAY;AAAA,cAC5B,CAAe,IAGH0gB,EAAK,IAAI;AAAA,gBACP,UAAUK;AAAA,cACxB,CAAa,GACG/gB,EAAK,QAAMA,EAAK,KAAK,IAAI;AAAA,gBAC3B,UAAU+gB;AAAA,cACxB,CAAa,GACD/gB,EAAK,gBAAe,GACpBA,EAAK,KAAK,OAAO0gB,CAAI,GACjB1gB,EAAK,QAAMA,EAAK,KAAK,OAAOA,EAAK,IAAI,GACrCA,EAAK,UACP6gB,GAAM,IAAI;AAAA,gBACR,UAAUE;AAAA,cAC1B,CAAe,GACD/gB,EAAK,KAAK,OAAO6gB,EAAK;AAAA,YAEzB;AAED,YAAI1C,EAAI,SAAOne,EAAK,IAAIA,EAAK,KAAK;AAAA,cAChC,+BAA+B;AAAA,cAC/B,yBAAyB;AAAA,YACrC,CAAW,GAEG+R,EAAI,mBACFoM,EAAI,QAAMne,EAAK,IAAI,KAAK,aAAa,MAAM,GAC3Cme,EAAI,YAAUne,EAAK,IAAI,IAAI,WAAW,MAAM;AAAA,UAGnD;AA2BD,cAzBI+R,EAAI,iBAAiB,MACvB/R,EAAK,cAAc,IACnBA,EAAK,KAAK,IAAI;AAAA,YACZ,SAAS+R,EAAI;AAAA,UACzB,CAAW,GACG/R,EAAK,SAAOA,EAAK,MAAM,IAAI;AAAA,YAC7B,SAAS+R,EAAI;AAAA,UACzB,CAAW,KACSA,EAAI,iBAAiB,MAAUA,EAAI,iBAAiB,WAC9D/R,EAAK,cAAcsc,EAAC,EAAG,IAAItc,EAAK,IAAI,GAChCme,EAAI,UAAOne,EAAK,cAAcA,EAAK,YAAY,IAAIA,EAAK,MAAM,IAC9DA,EAAK,UAAOA,EAAK,cAAcA,EAAK,YAAY,IAAIA,EAAK,KAAK,IAC9DA,EAAK,SAASme,EAAI,UAAOne,EAAK,cAAcA,EAAK,YAAY,IAAIA,EAAK,OAAO,MACxE+R,EAAI,gBAAgB,YAC7B/R,EAAK,cAAcsc,EAAC,EAAG,IAAItc,EAAK,IAAI,GAChCA,EAAK,UAAOA,EAAK,cAAcA,EAAK,YAAY,IAAIA,EAAK,KAAK,MACzD+R,EAAI,gBAAgB,YAC7B/R,EAAK,cAAcsc,EAAC,EAAG,IAAItc,EAAK,MAAM,GAClCA,EAAK,UAAOA,EAAK,cAAcA,EAAK,YAAY,IAAIA,EAAK,OAAO,MAC3D+R,EAAI,gBAAgB,aAC7B/R,EAAK,cAAc,IACnBA,EAAK,KAAI,GACTA,EAAK,cAAc,KAGjBme,EAAI,YAAYne,EAAK,kBAAkB+R,EAAI,gBAAgBoM,EAAI,YAAY;AAE7E,YAAAne,EAAK,YAAY,IAAIghB,GAAsBhhB,CAAI,GAI/CA,EAAK,eAAe,SAAUnf,GAAG;AAK/B,kBAHImf,EAAK,UAGLnf,EAAE,gBAAgBA,EAAE,gBAAgB,WAAWA,EAAE,gBAAgBA,EAAE,sBAAuB,QAAO;AASrG,kBAPAmf,EAAK,YAAY,IAEbA,EAAK,UAAU,UACjBA,EAAK,iBAAgB,GACrBA,EAAK,UAAU,SAGb,CAACA,EAAK,aAAa;AACrB,oBAAI9lB,IAAK8lB,EAAK,UAAUnf,CAAC;AAEzB,oBAAI3G,GAAI;AACN,sBAAI+mC,KAAO,SAAS,KAAK/mC,EAAG,QAAQ,KAAO,SAAS,KAAKA,EAAG,IAAI;AAChE,sBAAI+mC,GAAK,QAAOjhB,EAAK,gBAAgBnf,CAAC;AAAA,gBACvC;AAED,oBAAIqgC,KAAWrgC,EAAE,SAAS;AAO1B,oBALI,EAAE,aAAaA,MAAO,oBAAoBA,MAC5CA,EAAE,UAAUA,EAAE,eAAe,CAAC,EAAE,SAChCA,EAAE,UAAUA,EAAE,eAAe,CAAC,EAAE,UAG9Bmf,EAAK,aAAa;AACpB,sBAAImhB,KAAKtgC;AACT,kBAAAA,IAAI;AAAA,oBACF,UAAaA,EAAE,WAAYA,EAAE,WAAWA;AAAA,kBAC1D,GACgBA,EAAE,UAAUsgC,GAAG,SACftgC,EAAE,UAAUsgC,GAAG;AAAA,gBAChB;AAcD,oBAZAnhB,EAAK,KAAK,OAAO;AAAA,kBACf,GAAGnf,EAAE;AAAA,kBACL,GAAGA,EAAE;AAAA,kBACL,IAAImf,EAAK,OAAO;AAAA,kBAChB,IAAIA,EAAK,OAAO;AAAA,kBAChB,IAAIA,EAAK,aAAc;AAAA,kBACvB,IAAIA,EAAK,cAAe;AAAA,kBACxB,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,IAAI9lB;AAAA,gBACpB,GAEkB8lB,EAAK,UAAU,CAAC+R,EAAI;AAEtB,kBAAA/R,EAAK,KAAK,KAAK,KAAK;AAAA,qBAEf;AAEL,sBAAIkM,KAAO;AAAA,oBACT,GAAGuQ,GAAQ,MAAO;AAAA,oBAClB,GAAGA,GAAQ,OAAQ;AAAA,kBACrC,GAEoB1hC,KAAOilB,EAAK,kBAEZohB,KAAOrmC,GAAK,IAAImxB,GAAK,GACrBmV,KAAOtmC,GAAK,IAAImxB,GAAK;AAEzB,kBAAIlM,EAAK,KAAK,cAAc,CAACA,EAAK,MAAM,aAAYA,EAAK,KAAK,KAAK,KAAMohB,KAAO,IAAK,MAAM,KAClF,CAACphB,EAAK,KAAK,cAAcA,EAAK,MAAM,aAAYA,EAAK,KAAK,KAAK,KAAMqhB,KAAO,IAAK,MAAM,KAC3FrhB,EAAK,KAAK,KAAK,KAAK;AAAA,gBAE1B;AAED,oBAAI+R,EAAI,gBAAgB/R,EAAK,YAAYme,EAAI,MAAM;AACjD,sBAAImD,KAAKthB,EAAK,IAAI,SAAQ;AAC1B,kBAAAA,EAAK,KAAK,KAAK,KAAKshB,GAAG,MACvBthB,EAAK,KAAK,KAAK,KAAKshB,GAAG;AAAA,gBACxB;AAMD,oBAJAthB,EAAK,YAAY,IACjBA,EAAK,cAAc,IACnBA,EAAK,UAAU,MAAMnf,EAAE,SAASA,EAAE,OAAO,GAErC3G,KAAIgnC,IAAS;AAEf,sBAAIK,KAAK,gCAAgC,KAAKrnC,EAAG,QAAQ;AACzD,sBAAI,CAACqnC;AAEH,2BADIpD,EAAI,mBAAiBjkC,EAAG,WAAU,GAClC63B,EAAI,gBACF73B,EAAG,WAAW,CAAEA,EAAG,aACrBA,EAAG,WAAWA,EAAG,SACjBA,EAAG,UAAU,SAAU2G,IAAG;AACxB,0BAAImf,EAAK,UAAW,QAAO;AAC3B,sBAAA9lB,EAAG,SAAS,KAAK,MAAM2G,EAAC;AAAA,oBAChD,IAE2Bmf,EAAK,YAAYnf,CAAC,KAEpBmf,EAAK,gBAAgBnf,CAAC;AAG/B,kBAAI,wBAAwB,KAAKy7B,EAAEpiC,CAAE,EAAE,KAAK,MAAM,CAAC,MACjD8lB,EAAK,eAAe;AAAA,oBAClB,IAAM9lB;AAAA,oBACN,OAAS;AAAA,kBAC7B;AAAA,gBAGe;AAAA,cACF;AAAA,YAEb,GAEU8lB,EAAK,aAAa,SAAUnf,GAAG;AAE7B,kBAAI,CAACmf,EAAK,KAAK,KAAM,QAAO;AAE5B,kBAAIA,EAAK,KAAK,KAAK,MAAM,GAAG;AAE1B,oBAAInf,EAAE,gBAAgBA,EAAE,gBAAgB,WAAWA,EAAE,gBAAgBA,EAAE,sBAAuB,QAAO;AAErG,gBAAAmf,EAAK,KAAK,OAAO;AAEjB,oBAAIkhB,IAAWrgC,EAAE,SAAS;AAE1B,oBAAImf,EAAK,cACPA,EAAK,UAAU,cACfA,EAAK,cAAc,IACnBA,EAAK,WAAU,GACXme,EAAI,mBAAiB5B,EAAK,eAAc,GACxC2E;AAAS,yBAAOlhB,EAAK,YAAYnf,CAAC;AAAA,cAGzC,WACQmf,EAAK,KAAK,KAAK,MAAM;AAC5B,uBAAOA,EAAK,UAAUnf,CAAC;AAAA,YAGrC;AAEU,gBAAI2gC,KAAkBzP,EAAI,gBAAgB/R,EAAK,YAAY,CAACme,EAAI,iBAE5DsD,KAAiB1P,EAAI,wBAAwB,MAAM;AAEvD,YAAA/R,EAAK,cAAc,SAAUnf,GAAG6gC,GAAU;AASxC,kBAPI,CAAC1hB,EAAK,KAAK,QAEXnf,EAAE,iBAAiBkxB,EAAI,8BACrBlxB,EAAE,cAAc,SAAS,KAI3BA,EAAE,gBAAgBA,EAAE,gBAAgB,WAAWA,EAAE,gBAAgBA,EAAE,sBAAuB,QAAO;AAErG,kBAAImf,EAAK,KAAK,KAAK,MAAM,GAAG;AAE1B,gBAAK,oBAAoBnf,MACvBA,EAAE,UAAUA,EAAE,eAAe,CAAC,EAAE,SAChCA,EAAE,UAAUA,EAAE,eAAe,CAAC,EAAE;AAGlC,oBAAI8gC,IAAKC;AAGT,oBAFAA,KAAMD,KAAM,GAERH,MAAkB,CAACE,GAAU;AAC/B,sBAAIJ,KAAKthB,EAAK,IAAI,SAAQ;AAC1B,kBAAA4hB,KAAM,CAACN,GAAG,MACVK,KAAM,CAACL,GAAG;AAAA,gBACX;AAED,oBAAIO,KAAKhhC,EAAE,UAAU8gC,IACjBG,KAAMD,KAAK7hB,EAAK,KAAK,KAAK,GAC1B+hB,KAAKlhC,EAAE,UAAU+gC,IACjBI,KAAMD,KAAK/hB,EAAK,KAAK,KAAK,GAE1BiiB,KAAKjiB,EAAK,KAAK,KAAK,KAAK8hB;AAE7B,oBAAI9hB,EAAK,cAAc+R,EAAI;AACzB,kBAAIkQ,KAAK,IACPA,KAAK,KAAK,MAAMA,KAAK,CAAC,IACbA,KAAKjiB,EAAK,KAAK,SACxBiiB,KAAKjiB,EAAK,KAAK,OAAO,KAAK,OAAOiiB,KAAKjiB,EAAK,KAAK,QAAQ,CAAC;AAAA,yBAGxDiiB,KAAK,KACPA,KAAK,GACLJ,KAAK,KAEEI,KAAKjiB,EAAK,KAAK,SACtBiiB,KAAKjiB,EAAK,KAAK,MACf6hB,KAAK,IAEHA,OAAO,KAAK,CAAC7hB,EAAK;AACpB,yBAAKA,EAAK,WAAQA,EAAK,KAAK,OAAO,KAC5B;AAIX,oBAAIkiB,KAAKliB,EAAK;AAyBd,oBAvBIA,EAAK,SAASA,EAAK,MAAM,eAC3BkiB,KAAMliB,EAAK,YAAagiB,KAAKhiB,EAAK,KAAK,KAAK,KAAKA,EAAK,KAAK,KAAK,KAAKgiB,IAEjEhiB,EAAK,cAAc+R,EAAI,eACrBmQ,KAAK,IACPA,KAAK,KAAK,MAAMA,KAAK,CAAC,IACbA,KAAKliB,EAAK,KAAK,SACxBkiB,KAAKliB,EAAK,KAAK,OAAO,KAAK,OAAOkiB,KAAKliB,EAAK,KAAK,QAAQ,CAAC,MAGxDkiB,KAAK,MACPA,KAAK,GACLH,KAAK,IAEHG,KAAKliB,EAAK,KAAK,SACjBkiB,KAAKliB,EAAK,KAAK,MACf+hB,KAAK,MAOP,CAAC/hB,EAAK,WAAW;AAEnB,sBAAIA,EAAK,KAAK,KAAK,MAAMnf,EAAE,WAAWmf,EAAK,KAAK,KAAK,MAAMnf,EAAE,QAAS,QAAOmf,EAAK,YAAYnf,CAAC;AAE/F,sBAAIshC,KAAK,KAAK,IAAIL,EAAE,GAChBM,KAAK,KAAK,IAAIJ,EAAE,GAChBK,KAAKtQ,EAAI;AAuBb,sBArBK/R,EAAK,KAAK,KAAK,KAKXA,EAAK,KAAK,KAAK,MAAM,MACxBoiB,KAAKC,MAAMF,MAAMV,KACnBzhB,EAAK,KAAK,OAAO,KAEVmiB,KAAKE,OAAIriB,EAAK,KAAK,KAAK,KAAK,OAG/BA,EAAK,KAAK,KAAK,MAAM,QAExBmiB,KAAKE,MAAMD,MAAMX,KACnBzhB,EAAK,KAAK,OAAO,KAEVoiB,KAAKC,OAAIriB,EAAK,KAAK,KAAK,KAAK,QAhBlCmiB,KAAKE,MAAMD,KAAKC,KAAIriB,EAAK,KAAK,KAAK,KAAK,MACnCmiB,KAAKE,KAAIriB,EAAK,KAAK,KAAK,KAAMoiB,KAAKX,KAAkB,MAAM,MAC3DW,KAAKC,OAAIriB,EAAK,KAAK,KAAK,KAAMmiB,KAAKV,KAAkB,MAAM,MAkBlE,CAACzhB,EAAK,KAAK,KAAK,GAAI,QAAOA,EAAK,YAAYnf,CAAC;AAEjD,kBAAAmf,EAAK,mBAAmBnf,EAAE,SAASA,EAAE,SAAS,GAAG,GAAG,CAAC,GACrDmf,EAAK,YAAY;AAAA,gBAClB;AAED,uBAAIA,EAAK,gBAAgB,CAACA,EAAK,aAAa,UAC1CA,EAAK,aAAa,QAAQA,EAAK,aAAa,GAAG,WAAW,IAC1DA,EAAK,aAAa,GAAG,UAAUA,EAAK,iBAGlCA,EAAK,KAAK,KAAK,OACbA,EAAK,KAAK,KAAK,MAAM,MAAKkiB,KAAKliB,EAAK,KAAK,KAAK,KACzCA,EAAK,KAAK,KAAK,MAAM,QAAKiiB,KAAKjiB,EAAK,KAAK,KAAK,MAGzDA,EAAK,QAAQ,aAAa,WAAY;AACpC,kBAAIA,EAAK,KAAK,QAASA,EAAK,KAAK,KAAK,MAAM,MACtCA,EAAK,qBAAmBA,EAAK,gBAAe,GAC5CA,EAAK,KAAK,cAAYA,EAAK,aAAaiiB,EAAE,GAC9CjiB,EAAK,UAAU,OAAO+hB,IAAIF,EAAE,GACxB7hB,EAAK,SAASA,EAAK,MAAM,cAC3BA,EAAK,cAAckiB,EAAE,GACrBliB,EAAK,WAAWiiB,IAAIC,EAAE,KAEtBliB,EAAK,WAAWiiB,EAAE,GAEhB9D,EAAI,UAAQ5B,EAAK,UAAU,MAAK;AAAA,gBAEtD,CAAe,GAEMvc,EAAK,YAAYnf,CAAC;AAAA,cAE1B,WACQmf,EAAK,KAAK,KAAK,MAAM;AAC5B,uBAAOA,EAAK,YAAYnf,CAAC;AAAA,YAGvC,GAEUmf,EAAK,qBAAqB,SAAUnf,GAAGyhC,GAAQ;AAC7C,kBAAI,EAAAtiB,EAAK,KAAK,QAAQA,EAAK,KAAK,KAAK,MAAM,IAC3C;AAAA,oBAAIA,EAAK,OAAQ,QAAOA,EAAK,YAAYnf,CAAC;AAC1C,gBAAAmf,EAAK,aAAY,GACjBA,EAAK,KAAK,OAAO;AAAA,kBACf,GAAGnf,EAAE,QAAQ,CAAC,EAAE;AAAA,kBAChB,GAAGA,EAAE,QAAQ,CAAC,EAAE;AAAA,kBAChB,IAAImf,EAAK,OAAO;AAAA,kBAChB,IAAIA,EAAK,OAAO;AAAA,kBAChB,IAAI;AAAA,kBACJ,IAAK,CAAC,CAACsiB;AAAA,gBACrB;AACY,oBAAIpoC,KAAK8lB,EAAK,UAAUnf,CAAC;AACzB,uBAAI,CAACmf,EAAK,UAAUme,EAAI,mBAAiBjkC,GAAG,cACxC8lB,EAAK,YAAY,CAACme,EAAI,oBACxBne,EAAK,MAAM,mBAAmBA,EAAK,IAAI,IAAI,gBAAgB,GAC3DA,EAAK,IAAIA,EAAK,KAAK,EAAE,kBAAkB,OAAM,CAAE,IAE1CA,EAAK,YAAYnf,CAAC;AAAA;AAAA,YACrC,GAEUmf,EAAK,mBAAmB,SAAUnf,GAAG;AACnC,kBAAImf,EAAK,KAAK;AAGZ,uBAFIme,EAAI,mBAAiB5B,EAAK,eAAc,GACxCvc,EAAK,YAAY,CAACme,EAAI,mBAAiBne,EAAK,IAAI,IAAI,kBAAkBA,EAAK,MAAM,gBAAgB,GACjGA,EAAK,KAAK,KAAK,MAAM,IAAG,UAC5BA,EAAK,KAAK,OAAO,IACVA,EAAK,YAAYnf,CAAC;AAAA,YAEvC,GAEUmf,EAAK,oBAAoB,SAAUnf,GAAG;AACpC,kBAAImf,EAAK,KAAK,MAAM;AAClB,oBAAIA,EAAK,KAAK,KAAK,MAAM,EAAG;AAI5B,oBAFAA,EAAK,gBAAgB,IAEjBA,EAAK,KAAK,KAAK,IAAI;AACrB,kBAAAA,EAAK,OAAO,IAAIA,EAAK,KAAK,KAAK,MAAMnf,EAAE,QAAQ,CAAC,EAAE,UAAUmf,EAAK,KAAK,KAAK,IACvEA,EAAK,OAAO,IAAI,MAAGA,EAAK,OAAO,IAAI;AACvC,sBAAIuiB,IAAKviB,EAAK;AACd,kBAAIA,EAAK,OAAO,IAAIuiB,MAAIviB,EAAK,OAAO,IAAIuiB;AAAA,gBACxD,OAAqB;AACL,kBAAAviB,EAAK,OAAO,IAAIA,EAAK,KAAK,KAAK,MAAMnf,EAAE,QAAQ,CAAC,EAAE,UAAUmf,EAAK,KAAK,KAAK,IACvEA,EAAK,OAAO,IAAI,MAAGA,EAAK,OAAO,IAAI;AACvC,sBAAI8hB,KAAK9hB,EAAK;AACd,kBAAIA,EAAK,OAAO,IAAI8hB,OAAI9hB,EAAK,OAAO,IAAI8hB;AAAA,gBACzC;AAED,uBAAA9hB,EAAK,QAAQ,aAAa,WAAY;AACpC,kBAAIA,EAAK,KAAK,QAASA,EAAK,KAAK,KAAK,MAAM,MAC1CA,EAAK,WAAU,GACXA,EAAK,KAAK,KAAK,KAAIA,EAAK,aAAa,KAAK,MAAMA,EAAK,OAAO,IAAIA,EAAK,YAAY,CAAC,GAAG+R,EAAI,eAAe,IACvG/R,EAAK,YAAY,KAAK,MAAMA,EAAK,OAAO,IAAIA,EAAK,YAAY,CAAC,GAAG+R,EAAI,eAAe;AAAA,gBAE3G,CAAe,GAEM/R,EAAK,YAAYnf,CAAC;AAAA,cAC1B;AAAA,YAEb;AAAA,UAES;AAqFD,cAnFAmf,EAAK,cAAc,SAAUnf,GAAGyhC,GAAQ;AACtC,gBAAI,EAAAtiB,EAAK,KAAK,QAAQA,EAAK,KAAK,KAAK,MAAM,IAC3C;AAAA,kBAAIA,EAAK,YAAa,QAAOA,EAAK,YAAYnf,CAAC;AAC/C,cAAAmf,EAAK,aAAY,GACjBA,EAAK,KAAK,OAAO;AAAA,gBACf,GAAGnf,EAAE;AAAA,gBACL,GAAGA,EAAE;AAAA,gBACL,IAAImf,EAAK,OAAO;AAAA,gBAChB,IAAIA,EAAK,OAAO;AAAA,gBAChB,IAAI;AAAA,gBACJ,IAAIsiB,KAAU;AAAA,cAC1B;AACU,kBAAIpoC,KAAK8lB,EAAK,UAAUnf,CAAC;AAEzB,qBAAIs9B,EAAI,mBAAiBjkC,GAAG,WAAU,GAClC8lB,EAAK,YAAY,CAACme,EAAI,oBACxBne,EAAK,MAAM,mBAAmBA,EAAK,IAAI,IAAI,gBAAgB,GAC3DA,EAAK,IAAIA,EAAK,KAAK;AAAA,gBACjB,kBAAkB;AAAA,cAChC,CAAa,IAEHA,EAAK,YAAY,IACVA,EAAK,YAAYnf,CAAC;AAAA;AAAA,UACnC,GAEQmf,EAAK,YAAY,SAAUnf,GAAG;AAC5B,gBAAImf,EAAK,KAAK;AACZ,qBAAIA,EAAK,KAAK,KAAK,MAAM,IAAU,MAE/Bme,EAAI,mBAAiB5B,EAAK,eAAc,GACxCvc,EAAK,YAAY,CAACme,EAAI,mBAAiBne,EAAK,IAAI,IAAI,kBAAkBA,EAAK,MAAM,gBAAgB,GACrGA,EAAK,KAAK,OAAO,IACjBA,EAAK,gBAAgB,IACjBA,EAAK,aAAWA,EAAK,iBAAgB,GAClCA,EAAK,YAAYnf,CAAC;AAAA,UAErC,GAEQmf,EAAK,cAAc,SAAUnf,GAAG;AAC9B,gBAAImf,EAAK,KAAK,MAAM;AAClB,kBAAIA,EAAK,KAAK,KAAK,OAAO,EAAG;AAE7B,kBAAIme,EAAI,YAAYt9B,EAAE,UAAU,EAAG,QAAOmf,EAAK,UAAUnf,CAAC;AAQ1D,kBANAmf,EAAK,gBAAgB,IAEhBA,EAAK,aAAWA,EAAK,mBAAmBnf,EAAE,SAASA,EAAE,SAAS,GAAG,GAAG,CAAC,GAE1Emf,EAAK,YAAY,IAEbA,EAAK,KAAK,KAAK,IAAI;AACrB,gBAAAA,EAAK,OAAO,IAAIA,EAAK,KAAK,KAAK,MAAMnf,EAAE,UAAUmf,EAAK,KAAK,KAAK,IAC5DA,EAAK,OAAO,IAAI,MAAGA,EAAK,OAAO,IAAI;AACvC,oBAAIuiB,IAAKviB,EAAK;AACd,gBAAIA,EAAK,OAAO,IAAIuiB,MAAIviB,EAAK,OAAO,IAAIuiB;AAAA,cACtD,OAAmB;AACL,gBAAAviB,EAAK,OAAO,IAAIA,EAAK,KAAK,KAAK,MAAMnf,EAAE,UAAUmf,EAAK,KAAK,KAAK,IAC5DA,EAAK,OAAO,IAAI,MAAGA,EAAK,OAAO,IAAI;AACvC,oBAAI8hB,KAAK9hB,EAAK;AACd,gBAAIA,EAAK,OAAO,IAAI8hB,OAAI9hB,EAAK,OAAO,IAAI8hB;AAAA,cACzC;AAED,qBAAA9hB,EAAK,QAAQ,aAAa,WAAY;AAEpC,gBAAIA,EAAK,kBACPA,EAAK,WAAU,GAEXA,EAAK,KAAK,KAAK,KACjBA,EAAK,WAAW,KAAK,MAAMA,EAAK,OAAO,IAAIA,EAAK,YAAY,CAAC,CAAC,IAE9DA,EAAK,UAAU,KAAK,MAAMA,EAAK,OAAO,IAAIA,EAAK,YAAY,CAAC,CAAC;AAAA,cAI/E,CAAa,GAEMA,EAAK,YAAYnf,CAAC;AAAA,YAC1B;AAEC,cAAAmf,EAAK,YAAY;AAAA,UAE7B,GAEYme,EAAI,YAAYpM,EAAI;AAEtB,YAAA/R,EAAK,iBAAiB,SAAUnf,GAAG;AACjC,kBAAImf,EAAK;AACP,uBAAAA,EAAK,aAAa,GAAG,UAAUA,EAAK,aAAa,OACjDA,EAAK,eAAe,IACbA,EAAK,YAAYnf,CAAC;AAAA,YAEvC,GAEUmf,EAAK,UAAWme,EAAI,QAAS,KAAQ,SAAUt9B,GAAG;AAChD,qBAAImf,EAAK,eACPA,EAAK,cAAc,IACZA,EAAK,YAAYnf,CAAC,KAElB;AAAA,YAErB,GAEckxB,EAAI,qBAAqBoM,EAAI,oBAC/Bne,EAAK,IAAKA,EAAK,SAAUA,EAAK,MAAMA,EAAK,KAAK;AAAA,cAC5C,QAAUme,EAAI;AAAA,YAC5B,CAAa,GACDne,EAAK,IAAIA,EAAK,MAAM;AAAA,cAClB,QAAUme,EAAI;AAAA,YAC5B,CAAa;AAAA,eAGE;AAEL,gBAAIqE,KAAuB,SAAU3hC,GAAG;AACtC,kBAAKmf,EAAK,eAEV;AAAA,oBAAInf,GAAG;AACL,sBAAIm/B,IAAKhgB,EAAK,IAAI,YAAW,GACzByiB,KAAM5hC,EAAE,QAAQmf,EAAK,cAAc;AACvC,kBAAIyiB,KAAK,KAAKA,KAAKzC,MAAIyC,KAAK,IACxBA,MAAMzC,MAAIyC,MAAMzC,IACpBhgB,EAAK,cAAc,KAAKyiB;AAAA,gBACzB;AACD,oBAAIziB,EAAK,cAAc,OAAO,GAE9B;AAAA,sBAAI0iB,KAAK,EAAE1iB,EAAK,cAAc,KAAG,IAAE,KAAG;AACtC,kBAAAA,EAAK,WAAW0iB,EAAE,GAElB1iB,EAAK,UAAU,qBAAqB,WAAY;AAC9C,oBAAAwiB;kBACD,GAAE,EAAE;AAAA;AAAA;AAAA,YACjB;AAEU,YAAI,kBAAkBjG,IACpBvc,EAAK,kBAAkB,WAAY;AACjC,qBAAQuc,EAAK,eAAe,aAAa;AAAA,YACvD,IACqB,eAAeA,IACxBvc,EAAK,kBAAkB,WAAY;AACjC,qBAAQuc,EAAK,UAAU,QAAQ;AAAA,YAC7C,IAEYvc,EAAK,kBAAkB,WAAY;AACjC,qBAAO;AAAA,YACrB,GAGUA,EAAK,mBAAmB,SAAUnf,GAAG;AAWnC,cAAImf,EAAK,WACTA,EAAK,gBAAgBA,EAAK,IAAI,OAAM;AAAA,YAChD,GAEUA,EAAK,iBAAiB,SAAUnf,GAAG;AACjC,cAAAmf,EAAK,gBAAgB;AAAA,YACjC,GACUA,EAAK,kBAAkB,SAAUnf,GAAG;AAClC,cAAKmf,EAAK,iBACNA,EAAK,gBAAiB,KAAEA,EAAK,UAAU,mBAAmB,WAAY;AACxE,gBAAAwiB,GAAqB3hC,CAAC;AAAA,cACvB,GAAE,GAAG;AAAA,YAClB;AAAA,UACS;AAwTD,cAtTIs9B,EAAI,eACNne,EAAK,IAAKA,EAAK,SAAUsc,EAAE,MAAM,IAAItc,EAAK,KAAK,EAAE,gBAAgB,OAAQ,CAAA,GACzEA,EAAK,IAAIA,EAAK,MAAM;AAAA,YAClB,gBAAgB;AAAA,UAC5B,CAAW,GACDA,EAAK,IAAIA,EAAK,QAAQ;AAAA,YACpB,gBAAgB;AAAA,UAC5B,CAAW,GACDA,EAAK,KAAKA,EAAK,KAAK,eAAeA,EAAK,YAAY,GACpDA,EAAK,KAAKuc,GAAM,aAAavc,EAAK,UAAU,GAC5CA,EAAK,SAASuc,GAAM,eAAevc,EAAK,WAAW,KAC1Cme,EAAI,cACbne,EAAK,IAAKA,EAAK,SAAUsc,EAAE,MAAM,IAAItc,EAAK,KAAK,EAAE,oBAAoB,OAAQ,CAAA,GAC7EA,EAAK,IAAIA,EAAK,MAAM;AAAA,YAClB,oBAAoB;AAAA,UAChC,CAAW,GACDA,EAAK,IAAIA,EAAK,QAAQ;AAAA,YACpB,oBAAoB;AAAA,UAChC,CAAW,GACDA,EAAK,KAAKA,EAAK,KAAK,iBAAiBA,EAAK,YAAY,GACtDA,EAAK,KAAKuc,GAAM,eAAevc,EAAK,UAAU,GAC9CA,EAAK,SAASuc,GAAM,iBAAiBvc,EAAK,WAAW,GACrDA,EAAK,KAAKA,EAAK,QAAQ,iBAAiB,SAAUnf,GAAG;AACnD,YAAAA,EAAE,eAAc;AAAA,UAC5B,CAAW,GACDmf,EAAK,KAAKA,EAAK,QAAQ,eAAe,SAAUnf,GAAG;AACjD,YAAAA,EAAE,eAAc;AAAA,UAC5B,CAAW,KACQs9B,EAAI,aACbne,EAAK,KAAKA,EAAK,KAAK,cAAcA,EAAK,cAAc,IAAO,EAAI,GAChEA,EAAK,KAAKuc,GAAM,YAAYvc,EAAK,YAAY,IAAO,EAAI,GACxDA,EAAK,KAAKuc,GAAM,eAAevc,EAAK,YAAY,IAAO,EAAI,GAC3DA,EAAK,SAASuc,GAAM,aAAavc,EAAK,aAAa,IAAO,EAAI,IAG5D+R,EAAI,iBACN/R,EAAK,KAAKA,EAAK,KAAK,aAAaA,EAAK,cAAc,IAAO,EAAI,GAC/DA,EAAK,KAAKuc,GAAM,WAAWvc,EAAK,YAAY,IAAO,EAAI,GACvDA,EAAK,KAAKuc,GAAM,aAAavc,EAAK,aAAa,IAAO,EAAI,KAGxD+R,EAAI,qBAAsB,CAACoM,EAAI,YAAY,CAACpM,EAAI,kBAElD/R,EAAK,KAAK,IAAI;AAAA,YACZ,QAAQ;AAAA,UACpB,CAAW,GACDA,EAAK,SAASA,EAAK,MAAM,IAAI;AAAA,YAC3B,QAAQ;AAAA,UACpB,CAAW,GAEDA,EAAK,OAAOA,EAAK,MAAM,cAAc,WAAY;AAC/C,gBAAI,CAACA,EAAK,UAAU,CAACA,EAAK,IAAI,GAAG,UAAU,EAAG,QAAO;AACrD,YAAIA,EAAK,uBAAqBA,EAAK,WAAU,GAC7CA,EAAK,KAAK,SAAS;AAAA,UAC/B,CAAW,GACDA,EAAK,OAAOA,EAAK,MAAM,cAAc,WAAY;AAC/C,YAAAA,EAAK,KAAK,SAAS,IACdA,EAAK,KAAK,QAAMA,EAAK,WAAU;AAAA,UAChD,CAAW,GAEG+R,EAAI,kBACN/R,EAAK,KAAKA,EAAK,MAAM,SAAS,SAAUnf,GAAG;AACzC,YAAAmf,EAAK,YAAYnf,GAAG,IAAO,EAAK;AAAA,UAC9C,CAAa,GACDmf,EAAK,KAAKA,EAAK,MAAM,YAAY,SAAUnf,GAAG;AAC5C,YAAAmf,EAAK,YAAYnf,GAAG,IAAM,EAAK;AAAA,UAC7C,CAAa,GACDmf,EAAK,KAAKA,EAAK,QAAQ,SAAS,SAAUnf,GAAG;AAC3C,YAAAmf,EAAK,YAAYnf,CAAC;AAAA,UAChC,CAAa,GACDmf,EAAK,KAAKA,EAAK,QAAQ,YAAY,SAAUnf,GAAG;AAC9C,YAAAmf,EAAK,YAAYnf,CAAC;AAAA,UAChC,CAAa,IAGCmf,EAAK,UACPA,EAAK,OAAOA,EAAK,OAAO,cAAc,WAAY;AAChD,gBAAI,CAACA,EAAK,UAAU,CAACA,EAAK,IAAI,GAAG,UAAU,EAAG,QAAO;AACrD,YAAIA,EAAK,uBAAqBA,EAAK,WAAU,GAC7CA,EAAK,KAAK,SAAS;AAAA,UACjC,CAAa,GACDA,EAAK,OAAOA,EAAK,OAAO,cAAc,WAAY;AAChD,YAAAA,EAAK,KAAK,SAAS,IACdA,EAAK,KAAK,QAAMA,EAAK,WAAU;AAAA,UAClD,CAAa,GAEG+R,EAAI,kBACN/R,EAAK,KAAKA,EAAK,OAAO,SAAS,SAAUnf,GAAG;AAC1C,YAAAmf,EAAK,YAAYnf,GAAG,IAAO,EAAI;AAAA,UAC/C,CAAe,GACDmf,EAAK,KAAKA,EAAK,OAAO,YAAY,SAAUnf,GAAG;AAC7C,YAAAmf,EAAK,YAAYnf,GAAG,IAAM,EAAI;AAAA,UAC9C,CAAe,GACDmf,EAAK,KAAKA,EAAK,SAAS,SAAS,SAAUnf,GAAG;AAC5C,YAAAmf,EAAK,YAAYnf,CAAC;AAAA,UAClC,CAAe,GACDmf,EAAK,KAAKA,EAAK,SAAS,YAAY,SAAUnf,GAAG;AAC/C,YAAAmf,EAAK,YAAYnf,CAAC;AAAA,UAClC,CAAe,MAOHkxB,EAAI,sBAAsB,KAAK,kBAAkBoM,EAAI,cACvDne,EAAK,KAAKA,EAAK,QAAQ,cAAcA,EAAK,kBAAkB,GAC5DA,EAAK,KAAKA,EAAK,QAAQ,aAAaA,EAAK,iBAAiB,GAC1DA,EAAK,KAAKA,EAAK,QAAQ,YAAYA,EAAK,gBAAgB,GACxDA,EAAK,WAAWA,EAAK,KAAKA,EAAK,SAAS,cAAc,SAAUnf,GAAG;AACjE,YAAAmf,EAAK,mBAAmBnf,GAAG,EAAI;AAAA,UAC3C,CAAW,GACDmf,EAAK,WAAWA,EAAK,KAAKA,EAAK,SAAS,aAAaA,EAAK,iBAAiB,GAC3EA,EAAK,WAAWA,EAAK,KAAKA,EAAK,SAAS,YAAYA,EAAK,gBAAgB,IAIvE,CAAC+R,EAAI,gBAAgB,CAACoM,EAAI,aAAa,CAACA,EAAI,SAE9Cne,EAAK,KAAMme,EAAI,kBAAmBne,EAAK,MAAMuc,GAAM,WAAWvc,EAAK,SAAS,GAC5EA,EAAK,KAAKuc,GAAM,aAAavc,EAAK,WAAW,GACzCA,EAAK,WAASA,EAAK,KAAKuc,GAAM,SAASvc,EAAK,OAAO,GAEvDA,EAAK,KAAKA,EAAK,QAAQ,aAAaA,EAAK,WAAW,GACpDA,EAAK,KAAKA,EAAK,QAAQ,WAAWA,EAAK,SAAS,GAE5CA,EAAK,UACPA,EAAK,KAAKA,EAAK,SAAS,aAAa,SAAUnf,GAAG;AAChD,YAAAmf,EAAK,YAAYnf,GAAG,EAAI;AAAA,UACtC,CAAa,GACDmf,EAAK,KAAKA,EAAK,SAAS,WAAWA,EAAK,SAAS,IAG/C,CAACA,EAAK,UAAU+R,EAAI,4BACtB/R,EAAK,KAAKA,EAAK,IAAI,CAAC,GAAG,aAAaA,EAAK,gBAAgB,GACzDA,EAAK,KAAKuc,GAAM,WAAWvc,EAAK,cAAc,GAC9CA,EAAK,KAAKA,EAAK,QAAQ,WAAWA,EAAK,cAAc,GACjDA,EAAK,WAASA,EAAK,KAAKA,EAAK,SAAS,WAAWA,EAAK,cAAc,GACxEA,EAAK,KAAKuc,GAAM,aAAavc,EAAK,eAAe,IAG/CA,EAAK,SACPA,EAAK,OAAOA,EAAK,MAAM,cAAc,WAAY;AAC/C,YAAIA,EAAK,uBAAqBA,EAAK,WAAU,GAC7CA,EAAK,KAAK,SAAS;AAAA,UACjC,CAAa,GACDA,EAAK,OAAOA,EAAK,MAAM,cAAc,WAAY;AAC/C,YAAAA,EAAK,KAAK,SAAS,IACdA,EAAK,KAAK,QAAMA,EAAK,WAAU;AAAA,UAClD,CAAa,OAKHA,EAAK,KAAMme,EAAI,kBAAmBne,EAAK,MAAMuc,GAAM,WAAWvc,EAAK,UAAU,GACzEA,EAAK,WAASA,EAAK,KAAKuc,GAAM,SAASvc,EAAK,OAAO,GAEnD+R,EAAI,qBACN/R,EAAK,KAAKA,EAAK,QAAQ,aAAaA,EAAK,WAAW,GACpDA,EAAK,KAAKA,EAAK,QAAQ,WAAWA,EAAK,SAAS,GAChDA,EAAK,WAAWA,EAAK,KAAKA,EAAK,SAAS,aAAa,SAAUnf,GAAG;AAChE,YAAAmf,EAAK,YAAYnf,GAAG,EAAI;AAAA,UACtC,CAAa,GACDmf,EAAK,WAAWA,EAAK,KAAKA,EAAK,SAAS,WAAWA,EAAK,SAAS,MAEjEA,EAAK,KAAKA,EAAK,MAAM,aAAa,SAAUnf,GAAG;AAAE,YAAAA,EAAE,eAAgB;AAAA,UAAG,CAAA,GACtEmf,EAAK,SAASA,EAAK,KAAKA,EAAK,OAAO,aAAa,SAAUnf,GAAG;AAAE,YAAAA,EAAE,eAAgB;AAAA,UAAG,CAAA,KAMrFkxB,EAAI,qBACD/R,EAAK,YAAUA,EAAK,WAAYme,EAAI,QAAQne,EAAK,SAAUuc,IAAOvc,EAAK,KAAKA,EAAK,YAAY,GAClGA,EAAK,WAAWA,EAAK,MAAMA,EAAK,YAAY,GACxCA,EAAK,SAAOA,EAAK,WAAWA,EAAK,OAAOA,EAAK,cAAc,IAG7D,CAACA,EAAK,UAAU,CAACme,EAAI,YAAY,CAAE,aAAa,KAAKne,EAAK,IAAI,CAAC,EAAE,QAAQ,MACtEA,EAAK,IAAI,KAAK,UAAU,KAAGA,EAAK,IAAI,KAAK;AAAA,YAC5C,UAAY,EAAEmc;AAAA,UAC1B,CAAW,GAEDnc,EAAK,KAAKA,EAAK,KAAK,SAAS,SAAUnf,GAAG;AACxC,YAAAo7B,IAAYjc,EAAK,UAAUnf,CAAC,EAAG,MAAMmf,EAAK,UAAUnf,CAAC,KAAK,IAC1Dmf,EAAK,WAAW,IACZA,EAAK,uBAAqBA,EAAK,aAAY;AAAA,UAC3D,CAAW,GACDA,EAAK,KAAKA,EAAK,KAAK,QAAQ,SAAUnf,GAAG;AACvC,YAAAo7B,IAAW,IACXjc,EAAK,WAAW;AAAA,UAC5B,CAAW,GAEDA,EAAK,KAAKA,EAAK,KAAK,cAAc,SAAUnf,GAAG;AAC7C,YAAAq7B,IAAclc,EAAK,UAAUnf,CAAC,EAAG,MAAMmf,EAAK,UAAUnf,CAAC,KAAK,IAC5Dmf,EAAK,gBAAgB,IACjBA,EAAK,uBAAqBA,EAAK,aAAY;AAAA,UAC3D,CAAW,GACDA,EAAK,KAAKA,EAAK,KAAK,cAAc,SAAUnf,GAAG;AAC7C,YAAAq7B,IAAa,IACblc,EAAK,gBAAgB,IAChBA,EAAK,KAAK,QAAMA,EAAK,WAAU;AAAA,UAChD,CAAW,IAMHA,EAAK,aAAa,SAAUnf,GAAG;AAC7B,gBAAImf,EAAK,eAAeA,EAAK,KAAK,SAAS,EAAG,QAAO;AAErD,YAAAnf,IAAIA,KAAK27B,EAAK;AACd,gBAAItiC,IAAK8lB,EAAK,UAAUnf,CAAC;AACzB,gBAAI3G,KAAM,+BAA+B,KAAKA,EAAG,QAAQ,GAAG;AAC1D,kBAAIyoC,KAAKzoC,EAAG,aAAa,MAAM,KAAKA,EAAG,QAAQ;AAC/C,kBAAK,CAACyoC,MAAO,CAAE,wBAAwB,GAAK,QAAO;AAAA,YACpD;AAED,gBAAIrG,EAAEpiC,CAAE,EAAE,KAAK,iBAAiB,EAAG,QAAO;AAE1C,gBAAI8lB,EAAK,YAAaA,EAAK,iBAAiB,CAACic,KAAcjc,EAAK,UAAU,CAACic,KAAY,CAACC,GAAa;AACnG,kBAAI/jB,KAAMtX,EAAE;AAEZ,kBAAImf,EAAK,eAAe7H,MAAO,GAAI,QAAO6H,EAAK,YAAYnf,CAAC;AAE5D,kBAAI+hC,KAAO/hC,EAAE,WAAW,IACpBgiC,KAAQhiC,EAAE,YAAY,IAEtBoR,KAAM;AACV,sBAAQkG,IAAG;AAAA,gBACT,KAAK;AAAA,gBACL,KAAK;AACH,kBAAA6H,EAAK,WAAW,KAAK,CAAC,GACtB/N,KAAM;AACN;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAA+N,EAAK,WAAW,MAAM,CAAC,GACvB/N,KAAM;AACN;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAI+N,EAAK,UACN4iB,KAAQ5iB,EAAK,aAAa,CAAC,IAAIA,EAAK,eAAe,KAAK,CAAC,GAC1D/N,KAAM;AAER;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAI+N,EAAK,UACN4iB,KAAQ5iB,EAAK,aAAaA,EAAK,KAAK,IAAI,IAAIA,EAAK,eAAe,MAAM,CAAC,GACxE/N,KAAM;AAER;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAA+N,EAAK,WAAWA,EAAK,KAAK,CAAC,GAC3B/N,KAAM;AACN;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAA+N,EAAK,WAAW,CAACA,EAAK,KAAK,CAAC,GAC5B/N,KAAM;AACN;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAC+N,EAAK,SAAS4iB,KAAQ5iB,EAAK,YAAY,GAAG,CAAC,IAAIA,EAAK,WAAW,CAAC,GACjE/N,KAAM;AACN;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,kBAAC+N,EAAK,SAAS4iB,KAAQ5iB,EAAK,YAAYA,EAAK,KAAK,MAAMA,EAAK,KAAK,IAAI,IAAIA,EAAK,WAAWA,EAAK,KAAK,IAAI,GACxG/N,KAAM;AACN;AAAA,gBACF,KAAK;AACH,kBAAI8f,EAAI,oBACL8Q,KAAS7iB,EAAK,WAAWA,EAAK,KAAK,CAAC,IAAIA,EAAK,WAAW,CAACA,EAAK,KAAK,CAAC,GACrE/N,KAAM;AAER;AAAA,gBACF,KAAK;AACH,kBAAI+N,EAAK,eACPA,EAAK,OAAM,GACX/N,KAAM;AAER;AAAA,cACH;AACD,kBAAIA,GAAK,QAAO+N,EAAK,YAAYnf,CAAC;AAAA,YACnC;AAAA,UACX,GAEYkxB,EAAI,kBAAgB/R,EAAK,KAAKuc,GAAO4B,EAAI,WAAW,CAACA,EAAI,YAAa,aAAa,WAAWne,EAAK,UAAU,GAEjHA,EAAK,KAAKuc,GAAM,WAAW,SAAU17B,GAAG;AACtC,gBAAI+hC,IAAO/hC,EAAE,WAAW;AACxB,YAAI+hC,MAAM5iB,EAAK,iBAAiB;AAAA,UAC1C,CAAS,GACDA,EAAK,KAAKuc,GAAM,SAAS,SAAU17B,GAAG;AACpC,gBAAI+hC,IAAO/hC,EAAE,WAAW;AACxB,YAAK+hC,MAAM5iB,EAAK,iBAAiB;AAAA,UAC3C,CAAS,GACDA,EAAK,KAAKwc,GAAM,QAAQ,SAAU37B,GAAG;AACnC,YAAAmf,EAAK,iBAAiB;AAAA,UAChC,CAAS,GAEDA,EAAK,KAAKwc,GAAM,UAAUxc,EAAK,cAAc,GAC7CA,EAAK,KAAKwc,GAAM,qBAAqBxc,EAAK,cAAc,GAExDA,EAAK,KAAKwc,GAAM,QAAQxc,EAAK,UAAU,GAEnCme,EAAI,YAAY,CAACne,EAAK,UAAU,CAACA,EAAK,YAAY;AACpD,gBAAIvG,KAAMuG,EAAK,IAAI,KAAK,OAAO,GAC3BggB,KAAK,WAAWhgB,EAAK,IAAI,IAAI,OAAO,CAAC,IAAI;AAC7C,YAAAA,EAAK,IAAI,IAAI,SAASggB,EAAE,GACxBhgB,EAAK,QAAQ,aAAa,WAAY;AACpC,cAAAA,EAAK,IAAI,KAAK,SAASvG,EAAG;AAAA,YACtC,CAAW;AAAA,UACF;AASD,cAJAuG,EAAK,oBAAoB,SAAUnf,GAAG;AACpC,YAAAmf,EAAK,WAAWA,EAAK,UAAU,MAAM,EAAE;AAAA,UACjD,GAEY+R,EAAI,mBAED,CAAC/R,EAAK,UAAYkd,OAAwB,OAC7Cld,EAAK,eAAe,IAAIkd,GAAoB,SAAU4F,GAAW;AAM/D,gBALAA,EAAU,QAAQ,SAAUC,GAAK;AAC/B,kBAAIA,EAAI,QAAQ;AACd,uBAAQ9E,EAAM,SAAS,YAAY,KAAKA,EAAM,SAAS,cAAc,KAAK,CAAC3B,EAAE,SAASA,EAAE,eAAe,EAAE,CAAC,GAAGtc,EAAK,IAAI,CAAC,CAAC,IAAKA,EAAK,KAAI,IAAKA,EAAK,KAAI;AAAA,YAEtK,CAAe,GACGA,EAAK,GAAG,eAAeA,EAAK,KAAK,SAASA,EAAK,GAAG,gBAAgBA,EAAK,KAAK,OAAQ,QAAOA,EAAK,WAAW,EAAE;AAAA,UAC/H,CAAa,GACDA,EAAK,aAAa,QAAQuc,EAAK,MAAM;AAAA,YACnC,WAAW;AAAA,YACX,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,iBAAiB,CAAC,OAAO;AAAA,UACvC,CAAa,IAGC,CAACvc,EAAK,UAAU,CAACA,EAAK,aAAY;AAEpC,gBAAIgjB,KAAOhjB,EAAK,IAAI,CAAC;AAGrB,YAAIkd,OAAwB,MAC1Bld,EAAK,WAAW,IAAIkd,GAAoB,SAAU4F,GAAW;AAC3D,cAAAA,EAAU,QAAQ9iB,EAAK,iBAAiB;AAAA,YACxD,CAAe,GACDA,EAAK,SAAS,QAAQgjB,IAAM;AAAA,cAC1B,WAAW;AAAA,cACX,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,SAAS;AAAA,YACzB,CAAe,GACDhjB,EAAK,kBAAkB,IAAIkd,GAAoB,SAAU4F,GAAW;AAClE,cAAAA,EAAU,QAAQ,SAAUG,GAAI;AAC9B,oBAAIA,EAAG,aAAa,SAAS;AAC3B,2BAAS5E,MAAM4E,EAAG;AAChB,wBAAMjjB,KAASijB,EAAG,aAAa5E,EAAE,MAAM2E,GAAO,QAAOhjB,EAAK;;cAGhF,CAAiB;AAAA,YACjB,CAAe,GACDA,EAAK,gBAAgB,QAAQgjB,GAAK,YAAY;AAAA,cAC5C,WAAW;AAAA,cACX,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,SAAS;AAAA,YACzB,CAAe,MAEDhjB,EAAK,KAAKgjB,IAAO7E,EAAI,QAAQ,CAACA,EAAI,QAAS,mBAAmB,mBAAmBne,EAAK,iBAAiB,GACnGme,EAAI,SAAO6E,GAAK,YAAY,oBAAoBhjB,EAAK,iBAAiB,GAC1EA,EAAK,KAAKgjB,IAAM,kBAAkB,SAAUniC,GAAG;AAC7C,cAAIA,EAAE,WAAWmiC,MAAMhjB,EAAK,OAAM;AAAA,YAClD,CAAe;AAAA,UAEJ;AAMH,UAAI,CAACA,EAAK,UAAU+R,EAAI,WAAS/R,EAAK,KAAKwc,GAAM,UAAUxc,EAAK,UAAU,GACtEA,EAAK,eACPA,EAAK,KAAKA,EAAK,KAAK,WAAWA,EAAK,UAAU,GAC9CA,EAAK,KAAKA,EAAK,KAAK,WAAWA,EAAK,UAAU,IAGhDA,EAAK,WAAW,EAAE;AAAA,QAEnB;AAED,YAAI,KAAK,IAAI,CAAC,EAAE,YAAY,UAAU;AACpC,cAAIkjB,KAAe,WAAY;AAC7B,YAAAljB,EAAK,WAAW;AAChB,gBAAIzO;AACJ,gBAAI;AACF,cAAAA,IAAM,qBAAqB,OAAO,KAAK,kBAAkB,KAAK,cAAc;AAC5E,kBAAI7O,IAAI6O,EAAI;AAAA,YACb,QAAW;AACV,cAAAyO,EAAK,WAAW,IAChBzO,IAAM;AAAA,YACP;AAED,gBAAIyO,EAAK;AACP,qBAAI,aAAawc,KAAM,QAAQ,IAAI,2CAA2C,GACvE;AAoBT,gBAjBAxc,EAAK,cAAc,IAEfA,EAAK,aACPA,EAAK,SAAS;AAAA,cACZ,KAAOsc,EAAE/qB,CAAG;AAAA,cACZ,MAAQyO,EAAK,IAAI,SAAU,EAAC,KAAK,MAAM,EAAE,CAAC;AAAA,cAC1C,MAAQA,EAAK,IAAI,SAAU,EAAC,KAAK,MAAM,EAAE,CAAC;AAAA,YACxD,GACYA,EAAK,iBAAiB,WAAY;AAChC,qBAAO;AAAA,gBACL,GAAG,KAAK,IAAIA,EAAK,OAAO,KAAK,aAAaA,EAAK,OAAO,KAAK,WAAW;AAAA,gBACtE,GAAG,KAAK,IAAIA,EAAK,OAAO,KAAK,cAAcA,EAAK,OAAO,KAAK,YAAY;AAAA,cACxF;AAAA,YACA,GACYA,EAAK,YAAYsc,EAAEtc,EAAK,OAAO,IAAI,IAGjC,CAACme,EAAI,SAASpM,EAAI,oBAAoB,CAAC/R,EAAK,UAAU;AACxD,cAAAA,EAAK,IAAI,UAAU,CAAC,GACpBA,EAAK,IAAI,OAAO,EAAE;AAClB,kBAAImjB,KAAK,KAAK,IAAI5xB,EAAI,qBAAqB,MAAM,EAAE,CAAC,EAAE,cAAcA,EAAI,KAAK,YAAY;AACzF,cAAAyO,EAAK,IAAI,OAAOmjB,EAAE;AAAA,YACnB;AACD,YAAAnjB,EAAK,WAAW,EAAE,GAElBA,EAAK,IAAIsc,EAAEtc,EAAK,OAAO,IAAI,GAAGugB,CAAc,GAExCpC,EAAI,SAASne,EAAK,cACpBA,EAAK,IAAIsc,EAAE/qB,EAAI,IAAI,GAAG;AAAA,cACpB,qBAAqB;AAAA,YACnC,CAAa,GAGC,mBAAmB,OACrByO,EAAK,KAAK,KAAK,eAAe,UAAUA,EAAK,QAAQ,IAErDA,EAAK,KAAKzO,GAAK,UAAUyO,EAAK,QAAQ,GAGpC+R,EAAI,oBACN/R,EAAK,WAAWzO,GAAKyO,EAAK,YAAY,GAGpC+R,EAAI,kBAAgB/R,EAAK,KAAKzO,GAAM4sB,EAAI,UAAW,aAAa,WAAWne,EAAK,UAAU,GAE1Fme,EAAI,YACNne,EAAK,KAAKzO,GAAK,cAAcyO,EAAK,YAAY,GAC9CA,EAAK,KAAKzO,GAAK,aAAayO,EAAK,WAAW,KAErC+R,EAAI,iBACX/R,EAAK,KAAKzO,GAAK,aAAayO,EAAK,YAAY,GAC7CA,EAAK,KAAKzO,GAAK,aAAa,SAAU1Q,IAAG;AACvC,qBAAOmf,EAAK,YAAYnf,IAAG,EAAI;AAAA,YAC7C,CAAa,GACGkxB,EAAI,qBAAqBoM,EAAI,mBAAiBne,EAAK,IAAIsc,EAAE/qB,EAAI,IAAI,GAAG;AAAA,cACtE,QAAU4sB,EAAI;AAAA,YAC5B,CAAa,IAGHne,EAAK,KAAKzO,GAAK,WAAWyO,EAAK,UAAU,GAErCA,EAAK,SACH+R,EAAI,gBAAc/R,EAAK,KAAKzO,GAAK,YAAYyO,EAAK,MAAM,GACxDA,EAAK,iBAAeA,EAAK,KAAKzO,GAAK,cAAcyO,EAAK,aAAa;AAAA,UAEnF;AAEQ,UAAI,KAAK,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC,EAAE,eAAe,cACvD,WAAW,WAAY;AACrB,YAAAkjB,GAAa,KAAKljB,EAAK,IAAI,CAAC,GAAG,EAAK;AAAA,UACrC,GAAE,GAAG,GAERA,EAAK,KAAK,KAAK,KAAK,QAAQkjB,EAAY;AAAA,QAEzC;AAAA,MAEP,GAEI,KAAK,aAAa,SAAUE,GAAIxD,GAAI;AAKlC,YAJI5f,EAAK,kBACP,aAAaA,EAAK,aAAa,GAC/BA,EAAK,gBAAgB,IAEnB,EAACA,EAAK,MAqBV;AAAA,cApBIA,EAAK,gBACPA,EAAK,YAAY,KAAM,EAAC,IAAI;AAAA,YAC1B,SAAS+R,EAAI;AAAA,UACvB,CAAS,GACD/R,EAAK,eAAe,MAGlB,CAACA,EAAK,KAAK,QAAQA,EAAK,KAAK,KAAK,MAAM,OACtCojB,MAAO,UAAaA,MAAO,OAC7BpjB,EAAK,OAAO,IAAKojB,IAAKpjB,EAAK,YAAY,IAAK,IAE1C4f,MAAO,WACT5f,EAAK,OAAO,IAAK4f,IAAK5f,EAAK,YAAY,IAAK,KAIhDA,EAAK,OAAO,IAAI;AAAA,YACd,QAAQA,EAAK;AAAA,YACb,KAAKA,EAAK,OAAO;AAAA,UACzB,CAAO,GACGA,EAAK,SAAS;AAChB,gBAAIqjB,IAAMrjB,EAAK,eAAgBA,EAAK,kBAAkBA,EAAK,OAAO,IAAIA,EAAK,OAAO;AAClF,YAAAA,EAAK,QAAQ,IAAI;AAAA,cACf,OAAOA,EAAK;AAAA,cACZ,MAAO,CAACA,EAAK,KAAK,SAASA,EAAK,KAAK,aAAcqjB,IAAKrjB,EAAK,KAAK,QAAQqjB;AAAA,YACpF,CAAS,GACDrjB,EAAK,eAAe;AAAA,UACrB;AAED,UAAIA,EAAK,QAAMA,EAAK,KAAK,KAAM,EAAC,IAAI;AAAA,YAClC,SAAS+R,EAAI;AAAA,UACrB,CAAO;AAAA;AAAA,MACP,GAEI,KAAK,aAAa,SAAUqM,GAAI;AAC9B,QAAIpe,EAAK,iBACJA,EAAK,QACLA,EAAK,gBAENA,EAAK,iBAAiB+R,EAAI,iBAAiB,YAC/C/R,EAAK,gBAAgB,WAAW,WAAY;AAC1C,WAAI,CAACA,EAAK,KAAK,UAAU,CAACA,EAAK,sBAC7BA,EAAK,YAAY,KAAM,EAAC,QAAQ;AAAA,YAC9B,SAAS+R,EAAI;AAAA,UACzB,CAAW,GACG/R,EAAK,QAAMA,EAAK,KAAK,KAAM,EAAC,QAAQ;AAAA,YACtC,SAAS+R,EAAI;AAAA,UACzB,CAAW,GACD/R,EAAK,eAAe,KAEtBA,EAAK,gBAAgB;AAAA,QAC7B,GAASoe,KAAMrM,EAAI,eAAe;AAAA,MAClC,GAEI,KAAK,eAAe,SAAUqM,GAAIgF,GAAIxD,GAAI;AACxC,QAAA5f,EAAK,WAAWojB,GAAIxD,CAAE,GACjB5f,EAAK,KAAK,UAAQA,EAAK,WAAWoe,CAAE;AAAA,MAC/C,GAEI,KAAK,iBACFpe,EAAK,SACJ,WAAY;AACV,eAAO;AAAA,UACL,GAAG,KAAK,IAAIuc,EAAK,KAAK,aAAaA,EAAK,gBAAgB,WAAW;AAAA,UACnE,GAAG,KAAK,IAAIA,EAAK,KAAK,cAAcA,EAAK,gBAAgB,YAAY;AAAA,QACjF;AAAA,MACA,IAAavc,EAAK,aACR,WAAY;AACV,eAAO;AAAA,UACL,GAAGA,EAAK,IAAI,CAAC,EAAE;AAAA,UACf,GAAGA,EAAK,IAAI,CAAC,EAAE;AAAA,QAC7B;AAAA,MACA,IAAc,WAAY;AACd,eAAO;AAAA,UACL,GAAGA,EAAK,UAAU,CAAC,EAAE;AAAA,UACrB,GAAGA,EAAK,UAAU,CAAC,EAAE;AAAA,QACnC;AAAA,MACA,GAEI,KAAK,WAAW,SAAUnf,GAAG9F,GAAM;AAEjC,YAAI,CAACilB,KAAQ,CAACA,EAAK,IAAK,QAAO;AAE/B,YAAIsjB,IAAUtjB,EAAK,KAAK,MACpBujB,IAAUvjB,EAAK,KAAK,MACpBwjB,IAAWxjB,EAAK,KAAK,GACrByjB,IAAWzjB,EAAK,KAAK;AAYzB,YAVAA,EAAK,OAAO;AAAA,UACV,GAAIA,EAAK,SAAUA,EAAK,IAAI,MAAK,IAAKA,EAAK,IAAI,CAAC,EAAE;AAAA,UAClD,GAAIA,EAAK,SAAUA,EAAK,IAAI,OAAM,IAAKA,EAAK,IAAI,CAAC,EAAE;AAAA,QAC3D,GAEMA,EAAK,OAAQjlB,KAAeilB,EAAK,kBAEjCA,EAAK,KAAK,OAAO,KAAK,IAAI,GAAGA,EAAK,KAAK,IAAIA,EAAK,KAAK,CAAC,GACtDA,EAAK,KAAK,OAAO,KAAK,IAAI,GAAGA,EAAK,KAAK,IAAIA,EAAK,KAAK,CAAC,GAEjDA,EAAK,KAAK,QAAQsjB,KAAatjB,EAAK,KAAK,QAAQujB,KAAavjB,EAAK,KAAK,KAAKyjB,KAAczjB,EAAK,KAAK,KAAKwjB,GAAW;AAExH,cAAKxjB,EAAK;AAQR,mBAAOA;AAPP,cAAIkgB,KAAMlgB,EAAK,IAAI,OAAM;AACzB,cAAIA,EAAK,cAAc;AACrB,gBAAI6d,KAAM7d,EAAK;AACf,gBAAK6d,GAAI,OAAOqC,GAAI,OAASrC,GAAI,QAAQqC,GAAI,KAAO,QAAOlgB;AAAA,UAC5D;AACD,UAAAA,EAAK,eAAekgB;AAAA,QAIvB;AA+BD,YA7BIlgB,EAAK,KAAK,SAAS,KACrBA,EAAK,SAAQ,GACbA,EAAK,iBAAiB,GACtBA,EAAK,OAAO,IAAI,GAChBA,EAAK,YAAY,IAAI,GACrBA,EAAK,eAAe,GACpBA,EAAK,aAAa,CAAC,GACfA,EAAK,SAAMA,EAAK,KAAK,aAAa,QAEtCA,EAAK,KAAK,QAAS+R,EAAI,YAAY,MAAMA,EAAI,YAAY,QACzD/R,EAAK,KAAK,aAAa,KAGrBA,EAAK,KAAK,SAAS,KACrBA,EAAK,WAAU,GACfA,EAAK,kBAAkB,GACvBA,EAAK,OAAO,IAAI,GAChBA,EAAK,YAAY,IAAI,GACrBA,EAAK,cAAc,GACnBA,EAAK,cAAc,CAAC,GAChBA,EAAK,UACPA,EAAK,MAAM,aAAa,QAG1BA,EAAK,KAAK,QAAS+R,EAAI,YAAY,OAAOA,EAAI,YAAY,OACtD/R,EAAK,UAAOA,EAAK,MAAM,aAAc+R,EAAI,oBAG/C/R,EAAK,cAAeA,EAAK,UAAaA,EAAK,KAAK,SAAS,KAAOA,EAAK,KAAK,SAAS,GAC/EA,EAAK;AACP,iBAAKA,EAAK,UAAQA,EAAK,gBAAgBA,EAAK,IAAI,GACzC;AAGT,QAAKA,EAAK,WACHA,EAAK,KAAK,cAAYA,EAAK,SAAQ,GACpCA,EAAK,SAAS,CAACA,EAAK,MAAM,cAAYA,EAAK,eAG7CA,EAAK,cAAcA,EAAK,IAAI,IAAI,QAAQ,KAAKA,EAAK,IAAI,IAAI,QAAQ,KAAK,WAAQA,EAAK,KAAK,KAAK,KAElGA,EAAK,eAAe,KAAK,IAAIA,EAAK,KAAK,GAAG,KAAK,MAAMA,EAAK,KAAK,KAAKA,EAAK,KAAK,IAAIA,EAAK,KAAK,EAAE,CAAC,GAC/FA,EAAK,eAAgB+R,EAAI,oBAAqBA,EAAI,oBAAoB,KAAK,IAAIA,EAAI,iBAAiB/R,EAAK,YAAY,GAErHA,EAAK,cAAc,KAAK,IAAIA,EAAK,KAAK,GAAG,KAAK,MAAMA,EAAK,KAAK,KAAKA,EAAK,KAAK,IAAIA,EAAK,KAAK,EAAE,CAAC,GAC9FA,EAAK,cAAe+R,EAAI,oBAAqBA,EAAI,oBAAoB,KAAK,IAAIA,EAAI,iBAAiB/R,EAAK,WAAW,GAEnHA,EAAK,iBAAiBA,EAAK,KAAK,IAAIA,EAAK,gBAAgB+R,EAAI,YAAY,MAAMA,EAAI,YAAY,SAC1F/R,EAAK,iBAAcA,EAAK,kBAAkBA,EAAK,OAAO,CAAC,EAAE,eAAeA,EAAK,OAAO,CAAC,EAAE,eAExFA,EAAK,UACPA,EAAK,MAAM,QAASA,EAAK,KAAK,OAAO,IAAMA,EAAK,KAAK,IAAIA,EAAK,KAAK,QAASA,EAAK,KAAK,GACtFA,EAAK,kBAAkBA,EAAK,MAAM,QAAQA,EAAK,eAAe+R,EAAI,YAAY,OAAOA,EAAI,YAAY,SAGlG/R,EAAK,UAAQA,EAAK,gBAAgBA,EAAK,IAAI,GAEhDA,EAAK,cAAc;AAAA,UACjB,GAAIA,EAAK,KAAK,OAAOA,EAAK;AAAA,UAC1B,GAAIA,EAAK,KAAK,OAAOA,EAAK;AAAA,QAClC;AAEM,YAAI0jB,KAAK1jB,EAAK;AACd,eAAI0jB,KAAK1jB,EAAK,KAAK,OACjBA,EAAK,YAAYA,EAAK,KAAK,IAAI,KAE/BA,EAAK,OAAO,IAAKA,EAAK,aAAc,IAAGA,EAAK,YAAY,IAAK,GAC7DA,EAAK,OAAO,IAAKA,EAAK,cAAe,IAAGA,EAAK,YAAY,IAAK,GAC1DA,EAAK,gBAAcA,EAAK,aAAY,IAGtCA,EAAK,OAAO,KAAMA,EAAK,aAAc,MAAK,KAAIA,EAAK,WAAYA,EAAK,OAAO,IAAIA,EAAK,YAAY,IAAG,CAAC,GAEjGA;AAAA,MACb,GAEI,KAAK,SAASA,EAAK;AAEnB,UAAI2jB,KAAc;AAElB,WAAK,iBAAiB,SAAS9iC,GAAG;AAChC,qBAAa8iC,EAAW;AAExB,YAAIC,IAAa,CAAC5jB,EAAK,UAAU,CAACA,EAAK;AACvC,QAAI4jB,KAAW5jB,EAAK,aAEpB2jB,KAAc,WAAW,WAAY;AACnC,UAAI3jB,MACE4jB,KAAW5jB,EAAK,aACpBA,EAAK,OAAM,IAEb2jB,KAAY;AAAA,QACb,GAAE,GAAG;AAAA,MACZ,GAEI,KAAK,aAAa,SAAUvF,GAAI;AAE9B,4BAAauF,EAAW,GAExBvF,IAAK,MAAMA,CAAE,IAAI,MAAMA,GAEvBuF,KAAc,WAAW,WAAY;AACnC,UAAA3jB,KAAQA,EAAK,UACb2jB,KAAY;AAAA,QACb,GAAEvF,CAAE,GAEEpe;AAAA,MAEb;AAGI,eAAS6jB,GAAkBvE,GAAK/sB,GAAM8F,GAAIyrB,GAAQ;AAChD,QAAA9jB,EAAK,MAAMsf,GAAK/sB,GAAM,SAAU1R,GAAG;AACjC,UAAAA,IAAIA,KAAK27B,EAAK;AACd,cAAI/T,IAAQ;AAAA,YACV,UAAU5nB;AAAA,YACV,QAAQA,EAAE,UAAUA,EAAE;AAAA,YACtB,MAAM;AAAA,YACN,WAAWA,EAAE,QAAQ,wBAAwB,IAAI;AAAA,YACjD,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB,WAAY;AAC1B,qBAAAA,EAAE,iBAAiBA,EAAE,eAAgB,IAAGA,EAAE,cAAc,IACjD;AAAA,YACR;AAAA,YACD,0BAA0B,WAAY;AACpC,cAACA,EAAE,2BAA4BA,EAAE,yBAAwB,IAAKA,EAAE,eAAe;AAAA,YAChF;AAAA,UACX;AAEQ,iBAAI0R,KAAQ,gBACV1R,EAAE,gBAAgB4nB,EAAM,SAAS,KAAK,KAAK5nB,EAAE,cAC7CA,EAAE,gBAAgB4nB,EAAM,SAAS,KAAK,KAAK5nB,EAAE,cAC7C,CAAC4nB,EAAM,UAAU,CAACA,EAAM,WAAWA,EAAM,SAAS,KAAK,KAAK5nB,EAAE,eAE9D4nB,EAAM,SAAS5nB,EAAE,QAGZwX,EAAG,KAAKinB,GAAK7W,CAAK;AAAA,QAC1B,GAAEqb,CAAM;AAAA,MACV;AAID,WAAK,SAAS,SAAUxE,GAAK/sB,GAAM8F,GAAI;AACrC,QAAA2H,EAAK,OAAO,KAAK;AAAA,UACf,GAAGsf;AAAA,UACH,GAAG/sB;AAAA,UACH,GAAG8F;AAAA,UACH,GAAG;AAAA,QACX,CAAO,GACDikB,EAAEgD,CAAG,EAAE,GAAG/sB,GAAM8F,CAAE;AAAA,MACxB,GAEI,KAAK,aAAa,SAAUinB,GAAKjnB,GAAIyrB,GAAQ;AAC3C,YAAIvrB,IAAM,YAAY+mB,IAAOA,EAAI,CAAC,IAAIA;AACtC,YAAI,aAAa/C,EAAK,cAAc,KAAK;AACvC,UAAAvc,EAAK,MAAMzH,GAAI,SAASF,GAAIyrB,KAAU,EAAK;AAAA,aACtC;AACL,cAAIC,IAASxH,EAAK,iBAAiB,SAAa,eAAe;AAC/D,UAAAsH,GAAkBtrB,GAAIwrB,GAAO1rB,GAAIyrB,KAAU,EAAK,GAC5CC,KAAS,oBAAkBF,GAAkBtrB,GAAI,uBAAuBF,GAAIyrB,KAAU,EAAK;AAAA,QAChG;AAAA,MACP;AAEI,UAAIE,KAAmB;AAEvB,UAAI7F,EAAI,kBAAkB;AAGxB,YAAI;AAAE,cAAI7rB,KAAU,OAAO,eAAe,CAAA,GAAI,WAAW,EAAE,KAAK,WAAY;AAAE,YAAA0xB,KAAmB;AAAA,UAAK,EAAA,CAAE;AAAG,UAAAxH,EAAK,iBAAiB,QAAQ,MAAMlqB,EAAO;AAAA,QAAE,QAAe;AAAA,QAAG;AAE1K,aAAK,kBAAkB,SAAUzR,GAAG;AAClC,iBAAKA,MACLA,IAAKA,EAAE,WAAYA,EAAE,WAAWA,GAChCA,EAAE,gBAAe,IACV;AAAA,QACf,GAEM,KAAK,cAAc,SAASA,GAAG;AAC7B,iBAAIA,EAAE,cAAYA,EAAE,eAAc,GAClCA,EAAE,yBAAwB,GACtBA,EAAE,uBAAqBA,EAAE,oBAAmB,GACzC;AAAA,QACf;AAAA,MAEA;AAIM,cAAM,UAAU,iBAAiB,WAAY;AAC3C,eAAK,cAAc;AAAA,QAC3B,GAEM,MAAM,UAAU,kBAAkB,WAAY;AAC5C,eAAK,eAAe;AAAA,QAC5B,GAEM27B,EAAK,YAAY,UAAU,mBAAmBD,EAAK,YAAY,UAAU,mBAAmB,QAAQ,UAAU,mBAAmB,SAAU7oB,GAAMuwB,GAAUC,GAAY;AACrK,eAAK,YAAY,OAAOxwB,GAAMuwB,CAAQ;AAAA,QAC9C,GACMzH,EAAK,YAAY,UAAU,sBAAsBD,EAAK,YAAY,UAAU,sBAAsB,QAAQ,UAAU,sBAAsB,SAAU7oB,GAAMuwB,GAAUC,GAAY;AAC9K,eAAK,YAAY,OAAOxwB,GAAMuwB,CAAQ;AAAA,QAC9C,GAGM,KAAK,cAAc,SAAUpjC,GAAG;AAC9B,iBAAAA,IAAIA,KAAK27B,EAAK,OACV37B,MACFA,EAAE,eAAe,IACjBA,EAAE,SAAS,IACXA,EAAE,cAAc,KAEX;AAAA,QACf,GAEM,KAAK,kBAAkB,SAAUA,GAAG;AAClC,iBAAAA,IAAIA,KAAK27B,EAAK,OACV37B,MAAGA,EAAE,eAAe,KACjB;AAAA,QACf;AAII,WAAK,WAAW,SAAUy+B,GAAK/sB,GAAM8F,GAAIyrB,GAAQK,GAAQ;AAEvD,YAAIC,IAAK1H,GAAcnqB,CAAI,KAAK;AAEhC,QAAK6xB,MAEHA,IAAK;AAAA,UACH,GAAG,CAAE;AAAA,UACL,GAAG,CAAE;AAAA,UACL,GAAG,SAAUvjC,IAAG;AAGd,qBAFIg9B,KAAMuG,EAAG,GAAG/jB,KAAIwd,GAAI,SAAS,GAC7BwG,KAAI,IACC3hC,KAAI2d,IAAG3d,MAAK,GAAGA;AAEtB,kBADA2hC,KAAIxG,GAAIn7B,EAAC,EAAE,KAAK7B,GAAE,QAAQA,EAAC,GACvBwjC,OAAM,GAAO,QAAO;AAE1B,mBAAOA;AAAA,UACR;AAAA,QACX,GAEQrkB,EAAK,KAAKsf,GAAK/sB,GAAM6xB,EAAG,GAAGN,GAAQK,CAAM,GAEzCzH,GAAcnqB,CAAI,IAAI6xB,IAIpBpkB,EAAK,UACPokB,EAAG,IAAI,CAACpkB,EAAK,EAAE,EAAE,OAAOokB,EAAG,CAAC,GAC5BA,EAAG,IAAI,CAAC/rB,CAAE,EAAE,OAAO+rB,EAAG,CAAC,MAEvBA,EAAG,EAAE,KAAKpkB,EAAK,EAAE,GACjBokB,EAAG,EAAE,KAAK/rB,CAAE;AAAA,MAGpB,GAEI,KAAK,aAAa,SAAUinB,GAAK/sB,GAAM8F,GAAIyrB,GAAQK,GAAQ;AACzD,YAAIC,IAAK1H,GAAcnqB,CAAI,KAAG;AAC9B,YAAI6xB,KAAIA,EAAG;AACT,mBAAS1hC,KAAE,GAAE2d,KAAE+jB,EAAG,EAAE,QAAO1hC,KAAE2d,IAAE3d;AAC7B,YAAI0hC,EAAG,EAAE1hC,EAAC,MAAMsd,EAAK,OACnBokB,EAAG,EAAE,OAAO1hC,EAAC,GACb0hC,EAAG,EAAE,OAAO1hC,EAAC,GACT0hC,EAAG,EAAE,WAAS,MAChBpkB,EAAK,QAAQsf,GAAI/sB,GAAK6xB,EAAG,EAAE,CAAC,GAC5B1H,GAAcnqB,CAAI,IAAI;AAAA,MAKpC,GAEI,KAAK,OAAO,SAAU+sB,GAAK/sB,GAAM8F,GAAIyrB,GAAQK,GAAQ;AACnD,YAAI5rB,IAAM,YAAY+mB,IAAOA,EAAI,CAAC,IAAIA;AACtC,QAAAtf,EAAK,MAAMzH,GAAIhG,GAAM8F,GAAIyrB,KAAU,IAAOK,KAAU,EAAK;AAAA,MAC/D,GAEI,KAAK,QAAQ,SAAU5rB,GAAIhG,GAAM8F,GAAIyrB,GAAQK,GAAQ;AAEnD,QAAAnkB,EAAK,OAAO,KAAK;AAAA,UACf,GAAGzH;AAAA,UACH,GAAGhG;AAAA,UACH,GAAG8F;AAAA,UACH,GAAGyrB;AAAA,UACH,GAAG;AAAA,QACX,CAAO,GAEAE,MAAoBG,IAAU5rB,EAAG,iBAAiBhG,GAAM8F,GAAI,EAAE,SAAS,IAAO,SAASyrB,EAAQ,CAAA,IAAIvrB,EAAG,iBAAiBhG,GAAM8F,GAAIyrB,KAAU,EAAK;AAAA,MACvJ,GAEI,KAAK,UAAU,SAAUvrB,GAAIhG,GAAM8F,GAAIisB,GAAK;AAC1C,QAAI5H,GAAcnqB,CAAI,IAAGyN,EAAK,WAAWzH,GAAIhG,GAAM8F,GAAIisB,CAAG,IACrD/rB,EAAG,oBAAoBhG,GAAM8F,GAAIisB,CAAG;AAAA,MAC/C,GAEI,KAAK,YAAY,WAAY;AAC3B,iBAAS5hC,IAAI,GAAGA,IAAIsd,EAAK,OAAO,QAAQtd,KAAK;AAC3C,cAAI2hC,IAAIrkB,EAAK,OAAOtd,CAAC;AACrB,UAAC2hC,EAAE,IAAKA,EAAE,EAAE,OAAOA,EAAE,GAAGA,EAAE,CAAC,IAAIrkB,EAAK,QAAQqkB,EAAE,GAAGA,EAAE,GAAGA,EAAE,GAAGA,EAAE,CAAC;AAAA,QAC/D;AAAA,MACP,GAEI,KAAK,YAAY,WAAY;AAC3B,eAAOrkB,EAAK,WAAW;MAC7B,GAEI,KAAK,WAAW,WAAY;AAC1B,eAAKA,EAAK,KAAK,SAAS,MAAOA,EAAK,UAAUA,EAAK,IAAI,IAAI,SAAS,KAAK,YAEvEA,EAAK,KAAK,aAAa,IACvBA,EAAK,KAAK,IAAI,WAAW,OAAO,IAE3BA;AAAA,MACb,GAEI,KAAK,aAAa,WAAY;AAC5B,eAAIA,EAAK,SACFA,EAAK,KAAK,SAAS,MAAOA,EAAK,UAAUA,EAAK,IAAI,IAAI,SAAS,KAAK,YACvEA,EAAK,MAAM,aAAa,IACxBA,EAAK,MAAM,IAAI,WAAW,OAAO,IAG9BA;AAAA,MACb,GAEI,KAAK,YAAY,WAAY;AAC3B,eAAOA,EAAK,WAAW;MAC7B,GAEI,KAAK,WAAW,WAAY;AAE1B,eAAAA,EAAK,KAAK,aAAa,IACvBA,EAAK,KAAK,IAAI,WAAW,MAAM,GACxBA;AAAA,MACb,GAEI,KAAK,aAAa,WAAY;AAC5B,eAAIA,EAAK,UACPA,EAAK,MAAM,aAAa,IACxBA,EAAK,MAAM,IAAI,WAAW,MAAM,IAE3BA;AAAA,MACb,GAEI,KAAK,OAAO,WAAY;AACtB,eAAAA,EAAK,SAAS,IACdA,EAAK,cAAc,IACZA,EAAK;MAClB,GAEI,KAAK,OAAO,WAAY;AACtB,eAAAA,EAAK,SAAS,IACdA,EAAK,cAAc,IACZA,EAAK;MAClB,GAEI,KAAK,SAAS,WAAY;AACxB,eAAQA,EAAK,SAAUA,EAAK,SAASA,EAAK;MAChD,GAEI,KAAK,SAAS,WAAY;AACxB,QAAAA,EAAK,KAAI,GACLA,EAAK,iBAAe,aAAaA,EAAK,aAAa;AACvD,iBAASN,KAAKM,EAAK,UAAW,CAAIA,EAAK,UAAUN,CAAC,KAAGod,EAAoB9c,EAAK,UAAUN,CAAC,EAAE,CAAC;AAC5F,QAAAM,EAAK,UAAS,GACdA,EAAK,UAAS,GAEVme,EAAI,SAAOne,EAAK,IAAI,CAAC,EAAE,YAAY,oBAAoBA,EAAK,iBAAiB,GAE7EA,EAAK,aAAa,MAAOA,EAAK,SAAS,cACvCA,EAAK,oBAAoB,MAAOA,EAAK,gBAAgB,cACrDA,EAAK,iBAAiB,MAAOA,EAAK,aAAa,cAEnDA,EAAK,SAAS,MAEVA,EAAK,UACPA,EAAK,OAAO,UAEVA,EAAK,WACPA,EAAK,QAAQ,UAEXA,EAAK,QACPA,EAAK,KAAK,UAERA,EAAK,SACPA,EAAK,MAAM,UAETA,EAAK,QACPA,EAAK,KAAK;AAEZ,iBAAStd,IAAI,GAAGA,IAAIsd,EAAK,MAAM,IAAI,QAAQtd,KAAK;AAC9C,cAAIjI,IAAIulB,EAAK,MAAM,IAAItd,CAAC;AACxB,UAAAjI,EAAE,CAAC,EAAE,IAAIA,EAAE,CAAC,GAAIA,EAAE,CAAC,MAAM,SAAa,KAAKA,EAAE,CAAC,CAAC;AAAA,QAChD;AACD,QAAAulB,EAAK,QAAQ,IACbA,EAAK,GAAG,KAAK,gBAAgB,EAAE;AAI/B,YAAI6d,IAAMvB,EAAE;AACZ,QAAAuB,EAAI,KAAK,SAAU7/B,GAAG;AACpB,cAAK,QACD,KAAK,OAAOgiB,EAAK,IAAI;AACvB,mBAAO6d,EAAI7/B,CAAC;AACZ,qBAASnC,KAAI,EAAEmC,GAAGnC,KAAIgiC,EAAI,QAAQhiC,MAAMmC,IAAK,CAAA6/B,EAAI7/B,CAAC,IAAI6/B,EAAIhiC,EAAC;AAC3D,YAAAgiC,EAAI,UACAA,EAAI,UAAQ,OAAOA,EAAIA,EAAI,MAAM;AAAA,UACtC;AAAA,QACT,CAAO;AAED,iBAAS7/B,KAAKgiB;AACZ,UAAAA,EAAKhiB,CAAC,IAAI,MACV,OAAOgiB,EAAKhiB,CAAC;AAGf,QAAAgiB,IAAO;AAAA,MAEb,GAEI,KAAK,cAAc,SAAU3H,GAAI;AAC/B,oBAAK,gBAAgBA,GACd2H;AAAA,MACb,GACI,KAAK,YAAY,SAAU3H,GAAI;AAC7B,oBAAK,cAAcA,GACZ2H;AAAA,MACb,GACI,KAAK,eAAe,SAAU3H,GAAI;AAChC,oBAAK,iBAAiBA,GACf2H;AAAA,MACb,GAEI,KAAK,SAAS,SAAU3H,GAAI;AAC1B,oBAAK,WAAWA,GACT2H;AAAA,MACb,GACI,KAAK,UAAU,SAAU3H,GAAI;AAC3B,oBAAK,YAAYA,GACV2H;AAAA,MACb,GAEI,KAAK,eAAe,SAAUnf,GAAG;AAC/B,YAAIy+B,IAAOz+B,EAAE,SAAUA,EAAE,SAASA;AAClC,YAAIy+B,EAAI,YAAY,SAAU,QAAO;AACrC,eAAOA,KAAQA,EAAI,YAAY,KAAOA,MAAQ,KAAK,GAAG,CAAC,KAAM,CAAE,aAAa,KAAKA,EAAI,QAAQ,KAAI;AAC/F,cAAIjB,IAAK/B,EAAEgD,CAAG,GACViF,IAAKlG,EAAG,IAAI,WAAW,KAAKA,EAAG,IAAI,WAAW,KAAKA,EAAG,IAAI,UAAU,KAAK;AAC7E,cAAI,cAAc,KAAKkG,CAAE,EAAG,QAAQjF,EAAI,gBAAgBA,EAAI;AAC5D,UAAAA,IAAOA,EAAI,aAAcA,EAAI,aAAa;AAAA,QAC3C;AACD,eAAO;AAAA,MACb,GAEI,KAAK,cAAc,SAAUtB,GAAI;AAE/B,iBADIsB,IAAOtB,KAAMA,EAAG,aAAcA,EAAG,aAAa,IAC3CsB,KAAQA,EAAI,YAAY,KAAM,CAAE,aAAa,KAAKA,EAAI,QAAQ,KAAI;AACvE,cAAIjB,IAAK/B,EAAEgD,CAAG;AACd,cAAI,iBAAiB,KAAKjB,EAAG,IAAI,UAAU,CAAC,EAAG,QAAOA;AACtD,cAAIkG,IAAKlG,EAAG,IAAI,WAAW,KAAKA,EAAG,IAAI,WAAW,KAAKA,EAAG,IAAI,UAAU,KAAK;AAE7E,cADK,cAAc,KAAKkG,CAAE,KAAOjF,EAAI,gBAAgBA,EAAI,gBACrDjB,EAAG,cAAe,EAAC,SAAS,EAAG,QAAOA;AAC1C,UAAAiB,IAAOA,EAAI,aAAcA,EAAI,aAAa;AAAA,QAC3C;AACD,eAAO;AAAA,MACb,GAEI,KAAK,qBAAqB,SAAUkF,GAAIC,GAAIC,GAAIC,GAAIC,GAAI;AAEtD,YAAI5kB,EAAK,eAAe;AACtB,cAAI6kB,IAAO;AAAA,YACT,MAAM;AAAA,YACN,SAAS;AAAA,cACP,GAAGL;AAAA,cACH,GAAGC;AAAA,YACJ;AAAA,YACD,SAAS;AAAA,cACP,GAAGC;AAAA,cACH,GAAGC;AAAA,YACJ;AAAA,YACD,KAAK;AAAA,cACH,GAAG3kB,EAAK;AAAA,cACR,GAAGA,EAAK;AAAA,YACT;AAAA,YACD,OAAO4kB;AAAA,UACjB;AACQ,UAAA5kB,EAAK,cAAc,KAAKA,GAAM6kB,CAAI;AAAA,QACnC;AAAA,MAEP,GAEI,KAAK,mBAAmB,WAAY;AAClC,YAAI7kB,EAAK,aAAa;AAEpB,cAAI4f,IAAK5f,EAAK,iBACVojB,IAAKpjB,EAAK,gBAEV6kB,IAAO;AAAA,YACT,MAAM;AAAA,YACN,SAAS;AAAA,cACP,GAAGjF;AAAA,cACH,GAAGwD;AAAA,YACJ;AAAA,YACD,KAAK;AAAA,cACH,GAAGxD;AAAA,cACH,GAAGwD;AAAA,YACJ;AAAA,UACX;AAEQ,UAAApjB,EAAK,YAAY,KAAKA,GAAM6kB,CAAI;AAAA,QAEjC;AAAA,MAEP;AAEI,UAAIC,KAAa,GAAGC,KAAa,GAAGC,KAAY,GAAGC,KAAY;AAE/D,eAASC,EAAiBtF,GAAIwD,GAAI+B,GAAWC,GAAS;AAEpD,QAAKplB,EAAK,kBACRA,EAAK,aAAaA,EAAK,gBACvBA,EAAK,aAAaA,EAAK,iBACvBglB,KAAY7H,GAAG;AAGjB,YAAIkI,IAAOlI,OAAQ6H;AAYnB,YAXAA,KAAY7H,GAAG,GAEXkI,IAAM,MACRJ,KAAY,IAEZA,OAAc,IAAIA,MAAa,IAGjCrF,IAAKA,IAAKqF,KAAY,GACtB7B,IAAKA,IAAK6B,KAAY,GAElBrF,GAAI;AAEN,cAAIwF;AACF,gBAAIxF,IAAK;AACP,kBAAI5f,EAAK,mBAAmBA,EAAK,KAAK,KAAM,QAAO;AAAA,uBAE/CA,EAAK,cAAa,KAAM,EAAG,QAAO;AAAA;AAI1C,cAAIslB,IAAK1F,IAAK,IAAI,IAAI;AAEtB,UAAImF,OAAeO,MACbtlB,EAAK,aAAWA,EAAK,UAAU,KAAI,GACvCA,EAAK,aAAaA,EAAK,iBACvB+kB,KAAaO,IAGftlB,EAAK,cAAc4f;AAAA,QAEpB;AAED,YAAIwD,GAAI;AAEN,cAAImC,KAAO,WAAY;AACrB,gBAAI/+B,KAAMwZ,EAAK;AACf,gBAAIojB,IAAK;AACP,kBAAI58B,MAAOwZ,EAAK,KAAK,KAAM,QAAO;AAAA,uBAE9BxZ,MAAO,EAAG,QAAO;AAAA,UAEjC;AAEQ,cAAI++B,IAAK;AACP,gBAAIxT,EAAI,yBAAyBoT,KAAa,CAACnlB,EAAK,UAAU,CAACA,EAAK,WAAY,QAAO;AACvF,gBAAIiiB,KAAKjiB,EAAK,KAAK,KAAK;AACxB,YAAIA,EAAK,aAAa,CAACiiB,MAAMjiB,EAAK,aAAa,CAACiiB,IAAImB,IAAK,MAChDpjB,EAAK,aAAaA,EAAK,KAAK,OAAOiiB,MAAMjiB,EAAK,aAAaA,EAAK,KAAK,OAAOiiB,IAAImB,IAAK,KACzFA,IAAK;AAAA,UACX;AAED,cAAIoC,KAAKpC,IAAK,IAAI,IAAI;AAEtB,UAAI0B,OAAeU,OACbxlB,EAAK,aAAWA,EAAK,UAAU,KAAI,GACvCA,EAAK,aAAaA,EAAK,gBACvB8kB,KAAaU,KAGfxlB,EAAK,cAAcojB;AAAA,QAEpB;AAED,SAAIA,KAAMxD,MACR5f,EAAK,QAAQ,cAAc,WAAY;AAErC,cAAIylB,KAAMzlB,EAAK,aAAaA,EAAK;AACjC,UAAAA,EAAK,aAAa;AAElB,cAAI0lB,KAAM1lB,EAAK,aAAaA,EAAK;AACjC,UAAAA,EAAK,aAAa,GAEbA,EAAK,KAAK,QAAMA,EAAK,YAAY0lB,IAAKD,EAAG;AAAA,QAExD,CAAS;AAAA,MAGJ;AAED,UAAIE,KAA0B;AAE9B,eAASC,GAAgB/kC,GAAGw/B,GAAI8E,GAAW;AACzC,YAAIvF,GAAIwD;AAER,YAAI,CAAC+B,KAAaQ,GAAyB,QAAO;AAUlD,YARI9kC,EAAE,cAAc,KAClB++B,IAAK,EAAE/+B,EAAE,UAAUkxB,EAAI,mBAAmB,KAAK,OAAO,GACtDqR,IAAK,EAAEviC,EAAE,UAAUkxB,EAAI,mBAAmB,KAAK,OAAO,KAC7ClxB,EAAE,cAAc,MACzB++B,IAAK,EAAE/+B,EAAE,SAASkxB,EAAI,kBAAkB,KAAK,MAAM,GACnDqR,IAAK,EAAEviC,EAAE,SAASkxB,EAAI,kBAAkB,KAAK,MAAM,IAGjDsO,KAAMtO,EAAI,oBAAqB6N,MAAO,KAAMwD,MAC9CxD,IAAKwD,GACLA,IAAK,GAED+B,IAAW;AACb,cAAIU,IAASjG,IAAK,IAAM5f,EAAK,cAAe,KAAIA,EAAK,KAAK,OAASA,EAAK,cAAe,KAAI;AAC3F,UAAI6lB,MACFzC,IAAKxD,GACLA,IAAK;AAAA,QAER;AAKH,QAAI5f,EAAK,cAAW4f,IAAK,CAACA;AAE1B,YAAI2F,KAAML,EAAiBtF,GAAIwD,GAAI+B,GAAW,EAAI;AAElD,YAAII;AACF,UAAIJ,MAAWQ,KAA0B;AAAA;AAEzC,iBAAAA,KAA0B,IAC1B9kC,EAAE,yBAAwB,GACnBA,EAAE;MAGZ;AAoED,UAlEA,KAAK,eAAe,SAAUA,GAAG;AAC/B,YAAImf,EAAK,kBAAgBA,EAAK,OAAQ,QAAO;AAC7C,YAAIA,EAAK;AACP,iBAAAA,EAAK,UAAU,eAAeA,EAAK,QAAQ,GAAG,GACvC;AAET,YAAIA,EAAK,KAAK,KAAM,QAAOA,EAAK,YAAYnf,CAAC;AAI7C,YAFIkxB,EAAI,qBAAqB,UAAUlxB,EAAE,WAAW,MAAGkxB,EAAI,mBAAmB,KAE1EA,EAAI,oBAAoBlxB,EAAE,WAAW,KACnC,CAACmf,EAAK,KAAK;AACb,iBAAIA,EAAK,SAASA,EAAK,MAAM,aACpBA,EAAK,eAAenf,CAAC,IAErB;AAKb,YAAIilC,IAAK3I,MACLoI,IAAM;AAMV,YALIxT,EAAI,2BAA6B/R,EAAK,YAAY,MAAO8lB,MAC3D9lB,EAAK,sBAAsBA,EAAK,aAAanf,CAAC,GAC9C0kC,IAAM,KAERvlB,EAAK,YAAY8lB,GACb9lB,EAAK,oBAAqB,QAAO;AACrC,YAAI/N,IAAM2zB,GAAgB/kC,GAAG,IAAO0kC,CAAG;AACvC,eAAItzB,MAAK+N,EAAK,YAAY,IACnB/N;AAAA,MACb,GAEI,KAAK,iBAAiB,SAAUpR,GAAG;AACjC,YAAI,CAAAmf,EAAK,gBACT;AAAA,cAAIA,EAAK,eAAe,CAACA,EAAK,MAAM,WAAY,QAAO;AACvD,cAAIA,EAAK,KAAK,KAAM,QAAOA,EAAK,YAAYnf,CAAC;AAE7C,cAAIilC,IAAK3I,MACLoI,IAAM;AAMV,iBALIxT,EAAI,2BAA6B/R,EAAK,YAAY,MAAO8lB,MAC3D9lB,EAAK,sBAAsBA,EAAK,aAAanf,CAAC,GAC9C0kC,IAAM,KAERvlB,EAAK,YAAY8lB,GACb9lB,EAAK,sBAA4B,KACjCA,EAAK,cAAoBA,EAAK,YAAYnf,CAAC,IAExC+kC,GAAgB/kC,GAAG,IAAM0kC,CAAG;AAAA;AAAA,MACzC,GAEI,KAAK,OAAO,WAAY;AACtB,eAAAvlB,EAAK,aAAY,GACbA,EAAK,aAAWA,EAAK,UAAU,KAAI,GACvCA,EAAK,gBAAgB,IACrBA,EAAK,OAAO,IAAI,KAAK,MAAMA,EAAK,aAAc,KAAI,IAAIA,EAAK,YAAY,EAAE,GACzEA,EAAK,aAAY,GACVA;AAAA,MACb,GAEI,KAAK,qBAAqB,SAAU+lB,GAAK;AAEvC,eAAO,KAAMA,IAAM,KAAMhU,EAAI,cAAa;AAAA,MAEhD,GAEQ,CAACA,EAAI;AACP,aAAK,eAAe,SAAU/3B,GAAG0kC,GAAK;AACpC,cAAIzkC,IAAI+lB,EAAK;AACb,UAAAA,EAAK,YAAYhmB,GAAGC,GAAGykC,CAAG;AAAA,QAClC,GACM,KAAK,cAAc,SAAUzkC,GAAGykC,GAAK;AACnC,cAAI1kC,IAAIgmB,EAAK;AACb,UAAAA,EAAK,YAAYhmB,GAAGC,GAAGykC,CAAG;AAAA,QAClC,GACM,KAAK,cAAc,SAAU1kC,GAAGC,GAAGykC,GAAK;AACtC,cAAIwD,IAAMloC,IAAIgmB,EAAK,KAAK,OAAQA,EAAK,KAAK,OAAOhmB;AACjD,UAAIkoC,IAAK,MAAGA,IAAK;AACjB,cAAID,IAAMhoC,IAAI+lB,EAAK,KAAK,OAAQA,EAAK,KAAK,OAAO/lB;AACjD,UAAIgoC,IAAK,MAAGA,IAAK,IACjBjiB,EAAK,QAAQ,UAAU,WAAY;AACjC,YAAAA,EAAK,aAAaiiB,CAAE,GACpBjiB,EAAK,cAAckiB,CAAE;AAAA,UAC/B,CAAS;AAAA,QACT,GACM,KAAK,eAAe,WAAY;AAAA;eAEvBliB,EAAK,cAAcme,EAAI,iBAAiBpM,EAAI,iBAAmBA,EAAI,cAAc;AAE1F,YAAIiU,KAAsB;AAE1B,aAAK,kBAAkB,WAAY;AACjC,UAAAA,KAAsB,IACtBhmB,EAAK,IAAI,IAAIme,EAAI,cAAc,uBAAuB,KAAK;AAAA,QACnE,GAEM,KAAK,oBAAoB,SAAU4H,GAAKE,GAAQ;AAC9C,cAAIzkB,IAAMykB,IAAUF,IAAM/lB,EAAK,mBAAmB+lB,CAAG,GACjDG,IAAQ1kB,IAAK;AACjB,iBAAIwkB,OAAwBE,MAC1BF,KAAsBE,GACtBlmB,EAAK,IAAI,IAAIme,EAAI,cAAc,uBAAuB+H,CAAK,IAEtD1kB;AAAA,QACf,GAEM,KAAK,eAAe,SAAUxnB,GAAG0kC,GAAK;AACpC,cAAIzkC,IAAK+lB,EAAK,gBAAiBA,EAAK,aAAaA,EAAK;AACtD,UAAAA,EAAK,YAAYhmB,GAAGC,GAAGykC,CAAG;AAAA,QAClC,GAEM,KAAK,cAAc,SAAUzkC,GAAGykC,GAAK;AACnC,cAAI1kC,IAAKgmB,EAAK,gBAAiBA,EAAK,aAAaA,EAAK;AACtD,UAAAA,EAAK,YAAYhmB,GAAGC,GAAGykC,CAAG;AAAA,QAClC,GAEM,KAAK,eAAe;AAAA,UAClB,SAAS;AAAA,UACT,OAAO,WAAY;AACjB,gBAAIjnB,IAAI;AAER,gBAAI,CAAAA,EAAE,SACN;AAAA,cAAAA,EAAE,UAAU;AAEZ,kBAAI0uB,IAAO,WAAY;AACrB,gBAAI1uB,EAAE,WAASolB,GAAkBsJ,CAAI,GACrCnmB,EAAK,WAAWA,EAAK,aAAc,GAAEA,EAAK,cAAa,CAAE,GACzDA,EAAK,kBAAkBA,EAAK,IAAI,CAAC,CAAC;AAAA,cAC9C;AAEU,cAAA6c,GAAkBsJ,CAAI;AAAA;AAAA,UACvB;AAAA,UACD,MAAM,WAAY;AAChB,iBAAK,UAAU;AAAA,UAChB;AAAA,QACT,GAEM,KAAK,cAAc,SAAUnsC,GAAGC,GAAGykC,GAAK;AAEtC,cAAI0E,IAAKpjB,EAAK,gBACV4f,IAAK5f,EAAK;AAgBd,gBAdMA,EAAK,aAAaojB,MAAOnpC,IAAImpC,KAAM,MAAQpjB,EAAK,aAAa4f,MAAO5lC,IAAI4lC,KAAM,MAAI5f,EAAK,gBAExF+R,EAAI,gBAMH93B,IAAI,IAAGA,IAAIA,IAAI,IAAI,IACdA,IAAI+lB,EAAK,KAAK,SAAM/lB,IAAI+lB,EAAK,KAAK,QAAQ/lB,IAAI+lB,EAAK,KAAK,QAAQ,IAAI,IACzEhmB,IAAI,IAAGA,IAAIA,IAAI,IAAI,IACdA,IAAIgmB,EAAK,KAAK,SAAMhmB,IAAIgmB,EAAK,KAAK,QAAQhmB,IAAIgmB,EAAK,KAAK,QAAQ,IAAI,OARzE/lB,IAAI,IAAGA,IAAI,IACNA,IAAI+lB,EAAK,KAAK,SAAM/lB,IAAI+lB,EAAK,KAAK,OACvChmB,IAAI,IAAGA,IAAI,IACNA,IAAIgmB,EAAK,KAAK,SAAMhmB,IAAIgmB,EAAK,KAAK,QAQzCA,EAAK,iBAAiBhmB,KAAKgmB,EAAK,cAAc/lB,KAAK+lB,EAAK,WAAY,QAAO;AAE/E,UAAAA,EAAK,aAAa/lB,GAClB+lB,EAAK,aAAahmB;AAElB,cAAIwM,IAAMwZ,EAAK,gBACXomB,KAAMpmB,EAAK,iBAEXqmB,KAAM,CAAA;AACV,UAAAA,GAAI,IAAIrsC,IAAIosC,IACZC,GAAI,IAAIpsC,IAAIuM;AAEZ,cAAI63B,KAAK,KAAK,KAAMgI,GAAI,IAAIA,GAAI,IAAMA,GAAI,IAAIA,GAAI,CAAE,IAAI,GAEpDzB,KAAK5kB,EAAK,kBAAkBqe,EAAE;AAElC,UAAKre,EAAK,kBACRA,EAAK,gBAAgB,IACrBA,EAAK,mBAAmBomB,IAAK5/B,GAAKxM,GAAGC,GAAG2qC,EAAE,GAC1C5kB,EAAK,aAAa,UAGpBA,EAAK,mBAAmB,IAEnBme,EAAI,kBACHne,EAAK,oBAAkB,aAAaA,EAAK,gBAAgB,GAC7DA,EAAK,mBAAmB,WAAWA,EAAK,uBAAuB4kB,EAAE,IAGnE5kB,EAAK,aAAaA,EAAK,UAAU,GACjCA,EAAK,cAAcA,EAAK,UAAU;AAAA,QAE1C,GAEM,KAAK,eAAe,WAAY;AAC9B,cAAI,CAACA,EAAK,iBAAkB,QAAO;AACnC,cAAIojB,IAAKpjB,EAAK,gBACV4f,IAAK5f,EAAK;AACd,iBAAAA,EAAK,gBAAgB,IAChBme,EAAI,iBAAe,aAAaA,EAAI,aAAa,GACtDne,EAAK,mBAAmB,IACxBA,EAAK,gBAAe,GACpBA,EAAK,aAAaojB,CAAE,GAChBpjB,EAAK,SAAOA,EAAK,cAAc4f,CAAE,GACjC5f,EAAK,eAAeA,EAAK,YAAY,MAAI,cAAcA,EAAK,YAAY,EAAE,GAC9EA,EAAK,cAAc,IAEnBA,EAAK,gBAAgB,IAErBA,EAAK,aAAa,QAClBA,EAAK,WAAWojB,GAAIxD,CAAE,GACf5f;AAAA,QACf,GAEM,KAAK,wBAAwB,WAAY;AAEvC,cAAKA,EAAK,kBAEV;AAAA,gBAAIojB,IAAKpjB,EAAK,gBACV4f,IAAK5f,EAAK;AAMd,gBAJIojB,IAAK,IAAGA,IAAK,IACRA,IAAKpjB,EAAK,KAAK,SAAMojB,IAAKpjB,EAAK,KAAK,OACzC4f,IAAK,IAAGA,IAAK,IACRA,IAAK5f,EAAK,KAAK,SAAM4f,IAAK5f,EAAK,KAAK,OACxCojB,KAAMpjB,EAAK,cAAgB4f,KAAM5f,EAAK,WAAa,QAAOA,EAAK,YAAY4f,GAAIwD,GAAIrR,EAAI,aAAa;AAEzG,YAAI/R,EAAK,iBAAeA,EAAK,iBAAgB,GAC7CA,EAAK,gBAAgB,IAErBA,EAAK,mBAAmB,IACxBA,EAAK,gBAAe,GACpBA,EAAK,cAAc,IACnBA,EAAK,aAAaojB,CAAE,GAChBpjB,EAAK,SAAOA,EAAK,cAAc4f,CAAE,GAErC5f,EAAK,aAAa,QAClBA,EAAK,aAAa,IAAOojB,GAAIxD,CAAE,GAE/B5f,EAAK,gBAAgB;AAAA;AAAA,QAE7B;AAAA,MAEA;AAEM,aAAK,eAAe,SAAUhmB,GAAG0kC,GAAK;AACpC,cAAIzkC,IAAK+lB,EAAK,gBAAiBA,EAAK,aAAaA,EAAK;AACtD,UAAAA,EAAK,YAAYhmB,GAAGC,GAAGykC,CAAG;AAAA,QAClC,GAEM,KAAK,cAAc,SAAUzkC,GAAGykC,GAAK;AACnC,cAAI1kC,IAAKgmB,EAAK,gBAAiBA,EAAK,aAAaA,EAAK;AACtD,UAAAA,EAAK,YAAYhmB,GAAGC,GAAGykC,CAAG;AAAA,QAClC,GAEM,KAAK,cAAc,SAAU1kC,GAAGC,GAAGykC,GAAK;AAEtC,cAAI0E,IAAKpjB,EAAK,gBACV4f,IAAK5f,EAAK;AAEd,YAAMA,EAAK,aAAaojB,MAAOnpC,IAAImpC,KAAM,MAAQpjB,EAAK,aAAa4f,MAAO5lC,IAAI4lC,KAAM,MAAI5f,EAAK;AAE7F,cAAIsmB,IAAU;AAqBd,eAnBI,CAACtmB,EAAK,gBAAgB,CAACA,EAAK,KAAK,gBAC/B/lB,IAAI,KACNA,IAAI,GACJqsC,IAAU,MACDrsC,IAAI+lB,EAAK,KAAK,SACvB/lB,IAAI+lB,EAAK,KAAK,MACdsmB,IAAU,OAGV,CAACtmB,EAAK,gBAAgB,CAACA,EAAK,MAAM,gBAChChmB,IAAI,KACNA,IAAI,GACJssC,IAAU,MACDtsC,IAAIgmB,EAAK,KAAK,SACvBhmB,IAAIgmB,EAAK,KAAK,MACdsmB,IAAU,MAIVtmB,EAAK,iBAAkBA,EAAK,eAAe/lB,KAAO+lB,EAAK,eAAehmB,EAAI,QAAO;AAErF,UAAAgmB,EAAK,aAAa/lB,GAClB+lB,EAAK,aAAahmB,GAElBgmB,EAAK,MAAM,IACXA,EAAK,IAAI,IAAIhmB,IAAI4lC,GACjB5f,EAAK,IAAI,IAAI/lB,IAAImpC,GACjBpjB,EAAK,IAAI,KAAK4f,GACd5f,EAAK,IAAI,KAAKojB;AAEd,cAAI/E,KAAK,KAAK,KAAMre,EAAK,IAAI,IAAIA,EAAK,IAAI,IAAMA,EAAK,IAAI,IAAIA,EAAK,IAAI,CAAE,IAAI,GACxE4kB,KAAK5kB,EAAK,mBAAmBqe,EAAE;AAEnC,UAAAre,EAAK,WAAW;AAEhB,cAAI6e,KAAMyH,IAAW,IAAI;AACzB,UAAAtmB,EAAK,SAAS,IAAI,IAAIue,GAAYqB,GAAI5f,EAAK,YAAY4kB,IAAI,GAAG,GAAG/F,IAAI,CAAC,GACtE7e,EAAK,SAAS,IAAI,IAAIue,GAAY6E,GAAIpjB,EAAK,YAAY4kB,IAAI,GAAG,GAAG/F,IAAI,CAAC,GAEzD1B,GAAM;AAEnB,cAAIgJ,KAAO,WAAY;AAErB,gBAAKnmB,EAAK,eACV;AAAA,kBAAIhmB,KAAIgmB,EAAK,SAAS,EAAE,OAAM;AAE9B,cAAAA,EAAK,cAAcA,EAAK,SAAS,EAAE,OAAM,CAAE,GAC3CA,EAAK,aAAaA,EAAK,SAAS,EAAE,OAAM,CAAE,GAEtChmB,MAAK,IACPgmB,EAAK,QAAQ6c,GAAkBsJ,EAAI,KAEnCnmB,EAAK,gBAAgB,IACrBA,EAAK,QAAQ,GACbA,EAAK,iBAAgB;AAAA;AAAA,UAGjC;AAEQ,UAAKA,EAAK,kBACRA,EAAK,mBAAmB4f,GAAIwD,GAAIppC,GAAGC,GAAG2qC,EAAE,GACxC5kB,EAAK,gBAAgB,IACrBA,EAAK,QAAQ6c,GAAkBsJ,EAAI;AAAA,QAG7C,GAEM,KAAK,eAAe,WAAY;AAC9B,iBAAInmB,EAAK,SAAO8c,EAAoB9c,EAAK,KAAK,GAC9CA,EAAK,QAAQ,GACbA,EAAK,WAAW,IAChBA,EAAK,gBAAgB,IACdA;AAAA,QACf;AAII,WAAK,aAAa,SAAUumB,GAAKC,GAAU;AACzC,QAAAtB,EAAiB,GAAGqB,CAAG;AAAA,MAC7B,GAEI,KAAK,iBAAiB,SAAUA,GAAKC,GAAU;AAC7C,QAAAtB,EAAiBqB,GAAK,CAAC;AAAA,MAC7B,GAEI,KAAK,aAAa,SAAUrG,GAAKsG,GAAU;AACzC,YAAIvE,IAAMuE,IAAY,KAAK,MAAMtG,IAAMlgB,EAAK,YAAY,CAAC,IAAIkgB;AAC7D,QAAI+B,IAAK,IAAGA,IAAK,IACRA,IAAKjiB,EAAK,KAAK,SAAMiiB,IAAKjiB,EAAK,KAAK,OAC7CA,EAAK,gBAAgB,IACrBA,EAAK,YAAYkgB,CAAG;AAAA,MAC1B,GAEI,KAAK,mBAAmB,WAAY;AAClC,YAAII,IAAKtgB,EAAK;AACd,SAAKsgB,EAAG,KAAKtgB,EAAK,KAAK,KAAOsgB,EAAG,KAAKtgB,EAAK,KAAK,MAAIA,EAAK,OAAO,IAAOsgB,CAAE;AAAA,MAC/E,GAEItgB,EAAK,WAAW,SAAUnf,GAAG;AAC3B,QAAImf,EAAK,KAAK,QACTA,EAAK,iBACRA,EAAK,QAAQ,UAAU,WAAY;AACjC,UAAAA,EAAK,OAAO,IAAI,KAAK,MAAMA,EAAK,iBAAiBA,EAAK,YAAY,CAAC,GAC/DA,EAAK,UAAOA,EAAK,OAAO,IAAI,KAAK,MAAMA,EAAK,cAAe,IAAGA,EAAK,YAAY,CAAC,IACpFA,EAAK,aAAY;AAAA,QAC3B,CAAS;AAAA,MAET,GACIA,EAAK,KAAKA,EAAK,WAAW,UAAUA,EAAK,QAAQ,GAEjD,KAAK,WAAW,SAAUnf,GAAG;AAC3B,YAAI,CAAAmf,EAAK,YACT;AAAA,UAAAA,EAAK,aAAa,IAElBA,EAAK,cAAc;AAAA,YACjB,OAAO,CAAE;AAAA,UACjB;AACM,cAAI6d,IAAM,CAAC,YAAY,OAAO,QAAQ,UAAU,mBAAmB,aAAa,gBAAgB,cAAc,aAAa,GACvH1C,IAAMnb,EAAK,IAAI,CAAC,EAAE;AACtB,mBAAStd,KAAKm7B,GAAK;AACjB,gBAAI4I,IAAK5I,EAAIn7B,CAAC;AACd,YAAAsd,EAAK,YAAY,MAAMymB,CAAE,IAAKtL,EAAIsL,CAAE,MAAM,SAAatL,EAAIsL,CAAE,IAAI;AAAA,UAClE;AAED,UAAAzmB,EAAK,YAAY,MAAM,QAAQA,EAAK,IAAI,IAAI,OAAO,GACnDA,EAAK,YAAY,MAAM,SAASA,EAAK,IAAI,IAAI,QAAQ,GAErDA,EAAK,YAAY,UAAU;AAAA,YACzB,GAAGA,EAAK,IAAI,WAAY,IAAGA,EAAK,IAAI,MAAO;AAAA,YAC3C,GAAGA,EAAK,IAAI,YAAa,IAAGA,EAAK,IAAI,OAAQ;AAAA,UACrD,GAEUme,EAAI,WACNne,EAAK,YAAY,YAAYyc,GAAQ,UAAS,GAC9CA,GAAQ,UAAU,CAAC,IAGrBzc,EAAK,IAAI,IAAI;AAAA,YACX,UAAWme,EAAI,SAAU,aAAa;AAAA,YACtC,KAAK;AAAA,YACL,MAAM;AAAA,YACN,QAAQ9B,IAAkB;AAAA,YAC1B,QAAQ;AAAA,UAChB,CAAO;AACD,cAAIqK,IAAM1mB,EAAK,IAAI,IAAI,iBAAiB;AACxC,kBAAW0mB,MAAP,MAAc,iDAAiD,KAAKA,CAAG,MAAG1mB,EAAK,IAAI,IAAI,mBAAmB,MAAM,GACpHA,EAAK,KAAK,IAAI;AAAA,YACZ,QAAQqc,IAAkB;AAAA,UAClC,CAAO,GACDrc,EAAK,KAAK,IAAI;AAAA,YACZ,QAAQqc,IAAkB;AAAA,UAClC,CAAO,GACDrc,EAAK,KAAK,IAAI,sBAAsB,SAAS,GAC7CA,EAAK,WAAU,GAEXA,EAAK,YAAUA,EAAK,SAAS,KAAKA,CAAI,GAEnCA,EAAK,YAAYnf,CAAC;AAAA;AAAA,MAC/B,GAEI,KAAK,YAAY,SAAUA,GAAG;AAC5B,YAAKmf,EAAK;AACV,iBAAAA,EAAK,aAAa,IAElBA,EAAK,IAAI,IAAI,UAAU,EAAE,GACzBA,EAAK,IAAI,IAAIA,EAAK,YAAY,KAAK,GAE/Bme,EAAI,UACN1B,GAAQ,UAAUzc,EAAK,YAAY,SAAS,GAG9CA,EAAK,KAAK,IAAI;AAAA,YACZ,WAAWA,EAAK;AAAA,UACxB,CAAO,GACDA,EAAK,KAAK,IAAI;AAAA,YACZ,WAAWA,EAAK;AAAA,UACxB,CAAO,GACDA,EAAK,cAAc,IACnBA,EAAK,KAAK,IAAI,sBAAsB,KAAK,GACzCA,EAAK,SAAQ,GAETA,EAAK,aAAWA,EAAK,UAAU,KAAKA,CAAI,GAErCA,EAAK,YAAYnf,CAAC;AAAA,MAC/B,GAEI,KAAK,SAAS,SAAUA,GAAG;AACzB,eAAQmf,EAAK,aAAcA,EAAK,UAAUnf,CAAC,IAAImf,EAAK,SAASnf,CAAC;AAAA,MACpE,GAEI,KAAK,aAAa,WAAY;AAC5B,YAAKmf,EAAK,YAEV;AAAA,cAAIojB,IAAKpjB,EAAK;AACd,UAAAA,EAAK,IAAI,IAAI;AAAA,YACX,OAAOyc,GAAQ,MAAO,IAAGzc,EAAK,YAAY,QAAQ,IAAI;AAAA,YACtD,QAAQyc,GAAQ,OAAQ,IAAGzc,EAAK,YAAY,QAAQ,IAAI;AAAA,UAChE,CAAO,GACDA,EAAK,SAAQ,GAEbA,EAAK,aAAa,KAAK,IAAIA,EAAK,KAAK,MAAMojB,CAAE,CAAC;AAAA;AAAA,MACpD,GAEI,KAAK,KAAI,GAET9G,EAAE,WAAW,KAAK,IAAI;AAAA,IAE1B,GAIM0E,KAAwB,SAAU2F,GAAI;AACxC,UAAI3mB,IAAO;AACX,WAAK,KAAK2mB,GAEV,KAAK,QAAQ,GACb,KAAK,QAAQ,GACb,KAAK,SAAS,GACd,KAAK,SAAS,GACd,KAAK,WAAW,GAChB,KAAK,WAAW,GAChB,KAAK,QAAQ,IACb,KAAK,QAAQ,IACb,KAAK,SAAS,GACd,KAAK,SAAS,GAEd,KAAK,cAAc,IACnB,KAAK,cAAc,IAEnB,KAAK,OAAO,GACZ,KAAK,OAAO,GAEZ,KAAK,QAAQ,GAEb,KAAK,QAAQ,SAAU/G,GAAIwD,GAAI;AAC7B,QAAApjB,EAAK,KAAI,GACTA,EAAK,WAAW,GAChBA,EAAK,WAAWmd,MAChBnd,EAAK,SAAS,GACdA,EAAK,SAAS,GACdA,EAAK,QAAQ4f,GACb5f,EAAK,QAAQojB,GACbpjB,EAAK,cAAc,IACnBA,EAAK,cAAc;AAAA,MACzB,GAEI,KAAK,SAAS,SAAU4f,GAAIwD,GAAI;AAC9B,YAAIhF,IAAKjB;AACT,QAAAnd,EAAK,WAAWoe,IAAKpe,EAAK,UAC1BA,EAAK,WAAWoe;AAChB,YAAIoH,KAAKpC,IAAKpjB,EAAK,OACfslB,KAAK1F,IAAK5f,EAAK,OACf0jB,KAAK1jB,EAAK,GAAG,aAAY,GACzB4mB,IAAK5mB,EAAK,GAAG,cAAa,GAC1B6mB,KAAOnD,KAAK8B,IACZsB,KAAOF,IAAKtB;AAChB,QAAAtlB,EAAK,QAAS8mB,KAAO,KAAOA,KAAO9mB,EAAK,GAAG,KAAK,MAChDA,EAAK,QAAS6mB,KAAO,KAAOA,KAAO7mB,EAAK,GAAG,KAAK,MAChDA,EAAK,SAASslB,IACdtlB,EAAK,SAASwlB,IACdxlB,EAAK,QAAQ4f,GACb5f,EAAK,QAAQojB;AAAA,MACnB,GAEI,KAAK,OAAO,WAAY;AACtB,QAAApjB,EAAK,GAAG,UAAU,cAAc,GAC5BA,EAAK,SAAO,aAAaA,EAAK,KAAK,GACvCA,EAAK,QAAQ,GACbA,EAAK,cAAc,IACnBA,EAAK,cAAc;AAAA,MACzB,GAEI,KAAK,UAAU,SAAUkiB,GAAID,GAAI;AAC/B,YAAI8E,IAAO;AAEX,QAAI9E,IAAK,KACPA,IAAK,GACL8E,IAAO,MACE9E,IAAKjiB,EAAK,GAAG,KAAK,SAC3BiiB,IAAKjiB,EAAK,GAAG,KAAK,MAClB+mB,IAAO,KAGL7E,IAAK,KACPA,IAAK,GACL6E,IAAO,MACE7E,IAAKliB,EAAK,GAAG,KAAK,SAC3BkiB,IAAKliB,EAAK,GAAG,KAAK,MAClB+mB,IAAO,KAGRA,IAAQ/mB,EAAK,GAAG,YAAYkiB,GAAID,GAAIjiB,EAAK,GAAG,IAAI,aAAa,IAAIA,EAAK,GAAG,iBAAgB;AAAA,MAChG,GAEI,KAAK,aAAa,SAAUgnB,GAAI;AAC9B,YAAIne,IAAIsU,MACJ9c,IAAK2mB,IAAMne,IAAIme,IAAKhnB,EAAK,UAEzBinB,KAAKjnB,EAAK,GAAG,cAAa,GAC1Bwe,KAAKxe,EAAK,GAAG,aAAY,GAEzBknB,KAAQlnB,EAAK,GAAG,KAAK,MACrBmnB,IAAQnnB,EAAK,GAAG,KAAK;AAEzB,QAAAA,EAAK,SAAUmnB,IAAQ,IAAK,KAAK,IAAI,IAAInnB,EAAK,MAAM,IAAI,GACxDA,EAAK,SAAUknB,KAAQ,IAAK,KAAK,IAAI,IAAIlnB,EAAK,MAAM,IAAI;AAExD,YAAIulB,KAAMllB,KAAMwI,IAAIxI,KAAM;AAE1B,SAAKme,KAAK,KAAOA,KAAK0I,MAAWD,KAAK,KAAOA,KAAKE,OAAQ5B,KAAM;AAEhE,YAAI7B,KAAM1jB,EAAK,UAAUulB,KAAOvlB,EAAK,SAAS,IAC1C4mB,KAAM5mB,EAAK,UAAUulB,KAAOvlB,EAAK,SAAS;AAE9C,YAAI0jB,MAAMkD,IAAI;AACZ,cAAIxI,KAAK,KAAK,IAAI,IAAIpe,EAAK,QAAQ;AAEnC,cAAIoe,KAAK,IAAI;AACX,gBAAIgJ,KAAKhJ,KAAK;AACd,YAAApe,EAAK,UAAUonB,IACfpnB,EAAK,UAAUonB,IACfhJ,KAAK;AAAA,UACN;AAED,UAAApe,EAAK,UAAU,GAEfA,EAAK,cAAcA,EAAK,GAAG,cAAa,GACxCA,EAAK,OAAOA,EAAK,aACjBA,EAAK,cAAcA,EAAK,GAAG,aAAY,GACvCA,EAAK,OAAOA,EAAK;AAEjB,cAAIkiB,KAAKliB,EAAK,aACViiB,KAAKjiB,EAAK,aAEVqnB,KAAW,WAAY;AACzB,gBAAI5E,KAAOtF,GAAG,IAAKtU,IAAK,MAAO,OAAO;AAEtC,YAAI7I,EAAK,WACPkiB,KAAK,KAAK,MAAMliB,EAAK,cAAeA,EAAK,UAAU,IAAIA,EAAK,QAAS,GACrEA,EAAK,cAAckiB,KACdA,KAAK,KAAOA,KAAKiF,OAAQ1E,KAAK,OAGjCziB,EAAK,WACPiiB,KAAK,KAAK,MAAMjiB,EAAK,cAAeA,EAAK,UAAU,IAAIA,EAAK,QAAS,GACrEA,EAAK,cAAciiB,KACdA,KAAK,KAAOA,KAAKiF,QAAQzE,KAAK,OAGrCziB,EAAK,UAAU,KAAK,IAAI,GAAGA,EAAK,UAAUyiB,EAAE,GAE5CziB,EAAK,GAAG,QAAQ,gBAAgB,WAAY;AAE1C,cAAIA,EAAK,WACGA,EAAK,GAAG,cAAgB,GAElCA,EAAK,OAAOkiB,IACZliB,EAAK,GAAG,cAAckiB,EAAE,IAGtBliB,EAAK,WACGA,EAAK,GAAG,aAAe,GAEjCA,EAAK,OAAOiiB,IACZjiB,EAAK,GAAG,aAAaiiB,EAAE,IAGpBjiB,EAAK,UACRA,EAAK,GAAG,cACRA,EAAK,QAAQkiB,IAAID,EAAE;AAAA,YAGjC,CAAW,GAEGjiB,EAAK,UAAU,IACjBA,EAAK,QAAQ,WAAWqnB,IAAUjJ,EAAE,KAEpCpe,EAAK,KAAI,GACTA,EAAK,GAAG,cACRA,EAAK,QAAQkiB,IAAID,EAAE;AAAA,UAE/B;AAEQ,UAAAoF;QAER;AACQ,UAAArnB,EAAK,QAAQA,EAAK,GAAG,cAAe,GAAEA,EAAK,GAAG,aAAY,CAAE;AAAA,MAGpE;AAAA,IAEA,GAIMsnB,KAAa11B,EAAO,GAAG;AAE3B,IAAAA,EAAO,SAAS,cAAc;AAAA,MAC5B,KAAK,SAAUO,GAAMkb,GAAU2B,GAAO;AACpC,YAAIuY,IAAOjL,EAAE,KAAKnqB,GAAM,cAAc,KAAK;AAC3C,eAAQo1B,KAAQA,EAAK,aAAcA,EAAK,aAAY,IAAKD,GAAW,KAAKn1B,CAAI;AAAA,MAC9E;AAAA,MACD,KAAK,SAAUA,GAAMqB,GAAO;AAC1B,YAAI+zB,IAAOjL,EAAE,KAAKnqB,GAAM,cAAc,KAAK;AAC3C,eAACo1B,KAAQA,EAAK,aAAcA,EAAK,aAAa,SAAS/zB,CAAK,CAAC,IAAI8zB,GAAW,KAAKn1B,GAAMqB,CAAK,GACrF;AAAA,MACR;AAAA,IACL,GAEE5B,EAAO,GAAG,YAAY,SAAU4B,GAAO;AACrC,UAAIA,MAAU,QAAW;AACvB,YAAI+zB,IAAQ,KAAK,CAAC,KAAKjL,EAAE,KAAK,KAAK,CAAC,GAAG,cAAc,KAAK;AAC1D,eAAQiL,KAAQA,EAAK,aAAcA,EAAK,aAAY,IAAKD,GAAW,KAAK,IAAI;AAAA,MACnF;AACM,eAAO,KAAK,KAAK,WAAY;AAC3B,cAAIC,IAAOjL,EAAE,KAAK,MAAM,cAAc,KAAK;AAC3C,UAACiL,KAAQA,EAAK,aAAcA,EAAK,aAAa,SAAS/zB,CAAK,CAAC,IAAI8zB,GAAW,KAAKhL,EAAE,IAAI,GAAG9oB,CAAK;AAAA,QACvG,CAAO;AAAA,IAEP;AAGE,QAAIg0B,KAAc51B,EAAO,GAAG;AAE5B,IAAA0qB,EAAE,SAAS,cAAc;AAAA,MACvB,KAAK,SAAUnqB,GAAMkb,GAAU2B,GAAO;AACpC,YAAIuY,IAAOjL,EAAE,KAAKnqB,GAAM,cAAc,KAAK;AAC3C,eAAQo1B,KAAQA,EAAK,aAAcA,EAAK,cAAa,IAAKC,GAAY,KAAKr1B,CAAI;AAAA,MAChF;AAAA,MACD,KAAK,SAAUA,GAAMqB,GAAO;AAC1B,YAAI+zB,IAAOjL,EAAE,KAAKnqB,GAAM,cAAc,KAAK;AAC3C,eAACo1B,KAAQA,EAAK,aAAcA,EAAK,cAAc,SAAS/zB,CAAK,CAAC,IAAIg0B,GAAY,KAAKr1B,GAAMqB,CAAK,GACvF;AAAA,MACR;AAAA,IACL,GAEE5B,EAAO,GAAG,aAAa,SAAU4B,GAAO;AACtC,UAAIA,MAAU,QAAW;AACvB,YAAI+zB,IAAQ,KAAK,CAAC,KAAKjL,EAAE,KAAK,KAAK,CAAC,GAAG,cAAc,KAAK;AAC1D,eAAQiL,KAAQA,EAAK,aAAcA,EAAK,cAAa,IAAKC,GAAY,KAAK,IAAI;AAAA,MACrF;AACM,eAAO,KAAK,KAAK,WAAY;AAC3B,cAAID,IAAOjL,EAAE,KAAK,MAAM,cAAc,KAAK;AAC3C,UAACiL,KAAQA,EAAK,aAAcA,EAAK,cAAc,SAAS/zB,CAAK,CAAC,IAAIg0B,GAAY,KAAKlL,EAAE,IAAI,GAAG9oB,CAAK;AAAA,QACzG,CAAO;AAAA,IAEP;AAEE,QAAIi0B,KAAkB,SAAUC,GAAM;AACpC,UAAI1nB,IAAO;AAkBX,UAjBA,KAAK,SAAS,GACd,KAAK,OAAO,mBAEZ,KAAK,OAAO,SAAU3H,GAAI;AACxB,eAAAikB,EAAE,KAAKtc,GAAM3H,CAAE,GACR2H;AAAA,MACb,GAEI,KAAK,OAAO,SAAUunB,GAAM;AAC1B,QAAAvnB,EAAKA,EAAK,MAAM,IAAIunB,GACpBvnB,EAAK;AAAA,MACX,GAEI,KAAK,KAAK,SAAUxE,GAAK;AACvB,eAAOwE,EAAKxE,CAAG;AAAA,MACrB,GAEQksB;AACF,iBAAShlC,IAAI,GAAGA,IAAIglC,EAAK,QAAQhlC,KAAK;AACpC,cAAI6kC,IAAOjL,EAAE,KAAKoL,EAAKhlC,CAAC,GAAG,cAAc,KAAK;AAC9C,UAAI6kC,MACF,KAAK,KAAK,MAAM,IAAIA,GACpB,KAAK;AAAA,QAER;AAGH,aAAO;AAAA,IACX;AAEE,aAASI,GAAMpvB,GAAIslB,GAAKxlB,GAAI;AAC1B,eAAS3V,IAAI,GAAG2d,IAAIwd,EAAI,QAAQn7B,IAAI2d,GAAG3d,IAAK,CAAA2V,EAAGE,GAAIslB,EAAIn7B,CAAC,CAAC;AAAA,IAC1D;AACD,IAAAilC;AAAA,MACEF,GAAgB;AAAA,MAAW,CAAC,QAAQ,QAAQ,UAAU,YAAY,UAAU,UAAU,QAAQ,aAAa;AAAA,MAC3G,SAAU5mC,GAAG6e,GAAG;AACd,QAAA7e,EAAE6e,CAAC,IAAI,WAAY;AACjB,cAAInE,IAAO;AACX,iBAAO,KAAK,KAAK,WAAY;AAC3B,iBAAKmE,CAAC,EAAE,MAAM,MAAMnE,CAAI;AAAA,UAClC,CAAS;AAAA,QACT;AAAA,MACK;AAAA,IACL,GAEE3J,EAAO,GAAG,gBAAgB,SAAUnY,GAAO;AACzC,aAAIA,MAAU,SACL,IAAIguC,GAAgB,IAAI,IAExB,KAAKhuC,CAAK,KAAK6iC,EAAE,KAAK,KAAK7iC,CAAK,GAAG,cAAc,KAAK;AAAA,IAEnE;AAEE,QAAImc,KAAUhE,EAAO,KAAK,WAAWA,EAAO,KAAK,GAAG;AACpD,IAAAgE,GAAQ,aAAa,SAAUlT,GAAG;AAChC,aAAO45B,EAAE,KAAK55B,GAAG,cAAc,MAAM;AAAA,IACzC,GAEE45B,EAAE,GAAG,aAAa,SAAU5sB,GAASk4B,GAAM;AACzC,MAAIA,MAAS,UAAa,OAAOl4B,KAAW,YAAY,EAAE,YAAYA,OACpEk4B,IAAOl4B,GACPA,IAAU;AAGZ,UAAIuC,IAAM,IAAIw1B;AAEd,kBAAK,KAAK,WAAY;AACpB,YAAII,IAAQvL,EAAE,IAAI,GAEdvK,IAAMuK,EAAE,OAAO,CAAE,GAAEsL,CAAI;AAE3B,YAAIl4B,GAAgB;AAC1B,cAAAo4B,KAAAxL,EAAA5sB,CAAA;AACA,UAAAqiB,EAAA,MAAA+V,GAAA,SAAA,IAAAxL,EAAA5sB,GAAAm4B,CAAA,IAAAC,IACA/V,EAAA,MAAA8V;AAAA,QACO;AACD,YAAIE,KAAW,EAAE,SAAShW;AAC1B,QAAI,CAACgW,MAAY,EAAE,SAAShW,OAAMA,EAAI,MAAM8V;AAE5C,YAAIN,KAAOM,EAAM,KAAK,cAAc,KAAK;AACzC,QAAKN,OACHxV,EAAI,MAAMA,EAAI,OAAO8V,GACrBN,KAAO,IAAIzJ,EAAgB/L,GAAK8V,CAAK,GACrCA,EAAM,KAAK,gBAAgBN,EAAI,IAEjCt1B,EAAI,KAAKs1B,EAAI;AAAA,MACnB,CAAK,GAEOt1B,EAAI,WAAW,IAAKA,EAAI,CAAC,IAAIA;AAAA,IACzC,GAEEuqB,EAAK,aAAa;AAAA,MAChB,WAAW,WAAY;AACrB,eAAO5qB;AAAA,MACR;AAAA,IACL,GAEO0qB,EAAE,eACLA,EAAE,aAAa,IAAImL,MACnBnL,EAAE,WAAW,UAAUc;AAAA,EAG3B,CAAC;;AChoHM,MAAM4K,KACT;AAIY,SAAAC,GACZpiC,GACAqiC,GACI;AAEJ,MAAIriC,EAAU,UAAU,SAAS,OAAO;AACpC;AAEE,QAAAsiC,IAA0BviC,GAAwBC,CAAS;AAIjE,MAAI,0BAA0B,QAAQ;AAGlC,QAAIuiC,IAA8B,CAAA,GAC9BC,IAAmC,GACnCC,IAAmC;AACrC,IAAAhM,GAAAz2B,CAAS,EACN,KAAKmiC,EAAuC,EAC5C,KAAK,CAACvuC,GAAO6H,MAAQ;AAmBlB,YAAMinC,IAAajnC,EAAI,mBACjBknC,IAAYlnC,EAAI;AAClB,UAAA,CAACinC,KAAc,CAACC;AAEhB;AAMJ,UAAI9mC,IAAQ;AAEZ,YAAM+mC,KAAa,SAAS;AAAA,QACxB;AAAA,MAAA;AAEJ,UAAIA,IAAY;AACN,cAAAxqC,KAAQwqC,GAAW,UAAU;AAAA,UAC/B;AAAA,QAAA;AAEJ,QAAIxqC,OACQyD,IAAA,WAAWzD,GAAM,CAAC,CAAC;AAAA,MAC/B,OACG;AAEH,cAAMyqC,KAAiBpnC,EAAI;AAAA,UACvB;AAAA,QAAA;AAEJ,YAAIonC,IAAgB;AACV,gBAAAC,KAAaD,GAAe,MAAM;AACxC,UAAIC,MAAcA,GAAW,WAAW,QAAQ,MACpCjnC,IAAA;AAAA,YACJinC,GAAW,UAAU,GAAGA,GAAW,SAAS,CAAC;AAAA,UAAA;AAAA,QAGzD;AAAA,MACJ;AAKA,YAAM,EAAE,WAAAC,IAAW,YAAAC,IAAY,YAAAC,GAC3B,IAAAC,GAAyBrnC,GAAOJ,CAAkB,GAShD0nC,IAAW,IAAI;AAAA,QACjB,CAACC,IAASC,OAAO;AAGL,UAAAD,GAAA,QAAQ,CAACE,OAAU;ALjGnD,gBAAAloC;AKoGgC,gBAFJqnC,KACGY,GAAA,UAAUC,GAAM,MAAM,GACrB,CAACA,GAAM,OAAO;AAGd;AAEJ,kBAAMC,KAAW,CAAC,CAACD,GAAM,OAAO;AAAA,cAC5BtkC;AAAA,YAAA;AAUA,gBAAAwkC,KAAcF,GAAM,oBAAoB;AAE5C,gBAAIE,MAAeD,IAAU;AAazB,kBAAIE,IAAgC;AAEhC,eAAAH,GAAM,YACFloC,KAAAkoC,GAAM,OAAO,kBAAb,gBAAAloC,GACM,sBACVkoC,GAAM,UACFA,GAAM,OAAO,cACR,sBAMwBG,KAAA;AAErC,oBAAMC,MACD,IAAIJ,GAAM,qBACXA,GAAM,OAAO,cACXK,KAAe,OAAO;AAAA,gBACxBL,GAAM;AAAA,cACR,EAAA,YACIM,KAAa;AAAA;AAAA,gBAEfD,GAAa;AAAA,kBACT;AAAA,kBACAA,GAAa,SAAS;AAAA,gBAC1B;AAAA,cAAA;AAEJ,cAAAH,KACIE,KACAE,KAAaH;AAAA,YACrB;AACA,gBACID,MACAjB,EAAa;AAAA,cACTe,GAAM,OAAO;AAAA,gBACb,GACN;AACe,cAAAf,EAAA,KAAKe,GAAM,OAAO,aAAc;AAEvC,oBAAAO,IACFP,GAAM,OAAO,cAAe;AAChC,cACIO,EAAM,UAAU;AAAA,gBACZ;AAAA,cAAA,MAGJA,EAAM,UAAU;AAAA,gBACZ;AAAA,cAAA,GAEAvB,KACAuB,EAAM,UAAU;AAAA,gBACZ;AAAA,cAAA,IAIRA,EAAM,UAAU;AAAA,gBACZ;AAAA,cAAA,MAGJA,EAAM,UAAU;AAAA,gBACZ;AAAA,cAAA,GAEAvB,KACAuB,EAAM,UAAU;AAAA,gBACZ;AAAA,cAAA,IAGRN,MAKMD,GAAA,OAAO,cAAe,UAAU;AAAA,gBAClC;AAAA,cAAA;AAAA,YAGZ;AACA,YACIb,MACAD,MAGE/L,GAAA8L,CAAY,EAAE,WAAW;AAAA,cACvB,cAAc;AAAA,cACd,YAAY;AAAA,gBACR,KAAK,CAACQ;AAAA,gBACN,MAAM,CAACC;AAAA,cACX;AAAA,cACA,aAAaC;AAAA,cACb,aAAa;AAAA,cACb,kBAAkB;AAAA,cAClB,oBAAoBA;AAAA;AAAA,YAAA,CACvB,GACDa;AAAA,cACI9jC;AAAA,cACAqiC;AAAA,YAAA,GAEJE,IAAe,CAAA;AAAA,UACnB,CACH;AAAA,QACL;AAAA,QACA,EAAE,MAAM9mC,EAAI;AAAA,MAAA;AAEhB,MAAA+mC,KACAW,EAAS,QAAQT,CAAU,GACvBA,MAAeC,MACfH,KACAW,EAAS,QAAQR,CAAS;AAAA,IAC9B,CACH;AAAA,EACT;AACJ;AAOA,SAASoB,GAAoBtoC,GAAsC;AAI3D,WAHAuoC,IACAvoC,KAAOA,EAAI,aAAcA,EAAI,aAA6B,MAE1DuoC,KACAA,EAAU,aAAa,KAAK,gBAC5B,CAAC,aAAa,KAAKA,EAAU,QAAQ,KACvC;AACQ,UAAAxc,IAAW,OAAO,iBAAiBwc,CAAS,GAC5C5O,IAAW5N,EAAS,iBAAiB,UAAU;AACrD,QAAI,iBAAiB,KAAK4N,CAAQ,EAAU,QAAA4O;AAC5C,UAAMtF,IACFlX,EAAS,iBAAiB,YAAY,KACtCA,EAAS,iBAAiB,YAAY,KACtCA,EAAS,iBAAiB,UAAU,KACpC;AAMJ,QAJI,cAAc,KAAKkX,CAAE,KACrBsF,EAAU,gBAAgBA,EAAU,gBAGnCvN,GAAEuN,CAAS,EAAE,cAAwB,EAAA,SAAS,EAAU,QAAAA;AACjD,IAAAA,IAAAA,EAAU,aACfA,EAAU,aACX;AAAA,EACV;AACO,SAAA;AACX;AAOA,SAASd,GACLrnC,GACAJ,GAC6D;AAC7D,MAAIsnC,IAAY,GACZC,IAAa,GACbC,IAAa;AACjB,MAAIpnC,MAAU,GAAG;AACb,UAAMooC,IAAsBxoC,EAAI;AAChC,QACI,CAACwoC,KACD,CAACA,EAAoB,UAAU,SAAS,wBAAwB;AAGzD,aAAA,EAAE,WAAAlB,GAAW,YAAAC,GAAY,YAAAC;AAGpC,QADgCc,GAAoBtoC,CAAG,GAC1B;AAGnB,YAAAyoC,IAAa,OAAO,iBAAiBD,CAAmB,GACxDE,IACFD,EAAW,iBAAiB,aAAa,KAAK,KAC5CE,IACFF,EAAW,iBAAiB,cAAc,KAAK;AACvC,MAAAnB,IAAA,WAAWoB,CAAU,KAAKtoC,IAAQ,IACjCmnC,IAAA,WAAWoB,CAAW,KAAKvoC,IAAQ;AAAA,IAAA,OAC7C;AAIH,YAAMwoC,IAA0BJ,EAAoB;AACpD,UAAI,CAACI;AAEM,eAAA,EAAE,WAAAtB,GAAW,YAAAC,GAAY,YAAAC;AAKvB,MAAAA,IAAA,GAAG,KAAKpnC,CAAK;AAC1B,YAAM8E,IAAM0jC,KAAA,gBAAAA,EAAyB,WAC/BC,IACFD,EAAwB,aACxBA,EAAwB;AAChB,MAAAtB,IAAA,EAAEpiC,KAAO9E,IAAQ,KAChBmnC,IAAA,EAAEsB,KAASzoC,IAAQ;AAAA,IACpC;AAAA,EACJ;AACO,SAAA,EAAE,WAAAknC,GAAW,YAAAC,GAAY,YAAAC;AACpC;AAEgB,SAAAa,GACZ9jC,GACAqiC,GACF;AAGE,MAFUriC,EAAA,oBAAoB,eAAeukC,EAAoB,GACvDvkC,EAAA,iBAAiB,eAAeukC,EAAoB,GAC1D,EAAClC;AAKL,eAAWmC,KAAa,CAAC,eAAe,WAAW;AAC/C,MAAAxkC,EAAU,cAAc,KAAK;AAAA,QACzBwkC;AAAA,QACAnC;AAAA,QACA;AAAA,UACI,SAAS;AAAA,QACb;AAAA,MAAA;AAGZ;AAOgB,SAAAoC,GAAqBvvC,GAAmB2G,GAAe;AAC9D,EAAA3G,EAAA,iBAAiBitC,EAAuC,EAAE;AAAA,IAC3D,CAAC0B,MAAU;AAEP,YAAMa,IAAkBjO,GAAEoN,CAAK,EAAE,cAAc;AAC3C,UAAAa,KAAmBA,EAAgB,SAAS,GAAG;AAC/C,YAAI,EAAE,WAAA3B,GAAW,YAAAC,GAAY,YAAAC,EACzB,IAAAC,GAAyBrnC,GAAOgoC,CAAoB;AACxD,QAAAa,EAAgB,CAAC,EAAE,IAAI,WAAW,MAAM,CAAC3B,GACzC2B,EAAgB,CAAC,EAAE,IAAI,WAAW,OAAO,CAAC1B,GAC1B0B,EAAA,CAAC,EAAE,IAAI,cAAczB,GACrByB,EAAA,CAAC,EAAE;MACvB;AAAA,IACJ;AAAA,EAAA;AAER;AAMA,SAASH,GAAqBI,GAAkB;AAExC,EAAAA,EAAG,kBAAkB,kBACpBA,EAAG,OAA0B,UAAU,SAAS,oBAAoB,MAEpEA,EAAG,OAA0B,kBAAkBA,EAAG,SAAS,GACxDA,EAAG,gBAAgB,WAKnBA,EAAG,gBAAgB;AAG/B;AAEO,SAASC,KAAoB;AL/YpC,MAAAxpC;AKqZM,GAAAA,IAAAq7B,GAAA,gBAAgB,EAAE,CAAC,MAAnB,QAAAr7B,EACI,iBAAiB+mC,IAClB,QAAQ,CAAC0B,MAAU;AAMhB,UAAMa,IAAkBjO;AAAA,MACpBoN;AAAA,MACF,cAAc;AACZ,IAAAa,KAAmBA,EAAgB,SAAS,KAC5CA,EAAgB,OAAO,GAIvBb,EAAM,UAAU,SAAS,kBAAkB,KACrCA,EAAA,UAAU,OAAO,kBAAkB;AAE7C,UAAMgB,IAAchB,EAAM;AAC1B,IAAKgB,MAEDA,EAAY,UAAU;AAAA,MAClB;AAAA,IAAA,MAGJA,EAAY,UAAU;AAAA,MAClB;AAAA,IAAA,GAEQA,EAAA,UAAU,IAAI,6BAA6B,IAGvDA,EAAY,UAAU;AAAA,MAClB;AAAA,IAAA,MAGJA,EAAY,UAAU;AAAA,MAClB;AAAA,IAAA,GAEQA,EAAA,UAAU,IAAI,6BAA6B,IAG1DhB,EAAsB,MAAM,WAAW,IACvCA,EAAsB,MAAM,UAAU,IACtCA,EAAsB,MAAM,QAAQ;AAAA,EAAA;AAEjD;AC3cO,MAAMiB,GAAU;AAAA,EACnB,OAAc,iCAAiCC,GAA0B;AAC/D,UAAA3sC,IAAQ2sC,EAAiB,MAAM,2BAA2B;AAChE,WAAK3sC,IAGEA,EAAM,CAAC,IAFH;AAAA,EAGf;AACJ;ACQO,MAAM4sC,KAAN,MAAMA,GAAU;AAAA;AAAA,EA0DnB,cAAc;AAFd,SAAQ,oBAA4B,KAuEpC,KAAO,mBAAuC,MAjEnC,OAAA;AAAA,MAAiB;AAAA,MAAqB,MACzC,OAAO;AAAA,QACH,MAAM,KAAK,uBAAuB,KAAK,WAAW;AAAA,QAClD;AAAA,MACJ;AAAA,IAAA;AAAA,EAER;AAAA,EAnEA,OAAc,iBAAiB9vC,GAA+B;AAC1D,WAAO,CAAC,CAAC8vC,GAAU,oBAAoB9vC,CAAI;AAAA,EAC/C;AAAA;AAAA,EAGA,OAAc,mBAAmBA,GAAuC;AACpE,QACIA,EAAK,qBACLA,EAAK,kBAAkB,UAAU;AAAA,MAC7B;AAAA,IAAA,GAEN;AACE,YAAM+vC,IAAsB/vC,EAAK;AACjC,UACI+vC,EAAoB,qBACpBA,EAAoB,kBAAkB,UAAU;AAAA,QAC5CD,GAAU;AAAA,MAAA,GAEhB;AACE,cAAME,IAAaD,EAAoB;AAEnC,YAAAC,EAAW,qBACXA,EAAW,kBAAkB;AAAA,UACzB;AAAA,QAAA;AAGJ,iBAAOA,EAAW;AAAA,MAE1B;AAAA,IACJ;AACO,WAAA;AAAA,EACX;AAAA;AAAA,EAGA,OAAc,oBAAoBhwC,GAAgC;AACxD,UAAAiwC,IAAiB,CAAG,EAAA,MACrB,KAAKjwC,EAAK,uBAAuB,cAAc,CAAC,EAChD;AAAA,MACG,CAACumB,MACG,CAACA,EAAE,QAAQ,4BAA4B,KACvC,CAAC,CAAEA,EAAE,QAAuB;AAAA,IAAA;AAExC,WAAI0pB,KACG,CAAA,EAAG,MACL,KAAKjwC,EAAK,uBAAuB,sBAAsB,CAAC,EACxD;AAAA,MACG,CAACumB,MAAM,CAAC,CAAEA,EAAE,QAAuB;AAAA,IAAA;AAAA,EAE/C;AAAA,EAqBO,wBAAwBvmB,GAAmB;AAC9C,IAAK,KAAK,cAAcA,CAAI,KAExB,KAAK,wBAAwBA,CAAI;AAAA,EAEzC;AAAA;AAAA;AAAA,EAIO,kBAAkBA,GAAmBkwC,GAAiB;AACrD,IAAA,KAAK,cAAclwC,CAAI,MAEvB,KAAK,cAAcA,GACd,KAAA,mBAAmB8vC,GAAU,oBAAoB9vC,CAAI,GACtD,KAAK,gBAAgB,KAAK,oBAErB,KAAA,eAAeA,GAAMkwC,CAAM;AAAA,EAG5C;AAAA;AAAA;AAAA,EAIO,4BACHlwC,GACAoI,GACA8nC,GACF;AACM,IAAA,KAAK,cAAclwC,CAAI,MACvB,KAAK,oBAAoBoI,GAEzB,KAAK,mBAAmBpI,GACpB,KAAK,gBAAgB,KAAK,oBAErB,KAAA,eAAeA,GAAMkwC,CAAM;AAAA,EAG5C;AAAA;AAAA;AAAA,EAIO,kBAAkB;AACrB,IAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,mBAGlC,KAAK,gBAAgB;EACzB;AAAA;AAAA;AAAA,EAIO,iBAAiB;AACpB,IAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,mBAGlC,KAAK,gBAAgB;EACzB;AAAA,EAIQ,eAAelwC,GAAmBkwC,GAAuB;AAKzD,QAJA,CAAC,KAAK,kBAIN,CAAC,KAAK;AACN;AAsBJ,QAAIH,IAAsB/vC,EAAK,mBAC3BmwC,IAAuC;AAG3C,QACI,CAACJ,KACD,CAACA,EAAoB,UAAU,SAAS,2BAA2B,GACrE;AAKwB,MAAAA,IAAA,SAAS,cAAc,KAAK;AAClD,eAAS9sC,IAAI,GAAGA,IAAI,KAAK,iBAAiB,UAAU,QAAQA;AACxD,QAAA8sC,EAAoB,UAAU;AAAA,UAC1B,KAAK,iBAAiB,UAAU9sC,CAAC;AAAA,QAAA;AAGrB,MAAA8sC,EAAA,UAAU,IAAI,2BAA2B;AAEvD,YAAAK,IAAkB,KAAK,iBAAiB;AAAA,QAC1C;AAAA,MAAA,GAOEC,IAA0B,MAAM;AAC5B,cAAAC,IACF,KAAK,iBAAiB,MAAM;AAChC,QAAIA,IACAF,EAAgB,MAAM,kBAAkBE,IAExC,sBAAsBD,CAAuB;AAAA,MACjD;AAEJ,MAAKD,EAAgB,aAAa,qBAAqB,KACnD,sBAAsBC,CAAuB,GAG9BF,IAAA,SAAS,cAAc,KAAK,GAC9BA,EAAA,UAAU,IAAIL,GAAU,gBAAgB,GACzDK,EAAiB,YAAYC,CAAe,GAE5CD,EAAiB,MAAM,aAAa,UACpCJ,EAAoB,YAAYI,CAAgB,GAE3CnwC,EAAA,aAAa+vC,GAAqB/vC,EAAK,UAAU,GAGjD,KAAA;AAAA,QACDA;AAAA,QACAmwC;AAAA,QACAC;AAAA,QACAF;AAAA,MAAA;AAAA,IACJ;AAGA,MAAAC,IACIJ,EAAoB,mBAEpBI,EAAiB,aAAa,kBAAkB,KAIhD,KAAK,sBAAsBA,CAAgB,GACtC,KAAA,uBAAuBnwC,GAAMkwC,CAAM,KAGnC,KAAA;AAAA,QACDlwC;AAAA,QACAmwC;AAAA,QACAA,EAAiB;AAAA,QACjBD;AAAA,MAAA;AAAA,EAIhB;AAAA,EAEQ,uBAAuBlwC,GAAmBkwC,GAAiB;AACzD,UAAAE,IAAkBN,GAAU,mBAAmB9vC,CAAI;AAKzD,QAFI,KAAK,mBAAsB,KAAA,gBAAgB,aAAa,GAExDowC,GAAiB;AACX,YAAAG,IACFH,EAAgB,aAAa,kBAAkB,GAC7CI,IAAYJ,EAAgB,aAAa,gBAAgB;AAC/D,WAAK,kBAAkB,IAAIK;AAAA,QACvBF;AAAA,QACAC;AAAA,QACA,KAAK;AAAA,QACLJ;AAAA,MAAA,GAEAF,IAIA,KAAK,gBAAgB,6BAErB,KAAK,gBAAgB;IAE7B;AAAA,EACJ;AAAA,EAEQ,yCACJlwC,GACAmwC,GACAO,GACAR,GACI;AACA,QAAAlwC,EAAK,aAAa,kBAAkB;AAEpC,WAAK,sBAAsBmwC,CAAgB,GACtC,KAAA,uBAAuBnwC,GAAMkwC,CAAM;AAAA,aAGnCQ,EAAO,aAAa,qBAAqB,GAAG;AAC3C,YAAAC,IAAmBD,EACpB,aAAa,qBAAqB,EAClC,MAAM,GAAG,EACT,IAAI,UAAU;AACF,MAAAP,EAAA;AAAA,QACb;AAAA,SACCQ,EAAiB,CAAC,IAAIA,EAAiB,CAAC,GAAG,SAAS;AAAA,MAAA,GAEzD,KAAK,sBAAsBR,CAAgB,GACtC,KAAA,uBAAuBnwC,GAAMkwC,CAAM;AAAA,IAAA,OAKvC;AACD,YAAMU,IAAgC,MAAM;AACpC,YAAAF,EAAO,MAAM,iBAAiB;AACxB,gBAAAG,IAAe,IAAI;AACZ,UAAAA,EAAA,iBAAiB,QAAQ,MAAM;AACvB,YAAAV,EAAA;AAAA,cACb;AAAA,eAEIU,EAAa,eACbA,EAAa,eACf,SAAS;AAAA,YAAA,GAEf,KAAK,sBAAsBV,CAAgB,GACtC,KAAA,uBAAuBnwC,GAAMkwC,CAAM;AAAA,UAAA,CAC3C,GACDW,EAAa,MACTjB,GAAU;AAAA,YACNc,EAAO,MAAM;AAAA,UAAA;AAAA,QACjB;AAEJ,gCAAsBE,CAA6B;AAAA,MACvD;AAEJ,4BAAsBA,CAA6B;AAAA,IACvD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsBT,GAA+B;AACzD,UAAMW,IAAmB;AAAA,MACrBX,EAAiB,aAAa,kBAAkB;AAAA,IAAA,GAE9CJ,IAAsBI,EAAiB,eACvCY,IAAYhB,EAAoB,aAChCiB,IAAajB,EAAoB,cACjCkB,IAAkBF,IAAYC;AACpC,QAAIF,IAAmBG,GAAiB;AAEpC,YAAMC,IAAaF,IAAaF;AAChC,MAAAX,EAAiB,MAAM,SAAS,QACfA,EAAA,MAAM,QAAQ,GAAGe,CAAU,MAC5Cf,EAAiB,MAAM,OAAO,IAAIY,IAAYG,KAAc,CAAC;AAAA,IAAA,OAC1D;AAEH,YAAMC,IAAcJ,IAAYD;AAChC,MAAAX,EAAiB,MAAM,QAAQ,QACdA,EAAA,MAAM,SAAS,GAAGgB,CAAW,MAC9ChB,EAAiB,MAAM,MAAM,IAAIa,IAAaG,KAAe,CAAC;AAAA,IAClE;AACA,IAAAhB,EAAiB,MAAM,WAAW,UAClCA,EAAiB,MAAM,aAAa,WAE/B,KAAA;AAAA,MACDA;AAAA,MACAA,EAAiB;AAAA,IAAA;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA,EAKQ,mBACJA,GACAO,GACI;AACA,QAAAA,EAAO,aAAa,qBAAqB,GAAG;AACtC,YAAAU,IAAqBV,EACtB,aAAa,qBAAqB,EAClC,MAAM,GAAG,EACT,IAAI,UAAU,GACbW,IAA6B;AAAA,QAC/BlB,EAAiB;AAAA,QACjBA,EAAiB;AAAA,MAAA;AAGrB,MAAAO,EAAO,MAAM,QAAQ,GAAGU,EAAmB,CAAC,CAAC,MAC7CV,EAAO,MAAM,SAAS,GAAGU,EAAmB,CAAC,CAAC,MACvCV,EAAA,MAAM,QAAQ,GAAGW,EAA2B,CAAC,IAAID,EAAmB,CAAC,CAAC,IAItEV,EAAA,MAAM,MAAM,IAAIW,EAA2B,CAAC,IAAID,EAAmB,CAAC,KAAK,CAAC,MAC1EV,EAAA,MAAM,OAAO,IAAIW,EAA2B,CAAC,IAAID,EAAmB,CAAC,KAAK,CAAC;AAAA,IACtF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,uBAAuBpxC,GAAyB;AACpD,QAAI,CAACA;AACD;AAEJ,QAAI,CAAC,KAAK,cAAcA,CAAI,GAAG;AAG3B,WAAK,wBAAwBA,CAAI;AACjC;AAAA,IACJ;AAEM,UAAAmwC,IAAmB,KAAK,oBAAoBnwC,CAAI;AACtD,IAAKmwC,KAGL,KAAK,sBAAsBA,CAAgB;AAAA,EAC/C;AAAA,EAEQ,oBAAoBnwC,GAAuC;AAC/D,QAAI,CAACA;AACM,aAAA;AAEL,UAAAsxC,IAAexB,GAAU,mBAAmB9vC,CAAI;AACtD,QAAI,CAACsxC,KAAgBA,EAAa,SAAS,WAAW;AAC3C,aAAA;AAEX,UAAMnB,IAAmBmB,EAAa;AACtC,WAAKnB,EAAiB,UAAU,SAASL,GAAU,gBAAgB,IAG5DK,IAFI;AAAA,EAGf;AAAA,EAEQ,wBAAwBnwC,GAAmB;AAC/C,IACIA,EAAK,qBACLA,EAAK,kBAAkB,UAAU;AAAA,MAC7B;AAAA,IAAA,KAGCA,EAAA,YAAYA,EAAK,iBAAiB;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,cAAcA,GAA4B;AAEzC,WAAA,KAAK,kBACLA,EAAK,aAAa,OAAO,EAAG,QAAQ,WAAW,KAAK;AAAA,EAE5D;AACJ;AArYI8vC,GAAe,mBAAmB;AAvD/B,IAAMla,KAANka;AAicA,MAAMW,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBhC,YACIF,GACAC,GACApoC,GACAmpC,GACF;AACE,SAAK,WAAWnpC,IAAW,KAC3B,KAAK,mBAAmB,GACnB,KAAA,gBAAgB,KAAK,OAE1B,KAAK,SAAS,IAEd,KAAK,kBAAkBmpC;AAEvB,UAAMC,IAAcjB,EAAY,MAAM,GAAG,EAAE,IAAI,UAAU,GACnDkB,IAAYjB,EAAU,MAAM,GAAG,EAAE,IAAI,UAAU;AAQjD,IAAAgB,EAAY,UAAU,KACtBC,EAAU,UAAU,KACpB,KAAK,IAAI,GAAGA,CAAS,IAAI,KACzB,KAAK,IAAI,GAAGD,CAAW,IAAI,KAC3BA,EAAY,CAAC,IAAIA,EAAY,CAAC,IAAI,QAClCA,EAAY,CAAC,IAAIA,EAAY,CAAC,IAAI,QAClCC,EAAU,CAAC,IAAIA,EAAU,CAAC,IAAI,QAC9BA,EAAU,CAAC,IAAIA,EAAU,CAAC,IAAI,QAE9B,KAAK,eAAe,GACpB,KAAK,aAAa,GAClB,KAAK,cAAc,GACnB,KAAK,YAAY,GACjB,KAAK,aAAa,GAClB,KAAK,WAAW,MAEQD,EAAY,CAAC,GACfC,EAAU,CAAC,GACVD,EAAY,CAAC,GACfC,EAAU,CAAC,GAG3B,KAAA,eAAe,IAAI,KAAK,IAAID,EAAY,CAAC,GAAGA,EAAY,CAAC,CAAC,GAC3D,KAAK,gBAAgB,MAAG,KAAK,eAAe,SAC3C,KAAA,aAAa,IAAI,KAAK,IAAIC,EAAU,CAAC,GAAGA,EAAU,CAAC,CAAC,GACrD,KAAK,cAAc,MAAG,KAAK,aAAa,SAGvC,KAAA,cACD,KAAK,eACL,OACC,OAAO,MAAMD,EAAY,CAAC,IAAIA,EAAY,CAAC,KAC3C,KAAA,aACD,KAAK,eACL,OACC,OAAO,MAAMA,EAAY,CAAC,IAAIA,EAAY,CAAC,KAC3C,KAAA,YACD,KAAK,aACL,OACC,OAAO,MAAMC,EAAU,CAAC,IAAIA,EAAU,CAAC,KACvC,KAAA,WACD,KAAK,aACL,OACC,OAAO,MAAMA,EAAU,CAAC,IAAIA,EAAU,CAAC;AAAA,EAEpD;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAIN;AACM,QAAAC,IAAmB,KAAK,mBAAmB,KAAK;AACpD,IAAAA,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAgB,CAAC;AACtD,UAAAC,IAAe,KAAK,eAAeD,CAAgB,GACnDE,IACF,KAAK,gBACJ,KAAK,aAAa,KAAK,gBAAgBD,GACtCE,IACF,KAAK,eACJ,KAAK,YAAY,KAAK,eAAeF,GACpCG,IACF,KAAK,cAAc,KAAK,WAAW,KAAK,cAAcH;AAEnD,WAAA;AAAA,MACH,OAAOC;AAAA,MACP,MAAMC;AAAA,MACN,KAAKC;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA,EAIQ,eAAeC,GAA0B;AAE7C,WAAQ,MAAM,KAAK,IAAIA,IAAW,KAAK,EAAE,IAAI,KAAM;AAAA,EACvD;AAAA,EAEQ,mBAAmB;AAEvB,QAAI,KAAK,OAAQ;AAEX,UAAAnb,IAAc,KAAK;AAMrB,IALC,KAAA,oBAAoBA,IAAc,KAAK,eAKxC,OAAK,oBAAoB,KAAK,cAElC,KAAK,yBAAyB,GAE9B,KAAK,gBAAgBA,GAEC,sBAAA,MAAM,KAAK,iBAAA,CAAkB;AAAA,EACvD;AAAA,EAEO,2BAA2B;AAC9B,UAAM,EAAE,OAAAjwB,GAAO,MAAAqrC,GAAM,KAAAvmC,EAAI,IAAI,KAAK;AAC7B,SAAA,gBAAgB,MAAM,YAAY,aAAaumC,CAAI,MAAMvmC,CAAG,YAAY9E,CAAK;AAAA,EACtF;AAAA,EAEO,QAAQ;AACX,SAAK,SAAS;AAAA,EAClB;AAAA,EAEO,SAAS;AACZ,SAAK,SAAS,IACT,KAAA,gBAAgB,KAAK,OAC1B,KAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEO,iBAAiB;AACpB,SAAK,SAAS,IACd,KAAK,mBAAmB,GACnB,KAAA,gBAAgB,KAAK,OAC1B,KAAK,iBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA,EAIO,eAAe;AACb,SAAA,mBAAmB,KAAK,WAAW;AAAA,EAC5C;AACJ;","x_google_ignoreList":[3,4]}