{"version":3,"sources":["node_modules/file-saver/dist/FileSaver.min.js","node_modules/ng-lazyload-image/fesm2020/ng-lazyload-image.mjs","src/app/shared/image/image.component.ts","src/app/shared/image/image.component.html","src/app/_providers/saver.provider.ts","src/app/shared/_models/download.ts","src/app/_pipes/bytes.pipe.ts","src/app/shared/_services/download.service.ts","src/app/_pipes/manga-format.pipe.ts"],"sourcesContent":["(function (a, b) {\n if (\"function\" == typeof define && define.amd) define([], b);else if (\"undefined\" != typeof exports) b();else {\n b(), a.FileSaver = {\n exports: {}\n }.exports;\n }\n})(this, function () {\n \"use strict\";\n\n function b(a, b) {\n return \"undefined\" == typeof b ? b = {\n autoBom: !1\n } : \"object\" != typeof b && (console.warn(\"Deprecated: Expected third argument to be a object\"), b = {\n autoBom: !b\n }), b.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type) ? new Blob([\"\\uFEFF\", a], {\n type: a.type\n }) : a;\n }\n function c(a, b, c) {\n var d = new XMLHttpRequest();\n d.open(\"GET\", a), d.responseType = \"blob\", d.onload = function () {\n g(d.response, b, c);\n }, d.onerror = function () {\n console.error(\"could not download file\");\n }, d.send();\n }\n function d(a) {\n var b = new XMLHttpRequest();\n b.open(\"HEAD\", a, !1);\n try {\n b.send();\n } catch (a) {}\n return 200 <= b.status && 299 >= b.status;\n }\n function e(a) {\n try {\n a.dispatchEvent(new MouseEvent(\"click\"));\n } catch (c) {\n var b = document.createEvent(\"MouseEvents\");\n b.initMouseEvent(\"click\", !0, !0, window, 0, 0, 0, 80, 20, !1, !1, !1, !1, 0, null), a.dispatchEvent(b);\n }\n }\n var f = \"object\" == typeof window && window.window === window ? window : \"object\" == typeof self && self.self === self ? self : \"object\" == typeof global && global.global === global ? global : void 0,\n a = f.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent),\n g = f.saveAs || (\"object\" != typeof window || window !== f ? function () {} : \"download\" in HTMLAnchorElement.prototype && !a ? function (b, g, h) {\n var i = f.URL || f.webkitURL,\n j = document.createElement(\"a\");\n g = g || b.name || \"download\", j.download = g, j.rel = \"noopener\", \"string\" == typeof b ? (j.href = b, j.origin === location.origin ? e(j) : d(j.href) ? c(b, g, h) : e(j, j.target = \"_blank\")) : (j.href = i.createObjectURL(b), setTimeout(function () {\n i.revokeObjectURL(j.href);\n }, 4E4), setTimeout(function () {\n e(j);\n }, 0));\n } : \"msSaveOrOpenBlob\" in navigator ? function (f, g, h) {\n if (g = g || f.name || \"download\", \"string\" != typeof f) navigator.msSaveOrOpenBlob(b(f, h), g);else if (d(f)) c(f, g, h);else {\n var i = document.createElement(\"a\");\n i.href = f, i.target = \"_blank\", setTimeout(function () {\n e(i);\n });\n }\n } : function (b, d, e, g) {\n if (g = g || open(\"\", \"_blank\"), g && (g.document.title = g.document.body.innerText = \"downloading...\"), \"string\" == typeof b) return c(b, d, e);\n var h = \"application/octet-stream\" === b.type,\n i = /constructor/i.test(f.HTMLElement) || f.safari,\n j = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n if ((j || h && i || a) && \"undefined\" != typeof FileReader) {\n var k = new FileReader();\n k.onloadend = function () {\n var a = k.result;\n a = j ? a : a.replace(/^data:[^;]*;/, \"data:attachment/file;\"), g ? g.location.href = a : location = a, g = null;\n }, k.readAsDataURL(b);\n } else {\n var l = f.URL || f.webkitURL,\n m = l.createObjectURL(b);\n g ? g.location = m : location.href = m, g = null, setTimeout(function () {\n l.revokeObjectURL(m);\n }, 4E4);\n }\n });\n f.saveAs = g.saveAs = g, \"undefined\" != typeof module && (module.exports = g);\n});\n\n","import { Subject, of, Observable, ReplaySubject, never, empty } from 'rxjs';\nimport { filter, tap, take, mergeMap, map, catchError, switchMap, startWith, sampleTime, share } from 'rxjs/operators';\nimport { isPlatformServer } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, EventEmitter, PLATFORM_ID, Directive, Inject, Input, Output, NgModule } from '@angular/core';\nfunction getNavigator() {\n return typeof window !== 'undefined' ? window.navigator : undefined;\n}\nfunction isChildOfPicture(element) {\n return Boolean(element.parentElement && element.parentElement.nodeName.toLowerCase() === 'picture');\n}\nfunction isImageElement(element) {\n return element.nodeName.toLowerCase() === 'img';\n}\nfunction setImage(element, imagePath, useSrcset) {\n if (isImageElement(element)) {\n if (useSrcset && 'srcset' in element) {\n element.srcset = imagePath;\n } else {\n element.src = imagePath;\n }\n } else {\n element.style.backgroundImage = `url('${imagePath}')`;\n }\n return element;\n}\nfunction setSources(attrName) {\n return image => {\n const sources = image.parentElement.getElementsByTagName('source');\n for (let i = 0; i < sources.length; i++) {\n const attrValue = sources[i].getAttribute(attrName);\n if (attrValue) {\n // Check if `srcset` is supported by the current browser\n if ('srcset' in sources[i]) {\n sources[i].srcset = attrValue;\n } else {\n sources[i].src = attrValue;\n }\n }\n }\n };\n}\nconst setSourcesToDefault = setSources('defaultImage');\nconst setSourcesToLazy = setSources('lazyLoad');\nconst setSourcesToError = setSources('errorImage');\nfunction setImageAndSources(setSourcesFn) {\n return (element, imagePath, useSrcset) => {\n if (isImageElement(element) && isChildOfPicture(element)) {\n setSourcesFn(element);\n }\n if (imagePath) {\n setImage(element, imagePath, useSrcset);\n }\n };\n}\nconst setImageAndSourcesToDefault = setImageAndSources(setSourcesToDefault);\nconst setImageAndSourcesToLazy = setImageAndSources(setSourcesToLazy);\nconst setImageAndSourcesToError = setImageAndSources(setSourcesToError);\nclass Hooks {\n constructor() {\n this.navigator = getNavigator();\n }\n setPlatformId(platformId) {\n this.platformId = platformId;\n }\n onDestroy(attributes) {}\n onAttributeChange(newAttributes) {}\n}\nconst cssClassNames = {\n loaded: 'ng-lazyloaded',\n loading: 'ng-lazyloading',\n failed: 'ng-failed-lazyloaded'\n};\nfunction removeCssClassName(element, cssClassName) {\n element.className = element.className.replace(cssClassName, '');\n}\nfunction addCssClassName(element, cssClassName) {\n if (!element.className.includes(cssClassName)) {\n element.className += ` ${cssClassName}`;\n }\n}\nfunction hasCssClassName(element, cssClassName) {\n return element.className && element.className.includes(cssClassName);\n}\nclass SharedHooks extends Hooks {\n setup(attributes) {\n setImageAndSourcesToDefault(attributes.element, attributes.defaultImagePath, attributes.useSrcset);\n if (attributes.imagePath) {\n addCssClassName(attributes.element, cssClassNames.loading);\n }\n if (hasCssClassName(attributes.element, cssClassNames.loaded)) {\n removeCssClassName(attributes.element, cssClassNames.loaded);\n }\n }\n finally(attributes) {\n addCssClassName(attributes.element, cssClassNames.loaded);\n removeCssClassName(attributes.element, cssClassNames.loading);\n }\n loadImage(attributes) {\n if (this.skipLazyLoading(attributes)) {\n // Set the image right away for bots for better SEO\n return [attributes.imagePath];\n }\n const {\n element,\n useSrcset,\n imagePath,\n decode\n } = attributes;\n let img;\n if (isImageElement(element) && isChildOfPicture(element)) {\n const parentClone = element.parentNode.cloneNode(true);\n img = parentClone.getElementsByTagName('img')[0];\n setSourcesToLazy(img);\n setImage(img, imagePath, useSrcset);\n } else {\n img = new Image();\n if (isImageElement(element) && element.referrerPolicy) {\n img.referrerPolicy = element.referrerPolicy;\n }\n if (isImageElement(element) && element.sizes) {\n img.sizes = element.sizes;\n }\n if (useSrcset && 'srcset' in img) {\n img.srcset = imagePath;\n } else {\n img.src = imagePath;\n }\n }\n if (decode && img.decode) {\n return img.decode().then(() => imagePath);\n }\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(imagePath);\n img.onerror = () => reject(null);\n });\n }\n setErrorImage(error, attributes) {\n const {\n element,\n useSrcset,\n errorImagePath\n } = attributes;\n setImageAndSourcesToError(element, errorImagePath, useSrcset);\n addCssClassName(element, cssClassNames.failed);\n }\n setLoadedImage(imagePath, attributes) {\n const {\n element,\n useSrcset\n } = attributes;\n setImageAndSourcesToLazy(element, imagePath, useSrcset);\n }\n isDisabled() {\n // Disable if SSR and the user isn't a bot\n return isPlatformServer(this.platformId) && !this.isBot();\n }\n skipLazyLoading(attributes) {\n return this.isBot(attributes);\n }\n isBot(attributes) {\n if (this.navigator?.userAgent) {\n return /googlebot|bingbot|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\\ link\\ preview|showyoubot|outbrain|pinterest\\/0\\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|duckduckbot|prerender/i.test(this.navigator.userAgent);\n }\n return false;\n }\n}\nclass IntersectionObserverHooks extends SharedHooks {\n constructor() {\n super(...arguments);\n this.observers = new WeakMap();\n this.intersectionSubject = new Subject();\n this.uniqKey = {};\n }\n getObservable(attributes) {\n if (this.skipLazyLoading(attributes)) {\n return of({\n isIntersecting: true\n });\n }\n if (attributes.customObservable) {\n return attributes.customObservable;\n }\n const scrollContainerKey = attributes.scrollContainer || this.uniqKey;\n const options = {\n root: attributes.scrollContainer || null\n };\n if (attributes.offset) {\n options.rootMargin = `${attributes.offset}px`;\n }\n let observer = this.observers.get(scrollContainerKey);\n if (!observer) {\n observer = new IntersectionObserver(entrys => this.loadingCallback(entrys), options);\n this.observers.set(scrollContainerKey, observer);\n }\n observer.observe(attributes.element);\n return Observable.create(obs => {\n const subscription = this.intersectionSubject.pipe(filter(entry => entry.target === attributes.element)).subscribe(obs);\n return () => {\n subscription.unsubscribe();\n observer.unobserve(attributes.element);\n };\n });\n }\n isVisible(event) {\n return event.isIntersecting;\n }\n loadingCallback(entrys) {\n entrys.forEach(entry => this.intersectionSubject.next(entry));\n }\n}\nfunction lazyLoadImage(hooks, attributes) {\n return evntObservable => {\n return evntObservable.pipe(tap(data => attributes.onStateChange.emit({\n reason: 'observer-emit',\n data\n })), filter(event => hooks.isVisible(event, attributes)), take(1), tap(() => attributes.onStateChange.emit({\n reason: 'start-loading'\n })), mergeMap(() => hooks.loadImage(attributes)), tap(() => attributes.onStateChange.emit({\n reason: 'mount-image'\n })), tap(imagePath => hooks.setLoadedImage(imagePath, attributes)), tap(() => attributes.onStateChange.emit({\n reason: 'loading-succeeded'\n })), map(() => true), catchError(error => {\n attributes.onStateChange.emit({\n reason: 'loading-failed',\n data: error\n });\n hooks.setErrorImage(error, attributes);\n return of(false);\n }), tap(() => {\n attributes.onStateChange.emit({\n reason: 'finally'\n });\n hooks.finally(attributes);\n }));\n };\n}\nconst LAZYLOAD_IMAGE_HOOKS = new InjectionToken('LazyLoadImageHooks');\nlet LazyLoadImageDirective = /*#__PURE__*/(() => {\n class LazyLoadImageDirective {\n constructor(el, ngZone, platformId, hooks) {\n this.onStateChange = new EventEmitter(); // Emits an event on every state change\n this.elementRef = el;\n this.ngZone = ngZone;\n this.propertyChanges$ = new ReplaySubject();\n this.hooks = hooks;\n this.hooks.setPlatformId(platformId);\n this.uid = Math.random().toString(36).substr(2, 9);\n }\n ngOnChanges() {\n if (this.debug === true && !this.debugSubscription) {\n this.debugSubscription = this.onStateChange.subscribe(e => console.log(e));\n }\n this.propertyChanges$.next({\n element: this.elementRef.nativeElement,\n imagePath: this.lazyImage,\n defaultImagePath: this.defaultImage,\n errorImagePath: this.errorImage,\n useSrcset: this.useSrcset,\n offset: this.offset ? this.offset | 0 : 0,\n scrollContainer: this.scrollTarget,\n customObservable: this.customObservable,\n decode: this.decode,\n onStateChange: this.onStateChange,\n id: this.uid\n });\n }\n ngAfterContentInit() {\n if (this.hooks.isDisabled()) {\n return null;\n }\n this.ngZone.runOutsideAngular(() => {\n this.loadSubscription = this.propertyChanges$.pipe(tap(attributes => this.hooks.onAttributeChange(attributes)), tap(attributes => attributes.onStateChange.emit({\n reason: 'setup'\n })), tap(attributes => this.hooks.setup(attributes)), switchMap(attributes => {\n if (!attributes.imagePath) {\n return never();\n }\n return this.hooks.getObservable(attributes).pipe(lazyLoadImage(this.hooks, attributes));\n })).subscribe({\n next: () => null\n });\n });\n }\n ngOnDestroy() {\n this.propertyChanges$.pipe(take(1)).subscribe({\n next: attributes => this.hooks.onDestroy(attributes)\n }).unsubscribe();\n this.loadSubscription?.unsubscribe();\n this.debugSubscription?.unsubscribe();\n }\n }\n LazyLoadImageDirective.ɵfac = function LazyLoadImageDirective_Factory(t) {\n return new (t || LazyLoadImageDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(PLATFORM_ID), i0.ɵɵdirectiveInject(LAZYLOAD_IMAGE_HOOKS));\n };\n LazyLoadImageDirective.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: LazyLoadImageDirective,\n selectors: [[\"\", \"lazyLoad\", \"\"]],\n inputs: {\n lazyImage: [i0.ɵɵInputFlags.None, \"lazyLoad\", \"lazyImage\"],\n defaultImage: \"defaultImage\",\n errorImage: \"errorImage\",\n scrollTarget: \"scrollTarget\",\n customObservable: \"customObservable\",\n offset: \"offset\",\n useSrcset: \"useSrcset\",\n decode: \"decode\",\n debug: \"debug\"\n },\n outputs: {\n onStateChange: \"onStateChange\"\n },\n features: [i0.ɵɵNgOnChangesFeature]\n });\n return LazyLoadImageDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet LazyLoadImageModule = /*#__PURE__*/(() => {\n class LazyLoadImageModule {}\n LazyLoadImageModule.ɵfac = function LazyLoadImageModule_Factory(t) {\n return new (t || LazyLoadImageModule)();\n };\n LazyLoadImageModule.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: LazyLoadImageModule\n });\n LazyLoadImageModule.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [{\n provide: LAZYLOAD_IMAGE_HOOKS,\n useClass: IntersectionObserverHooks\n }]\n });\n return LazyLoadImageModule;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nclass Rect {\n constructor(left, top, right, bottom) {\n this.left = left;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n static fromElement(element) {\n const {\n left,\n top,\n right,\n bottom\n } = element.getBoundingClientRect();\n if (left === 0 && top === 0 && right === 0 && bottom === 0) {\n return Rect.empty;\n } else {\n return new Rect(left, top, right, bottom);\n }\n }\n static fromWindow(_window) {\n return new Rect(0, 0, _window.innerWidth, _window.innerHeight);\n }\n inflate(inflateBy) {\n this.left -= inflateBy;\n this.top -= inflateBy;\n this.right += inflateBy;\n this.bottom += inflateBy;\n }\n intersectsWith(rect) {\n return rect.left < this.right && this.left < rect.right && rect.top < this.bottom && this.top < rect.bottom;\n }\n getIntersectionWith(rect) {\n const left = Math.max(this.left, rect.left);\n const top = Math.max(this.top, rect.top);\n const right = Math.min(this.right, rect.right);\n const bottom = Math.min(this.bottom, rect.bottom);\n if (right >= left && bottom >= top) {\n return new Rect(left, top, right, bottom);\n } else {\n return Rect.empty;\n }\n }\n}\nRect.empty = new Rect(0, 0, 0, 0);\nclass ScrollHooks extends SharedHooks {\n constructor() {\n super(...arguments);\n this.getWindow = () => window;\n this.scrollListeners = new WeakMap();\n // Only create one scroll listener per target and share the observable.\n // Typical, there will only be one observable per application\n this.getScrollListener = scrollTarget => {\n if (!scrollTarget || typeof scrollTarget.addEventListener !== 'function') {\n console.warn('`addEventListener` on ' + scrollTarget + ' (scrollTarget) is not a function. Skipping this target');\n return empty();\n }\n const scrollListener = this.scrollListeners.get(scrollTarget);\n if (scrollListener) {\n return scrollListener;\n }\n const srollEvent = Observable.create(observer => {\n const eventName = 'scroll';\n const handler = event => observer.next(event);\n const options = {\n passive: true,\n capture: false\n };\n scrollTarget.addEventListener(eventName, handler, options);\n return () => scrollTarget.removeEventListener(eventName, handler, options);\n });\n const listener = this.sampleObservable(srollEvent);\n this.scrollListeners.set(scrollTarget, listener);\n return listener;\n };\n }\n getObservable(attributes) {\n if (this.skipLazyLoading(attributes)) {\n return of('load');\n } else if (attributes.customObservable) {\n return attributes.customObservable.pipe(startWith(''));\n } else if (attributes.scrollContainer) {\n return this.getScrollListener(attributes.scrollContainer);\n }\n return this.getScrollListener(this.getWindow());\n }\n isVisible(event, attributes) {\n const elementBounds = Rect.fromElement(attributes.element);\n if (elementBounds === Rect.empty) {\n return false;\n }\n const windowBounds = Rect.fromWindow(this.getWindow());\n elementBounds.inflate(attributes.offset);\n if (attributes.scrollContainer) {\n const scrollContainerBounds = Rect.fromElement(attributes.scrollContainer);\n const intersection = scrollContainerBounds.getIntersectionWith(windowBounds);\n return elementBounds.intersectsWith(intersection);\n } else {\n return elementBounds.intersectsWith(windowBounds);\n }\n }\n sampleObservable(obs, scheduler) {\n return obs.pipe(sampleTime(100, scheduler), share(), startWith(''));\n }\n}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { Hooks, IntersectionObserverHooks, LAZYLOAD_IMAGE_HOOKS, LazyLoadImageDirective, LazyLoadImageModule, ScrollHooks, SharedHooks };\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnChanges,\r\n Renderer2,\r\n RendererStyleFlags2,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {CoverUpdateEvent} from 'src/app/_models/events/cover-update-event';\r\nimport {ImageService} from 'src/app/_services/image.service';\r\nimport {EVENTS, MessageHubService} from 'src/app/_services/message-hub.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {CommonModule, NgOptimizedImage} from \"@angular/common\";\r\nimport {LazyLoadImageModule, StateChange} from \"ng-lazyload-image\";\r\n\r\n/**\r\n * This is used for images with placeholder fallback.\r\n */\r\n@Component({\r\n selector: 'app-image',\r\n standalone: true,\r\n imports: [CommonModule, NgOptimizedImage, LazyLoadImageModule],\r\n templateUrl: './image.component.html',\r\n styleUrls: ['./image.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ImageComponent implements OnChanges {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n protected readonly imageService = inject(ImageService);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly hubService = inject(MessageHubService);\r\n private readonly cdRef = inject(ChangeDetectorRef);\r\n\r\n /**\r\n * Source url to load image\r\n */\r\n @Input({required: true}) imageUrl!: string;\r\n /**\r\n * Width of the image. If not defined, will not be applied\r\n */\r\n @Input() width: string = '';\r\n /**\r\n * Height of the image. If not defined, will not be applied\r\n */\r\n @Input() height: string = '';\r\n /**\r\n * If the image component should respond to cover updates\r\n */\r\n @Input() processEvents: boolean = true;\r\n /**\r\n * Note: Parent component must use ViewEncapsulation.None\r\n */\r\n @Input() classes: string = '';\r\n /**\r\n * A collection of styles to apply. This is useful if the parent component doesn't want to use no view encapsulation\r\n */\r\n @Input() styles: {[key: string]: string} = {};\r\n @Input() errorImage: string = this.imageService.errorImage;\r\n\r\n @ViewChild('img', {static: true}) imgElem!: ElementRef;\r\n\r\n\r\n constructor() {\r\n this.hubService.messages$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(res => {\r\n if (!this.processEvents) return;\r\n if (res.event === EVENTS.CoverUpdate) {\r\n const updateEvent = res.payload as CoverUpdateEvent;\r\n if (this.imageUrl === undefined || this.imageUrl === null || this.imageUrl === '') return;\r\n const entityType = this.imageService.getEntityTypeFromUrl(this.imageUrl);\r\n if (entityType === updateEvent.entityType) {\r\n const tokens = this.imageUrl.split('?')[1].split('&');\r\n\r\n //...seriesId=123&random=\r\n let id = tokens[0].replace(entityType + 'Id=', '');\r\n if (id.includes('&')) {\r\n id = id.split('&')[0];\r\n }\r\n if (id === (updateEvent.id + '')) {\r\n this.imageUrl = this.imageService.randomize(this.imageUrl);\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.width !== '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'width', this.width);\r\n }\r\n\r\n if (this.height !== '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'height', this.height);\r\n }\r\n\r\n const styleKeys = Object.keys(this.styles);\r\n if (styleKeys.length !== 0) {\r\n styleKeys.forEach(key => {\r\n this.renderer.setStyle(this.imgElem.nativeElement, key, this.styles[key], RendererStyleFlags2.Important);\r\n });\r\n }\r\n\r\n if (this.classes != '') {\r\n this.renderer.addClass(this.imgElem.nativeElement, this.classes);\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n\r\n myCallbackFunction(event: StateChange) {\r\n const image = this.imgElem.nativeElement;\r\n switch (event.reason) {\r\n case 'setup':\r\n // The lib has been instantiated but we have not done anything yet.\r\n break;\r\n case 'observer-emit':\r\n // The image observer (intersection/scroll/custom observer) has emit a value so we\r\n // should check if the image is in the viewport.\r\n // `event.data` is the event in this case.\r\n break;\r\n case 'start-loading':\r\n // The image is in the viewport so the image will start loading\r\n break;\r\n case 'mount-image':\r\n // The image has been loaded successfully so lets put it into the DOM\r\n break;\r\n case 'loading-succeeded':\r\n // The image has successfully been loaded and placed into the DOM\r\n this.renderer.addClass(image, 'loaded');\r\n break;\r\n case 'loading-failed':\r\n // The image could not be loaded for some reason.\r\n // `event.data` is the error in this case\r\n this.renderer.removeClass(image, 'fade-in');\r\n this.cdRef.markForCheck();\r\n break;\r\n case 'finally':\r\n // The last event before cleaning up\r\n break;\r\n }\r\n }\r\n\r\n}\r\n","\"\"\r\n\r\n","import {InjectionToken} from '@angular/core'\r\nimport { saveAs } from 'file-saver';\r\n\r\nexport type Saver = (blob: Blob, filename?: string) => void\r\n\r\nexport const SAVER = new InjectionToken('saver')\r\n\r\nexport function getSaver(): Saver {\r\n return saveAs;\r\n}\r\n","import {\r\n HttpEvent,\r\n HttpEventType,\r\n HttpHeaders,\r\n HttpProgressEvent,\r\n HttpResponse\r\n } from \"@angular/common/http\";\r\n import { Observable } from \"rxjs\";\r\n import { scan } from \"rxjs/operators\";\r\n \r\n function isHttpResponse(event: HttpEvent): event is HttpResponse {\r\n return event.type === HttpEventType.Response;\r\n }\r\n \r\n function isHttpProgressEvent(\r\n event: HttpEvent\r\n ): event is HttpProgressEvent {\r\n return (\r\n event.type === HttpEventType.DownloadProgress ||\r\n event.type === HttpEventType.UploadProgress\r\n );\r\n }\r\n\r\n/**\r\n * Encapsulates an inprogress download of a Blob with progress reporting activated\r\n */ \r\nexport interface Download {\r\n content: Blob | null;\r\n progress: number;\r\n state: \"PENDING\" | \"IN_PROGRESS\" | \"DONE\";\r\n filename?: string;\r\n loaded?: number;\r\n total?: number\r\n}\r\n \r\nexport function download(saver?: (b: Blob, filename: string) => void): (source: Observable>) => Observable {\r\n return (source: Observable>) =>\r\n source.pipe(\r\n scan((previous: Download, event: HttpEvent): Download => {\r\n if (isHttpProgressEvent(event)) {\r\n return {\r\n progress: event.total\r\n ? Math.round((100 * event.loaded) / event.total)\r\n : previous.progress,\r\n state: 'IN_PROGRESS',\r\n content: null,\r\n loaded: event.loaded,\r\n total: event.total\r\n }\r\n }\r\n if (isHttpResponse(event)) {\r\n if (saver && event.body) {\r\n saver(event.body, getFilename(event.headers, ''))\r\n }\r\n return {\r\n progress: 100,\r\n state: 'DONE',\r\n content: event.body,\r\n filename: getFilename(event.headers, ''),\r\n }\r\n }\r\n return previous;\r\n },\r\n {state: 'PENDING', progress: 0, content: null}\r\n )\r\n )\r\n }\r\n\r\n\r\nfunction getFilename(headers: HttpHeaders, defaultName: string) {\r\n const tokens = (headers.get('content-disposition') || '').split(';');\r\n let filename = tokens[1].replace('filename=', '').replace(/\"/ig, '').trim(); \r\n if (filename.startsWith('download_') || filename.startsWith('kavita_download_')) {\r\n const ext = filename.substring(filename.lastIndexOf('.'), filename.length);\r\n if (defaultName !== '') {\r\n return defaultName + ext;\r\n }\r\n return filename.replace('kavita_', '').replace('download_', '');\r\n //return defaultName + ext;\r\n }\r\n return filename;\r\n }","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'bytes',\r\n standalone: true\r\n})\r\nexport class BytesPipe implements PipeTransform {\r\n\r\n /**\r\n * Format bytes as human-readable text.\r\n *\r\n * @param bytes Number of bytes.\r\n * @param si True to use metric (SI) units, aka powers of 1000. False to use\r\n * binary (IEC), aka powers of 1024.\r\n * @param dp Number of decimal places to display.\r\n *\r\n * @return Formatted string.\r\n *\r\n * Credit: https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string\r\n */\r\n transform(bytes: number, si=true, dp=1): string {\r\n const thresh = si ? 1000 : 1024;\r\n\r\n if (Math.abs(bytes) < thresh) {\r\n return bytes + ' B';\r\n }\r\n\r\n const units = si\r\n ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\r\n : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\r\n let u = -1;\r\n const r = 10**dp;\r\n\r\n do {\r\n bytes /= thresh;\r\n ++u;\r\n } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);\r\n\r\n const fixed = bytes.toFixed(dp);\r\n if ((fixed + '').endsWith('.0')) {\r\n return bytes.toFixed(0) + ' ' + units[u];\r\n }\r\n\r\n return fixed + ' ' + units[u];\r\n }\r\n\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport {DestroyRef, inject, Inject, Injectable} from '@angular/core';\r\nimport { Series } from 'src/app/_models/series';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ConfirmService } from '../confirm.service';\r\nimport { Chapter } from 'src/app/_models/chapter';\r\nimport { Volume } from 'src/app/_models/volume';\r\nimport {\r\n asyncScheduler,\r\n BehaviorSubject,\r\n Observable,\r\n tap,\r\n finalize,\r\n of,\r\n filter,\r\n} from 'rxjs';\r\nimport { download, Download } from '../_models/download';\r\nimport { PageBookmark } from 'src/app/_models/readers/page-bookmark';\r\nimport {switchMap, take, takeWhile, throttleTime} from 'rxjs/operators';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { BytesPipe } from 'src/app/_pipes/bytes.pipe';\r\nimport {translate} from \"@ngneat/transloco\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {SAVER, Saver} from \"../../_providers/saver.provider\";\r\nimport {UtilityService} from \"./utility.service\";\r\nimport {UserCollection} from \"../../_models/collection-tag\";\r\nimport {RecentlyAddedItem} from \"../../_models/recently-added-item\";\r\nimport {NextExpectedChapter} from \"../../_models/series-detail/next-expected-chapter\";\r\n\r\nexport const DEBOUNCE_TIME = 100;\r\n\r\nconst bytesPipe = new BytesPipe();\r\n\r\nexport interface DownloadEvent {\r\n /**\r\n * Type of entity being downloaded\r\n */\r\n entityType: DownloadEntityType;\r\n /**\r\n * What to show user. For example, for Series, we might show series name.\r\n */\r\n subTitle: string;\r\n /**\r\n * Progress of the download itself\r\n */\r\n progress: number;\r\n /**\r\n * Entity id. For entities without id like logs or bookmarks, uses 0 instead\r\n */\r\n id: number;\r\n}\r\n\r\n/**\r\n * Valid entity types for downloading\r\n */\r\nexport type DownloadEntityType = 'volume' | 'chapter' | 'series' | 'bookmark' | 'logs';\r\n/**\r\n * Valid entities for downloading. Undefined exclusively for logs.\r\n */\r\nexport type DownloadEntity = Series | Volume | Chapter | PageBookmark[] | undefined;\r\n\r\nexport type QueueableDownloadType = Chapter | Volume;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DownloadService {\r\n\r\n private baseUrl = environment.apiUrl;\r\n /**\r\n * Size in bytes in which to inform the user for confirmation before download starts. Defaults to 100 MB.\r\n */\r\n public SIZE_WARNING = 104_857_600;\r\n /**\r\n * Sie in bytes in which to inform the user that anything above may fail on iOS due to device limits. (200MB)\r\n */\r\n private IOS_SIZE_WARNING = 209_715_200;\r\n\r\n private downloadsSource: BehaviorSubject = new BehaviorSubject([]);\r\n /**\r\n * Active Downloads\r\n */\r\n public activeDownloads$ = this.downloadsSource.asObservable();\r\n\r\n private downloadQueue: BehaviorSubject = new BehaviorSubject([]);\r\n /**\r\n * Queued Downloads\r\n */\r\n public queuedDownloads$ = this.downloadQueue.asObservable();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly confirmService = inject(ConfirmService);\r\n private readonly accountService = inject(AccountService);\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly utilityService = inject(UtilityService);\r\n\r\n constructor(@Inject(SAVER) private save: Saver) {\r\n this.downloadQueue.subscribe((queue) => {\r\n if (queue.length > 0) {\r\n const entity = queue.shift();\r\n console.log('Download Queue shifting entity: ', entity);\r\n if (entity === undefined) return;\r\n this.processDownload(entity);\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Returns the entity subtitle (for the event widget) for a given entity\r\n * @param downloadEntityType\r\n * @param downloadEntity\r\n * @returns\r\n */\r\n downloadSubtitle(downloadEntityType: DownloadEntityType | undefined, downloadEntity: DownloadEntity | undefined) {\r\n switch (downloadEntityType) {\r\n case 'series':\r\n return (downloadEntity as Series).name;\r\n case 'volume':\r\n return (downloadEntity as Volume).minNumber + '';\r\n case 'chapter':\r\n return (downloadEntity as Chapter).minNumber + '';\r\n case 'bookmark':\r\n return '';\r\n case 'logs':\r\n return '';\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Downloads the entity to the user's system. This handles everything around downloads. This will prompt the user based on size checks and UserPreferences.PromptForDownload.\r\n * This will perform the download at a global level, if you need a handle to the download in question, use downloadService.activeDownloads$ and perform a filter on it.\r\n * @param entityType\r\n * @param entity\r\n * @param callback Optional callback. Returns the download or undefined (if the download is complete).\r\n */\r\n download(entityType: DownloadEntityType, entity: DownloadEntity, callback?: (d: Download | undefined) => void) {\r\n let sizeCheckCall: Observable;\r\n let downloadCall: Observable;\r\n switch (entityType) {\r\n case 'series':\r\n sizeCheckCall = this.downloadSeriesSize((entity as Series).id);\r\n downloadCall = this.downloadSeries(entity as Series);\r\n break;\r\n case 'volume':\r\n sizeCheckCall = this.downloadVolumeSize((entity as Volume).id);\r\n downloadCall = this.downloadVolume(entity as Volume);\r\n //this.enqueueDownload(entity as Volume);\r\n break;\r\n case 'chapter':\r\n sizeCheckCall = this.downloadChapterSize((entity as Chapter).id);\r\n downloadCall = this.downloadChapter(entity as Chapter);\r\n //this.enqueueDownload(entity as Chapter);\r\n break;\r\n case 'bookmark':\r\n sizeCheckCall = of(0);\r\n downloadCall = this.downloadBookmarks(entity as PageBookmark[]);\r\n break;\r\n case 'logs':\r\n sizeCheckCall = of(0);\r\n downloadCall = this.downloadLogs();\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n\r\n this.accountService.currentUser$.pipe(take(1), switchMap(user => {\r\n if (user && user.preferences.promptForDownloadSize) {\r\n return sizeCheckCall;\r\n }\r\n return of(0);\r\n }), switchMap(async (size) => {\r\n return await this.confirmSize(size, entityType);\r\n })\r\n ).pipe(filter(wantsToDownload => {\r\n return wantsToDownload;\r\n }),\r\n filter(_ => downloadCall !== undefined),\r\n switchMap(() => {\r\n return (downloadCall || of(undefined)).pipe(\r\n tap((d) => {\r\n if (callback) callback(d);\r\n }),\r\n takeWhile((val: Download) => {\r\n return val.state != 'DONE';\r\n }),\r\n finalize(() => {\r\n if (callback) callback(undefined);\r\n }))\r\n }), takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(() => {});\r\n }\r\n\r\n private downloadSeriesSize(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'download/series-size?seriesId=' + seriesId);\r\n }\r\n\r\n private downloadVolumeSize(volumeId: number) {\r\n return this.httpClient.get(this.baseUrl + 'download/volume-size?volumeId=' + volumeId);\r\n }\r\n\r\n private downloadChapterSize(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'download/chapter-size?chapterId=' + chapterId);\r\n }\r\n\r\n private downloadLogs() {\r\n const downloadType = 'logs';\r\n const subtitle = this.downloadSubtitle(downloadType, undefined);\r\n return this.httpClient.get(this.baseUrl + 'server/logs',\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle, 0)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n\r\n private getIdKey(entity: Chapter | Volume) {\r\n if (this.utilityService.isVolume(entity)) return 'volumeId';\r\n if (this.utilityService.isChapter(entity)) return 'chapterId';\r\n if (this.utilityService.isSeries(entity)) return 'seriesId';\r\n return 'id';\r\n }\r\n\r\n private getDownloadEntityType(entity: Chapter | Volume): DownloadEntityType {\r\n if (this.utilityService.isVolume(entity)) return 'volume';\r\n if (this.utilityService.isChapter(entity)) return 'chapter';\r\n if (this.utilityService.isSeries(entity)) return 'series';\r\n return 'logs'; // This is a hack but it will never occur\r\n }\r\n\r\n private downloadEntity(entity: Chapter | Volume): Observable {\r\n const downloadEntityType = this.getDownloadEntityType(entity);\r\n const subtitle = this.downloadSubtitle(downloadEntityType, entity);\r\n const idKey = this.getIdKey(entity);\r\n const url = `${this.baseUrl}download/${downloadEntityType}?${idKey}=${entity.id}`;\r\n\r\n return this.httpClient.get(url, { observe: 'events', responseType: 'blob', reportProgress: true }).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadEntityType, subtitle, entity.id)),\r\n finalize(() => this.finalizeDownloadState(downloadEntityType, subtitle))\r\n );\r\n }\r\n\r\n private downloadSeries(series: Series) {\r\n\r\n // TODO: Call backend for all the volumes and loose leaf chapters then enqueque them all\r\n\r\n const downloadType = 'series';\r\n const subtitle = this.downloadSubtitle(downloadType, series);\r\n return this.httpClient.get(this.baseUrl + 'download/series?seriesId=' + series.id,\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle, series.id)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n private finalizeDownloadState(entityType: DownloadEntityType, entitySubtitle: string) {\r\n let values = this.downloadsSource.getValue();\r\n values = values.filter(v => !(v.entityType === entityType && v.subTitle === entitySubtitle));\r\n this.downloadsSource.next(values);\r\n }\r\n\r\n private updateDownloadState(d: Download, entityType: DownloadEntityType, entitySubtitle: string, id: number) {\r\n let values = this.downloadsSource.getValue();\r\n if (d.state === 'PENDING') {\r\n const index = values.findIndex(v => v.entityType === entityType && v.subTitle === entitySubtitle);\r\n if (index >= 0) return; // Don't let us duplicate add\r\n values.push({entityType: entityType, subTitle: entitySubtitle, progress: 0, id});\r\n } else if (d.state === 'IN_PROGRESS') {\r\n const index = values.findIndex(v => v.entityType === entityType && v.subTitle === entitySubtitle);\r\n if (index >= 0) {\r\n values[index].progress = d.progress;\r\n }\r\n } else if (d.state === 'DONE') {\r\n values = values.filter(v => !(v.entityType === entityType && v.subTitle === entitySubtitle));\r\n }\r\n this.downloadsSource.next(values);\r\n\r\n }\r\n\r\n private downloadChapter(chapter: Chapter) {\r\n return this.downloadEntity(chapter);\r\n }\r\n\r\n private downloadVolume(volume: Volume) {\r\n return this.downloadEntity(volume);\r\n }\r\n\r\n private async confirmSize(size: number, entityType: DownloadEntityType) {\r\n const showIosWarning = size > this.IOS_SIZE_WARNING && /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n return (size < this.SIZE_WARNING ||\r\n await this.confirmService.confirm(translate('toasts.confirm-download-size',\r\n {entityType: translate('entity-type.' + entityType), size: bytesPipe.transform(size)})\r\n + (!showIosWarning ? '' : '

' + translate('toasts.confirm-download-size-ios'))));\r\n }\r\n\r\n private downloadBookmarks(bookmarks: PageBookmark[]) {\r\n const downloadType = 'bookmark';\r\n const subtitle = this.downloadSubtitle(downloadType, bookmarks);\r\n\r\n return this.httpClient.post(this.baseUrl + 'download/bookmarks', {bookmarks},\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle, 0)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n\r\n\r\n private processDownload(entity: QueueableDownloadType): void {\r\n const downloadObservable = this.downloadEntity(entity);\r\n console.log('Process Download called for entity: ', entity);\r\n\r\n // When we consume one, we need to take it off the queue\r\n\r\n downloadObservable.subscribe((downloadEvent) => {\r\n // Download completed, process the next item in the queue\r\n if (downloadEvent.state === 'DONE') {\r\n this.processNextDownload();\r\n }\r\n });\r\n }\r\n\r\n private processNextDownload(): void {\r\n const currentQueue = this.downloadQueue.value;\r\n if (currentQueue.length > 0) {\r\n const nextEntity = currentQueue[0];\r\n this.processDownload(nextEntity);\r\n }\r\n }\r\n\r\n private enqueueDownload(entity: QueueableDownloadType): void {\r\n const currentQueue = this.downloadQueue.value;\r\n const newQueue = [...currentQueue, entity];\r\n this.downloadQueue.next(newQueue);\r\n\r\n // If the queue was empty, start processing the download\r\n if (currentQueue.length === 0) {\r\n this.processNextDownload();\r\n }\r\n }\r\n\r\n mapToEntityType(events: DownloadEvent[], entity: Series | Volume | Chapter | UserCollection | PageBookmark | RecentlyAddedItem | NextExpectedChapter) {\r\n if(this.utilityService.isSeries(entity)) {\r\n return events.find(e => e.entityType === 'series' && e.id == entity.id\r\n && e.subTitle === this.downloadSubtitle('series', (entity as Series))) || null;\r\n }\r\n if(this.utilityService.isVolume(entity)) {\r\n return events.find(e => e.entityType === 'volume' && e.id == entity.id\r\n && e.subTitle === this.downloadSubtitle('volume', (entity as Volume))) || null;\r\n }\r\n if(this.utilityService.isChapter(entity)) {\r\n return events.find(e => e.entityType === 'chapter' && e.id == entity.id\r\n && e.subTitle === this.downloadSubtitle('chapter', (entity as Chapter))) || null;\r\n }\r\n // Is PageBookmark[]\r\n if(entity.hasOwnProperty('length')) {\r\n return events.find(e => e.entityType === 'bookmark'\r\n && e.subTitle === this.downloadSubtitle('bookmark', [(entity as PageBookmark)])) || null;\r\n }\r\n return null;\r\n }\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport { MangaFormat } from '../_models/manga-format';\r\nimport {TranslocoService} from \"@ngneat/transloco\";\r\n\r\n/**\r\n * Returns the string name for the format\r\n */\r\n@Pipe({\r\n name: 'mangaFormat',\r\n standalone: true\r\n})\r\nexport class MangaFormatPipe implements PipeTransform {\r\n\r\n constructor(private translocoService: TranslocoService) {}\r\n\r\n transform(format: MangaFormat): string {\r\n switch (format) {\r\n case MangaFormat.EPUB:\r\n return this.translocoService.translate('manga-format-pipe.epub');\r\n case MangaFormat.ARCHIVE:\r\n return this.translocoService.translate('manga-format-pipe.archive');\r\n case MangaFormat.IMAGE:\r\n return this.translocoService.translate('manga-format-pipe.image');\r\n case MangaFormat.PDF:\r\n return this.translocoService.translate('manga-format-pipe.pdf');\r\n case MangaFormat.UNKNOWN:\r\n return this.translocoService.translate('manga-format-pipe.unknown');\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n}\r\n"],"mappings":"itBAAA,IAAAA,GAAAC,GAAA,CAAAC,EAAAC,IAAA,eAAC,SAAUC,EAAGC,EAAG,CACG,OAAO,QAArB,YAA+B,OAAO,IAAK,OAAO,CAAC,EAAGA,CAAC,EAA0B,OAAOH,EAAtB,IAA+BG,EAAE,GACrGA,EAAE,EAAGD,EAAE,UACI,CAAC,EAGhB,GAAGF,EAAM,UAAY,CACnB,aAEA,SAASG,EAAED,EAAGC,EAAG,CACf,OAAsB,OAAOA,EAAtB,IAA0BA,EAAI,CACnC,QAAS,EACX,EAAgB,OAAOA,GAAnB,WAAyB,QAAQ,KAAK,oDAAoD,EAAGA,EAAI,CACnG,QAAS,CAACA,CACZ,GAAIA,EAAE,SAAW,6EAA6E,KAAKD,EAAE,IAAI,EAAI,IAAI,KAAK,CAAC,SAAUA,CAAC,EAAG,CACnI,KAAMA,EAAE,IACV,CAAC,EAAIA,CACP,CACA,SAASE,EAAEF,EAAGC,EAAG,EAAG,CAClB,IAAI,EAAI,IAAI,eACZ,EAAE,KAAK,MAAOD,CAAC,EAAG,EAAE,aAAe,OAAQ,EAAE,OAAS,UAAY,CAChEG,EAAE,EAAE,SAAUF,EAAG,CAAC,CACpB,EAAG,EAAE,QAAU,UAAY,CACzB,QAAQ,MAAM,yBAAyB,CACzC,EAAG,EAAE,KAAK,CACZ,CACA,SAASG,EAAEJ,EAAG,CACZ,IAAIC,EAAI,IAAI,eACZA,EAAE,KAAK,OAAQD,EAAG,EAAE,EACpB,GAAI,CACFC,EAAE,KAAK,CACT,MAAY,CAAC,CACb,MAAO,MAAOA,EAAE,QAAU,KAAOA,EAAE,MACrC,CACA,SAAS,EAAED,EAAG,CACZ,GAAI,CACFA,EAAE,cAAc,IAAI,WAAW,OAAO,CAAC,CACzC,MAAY,CACV,IAAIC,EAAI,SAAS,YAAY,aAAa,EAC1CA,EAAE,eAAe,QAAS,GAAI,GAAI,OAAQ,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAI,EAAGD,EAAE,cAAcC,CAAC,CACxG,CACF,CACA,IAAII,EAAgB,OAAO,QAAnB,UAA6B,OAAO,SAAW,OAAS,OAAqB,OAAO,MAAnB,UAA2B,KAAK,OAAS,KAAO,KAAmB,OAAO,QAAnB,UAA6B,OAAO,SAAW,OAAS,OAAS,OAC/LL,EAAIK,EAAE,WAAa,YAAY,KAAK,UAAU,SAAS,GAAK,cAAc,KAAK,UAAU,SAAS,GAAK,CAAC,SAAS,KAAK,UAAU,SAAS,EACzIF,EAAIE,EAAE,SAAuB,OAAO,QAAnB,UAA6B,SAAWA,EAAI,UAAY,CAAC,EAAI,aAAc,kBAAkB,WAAa,CAACL,EAAI,SAAUC,EAAGE,EAAGG,EAAG,CACjJ,IAAIC,EAAIF,EAAE,KAAOA,EAAE,UACjBG,EAAI,SAAS,cAAc,GAAG,EAChCL,EAAIA,GAAKF,EAAE,MAAQ,WAAYO,EAAE,SAAWL,EAAGK,EAAE,IAAM,WAAwB,OAAOP,GAAnB,UAAwBO,EAAE,KAAOP,EAAGO,EAAE,SAAW,SAAS,OAAS,EAAEA,CAAC,EAAIJ,EAAEI,EAAE,IAAI,EAAIN,EAAED,EAAGE,EAAGG,CAAC,EAAI,EAAEE,EAAGA,EAAE,OAAS,QAAQ,IAAMA,EAAE,KAAOD,EAAE,gBAAgBN,CAAC,EAAG,WAAW,UAAY,CACxPM,EAAE,gBAAgBC,EAAE,IAAI,CAC1B,EAAG,GAAG,EAAG,WAAW,UAAY,CAC9B,EAAEA,CAAC,CACL,EAAG,CAAC,EACN,EAAI,qBAAsB,UAAY,SAAUH,EAAGF,EAAGG,EAAG,CACvD,GAAIH,EAAIA,GAAKE,EAAE,MAAQ,WAAwB,OAAOA,GAAnB,SAAsB,UAAU,iBAAiBJ,EAAEI,EAAGC,CAAC,EAAGH,CAAC,UAAWC,EAAEC,CAAC,EAAGH,EAAEG,EAAGF,EAAGG,CAAC,MAAO,CAC7H,IAAIC,EAAI,SAAS,cAAc,GAAG,EAClCA,EAAE,KAAOF,EAAGE,EAAE,OAAS,SAAU,WAAW,UAAY,CACtD,EAAEA,CAAC,CACL,CAAC,CACH,CACF,EAAI,SAAUN,EAAGG,EAAGK,EAAGN,EAAG,CACxB,GAAIA,EAAIA,GAAK,KAAK,GAAI,QAAQ,EAAGA,IAAMA,EAAE,SAAS,MAAQA,EAAE,SAAS,KAAK,UAAY,kBAA+B,OAAOF,GAAnB,SAAsB,OAAOC,EAAED,EAAGG,EAAGK,CAAC,EAC/I,IAAI,EAAmCR,EAAE,OAAjC,2BACNM,GAAI,eAAe,KAAKF,EAAE,WAAW,GAAKA,EAAE,OAC5CG,EAAI,eAAe,KAAK,UAAU,SAAS,EAC7C,IAAKA,GAAK,GAAKD,IAAKP,IAAqB,OAAO,WAAtB,IAAkC,CAC1D,IAAIU,EAAI,IAAI,WACZA,EAAE,UAAY,UAAY,CACxB,IAAIV,EAAIU,EAAE,OACVV,EAAIQ,EAAIR,EAAIA,EAAE,QAAQ,eAAgB,uBAAuB,EAAGG,EAAIA,EAAE,SAAS,KAAOH,EAAI,SAAWA,EAAGG,EAAI,IAC9G,EAAGO,EAAE,cAAcT,CAAC,CACtB,KAAO,CACL,IAAIU,EAAIN,EAAE,KAAOA,EAAE,UACjBO,EAAID,EAAE,gBAAgBV,CAAC,EACzBE,EAAIA,EAAE,SAAWS,EAAI,SAAS,KAAOA,EAAGT,EAAI,KAAM,WAAW,UAAY,CACvEQ,EAAE,gBAAgBC,CAAC,CACrB,EAAG,GAAG,CACR,CACF,GACFP,EAAE,OAASF,EAAE,OAASA,EAAkB,OAAOJ,EAAtB,MAAiCA,EAAO,QAAUI,EAC7E,CAAC,IC1ED,SAASU,IAAe,CACtB,OAAO,OAAO,OAAW,IAAc,OAAO,UAAY,MAC5D,CACA,SAASC,GAAiBC,EAAS,CACjC,MAAO,GAAQA,EAAQ,eAAiBA,EAAQ,cAAc,SAAS,YAAY,IAAM,UAC3F,CACA,SAASC,EAAeD,EAAS,CAC/B,OAAOA,EAAQ,SAAS,YAAY,IAAM,KAC5C,CACA,SAASE,GAASF,EAASG,EAAWC,EAAW,CAC/C,OAAIH,EAAeD,CAAO,EACpBI,GAAa,WAAYJ,EAC3BA,EAAQ,OAASG,EAEjBH,EAAQ,IAAMG,EAGhBH,EAAQ,MAAM,gBAAkB,QAAQG,CAAS,KAE5CH,CACT,CACA,SAASK,EAAWC,EAAU,CAC5B,OAAOC,GAAS,CACd,IAAMC,EAAUD,EAAM,cAAc,qBAAqB,QAAQ,EACjE,QAASE,EAAI,EAAGA,EAAID,EAAQ,OAAQC,IAAK,CACvC,IAAMC,EAAYF,EAAQC,CAAC,EAAE,aAAaH,CAAQ,EAC9CI,IAEE,WAAYF,EAAQC,CAAC,EACvBD,EAAQC,CAAC,EAAE,OAASC,EAEpBF,EAAQC,CAAC,EAAE,IAAMC,EAGvB,CACF,CACF,CACA,IAAMC,GAAsBN,EAAW,cAAc,EAC/CO,GAAmBP,EAAW,UAAU,EACxCQ,GAAoBR,EAAW,YAAY,EACjD,SAASS,EAAmBC,EAAc,CACxC,MAAO,CAACf,EAASG,EAAWC,IAAc,CACpCH,EAAeD,CAAO,GAAKD,GAAiBC,CAAO,GACrDe,EAAaf,CAAO,EAElBG,GACFD,GAASF,EAASG,EAAWC,CAAS,CAE1C,CACF,CACA,IAAMY,GAA8BF,EAAmBH,EAAmB,EACpEM,GAA2BH,EAAmBF,EAAgB,EAC9DM,GAA4BJ,EAAmBD,EAAiB,EAChEM,EAAN,KAAY,CACV,aAAc,CACZ,KAAK,UAAYrB,GAAa,CAChC,CACA,cAAcsB,EAAY,CACxB,KAAK,WAAaA,CACpB,CACA,UAAUC,EAAY,CAAC,CACvB,kBAAkBC,EAAe,CAAC,CACpC,EACMC,EAAgB,CACpB,OAAQ,gBACR,QAAS,iBACT,OAAQ,sBACV,EACA,SAASC,GAAmBxB,EAASyB,EAAc,CACjDzB,EAAQ,UAAYA,EAAQ,UAAU,QAAQyB,EAAc,EAAE,CAChE,CACA,SAASC,EAAgB1B,EAASyB,EAAc,CACzCzB,EAAQ,UAAU,SAASyB,CAAY,IAC1CzB,EAAQ,WAAa,IAAIyB,CAAY,GAEzC,CACA,SAASE,GAAgB3B,EAASyB,EAAc,CAC9C,OAAOzB,EAAQ,WAAaA,EAAQ,UAAU,SAASyB,CAAY,CACrE,CACA,IAAMG,EAAN,cAA0BT,CAAM,CAC9B,MAAME,EAAY,CAChBL,GAA4BK,EAAW,QAASA,EAAW,iBAAkBA,EAAW,SAAS,EAC7FA,EAAW,WACbK,EAAgBL,EAAW,QAASE,EAAc,OAAO,EAEvDI,GAAgBN,EAAW,QAASE,EAAc,MAAM,GAC1DC,GAAmBH,EAAW,QAASE,EAAc,MAAM,CAE/D,CACA,QAAQF,EAAY,CAClBK,EAAgBL,EAAW,QAASE,EAAc,MAAM,EACxDC,GAAmBH,EAAW,QAASE,EAAc,OAAO,CAC9D,CACA,UAAUF,EAAY,CACpB,GAAI,KAAK,gBAAgBA,CAAU,EAEjC,MAAO,CAACA,EAAW,SAAS,EAE9B,GAAM,CACJ,QAAArB,EACA,UAAAI,EACA,UAAAD,EACA,OAAA0B,CACF,EAAIR,EACAS,EAoBJ,OAnBI7B,EAAeD,CAAO,GAAKD,GAAiBC,CAAO,GAErD8B,EADoB9B,EAAQ,WAAW,UAAU,EAAI,EACnC,qBAAqB,KAAK,EAAE,CAAC,EAC/CY,GAAiBkB,CAAG,EACpB5B,GAAS4B,EAAK3B,EAAWC,CAAS,IAElC0B,EAAM,IAAI,MACN7B,EAAeD,CAAO,GAAKA,EAAQ,iBACrC8B,EAAI,eAAiB9B,EAAQ,gBAE3BC,EAAeD,CAAO,GAAKA,EAAQ,QACrC8B,EAAI,MAAQ9B,EAAQ,OAElBI,GAAa,WAAY0B,EAC3BA,EAAI,OAAS3B,EAEb2B,EAAI,IAAM3B,GAGV0B,GAAUC,EAAI,OACTA,EAAI,OAAO,EAAE,KAAK,IAAM3B,CAAS,EAEnC,IAAI,QAAQ,CAAC4B,EAASC,IAAW,CACtCF,EAAI,OAAS,IAAMC,EAAQ5B,CAAS,EACpC2B,EAAI,QAAU,IAAME,EAAO,IAAI,CACjC,CAAC,CACH,CACA,cAAcC,EAAOZ,EAAY,CAC/B,GAAM,CACJ,QAAArB,EACA,UAAAI,EACA,eAAA8B,CACF,EAAIb,EACJH,GAA0BlB,EAASkC,EAAgB9B,CAAS,EAC5DsB,EAAgB1B,EAASuB,EAAc,MAAM,CAC/C,CACA,eAAepB,EAAWkB,EAAY,CACpC,GAAM,CACJ,QAAArB,EACA,UAAAI,CACF,EAAIiB,EACJJ,GAAyBjB,EAASG,EAAWC,CAAS,CACxD,CACA,YAAa,CAEX,OAAO+B,GAAiB,KAAK,UAAU,GAAK,CAAC,KAAK,MAAM,CAC1D,CACA,gBAAgBd,EAAY,CAC1B,OAAO,KAAK,MAAMA,CAAU,CAC9B,CACA,MAAMA,EAAY,CAChB,OAAI,KAAK,WAAW,UACX,uOAAuO,KAAK,KAAK,UAAU,SAAS,EAEtQ,EACT,CACF,EACMe,EAAN,cAAwCR,CAAY,CAClD,aAAc,CACZ,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,IAAI,QACrB,KAAK,oBAAsB,IAAIS,EAC/B,KAAK,QAAU,CAAC,CAClB,CACA,cAAchB,EAAY,CACxB,GAAI,KAAK,gBAAgBA,CAAU,EACjC,OAAOiB,EAAG,CACR,eAAgB,EAClB,CAAC,EAEH,GAAIjB,EAAW,iBACb,OAAOA,EAAW,iBAEpB,IAAMkB,EAAqBlB,EAAW,iBAAmB,KAAK,QACxDmB,EAAU,CACd,KAAMnB,EAAW,iBAAmB,IACtC,EACIA,EAAW,SACbmB,EAAQ,WAAa,GAAGnB,EAAW,MAAM,MAE3C,IAAIoB,EAAW,KAAK,UAAU,IAAIF,CAAkB,EACpD,OAAKE,IACHA,EAAW,IAAI,qBAAqBC,GAAU,KAAK,gBAAgBA,CAAM,EAAGF,CAAO,EACnF,KAAK,UAAU,IAAID,EAAoBE,CAAQ,GAEjDA,EAAS,QAAQpB,EAAW,OAAO,EAC5BsB,EAAW,OAAOC,GAAO,CAC9B,IAAMC,EAAe,KAAK,oBAAoB,KAAKC,EAAOC,GAASA,EAAM,SAAW1B,EAAW,OAAO,CAAC,EAAE,UAAUuB,CAAG,EACtH,MAAO,IAAM,CACXC,EAAa,YAAY,EACzBJ,EAAS,UAAUpB,EAAW,OAAO,CACvC,CACF,CAAC,CACH,CACA,UAAU2B,EAAO,CACf,OAAOA,EAAM,cACf,CACA,gBAAgBN,EAAQ,CACtBA,EAAO,QAAQK,GAAS,KAAK,oBAAoB,KAAKA,CAAK,CAAC,CAC9D,CACF,EACA,SAASE,GAAcC,EAAO7B,EAAY,CACxC,OAAO8B,GACEA,EAAe,KAAKC,EAAIC,GAAQhC,EAAW,cAAc,KAAK,CACnE,OAAQ,gBACR,KAAAgC,CACF,CAAC,CAAC,EAAGP,EAAOE,GAASE,EAAM,UAAUF,EAAO3B,CAAU,CAAC,EAAGiC,EAAK,CAAC,EAAGF,EAAI,IAAM/B,EAAW,cAAc,KAAK,CACzG,OAAQ,eACV,CAAC,CAAC,EAAGkC,GAAS,IAAML,EAAM,UAAU7B,CAAU,CAAC,EAAG+B,EAAI,IAAM/B,EAAW,cAAc,KAAK,CACxF,OAAQ,aACV,CAAC,CAAC,EAAG+B,EAAIjD,GAAa+C,EAAM,eAAe/C,EAAWkB,CAAU,CAAC,EAAG+B,EAAI,IAAM/B,EAAW,cAAc,KAAK,CAC1G,OAAQ,mBACV,CAAC,CAAC,EAAGmC,GAAI,IAAM,EAAI,EAAGC,GAAWxB,IAC/BZ,EAAW,cAAc,KAAK,CAC5B,OAAQ,iBACR,KAAMY,CACR,CAAC,EACDiB,EAAM,cAAcjB,EAAOZ,CAAU,EAC9BiB,EAAG,EAAK,EAChB,EAAGc,EAAI,IAAM,CACZ/B,EAAW,cAAc,KAAK,CAC5B,OAAQ,SACV,CAAC,EACD6B,EAAM,QAAQ7B,CAAU,CAC1B,CAAC,CAAC,CAEN,CACA,IAAMqC,GAAuB,IAAIC,EAAe,oBAAoB,EAChEC,IAAuC,IAAM,CAC/C,MAAMA,CAAuB,CAC3B,YAAYC,EAAIC,EAAQ1C,EAAY8B,EAAO,CACzC,KAAK,cAAgB,IAAIa,GACzB,KAAK,WAAaF,EAClB,KAAK,OAASC,EACd,KAAK,iBAAmB,IAAIE,EAC5B,KAAK,MAAQd,EACb,KAAK,MAAM,cAAc9B,CAAU,EACnC,KAAK,IAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CACnD,CACA,aAAc,CACR,KAAK,QAAU,IAAQ,CAAC,KAAK,oBAC/B,KAAK,kBAAoB,KAAK,cAAc,UAAU6C,GAAK,QAAQ,IAAIA,CAAC,CAAC,GAE3E,KAAK,iBAAiB,KAAK,CACzB,QAAS,KAAK,WAAW,cACzB,UAAW,KAAK,UAChB,iBAAkB,KAAK,aACvB,eAAgB,KAAK,WACrB,UAAW,KAAK,UAChB,OAAQ,KAAK,OAAS,KAAK,OAAS,EAAI,EACxC,gBAAiB,KAAK,aACtB,iBAAkB,KAAK,iBACvB,OAAQ,KAAK,OACb,cAAe,KAAK,cACpB,GAAI,KAAK,GACX,CAAC,CACH,CACA,oBAAqB,CACnB,GAAI,KAAK,MAAM,WAAW,EACxB,OAAO,KAET,KAAK,OAAO,kBAAkB,IAAM,CAClC,KAAK,iBAAmB,KAAK,iBAAiB,KAAKb,EAAI/B,GAAc,KAAK,MAAM,kBAAkBA,CAAU,CAAC,EAAG+B,EAAI/B,GAAcA,EAAW,cAAc,KAAK,CAC9J,OAAQ,OACV,CAAC,CAAC,EAAG+B,EAAI/B,GAAc,KAAK,MAAM,MAAMA,CAAU,CAAC,EAAG6C,EAAU7C,GACzDA,EAAW,UAGT,KAAK,MAAM,cAAcA,CAAU,EAAE,KAAK4B,GAAc,KAAK,MAAO5B,CAAU,CAAC,EAF7E8C,GAAM,CAGhB,CAAC,EAAE,UAAU,CACZ,KAAM,IAAM,IACd,CAAC,CACH,CAAC,CACH,CACA,aAAc,CACZ,KAAK,iBAAiB,KAAKb,EAAK,CAAC,CAAC,EAAE,UAAU,CAC5C,KAAMjC,GAAc,KAAK,MAAM,UAAUA,CAAU,CACrD,CAAC,EAAE,YAAY,EACf,KAAK,kBAAkB,YAAY,EACnC,KAAK,mBAAmB,YAAY,CACtC,CACF,CACA,OAAAuC,EAAuB,UAAO,SAAwCQ,EAAG,CACvE,OAAO,IAAKA,GAAKR,GAA2BS,EAAqBC,EAAU,EAAMD,EAAqBE,EAAM,EAAMF,EAAkBG,EAAW,EAAMH,EAAkBX,EAAoB,CAAC,CAC9L,EACAE,EAAuB,UAAyBa,GAAkB,CAChE,KAAMb,EACN,UAAW,CAAC,CAAC,GAAI,WAAY,EAAE,CAAC,EAChC,OAAQ,CACN,UAAW,CAAIc,GAAa,KAAM,WAAY,WAAW,EACzD,aAAc,eACd,WAAY,aACZ,aAAc,eACd,iBAAkB,mBAClB,OAAQ,SACR,UAAW,YACX,OAAQ,SACR,MAAO,OACT,EACA,QAAS,CACP,cAAe,eACjB,EACA,SAAU,CAAIC,CAAoB,CACpC,CAAC,EACMf,CACT,GAAG,EAICgB,IAAoC,IAAM,CAC5C,MAAMA,CAAoB,CAAC,CAC3B,OAAAA,EAAoB,UAAO,SAAqCR,EAAG,CACjE,OAAO,IAAKA,GAAKQ,EACnB,EACAA,EAAoB,UAAyBC,GAAiB,CAC5D,KAAMD,CACR,CAAC,EACDA,EAAoB,UAAyBE,GAAiB,CAC5D,UAAW,CAAC,CACV,QAASpB,GACT,SAAUtB,CACZ,CAAC,CACH,CAAC,EACMwC,CACT,GAAG,EAIGG,EAAN,MAAMC,CAAK,CACT,YAAYC,EAAMC,EAAKC,EAAOC,EAAQ,CACpC,KAAK,KAAOH,EACZ,KAAK,IAAMC,EACX,KAAK,MAAQC,EACb,KAAK,OAASC,CAChB,CACA,OAAO,YAAYpF,EAAS,CAC1B,GAAM,CACJ,KAAAiF,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,CACF,EAAIpF,EAAQ,sBAAsB,EAClC,OAAIiF,IAAS,GAAKC,IAAQ,GAAKC,IAAU,GAAKC,IAAW,EAChDJ,EAAK,MAEL,IAAIA,EAAKC,EAAMC,EAAKC,EAAOC,CAAM,CAE5C,CACA,OAAO,WAAWC,EAAS,CACzB,OAAO,IAAIL,EAAK,EAAG,EAAGK,EAAQ,WAAYA,EAAQ,WAAW,CAC/D,CACA,QAAQC,EAAW,CACjB,KAAK,MAAQA,EACb,KAAK,KAAOA,EACZ,KAAK,OAASA,EACd,KAAK,QAAUA,CACjB,CACA,eAAeC,EAAM,CACnB,OAAOA,EAAK,KAAO,KAAK,OAAS,KAAK,KAAOA,EAAK,OAASA,EAAK,IAAM,KAAK,QAAU,KAAK,IAAMA,EAAK,MACvG,CACA,oBAAoBA,EAAM,CACxB,IAAMN,EAAO,KAAK,IAAI,KAAK,KAAMM,EAAK,IAAI,EACpCL,EAAM,KAAK,IAAI,KAAK,IAAKK,EAAK,GAAG,EACjCJ,EAAQ,KAAK,IAAI,KAAK,MAAOI,EAAK,KAAK,EACvCH,EAAS,KAAK,IAAI,KAAK,OAAQG,EAAK,MAAM,EAChD,OAAIJ,GAASF,GAAQG,GAAUF,EACtB,IAAIF,EAAKC,EAAMC,EAAKC,EAAOC,CAAM,EAEjCJ,EAAK,KAEhB,CACF,EACAD,EAAK,MAAQ,IAAIA,EAAK,EAAG,EAAG,EAAG,CAAC,iBC/VnBS,IAAc,IAAA,CAArB,IAAOA,EAAP,MAAOA,CAAc,CAqCzBC,aAAA,CAnCiB,KAAAC,WAAaC,EAAOC,CAAU,EAC5B,KAAAC,aAAeF,EAAOG,EAAY,EACpC,KAAAC,SAAWJ,EAAOK,EAAS,EAC3B,KAAAC,WAAaN,EAAOO,EAAiB,EACrC,KAAAC,MAAQR,EAAOS,EAAiB,EASxC,KAAAC,MAAgB,GAIhB,KAAAC,OAAiB,GAIhB,KAAAC,cAAyB,GAI1B,KAAAC,QAAkB,GAIlB,KAAAC,OAAkC,CAAA,EAClC,KAAAC,WAAqB,KAAKb,aAAaa,WAM9C,KAAKT,WAAWU,UAAUC,KAAKC,EAAmB,KAAKnB,UAAU,CAAC,EAAEoB,UAAUC,GAAM,CAClF,GAAK,KAAKR,eACNQ,EAAIC,QAAUC,GAAOC,YAAa,CACpC,IAAMC,EAAcJ,EAAIK,QACxB,GAAI,KAAKC,WAAaC,QAAa,KAAKD,WAAa,MAAQ,KAAKA,WAAa,GAAI,OACnF,IAAME,EAAa,KAAK1B,aAAa2B,qBAAqB,KAAKH,QAAQ,EACvE,GAAIE,IAAeJ,EAAYI,WAAY,CAIzC,IAAIE,EAHW,KAAKJ,SAASK,MAAM,GAAG,EAAE,CAAC,EAAEA,MAAM,GAAG,EAGpC,CAAC,EAAEC,QAAQJ,EAAa,MAAO,EAAE,EAC7CE,EAAGG,SAAS,GAAG,IACjBH,EAAKA,EAAGC,MAAM,GAAG,EAAE,CAAC,GAElBD,IAAQN,EAAYM,GAAK,KAC3B,KAAKJ,SAAW,KAAKxB,aAAagC,UAAU,KAAKR,QAAQ,EACzD,KAAKlB,MAAM2B,aAAY,EAE3B,CACF,CACF,CAAC,CACH,CAEAC,aAAW,CACL,KAAK1B,QAAU,IACjB,KAAKN,SAASiC,SAAS,KAAKC,QAAQC,cAAe,QAAS,KAAK7B,KAAK,EAGpE,KAAKC,SAAW,IAClB,KAAKP,SAASiC,SAAS,KAAKC,QAAQC,cAAe,SAAU,KAAK5B,MAAM,EAG1E,IAAM6B,EAAYC,OAAOC,KAAK,KAAK5B,MAAM,EACrC0B,EAAUG,SAAW,GACvBH,EAAUI,QAAQC,GAAM,CACtB,KAAKzC,SAASiC,SAAS,KAAKC,QAAQC,cAAeM,EAAK,KAAK/B,OAAO+B,CAAG,EAAGC,GAAoBC,SAAS,CACzG,CAAC,EAGC,KAAKlC,SAAW,IAClB,KAAKT,SAAS4C,SAAS,KAAKV,QAAQC,cAAe,KAAK1B,OAAO,EAEjE,KAAKL,MAAM2B,aAAY,CACzB,CAGAc,mBAAmB5B,EAAkB,CACnC,IAAM6B,EAAQ,KAAKZ,QAAQC,cAC3B,OAAQlB,EAAM8B,OAAM,CAClB,IAAK,QAEH,MACF,IAAK,gBAIH,MACF,IAAK,gBAEH,MACF,IAAK,cAEH,MACF,IAAK,oBAEH,KAAK/C,SAAS4C,SAASE,EAAO,QAAQ,EACtC,MACF,IAAK,iBAGH,KAAK9C,SAASgD,YAAYF,EAAO,SAAS,EAC1C,KAAK1C,MAAM2B,aAAY,EACvB,MACF,IAAK,UAEH,KACJ,CACF,yCAnHWtC,EAAc,uBAAdA,EAAcwD,UAAA,CAAA,CAAA,WAAA,CAAA,EAAAC,UAAA,SAAAC,EAAAC,EAAA,IAAAD,EAAA,+ZC/B3BE,GAAA,EAAA,MAAA,EAAA,CAAA,EAMKC,GAAA,gBAAA,SAAAC,EAAA,CAAAC,OAAAC,GAAAC,CAAA,EAAAC,GAAiBP,EAAAP,mBAAAU,CAAA,CAA0B,CAAA,CAAA,EANhDK,GAAA,OAIKC,GAAA,WAAAT,EAAA9B,QAAA,EAAqB,aAAA8B,EAAAzC,UAAA,iBDsBdmD,GAAgCC,GAAmBC,EAAA,EAAAtD,OAAA,CAAA;yDAAA,EAAAuD,gBAAA,CAAA,CAAA,EAKzD,IAAOxE,EAAPyE,SAAOzE,CAAc,GAAA,EE9B3B,IAAA0E,GAAuB,SAIVC,GAAQ,IAAIC,EAAsB,OAAO,EAEhD,SAAUC,IAAQ,CACtB,OAAOC,SACT,CCCE,SAASC,GAAkBC,EAAmB,CAC5C,OAAOA,EAAMC,OAASC,EAAcC,QACtC,CAEA,SAASC,GACPJ,EAAyB,CAEzB,OACEA,EAAMC,OAASC,EAAcG,kBAC7BL,EAAMC,OAASC,EAAcI,cAEjC,CAcI,SAAUC,EAASC,EAA2C,CAChE,OAAQC,GACNA,EAAOC,KACLC,GAAK,CAACC,EAAoBZ,IAClBI,GAAoBJ,CAAK,EACpB,CACLa,SAAUb,EAAMc,MACZC,KAAKC,MAAO,IAAMhB,EAAMiB,OAAUjB,EAAMc,KAAK,EAC7CF,EAASC,SACbK,MAAO,cACPC,QAAS,KACTF,OAAQjB,EAAMiB,OACdH,MAAOd,EAAMc,OAGbf,GAAeC,CAAK,GAClBQ,GAASR,EAAMoB,MACjBZ,EAAMR,EAAMoB,KAAMC,GAAYrB,EAAMsB,QAAS,EAAE,CAAC,EAE3C,CACLT,SAAU,IACVK,MAAO,OACPC,QAASnB,EAAMoB,KACfG,SAAUF,GAAYrB,EAAMsB,QAAS,EAAE,IAGpCV,EAET,CAACM,MAAO,UAAWL,SAAU,EAAGM,QAAS,IAAI,CAAC,CAC/C,CAEP,CAGF,SAASE,GAAYC,EAAsBE,EAAmB,CAE1D,IAAID,GADYD,EAAQG,IAAI,qBAAqB,GAAK,IAAIC,MAAM,GAAG,EAC7C,CAAC,EAAEC,QAAQ,YAAa,EAAE,EAAEA,QAAQ,MAAO,EAAE,EAAEC,KAAI,EACzE,GAAIL,EAASM,WAAW,WAAW,GAAKN,EAASM,WAAW,kBAAkB,EAAG,CAC/E,IAAMC,EAAMP,EAASQ,UAAUR,EAASS,YAAY,GAAG,EAAGT,EAASU,MAAM,EACzE,OAAIT,IAAgB,GACXA,EAAcM,EAEhBP,EAASI,QAAQ,UAAW,EAAE,EAAEA,QAAQ,YAAa,EAAE,CAEhE,CACA,OAAOJ,CACT,CC3EF,IAAaW,IAAS,IAAA,CAAhB,IAAOA,EAAP,MAAOA,CAAS,CAcpBC,UAAUC,EAAeC,EAAG,GAAMC,EAAG,EAAC,CACpC,IAAMC,EAASF,EAAK,IAAO,KAE3B,GAAIG,KAAKC,IAAIL,CAAK,EAAIG,EACpB,OAAOH,EAAQ,KAGjB,IAAMM,EAAQL,EACV,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAC/C,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACvDM,EAAI,GACFC,EAAI,IAAIN,EAEd,GACEF,GAASG,EACT,EAAEI,QACKH,KAAKK,MAAML,KAAKC,IAAIL,CAAK,EAAIQ,CAAC,EAAIA,GAAKL,GAAUI,EAAID,EAAMI,OAAS,GAE7E,IAAMC,EAAQX,EAAMY,QAAQV,CAAE,EAC9B,OAAKS,EAAQ,IAAIE,SAAS,IAAI,EACrBb,EAAMY,QAAQ,CAAC,EAAI,IAAMN,EAAMC,CAAC,EAGlCI,EAAQ,IAAML,EAAMC,CAAC,CAC9B,yCAtCWT,EAAS,oCAATA,EAASgB,KAAA,GAAAC,WAAA,EAAA,CAAA,EAAhB,IAAOjB,EAAPkB,SAAOlB,CAAS,GAAA,ECuBf,IAAMmB,EAAgB,IAEvBC,GAAY,IAAIC,GAmCTC,IAAe,IAAA,CAAtB,IAAOA,EAAP,MAAOA,CAAe,CA8B1BC,YAAmCC,EAAW,CAAX,KAAAA,KAAAA,EA5B3B,KAAAC,QAAUC,GAAYC,OAIvB,KAAAC,aAAe,UAId,KAAAC,iBAAmB,UAEnB,KAAAC,gBAAoD,IAAIC,EAAiC,CAAA,CAAE,EAI5F,KAAAC,iBAAmB,KAAKF,gBAAgBG,aAAY,EAEnD,KAAAC,cAA0D,IAAIH,EAAyC,CAAA,CAAE,EAI1G,KAAAI,iBAAmB,KAAKD,cAAcD,aAAY,EAExC,KAAAG,WAAaC,EAAOC,CAAU,EAC9B,KAAAC,eAAiBF,EAAOG,EAAc,EACtC,KAAAC,eAAiBJ,EAAOK,EAAc,EACtC,KAAAC,WAAaN,EAAOO,EAAU,EAC9B,KAAAC,eAAiBR,EAAOS,EAAc,EAGrD,KAAKZ,cAAca,UAAWC,GAAS,CACrC,GAAIA,EAAMC,OAAS,EAAG,CACpB,IAAMC,EAASF,EAAMG,MAAK,EAE1B,GADAC,QAAQC,IAAI,mCAAoCH,CAAM,EAClDA,IAAWI,OAAW,OAC1B,KAAKC,gBAAgBL,CAAM,CAC7B,CACF,CAAC,CACH,CASCM,iBAAiBC,EAAoDC,EAA0C,CAC9G,OAAQD,EAAkB,CACxB,IAAK,SACH,OAAQC,EAA0BC,KACpC,IAAK,SACH,OAAQD,EAA0BE,UAAY,GAChD,IAAK,UACH,OAAQF,EAA2BE,UAAY,GACjD,IAAK,WACH,MAAO,GACT,IAAK,OACH,MAAO,EACX,CACA,MAAO,EACT,CASAC,SAASC,EAAgCZ,EAAwBa,EAA4C,CAC3G,IAAIC,EACAC,EACJ,OAAQH,EAAU,CAChB,IAAK,SACHE,EAAgB,KAAKE,mBAAoBhB,EAAkBiB,EAAE,EAC7DF,EAAe,KAAKG,eAAelB,CAAgB,EACnD,MACF,IAAK,SACHc,EAAgB,KAAKK,mBAAoBnB,EAAkBiB,EAAE,EAC7DF,EAAe,KAAKK,eAAepB,CAAgB,EAEnD,MACF,IAAK,UACHc,EAAgB,KAAKO,oBAAqBrB,EAAmBiB,EAAE,EAC/DF,EAAe,KAAKO,gBAAgBtB,CAAiB,EAErD,MACF,IAAK,WACHc,EAAgBS,EAAG,CAAC,EACpBR,EAAe,KAAKS,kBAAkBxB,CAAwB,EAC9D,MACF,IAAK,OACHc,EAAgBS,EAAG,CAAC,EACpBR,EAAe,KAAKU,aAAY,EAChC,MACF,QACE,MACJ,CAGA,KAAKlC,eAAemC,aAAaC,KAAKC,EAAK,CAAC,EAAGC,EAAUC,GACnDA,GAAQA,EAAKC,YAAYC,sBACpBlB,EAEFS,EAAG,CAAC,CACZ,EAAGM,EAAiBI,GAAQC,EAAA,sBAC3B,OAAO,MAAM,KAAKC,YAAYF,EAAMrB,CAAU,CAChD,EAAC,CAAC,EACAe,KAAKS,EAAOC,GACLA,CACR,EACCD,EAAOE,GAAKvB,IAAiBX,MAAS,EACtCyB,EAAU,KACFd,GAAgBQ,EAAGnB,MAAS,GAAGuB,KACrCY,EAAKC,GAAK,CACJ3B,GAAUA,EAAS2B,CAAC,CAC1B,CAAC,EACDC,GAAWC,GACFA,EAAIC,OAAS,MACrB,EACDC,EAAS,IAAK,CACR/B,GAAUA,EAAST,MAAS,CAClC,CAAC,CAAC,CACL,EAAGyC,EAAmB,KAAK3D,UAAU,CAAC,EACrCW,UAAU,IAAK,CAAE,CAAC,CACtB,CAEQmB,mBAAmB8B,EAAgB,CACzC,OAAO,KAAKrD,WAAWsD,IAAY,KAAKxE,QAAU,iCAAmCuE,CAAQ,CAC/F,CAEQ3B,mBAAmB6B,EAAgB,CACzC,OAAO,KAAKvD,WAAWsD,IAAY,KAAKxE,QAAU,iCAAmCyE,CAAQ,CAC/F,CAEQ3B,oBAAoB4B,EAAiB,CAC3C,OAAO,KAAKxD,WAAWsD,IAAY,KAAKxE,QAAU,mCAAqC0E,CAAS,CAClG,CAEQxB,cAAY,CAClB,IAAMyB,EAAe,OACfC,EAAW,KAAK7C,iBAAiB4C,EAAc9C,MAAS,EAC9D,OAAO,KAAKX,WAAWsD,IAAI,KAAKxE,QAAU,cACxC,CAAC6E,QAAS,SAAUC,aAAc,OAAQC,eAAgB,EAAI,CAAC,EAC/D3B,KACA4B,EAAatF,EAAeuF,EAAgB,CAAEC,QAAS,GAAMC,SAAU,EAAI,CAAE,EAC7E/C,EAAS,CAACgD,EAAMC,IAAY,CAC1B,KAAKtF,KAAKqF,EAAME,mBAAmBD,CAAQ,CAAC,CAC9C,CAAC,EACDrB,EAAKC,GAAM,KAAKsB,oBAAoBtB,EAAGU,EAAcC,EAAU,CAAC,CAAC,EACjEP,EAAS,IAAM,KAAKmB,sBAAsBb,EAAcC,CAAQ,CAAC,CAAC,CAEtE,CAGQa,SAAShE,EAAwB,CACvC,OAAI,KAAKL,eAAesE,SAASjE,CAAM,EAAU,WAC7C,KAAKL,eAAeuE,UAAUlE,CAAM,EAAU,YAC9C,KAAKL,eAAewE,SAASnE,CAAM,EAAU,WAC1C,IACT,CAEQoE,sBAAsBpE,EAAwB,CACpD,OAAI,KAAKL,eAAesE,SAASjE,CAAM,EAAU,SAC7C,KAAKL,eAAeuE,UAAUlE,CAAM,EAAU,UAC9C,KAAKL,eAAewE,SAASnE,CAAM,EAAU,SAC1C,MACT,CAEQQ,eAAkBR,EAAwB,CAChD,IAAMO,EAAqB,KAAK6D,sBAAsBpE,CAAM,EACtDmD,EAAW,KAAK7C,iBAAiBC,EAAoBP,CAAM,EAC3DqE,EAAQ,KAAKL,SAAShE,CAAM,EAC5BsE,EAAM,GAAG,KAAK/F,OAAO,YAAYgC,CAAkB,IAAI8D,CAAK,IAAIrE,EAAOiB,EAAE,GAE/E,OAAO,KAAKxB,WAAWsD,IAAIuB,EAAK,CAAElB,QAAS,SAAUC,aAAc,OAAQC,eAAgB,EAAI,CAAE,EAAE3B,KACjG4B,EAAatF,EAAeuF,EAAgB,CAAEC,QAAS,GAAMC,SAAU,EAAI,CAAE,EAC7E/C,EAAS,CAACgD,EAAMC,IAAY,CAC1B,KAAKtF,KAAKqF,EAAME,mBAAmBD,CAAQ,CAAC,CAC9C,CAAC,EACDrB,EAAKC,GAAM,KAAKsB,oBAAoBtB,EAAGjC,EAAoB4C,EAAUnD,EAAOiB,EAAE,CAAC,EAC/E2B,EAAS,IAAM,KAAKmB,sBAAsBxD,EAAoB4C,CAAQ,CAAC,CAAC,CAE5E,CAEQjC,eAAeqD,EAAc,CAInC,IAAMrB,EAAe,SACfC,EAAW,KAAK7C,iBAAiB4C,EAAcqB,CAAM,EAC3D,OAAO,KAAK9E,WAAWsD,IAAI,KAAKxE,QAAU,4BAA8BgG,EAAOtD,GAC7D,CAACmC,QAAS,SAAUC,aAAc,OAAQC,eAAgB,EAAI,CAAC,EACvE3B,KACA4B,EAAatF,EAAeuF,EAAgB,CAAEC,QAAS,GAAMC,SAAU,EAAI,CAAE,EAC7E/C,EAAS,CAACgD,EAAMC,IAAY,CAC1B,KAAKtF,KAAKqF,EAAME,mBAAmBD,CAAQ,CAAC,CAC9C,CAAC,EACDrB,EAAKC,GAAM,KAAKsB,oBAAoBtB,EAAGU,EAAcC,EAAUoB,EAAOtD,EAAE,CAAC,EACzE2B,EAAS,IAAM,KAAKmB,sBAAsBb,EAAcC,CAAQ,CAAC,CAAC,CAE9E,CAEQY,sBAAsBnD,EAAgC4D,EAAsB,CAClF,IAAIC,EAAS,KAAK7F,gBAAgB8F,SAAQ,EAC1CD,EAASA,EAAOrC,OAAOuC,GAAK,EAAEA,EAAE/D,aAAeA,GAAc+D,EAAEC,WAAaJ,EAAe,EAC3F,KAAK5F,gBAAgBiG,KAAKJ,CAAM,CAClC,CAEQX,oBAAoBtB,EAAa5B,EAAgC4D,EAAwBvD,EAAU,CACzG,IAAIwD,EAAS,KAAK7F,gBAAgB8F,SAAQ,EAC1C,GAAIlC,EAAEG,QAAU,UAAW,CAEzB,GADc8B,EAAOK,UAAUH,GAAKA,EAAE/D,aAAeA,GAAc+D,EAAEC,WAAaJ,CAAc,GACnF,EAAG,OAChBC,EAAOM,KAAK,CAACnE,WAAYA,EAAYgE,SAAUJ,EAAgBQ,SAAU,EAAG/D,GAAAA,CAAE,CAAC,CACjF,SAAWuB,EAAEG,QAAU,cAAe,CACpC,IAAMsC,EAAQR,EAAOK,UAAUH,GAAKA,EAAE/D,aAAeA,GAAc+D,EAAEC,WAAaJ,CAAc,EAC5FS,GAAS,IACXR,EAAOQ,CAAK,EAAED,SAAWxC,EAAEwC,SAE/B,MAAWxC,EAAEG,QAAU,SACrB8B,EAASA,EAAOrC,OAAOuC,GAAK,EAAEA,EAAE/D,aAAeA,GAAc+D,EAAEC,WAAaJ,EAAe,GAE7F,KAAK5F,gBAAgBiG,KAAKJ,CAAM,CAElC,CAEQnD,gBAAgB4D,EAAgB,CACtC,OAAO,KAAK1E,eAAe0E,CAAO,CACpC,CAEQ9D,eAAe+D,EAAc,CACnC,OAAO,KAAK3E,eAAe2E,CAAM,CACnC,CAEchD,YAAYF,EAAcrB,EAA8B,QAAAsB,EAAA,sBACpE,IAAMkD,EAAiBnD,EAAO,KAAKtD,kBAAoB,mBAAmB0G,KAAKC,UAAUC,SAAS,EAClG,OAAQtD,EAAO,KAAKvD,eAClB,MAAM,KAAKW,eAAemG,QAAQC,EAAU,+BAC1C,CAAC7E,WAAY6E,EAAU,eAAiB7E,CAAU,EAAGqB,KAAM/D,GAAUwH,UAAUzD,CAAI,CAAC,CAAC,GACnFmD,EAAsB,aAAeK,EAAU,kCAAkC,EAAhE,GAAkE,EAC3F,GAEQjE,kBAAkBmE,EAAyB,CACjD,IAAMzC,EAAe,WACfC,EAAW,KAAK7C,iBAAiB4C,EAAcyC,CAAS,EAE9D,OAAO,KAAKlG,WAAWmG,KAAK,KAAKrH,QAAU,qBAAsB,CAACoH,UAAAA,CAAS,EACzD,CAACvC,QAAS,SAAUC,aAAc,OAAQC,eAAgB,EAAI,CAAC,EACvE3B,KACA4B,EAAatF,EAAeuF,EAAgB,CAAEC,QAAS,GAAMC,SAAU,EAAI,CAAE,EAC7E/C,EAAS,CAACgD,EAAMC,IAAY,CAC1B,KAAKtF,KAAKqF,EAAME,mBAAmBD,CAAQ,CAAC,CAC9C,CAAC,EACDrB,EAAKC,GAAM,KAAKsB,oBAAoBtB,EAAGU,EAAcC,EAAU,CAAC,CAAC,EACjEP,EAAS,IAAM,KAAKmB,sBAAsBb,EAAcC,CAAQ,CAAC,CAAC,CAE9E,CAIQ9C,gBAAgBL,EAA6B,CACnD,IAAM6F,EAAqB,KAAKrF,eAAeR,CAAM,EACrDE,QAAQC,IAAI,uCAAwCH,CAAM,EAI1D6F,EAAmBhG,UAAWiG,GAAiB,CAEzCA,EAAcnD,QAAU,QAC1B,KAAKoD,oBAAmB,CAE5B,CAAC,CACH,CAEQA,qBAAmB,CACzB,IAAMC,EAAe,KAAKhH,cAAciH,MACxC,GAAID,EAAajG,OAAS,EAAG,CAC3B,IAAMmG,EAAaF,EAAa,CAAC,EACjC,KAAK3F,gBAAgB6F,CAAU,CACjC,CACF,CAEQC,gBAAgBnG,EAA6B,CACnD,IAAMgG,EAAe,KAAKhH,cAAciH,MAClCG,EAAW,CAAC,GAAGJ,EAAchG,CAAM,EACzC,KAAKhB,cAAc6F,KAAKuB,CAAQ,EAG5BJ,EAAajG,SAAW,GAC1B,KAAKgG,oBAAmB,CAE5B,CAEAM,gBAAgBC,EAAyBtG,EAA2G,CAClJ,OAAG,KAAKL,eAAewE,SAASnE,CAAM,EAC7BsG,EAAOC,KAAKC,GAAKA,EAAE5F,aAAe,UAAY4F,EAAEvF,IAAMjB,EAAOiB,IAC/DuF,EAAE5B,WAAa,KAAKtE,iBAAiB,SAAWN,CAAiB,CAAC,GAAK,KAE3E,KAAKL,eAAesE,SAASjE,CAAM,EAC7BsG,EAAOC,KAAKC,GAAKA,EAAE5F,aAAe,UAAY4F,EAAEvF,IAAMjB,EAAOiB,IAC/DuF,EAAE5B,WAAa,KAAKtE,iBAAiB,SAAWN,CAAiB,CAAC,GAAK,KAE3E,KAAKL,eAAeuE,UAAUlE,CAAM,EAC9BsG,EAAOC,KAAKC,GAAKA,EAAE5F,aAAe,WAAc4F,EAAEvF,IAAMjB,EAAOiB,IACjEuF,EAAE5B,WAAa,KAAKtE,iBAAiB,UAAYN,CAAkB,CAAC,GAAK,KAG7EA,EAAOyG,eAAe,QAAQ,GACxBH,EAAOC,KAAKC,GAAKA,EAAE5F,aAAe,YACpC4F,EAAE5B,WAAa,KAAKtE,iBAAiB,WAAY,CAAEN,CAAuB,CAAC,CAAC,GAAK,IAG1F,yCA3TW5B,GAAesI,GA8BNC,EAAK,CAAA,CAAA,yBA9BdvI,EAAewI,QAAfxI,EAAeyI,UAAAC,WAFd,MAAM,CAAA,EAEd,IAAO1I,EAAP2I,SAAO3I,CAAe,GAAA,ECvD5B,IAAa4I,IAAe,IAAA,CAAtB,IAAOA,EAAP,MAAOA,CAAe,CAE1BC,YAAoBC,EAAkC,CAAlC,KAAAA,iBAAAA,CAAqC,CAEzDC,UAAUC,EAAmB,CAC3B,OAAQA,EAAM,CACZ,KAAKC,EAAYC,KACf,OAAO,KAAKJ,iBAAiBK,UAAU,wBAAwB,EACjE,KAAKF,EAAYG,QACf,OAAO,KAAKN,iBAAiBK,UAAU,2BAA2B,EACpE,KAAKF,EAAYI,MACf,OAAO,KAAKP,iBAAiBK,UAAU,yBAAyB,EAClE,KAAKF,EAAYK,IACf,OAAO,KAAKR,iBAAiBK,UAAU,uBAAuB,EAChE,KAAKF,EAAYM,QACf,OAAO,KAAKT,iBAAiBK,UAAU,2BAA2B,EACpE,QACE,MAAO,EACX,CACF,yCAnBWP,GAAeY,EAAAC,GAAA,EAAA,CAAA,CAAA,0CAAfb,EAAec,KAAA,GAAAC,WAAA,EAAA,CAAA,EAAtB,IAAOf,EAAPgB,SAAOhB,CAAe,GAAA","names":["require_FileSaver_min","__commonJSMin","exports","module","a","b","c","g","d","f","h","i","j","e","k","l","m","getNavigator","isChildOfPicture","element","isImageElement","setImage","imagePath","useSrcset","setSources","attrName","image","sources","i","attrValue","setSourcesToDefault","setSourcesToLazy","setSourcesToError","setImageAndSources","setSourcesFn","setImageAndSourcesToDefault","setImageAndSourcesToLazy","setImageAndSourcesToError","Hooks","platformId","attributes","newAttributes","cssClassNames","removeCssClassName","cssClassName","addCssClassName","hasCssClassName","SharedHooks","decode","img","resolve","reject","error","errorImagePath","isPlatformServer","IntersectionObserverHooks","Subject","of","scrollContainerKey","options","observer","entrys","Observable","obs","subscription","filter","entry","event","lazyLoadImage","hooks","evntObservable","tap","data","take","mergeMap","map","catchError","LAZYLOAD_IMAGE_HOOKS","InjectionToken","LazyLoadImageDirective","el","ngZone","EventEmitter","ReplaySubject","e","switchMap","never","t","ɵɵdirectiveInject","ElementRef","NgZone","PLATFORM_ID","ɵɵdefineDirective","InputFlags","ɵɵNgOnChangesFeature","LazyLoadImageModule","ɵɵdefineNgModule","ɵɵdefineInjector","Rect","_Rect","left","top","right","bottom","_window","inflateBy","rect","ImageComponent","constructor","destroyRef","inject","DestroyRef","imageService","ImageService","renderer","Renderer2","hubService","MessageHubService","cdRef","ChangeDetectorRef","width","height","processEvents","classes","styles","errorImage","messages$","pipe","takeUntilDestroyed","subscribe","res","event","EVENTS","CoverUpdate","updateEvent","payload","imageUrl","undefined","entityType","getEntityTypeFromUrl","id","split","replace","includes","randomize","markForCheck","ngOnChanges","setStyle","imgElem","nativeElement","styleKeys","Object","keys","length","forEach","key","RendererStyleFlags2","Important","addClass","myCallbackFunction","image","reason","removeClass","selectors","viewQuery","rf","ctx","ɵɵelementStart","ɵɵlistener","$event","i0","ɵɵrestoreView","_r1","ɵɵresetView","ɵɵelementEnd","ɵɵproperty","CommonModule","LazyLoadImageModule","LazyLoadImageDirective","changeDetection","_ImageComponent","import_file_saver","SAVER","InjectionToken","getSaver","saveAs","isHttpResponse","event","type","HttpEventType","Response","isHttpProgressEvent","DownloadProgress","UploadProgress","download","saver","source","pipe","scan","previous","progress","total","Math","round","loaded","state","content","body","getFilename","headers","filename","defaultName","get","split","replace","trim","startsWith","ext","substring","lastIndexOf","length","BytesPipe","transform","bytes","si","dp","thresh","Math","abs","units","u","r","round","length","fixed","toFixed","endsWith","pure","standalone","_BytesPipe","DEBOUNCE_TIME","bytesPipe","BytesPipe","DownloadService","constructor","save","baseUrl","environment","apiUrl","SIZE_WARNING","IOS_SIZE_WARNING","downloadsSource","BehaviorSubject","activeDownloads$","asObservable","downloadQueue","queuedDownloads$","destroyRef","inject","DestroyRef","confirmService","ConfirmService","accountService","AccountService","httpClient","HttpClient","utilityService","UtilityService","subscribe","queue","length","entity","shift","console","log","undefined","processDownload","downloadSubtitle","downloadEntityType","downloadEntity","name","minNumber","download","entityType","callback","sizeCheckCall","downloadCall","downloadSeriesSize","id","downloadSeries","downloadVolumeSize","downloadVolume","downloadChapterSize","downloadChapter","of","downloadBookmarks","downloadLogs","currentUser$","pipe","take","switchMap","user","preferences","promptForDownloadSize","size","__async","confirmSize","filter","wantsToDownload","_","tap","d","takeWhile","val","state","finalize","takeUntilDestroyed","seriesId","get","volumeId","chapterId","downloadType","subtitle","observe","responseType","reportProgress","throttleTime","asyncScheduler","leading","trailing","blob","filename","decodeURIComponent","updateDownloadState","finalizeDownloadState","getIdKey","isVolume","isChapter","isSeries","getDownloadEntityType","idKey","url","series","entitySubtitle","values","getValue","v","subTitle","next","findIndex","push","progress","index","chapter","volume","showIosWarning","test","navigator","userAgent","confirm","translate","transform","bookmarks","post","downloadObservable","downloadEvent","processNextDownload","currentQueue","value","nextEntity","enqueueDownload","newQueue","mapToEntityType","events","find","e","hasOwnProperty","ɵɵinject","SAVER","factory","ɵfac","providedIn","_DownloadService","MangaFormatPipe","constructor","translocoService","transform","format","MangaFormat","EPUB","translate","ARCHIVE","IMAGE","PDF","UNKNOWN","ɵɵdirectiveInject","TranslocoService","pure","standalone","_MangaFormatPipe"],"x_google_ignoreList":[0,1]}