genus-pdf-viewer 0.1.13 → 0.2.1
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.
- package/README.md +128 -63
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/{workers → dist}/pdf.worker.min.mjs +0 -0
- package/dist/styles.css +132 -0
- package/dist/styles.d.ts +2 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +212 -0
- package/dist/styles.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/viewer.d.ts +27 -0
- package/dist/viewer.d.ts.map +1 -0
- package/dist/viewer.js +678 -0
- package/dist/viewer.js.map +1 -0
- package/package.json +51 -20
- package/fesm2022/genus-pdf-viewer.mjs +0 -1346
- package/fesm2022/genus-pdf-viewer.mjs.map +0 -1
- package/genus-pdf-viewer-0.1.13.tgz +0 -0
- package/index.d.ts +0 -119
- package/schematics/collection.json +0 -10
- package/schematics/ng-add/index.js +0 -171
- package/schematics/ng-add/schema.json +0 -27
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"genus-pdf-viewer.mjs","sources":["../../../projects/genus-pdf-viewer/src/lib/genus-pdf-viewer.ts","../../../projects/genus-pdf-viewer/src/lib/pdfjs-worker.provider.ts","../../../projects/genus-pdf-viewer/src/public-api.ts","../../../projects/genus-pdf-viewer/src/genus-pdf-viewer.ts"],"sourcesContent":["import { Component, Input, ViewChild, ElementRef, OnChanges, SimpleChanges, effect, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type {\n DocumentInitParameters,\n PDFDocumentLoadingTask,\n PDFDocumentProxy,\n PDFPageProxy,\n} from 'pdfjs-dist/types/src/display/api';\n\n@Component({\n selector: 'genus-pdf-viewer',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"genus-pdf-shell\">\n <ng-content select=\"[toolbar]\"></ng-content>\n\n <div class=\"genus-pdf-toolbar\" *ngIf=\"showToolbar\">\n <button type=\"button\" title=\"Zoom out\" aria-label=\"Zoom out\" (click)=\"zoomOut()\">−</button>\n <span class=\"pct\">{{ (zoomSig() * 100) | number:'1.0-0' }}%</span>\n <button type=\"button\" title=\"Zoom in\" aria-label=\"Zoom in\" (click)=\"zoomIn()\">+</button>\n <button type=\"button\" *ngIf=\"isZoomed()\" title=\"Reset zoom to 100%\" aria-label=\"Reset zoom to 100%\" (click)=\"resetZoom()\">100%</button>\n <span class=\"spacer\"></span>\n <button type=\"button\" title=\"Previous page\" aria-label=\"Previous page\" (click)=\"prevPage()\" [disabled]=\"pageSig() <= 1\">⟨</button>\n <span>{{ pageSig() }} / {{ pageCount() }}</span>\n <button type=\"button\" title=\"Next page\" aria-label=\"Next page\" (click)=\"nextPage()\" [disabled]=\"doc ? pageSig() >= doc.numPages : true\">⟩</button>\n <span class=\"spacer\"></span>\n <button type=\"button\" class=\"download-btn\" title=\"Download\" aria-label=\"Download\" (click)=\"download()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 3v10m0 0 4-4m-4 4-4-4M5 15v3a3 3 0 0 0 3 3h8a3 3 0 0 0 3-3v-3\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </button>\n </div>\n\n <div class=\"genus-pdf-stage\" #singleStage [style.display]=\"continuous ? 'none' : 'flex'\" [class.can-pan]=\"canPan()\" [class.is-panning]=\"isPanning()\" (pointerdown)=\"onPointerDown($event, singleStage)\" (wheel)=\"onWheel($event, singleStage)\" (scroll)=\"onScroll($event)\">\n <iframe *ngIf=\"iframeFallbackSrc()\" class=\"genus-pdf-iframe\" [src]=\"iframeFallbackSrc()\" title=\"PDF document\"></iframe>\n <div class=\"genus-pdf-overlay\" *ngIf=\"loading() && !iframeFallbackSrc()\"><div class=\"spinner\" aria-label=\"Loading\"></div></div>\n <div class=\"genus-pdf-overlay error\" *ngIf=\"error() && !iframeFallbackSrc()\">\n <div style=\"display:flex;flex-direction:column;gap:8px;align-items:center;\">\n <span>{{ error() }}</span>\n <button type=\"button\" (click)=\"retryLoad()\">Retry</button>\n </div>\n </div>\n <canvas #canvas [style.display]=\"iframeFallbackSrc() ? 'none' : 'block'\"></canvas>\n </div>\n\n <div class=\"genus-pdf-stage genus-pdf-stage--continuous\" #stage [style.display]=\"continuous ? 'block' : 'none'\" [class.can-pan]=\"canPan()\" [class.is-panning]=\"isPanning()\" (pointerdown)=\"onPointerDown($event, stage)\" (wheel)=\"onWheel($event, stage)\" (scroll)=\"onScroll($event)\">\n <iframe *ngIf=\"iframeFallbackSrc()\" class=\"genus-pdf-iframe\" [src]=\"iframeFallbackSrc()\" title=\"PDF document\"></iframe>\n <div class=\"genus-pdf-overlay\" *ngIf=\"loading() && !iframeFallbackSrc()\"><div class=\"spinner\" aria-label=\"Loading\"></div></div>\n <div class=\"genus-pdf-overlay error\" *ngIf=\"error() && !iframeFallbackSrc()\">\n <div style=\"display:flex;flex-direction:column;gap:8px;align-items:center;\">\n <span>{{ error() }}</span>\n <button type=\"button\" (click)=\"retryLoad()\">Retry</button>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .genus-pdf-shell { display:flex; flex-direction:column; gap:8px; width:100%; height:100%; background:#f3f4f6; }\n .genus-pdf-toolbar { position:sticky; top:0; z-index:2; display:flex; align-items:center; gap:8px; padding:6px 8px; border:1px solid #e5e7eb; border-radius:8px; background:#ffffffd9; backdrop-filter:saturate(1.2) blur(6px); box-shadow:0 1px 2px rgba(0,0,0,0.06); }\n .genus-pdf-toolbar .pct { min-width: 48px; text-align:center; font-variant-numeric: tabular-nums; color:#111827; }\n .genus-pdf-toolbar button { appearance:none; border:1px solid #e5e7eb; background:#fff; padding:6px 10px; border-radius:6px; cursor:pointer; color:#111827; font-size:14px; line-height:1; font-weight:500; min-width:32px; user-select:none; display:inline-flex; align-items:center; gap:6px; }\n .genus-pdf-toolbar button.download-btn { background:#2563eb; border-color:#2563eb; color:#fff; }\n .genus-pdf-toolbar button.download-btn:hover { background:#1d4ed8; border-color:#1d4ed8; }\n .genus-pdf-toolbar button:disabled { opacity:0.5; cursor:not-allowed; }\n .genus-pdf-toolbar .spacer { flex:1; }\n .genus-pdf-stage { position:relative; flex:1; overflow:auto; display:flex; align-items:flex-start; justify-content:center; background:#fafafa; touch-action: pan-y; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; overscroll-behavior-y: contain; }\n .genus-pdf-stage.can-pan { cursor: grab; touch-action: none; }\n .genus-pdf-stage.is-panning { cursor: grabbing; }\n .genus-pdf-stage--continuous { display:block; align-items:unset; justify-content:unset; padding:8px; scroll-behavior:smooth; }\n .genus-pdf-stage--continuous .pdf-page { margin:0 auto 12px auto; background:white; box-shadow:0 1px 2px rgba(0,0,0,0.08); }\n canvas { display:block; max-width:100%; height:auto; }\n .genus-pdf-iframe { width:100%; height:100%; border:0; background:#fff; }\n .genus-pdf-overlay { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; background:rgba(255,255,255,0.7); z-index:1; }\n .genus-pdf-overlay.error { background:transparent; }\n .spinner { width:28px; height:28px; border-radius:50%; border:3px solid #e5e7eb; border-top-color:#111827; animation:spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0) } to { transform: rotate(360deg) } }\n `]\n})\nexport class GenusPdfViewerComponent implements OnChanges {\n private static inlineWorkerSetupPromise: Promise<void> | null = null;\n private readonly sanitizer = inject(DomSanitizer);\n\n @Input() src!: string | URL | Uint8Array | Blob;\n @Input() page = 1;\n @Input() zoom = 1.0;\n @Input() maxZoom = 4;\n @Input() minZoom = 0.25;\n @Input() fit: 'width'|'height'|'page'|'none' = 'width';\n @Input() disableTextLayer = true;\n @Input() continuous = true;\n @Input() showToolbar = true;\n @Input() zoomAnimation = true;\n @Input() zoomAnimationMs = 180;\n @Input() gestureAnimationMs = 120;\n @Input() loadTimeoutMs = 45000;\n @Input() allowIframeFallback = true;\n @Input() withCredentials = false;\n @Input() httpHeaders?: Record<string, string>;\n\n @ViewChild('canvas', { static: false }) canvas!: ElementRef<HTMLCanvasElement>;\n @ViewChild('singleStage', { static: false }) singleStage!: ElementRef<HTMLDivElement>;\n @ViewChild('stage', { static: false }) stage!: ElementRef<HTMLDivElement>;\n\n doc?: PDFDocumentProxy;\n private currentPage?: PDFPageProxy;\n\n pageSig = signal(1);\n zoomSig = signal(1);\n isPanning = signal(false);\n canPan = signal(false);\n loading = signal(false);\n error = signal<string | null>(null);\n iframeFallbackSrc = signal<SafeResourceUrl | null>(null);\n private readonly PRINT_SCALE = 2;\n private scrollRaf = 0 as any;\n private renderLockCount = 0;\n private zoomAnimInFlight = false;\n private activeRenderTasks = new Set<any>();\n private wheelRaf = 0 as any;\n private pinchState: { id1: number; id2: number; startDist: number; startZoom: number } | null = null;\n private activePointers = new Map<number, { x: number; y: number; type: string }>();\n private renderVersion = 0;\n private previewActive = false;\n private reRenderQueued = false;\n private pendingAnchor: { page: number; ratio: number } | undefined;\n private lastZoomClient: { x: number; y: number } | null = null;\n private readonly WHEEL_STEP = 0.02;\n private readonly PINCH_SENSITIVITY = 0.5;\n private wheelCommitTimer = 0 as any;\n private lastLoadError: unknown = null;\n \n\n constructor() {\n effect(() => {\n // Only react to zoom changes here; page changes in continuous mode should NOT trigger a re-render\n this.zoomSig();\n if (this.renderLockCount > 0 || this.previewActive) return;\n this.safeRender();\n });\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['page']) this.pageSig.set(this.page);\n if (changes['zoom']) this.zoomSig.set(this.zoom);\n\n const srcChanged = !!changes['src'];\n const layoutChanged = !!(changes['fit'] || changes['minZoom'] || changes['maxZoom']);\n\n if (!this.src) return;\n\n if (srcChanged) {\n await this.loadDocument();\n\n if (this.doc) {\n const pages = this.doc.numPages;\n if (this.pageSig() < 1) this.pageSig.set(1);\n if (this.pageSig() > pages) this.pageSig.set(pages);\n await this.render();\n }\n return;\n }\n\n if (layoutChanged) {\n if (this.continuous) {\n const container = this.stage?.nativeElement;\n const anchor = container ? this.captureScrollAnchor(container) || undefined : undefined;\n await this.renderAllPages(anchor);\n } else {\n await this.render();\n }\n return;\n }\n\n if (!this.continuous && changes['page']) {\n await this.render();\n }\n }\n\n async safeRender() {\n try { await this.render(); } catch (_) {}\n }\n\n private async loadDocument() {\n this.loading.set(true);\n this.error.set(null);\n this.iframeFallbackSrc.set(null);\n this.lastLoadError = null;\n if (this.doc) {\n try { await this.doc.destroy(); } catch {}\n this.doc = undefined;\n }\n try {\n this.doc = await this.loadDocumentWithFallbacks(this.src);\n if (!this.doc) {\n if (!this.tryEnableIframeFallback()) {\n this.error.set(this.buildLoadErrorMessage());\n }\n }\n } catch {\n this.doc = undefined;\n if (!this.tryEnableIframeFallback()) {\n this.error.set(this.buildLoadErrorMessage());\n }\n } finally {\n this.loading.set(false);\n }\n }\n\n private async loadDocumentWithFallbacks(src: string | URL | Uint8Array | Blob): Promise<PDFDocumentProxy | undefined> {\n await this.ensureInlineWorkerFallback();\n const workerCandidates = this.getWorkerSrcCandidates();\n const baseTimeout = this.getEffectiveLoadTimeoutMs();\n const primary = this.createPrimaryParams(src);\n if (primary && workerCandidates.length) {\n for (let i = 0; i < workerCandidates.length; i++) {\n this.applyWorkerSrc(workerCandidates[i]);\n const timeoutMs = i === 0 ? baseTimeout : Math.min(baseTimeout, 12000);\n const doc = await this.tryLoadDocument(primary, timeoutMs);\n if (doc) return doc;\n }\n } else if (primary) {\n const doc = await this.tryLoadDocument(primary, baseTimeout);\n if (doc) return doc;\n }\n\n const bytes = await this.toPdfBytes(src);\n if (!bytes) return undefined;\n\n const byteParams: DocumentInitParameters = {\n data: bytes,\n disableRange: true,\n disableStream: true,\n disableAutoFetch: true,\n stopAtErrors: true,\n };\n if (workerCandidates.length) {\n for (let i = 0; i < workerCandidates.length; i++) {\n this.applyWorkerSrc(workerCandidates[i]);\n const timeoutMs = i === 0 ? baseTimeout : Math.min(baseTimeout, 12000);\n const doc = await this.tryLoadDocument(byteParams, timeoutMs);\n if (doc) return doc;\n }\n return undefined;\n }\n return this.tryLoadDocument(byteParams, baseTimeout);\n }\n\n private createPrimaryParams(src: string | URL | Uint8Array | Blob): DocumentInitParameters | null {\n if (typeof src === 'string') {\n return {\n url: src,\n withCredentials: this.withCredentials,\n httpHeaders: this.httpHeaders,\n stopAtErrors: true,\n };\n }\n if (src instanceof URL) {\n return {\n url: src.toString(),\n withCredentials: this.withCredentials,\n httpHeaders: this.httpHeaders,\n stopAtErrors: true,\n };\n }\n if (src instanceof Uint8Array) {\n const copy = new Uint8Array(src.byteLength);\n copy.set(src);\n return {\n data: copy,\n disableRange: true,\n disableStream: true,\n disableAutoFetch: true,\n stopAtErrors: true,\n };\n }\n return null;\n }\n\n private async tryLoadDocument(params: DocumentInitParameters, timeoutMs: number): Promise<PDFDocumentProxy | undefined> {\n const task = pdfjsLib.getDocument(params as any) as PDFDocumentLoadingTask;\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n if (timeoutMs <= 0) {\n return await task.promise;\n }\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('PDF load timeout')), timeoutMs);\n });\n return await Promise.race([task.promise, timeoutPromise]);\n } catch (e) {\n this.lastLoadError = e;\n try { await task.destroy(); } catch {}\n return undefined;\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private getEffectiveLoadTimeoutMs(): number {\n if (!Number.isFinite(this.loadTimeoutMs)) return 45000;\n if (this.loadTimeoutMs <= 0) return 0;\n return Math.max(5000, this.loadTimeoutMs);\n }\n\n private async ensureInlineWorkerFallback(): Promise<void> {\n if (typeof window === 'undefined') return;\n const g = globalThis as any;\n if (g?.pdfjsWorker?.WorkerMessageHandler) return;\n if (!GenusPdfViewerComponent.inlineWorkerSetupPromise) {\n GenusPdfViewerComponent.inlineWorkerSetupPromise = (async () => {\n try {\n // @ts-ignore pdfjs-dist worker entry does not ship declaration files.\n const workerModule: any = await import('pdfjs-dist/build/pdf.worker.min.mjs');\n if (workerModule?.WorkerMessageHandler) {\n g.pdfjsWorker = { ...(g.pdfjsWorker || {}), WorkerMessageHandler: workerModule.WorkerMessageHandler };\n }\n } catch {}\n })();\n }\n await GenusPdfViewerComponent.inlineWorkerSetupPromise;\n }\n\n private resolveBundledWorkerSrc(): string | null {\n try {\n return new URL('../workers/pdf.worker.min.mjs', import.meta.url).toString();\n } catch {\n return null;\n }\n }\n\n private getWorkerSrcCandidates(): string[] {\n const options = (pdfjsLib as any).GlobalWorkerOptions || {};\n const current = typeof options.workerSrc === 'string' ? options.workerSrc : '';\n const bundled = this.resolveBundledWorkerSrc() || '';\n const assetJs = '/assets/pdf.worker.min.js';\n const assetMjs = '/assets/pdf.worker.min.mjs';\n const candidates = [bundled, current, assetJs, assetMjs].filter((v) => !!v);\n return Array.from(new Set(candidates));\n }\n\n private applyWorkerSrc(workerSrc: string): void {\n const options = (pdfjsLib as any).GlobalWorkerOptions || {};\n options.workerPort = null;\n options.workerSrc = workerSrc;\n }\n\n private buildLoadErrorMessage(): string {\n const raw = this.extractErrorText(this.lastLoadError).trim();\n const lower = raw.toLowerCase();\n if (lower.includes('worker')) {\n return 'PDF worker bootstrap failed. Check CSP/network restrictions for dynamic imports and retry.';\n }\n if (lower.includes('cors') || lower.includes('network') || lower.includes('fetch')) {\n return 'PDF request failed. Check file URL, network, and CORS policy, then retry.';\n }\n if (lower.includes('password')) {\n return 'This PDF appears to be password protected.';\n }\n return 'Failed to load PDF. Check URL/CORS and worker setup, then retry.';\n }\n\n private tryEnableIframeFallback(): boolean {\n if (!this.allowIframeFallback) return false;\n if (!this.isLikelyNetworkOrCorsError()) return false;\n const href = this.toFallbackHref(this.src);\n if (!href) return false;\n this.iframeFallbackSrc.set(this.sanitizer.bypassSecurityTrustResourceUrl(href));\n this.error.set(null);\n this.pageSig.set(1);\n return true;\n }\n\n private isLikelyNetworkOrCorsError(): boolean {\n const lower = this.extractErrorText(this.lastLoadError).toLowerCase();\n return (\n lower.includes('cors') ||\n lower.includes('network') ||\n lower.includes('fetch') ||\n lower.includes('load failed') ||\n lower.includes('failed to fetch') ||\n lower.includes('securityerror')\n );\n }\n\n private toFallbackHref(src: string | URL | Uint8Array | Blob): string | null {\n if (typeof window === 'undefined') return null;\n if (typeof src === 'string') {\n try {\n const url = new URL(src, window.location.href);\n if (!['http:', 'https:', 'blob:', 'data:'].includes(url.protocol)) return null;\n return url.toString();\n } catch {\n return null;\n }\n }\n if (src instanceof URL) {\n if (!['http:', 'https:', 'blob:', 'data:'].includes(src.protocol)) return null;\n return src.toString();\n }\n return null;\n }\n\n private extractErrorText(error: unknown): string {\n if (!error) return '';\n if (typeof error === 'string') return error;\n if (typeof error === 'object') {\n const maybeMessage = (error as { message?: unknown }).message;\n if (typeof maybeMessage === 'string') return maybeMessage;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n return String(error);\n }\n\n private async toPdfBytes(src: string | URL | Uint8Array | Blob): Promise<Uint8Array | null> {\n if (src instanceof Uint8Array) {\n const copy = new Uint8Array(src.byteLength);\n copy.set(src);\n return copy;\n }\n if (src instanceof Blob) {\n try {\n return new Uint8Array(await src.arrayBuffer());\n } catch {\n return null;\n }\n }\n const href = typeof src === 'string' ? src : src.toString();\n if (typeof fetch === 'undefined') return null;\n try {\n const res = await fetch(href, {\n mode: 'cors',\n headers: this.httpHeaders,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) return null;\n return new Uint8Array(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n async render() {\n if (!this.doc) return;\n const version = ++this.renderVersion;\n if (this.continuous) {\n await this.renderAllPages();\n return;\n }\n\n const pageNum = this.pageSig();\n const pdfPage = await this.doc.getPage(pageNum);\n this.currentPage = pdfPage;\n\n const canvas = this.canvas?.nativeElement;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n\n const baseViewport = pdfPage.getViewport({ scale: 1 });\n const parent = canvas.parentElement!;\n const anchor = this.captureScrollAnchor(parent) || undefined;\n const pW = parent.clientWidth, pH = parent.clientHeight || baseViewport.height;\n\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (pW - 16) / baseViewport.width;\n if (this.fit === 'height') baseScale = (pH - 16) / baseViewport.height;\n if (this.fit === 'page') baseScale = Math.min((pW - 16) / baseViewport.width, (pH - 16) / baseViewport.height);\n\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n this.canPan.set(finalScale > baseScale + 0.001);\n const viewport = pdfPage.getViewport({ scale: finalScale });\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = pdfPage.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n if (anchor) this.restoreScrollAnchor(parent, anchor);\n }\n\n private async renderAllPages(anchorOverride?: { page: number; ratio: number }) {\n if (!this.doc) return;\n const stageEl = this.stage?.nativeElement;\n if (!stageEl) return;\n const version = ++this.renderVersion;\n const anchor = anchorOverride ?? this.captureScrollAnchor(stageEl);\n const total = this.doc.numPages;\n const parentRect = stageEl.getBoundingClientRect();\n const parentWidth = parentRect.width || stageEl.clientWidth || 800;\n let computedCanPan = false;\n const existing = Array.from(stageEl.querySelectorAll<HTMLElement>('.pdf-page'));\n const isInitialBuild = existing.length !== total;\n this.renderLockCount++;\n try {\n if (isInitialBuild) {\n stageEl.innerHTML = '';\n const contentEl = document.createElement('div');\n contentEl.className = 'pdf-content';\n stageEl.appendChild(contentEl);\n for (let i = 1; i <= total; i++) {\n const page = await this.doc.getPage(i);\n const baseViewport = page.getViewport({ scale: 1 });\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (parentWidth - 16) / baseViewport.width;\n if (this.fit === 'page') baseScale = (parentWidth - 16) / baseViewport.width;\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n if (i === 1) computedCanPan = finalScale > baseScale + 0.001;\n const viewport = page.getViewport({ scale: finalScale });\n\n const wrapper = document.createElement('div');\n wrapper.className = 'pdf-page';\n wrapper.setAttribute('data-page', String(i));\n wrapper.style.width = Math.floor(viewport.width) + 'px';\n wrapper.style.height = Math.floor(viewport.height) + 'px';\n wrapper.style.margin = '0 auto 12px auto';\n\n const canvas = document.createElement('canvas');\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const ctx = canvas.getContext('2d')!;\n\n wrapper.appendChild(canvas);\n contentEl.appendChild(wrapper);\n\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = page.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n }\n } else {\n let contentEl = stageEl.querySelector<HTMLElement>('.pdf-content');\n if (!contentEl) {\n contentEl = document.createElement('div');\n contentEl.className = 'pdf-content';\n const pages = Array.from(stageEl.querySelectorAll<HTMLElement>('.pdf-page'));\n for (const el of pages) contentEl.appendChild(el);\n stageEl.appendChild(contentEl);\n }\n for (let i = 1; i <= total; i++) {\n const page = await this.doc.getPage(i);\n const baseViewport = page.getViewport({ scale: 1 });\n let baseScale = 1;\n if (this.fit === 'width') baseScale = (parentWidth - 16) / baseViewport.width;\n if (this.fit === 'page') baseScale = (parentWidth - 16) / baseViewport.width;\n const minScale = baseScale * this.minZoom;\n const maxScale = baseScale * this.maxZoom;\n const finalScale = Math.max(minScale, Math.min(maxScale, baseScale * this.zoomSig()));\n if (i === 1) computedCanPan = finalScale > baseScale + 0.001;\n const viewport = page.getViewport({ scale: finalScale });\n\n const wrapper = existing[i - 1];\n const canvas = wrapper.querySelector('canvas') as HTMLCanvasElement;\n wrapper.style.width = Math.floor(viewport.width) + 'px';\n wrapper.style.height = Math.floor(viewport.height) + 'px';\n const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n canvas.style.width = Math.floor(viewport.width) + 'px';\n canvas.style.height = Math.floor(viewport.height) + 'px';\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n const ctx = canvas.getContext('2d')!;\n const renderCtx: any = { canvasContext: ctx, viewport };\n if (dpr !== 1) renderCtx.transform = [dpr, 0, 0, dpr, 0, 0];\n const task = page.render(renderCtx);\n await task.promise;\n if (this.renderVersion !== version) return;\n }\n }\n this.canPan.set(computedCanPan);\n if (anchor) this.restoreScrollAnchor(stageEl, anchor);\n } finally {\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n }\n }\n\n async goTo(page: number) {\n if (!this.doc) return;\n const p = Math.max(1, Math.min(this.doc.numPages, page));\n this.pageSig.set(p);\n if (this.continuous) {\n const stageEl = this.stage?.nativeElement;\n const el = stageEl?.querySelector(`[data-page=\"${p}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n } else {\n await this.render();\n }\n }\n async zoomIn(step = 0.1) { await this.applyZoomDelta(step); }\n async zoomOut(step = 0.1) { await this.applyZoomDelta(-step); }\n\n private clampZoom(z: number): number {\n return Math.max(this.minZoom, Math.min(this.maxZoom, z));\n }\n\n private cancelPreviewIfAny(container?: HTMLElement): void {\n if (!this.previewActive || !container) return;\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n try {\n target.style.transform = '';\n target.style.willChange = '';\n target.style.transition = '';\n } catch {}\n this.previewActive = false;\n this.lastZoomClient = null;\n }\n\n private async applyZoomDelta(delta: number): Promise<void> {\n const oldZoom = this.zoomSig();\n const newZoom = this.clampZoom(oldZoom + delta);\n if (Math.abs(newZoom - oldZoom) < 0.0001) return;\n\n const container = this.continuous ? this.stage?.nativeElement : this.singleStage?.nativeElement;\n // If a preview transform is active (from pinch/wheel), clear it before capturing anchor or animating\n this.cancelPreviewIfAny(container);\n const anchor = container ? this.captureScrollAnchor(container) || undefined : undefined;\n const ratio = newZoom / oldZoom;\n\n if (this.zoomAnimation && container && !this.zoomAnimInFlight) {\n this.zoomAnimInFlight = true;\n this.renderLockCount++;\n // Update UI value immediately\n this.zoomSig.set(newZoom);\n try {\n await this.runZoomAnimation(container, ratio);\n } finally {\n // Release the render lock before triggering the actual re-render\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n await this.safeReRenderWithCancellation(anchor);\n this.zoomAnimInFlight = false;\n }\n } else {\n this.zoomSig.set(newZoom);\n await this.safeReRenderWithCancellation(anchor);\n }\n }\n\n private async runZoomAnimation(container: HTMLElement, ratio: number): Promise<void> {\n if (Math.abs(ratio - 1) < 0.0001) return;\n const { target, originX, originY } = this.getZoomAnimTarget(container);\n return new Promise<void>((resolve) => {\n try {\n const onDone = () => {\n cleanup();\n resolve();\n };\n const cleanup = () => {\n target.removeEventListener('transitionend', onEnd as any);\n target.style.transition = '';\n target.style.transform = '';\n target.style.transformOrigin = '';\n target.style.willChange = '';\n };\n const onEnd = () => onDone();\n target.style.willChange = 'transform';\n target.style.transformOrigin = `${Math.max(0, originX)}px ${Math.max(0, originY)}px`;\n target.style.transition = 'none';\n target.style.transform = 'scale(1)';\n requestAnimationFrame(() => {\n target.addEventListener('transitionend', onEnd as any, { once: true } as any);\n target.style.transition = `transform ${this.zoomAnimationMs}ms cubic-bezier(0.2,0,0,1)`;\n target.style.transform = `scale(${ratio})`;\n setTimeout(onDone, this.zoomAnimationMs + 60);\n });\n } catch {\n resolve();\n }\n });\n }\n\n private getZoomAnimTarget(container: HTMLElement): { target: HTMLElement; originX: number; originY: number } {\n const isContinuous = this.continuous;\n let target: HTMLElement | null = null;\n if (isContinuous) {\n target = container.querySelector<HTMLElement>('.pdf-content');\n if (!target) target = container; // fallback\n } else {\n target = container.querySelector<HTMLElement>('canvas');\n if (!target) target = container; // fallback\n }\n const rectLeft = target.offsetLeft;\n const rectTop = target.offsetTop;\n // Prefer last gesture point (pinch center or wheel pointer) if available\n const client = this.lastZoomClient;\n const originX = client ? (container.scrollLeft + client.x - rectLeft) : (container.scrollLeft + container.clientWidth / 2 - rectLeft);\n const originY = client ? (container.scrollTop + client.y - rectTop) : (container.scrollTop + container.clientHeight / 2 - rectTop);\n return { target, originX, originY };\n }\n\n onScroll(evt: Event) {\n const container = evt.target as HTMLElement;\n // debounce via rAF\n if (this.scrollRaf) cancelAnimationFrame(this.scrollRaf);\n this.scrollRaf = requestAnimationFrame(() => {\n if (!this.doc || !this.continuous) return;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('.pdf-page'));\n if (!pages.length) return;\n const centerY = container.scrollTop + container.clientHeight / 2;\n let current = this.pageSig();\n for (const el of pages) {\n const top = el.offsetTop;\n const bottom = top + el.offsetHeight;\n if (centerY >= top && centerY <= bottom) {\n const p = parseInt(el.getAttribute('data-page') || '1', 10);\n current = p;\n break;\n }\n }\n if (current !== this.pageSig()) this.pageSig.set(current);\n });\n }\n\n async nextPage() { await this.goTo(this.pageSig() + 1); }\n async prevPage() { await this.goTo(this.pageSig() - 1); }\n\n pageCount(): number {\n return this.doc?.numPages ?? (this.iframeFallbackSrc() ? 1 : 0);\n }\n\n isZoomed(): boolean {\n return Math.abs(this.zoomSig() - 1) > 0.0001;\n }\n\n async resetZoom() {\n // Reset to exactly 1.0 (100%)\n const delta = 1 - this.zoomSig();\n await this.applyZoomDelta(delta);\n }\n\n async retryLoad() {\n await this.loadDocument();\n if (this.doc) {\n const pages = this.doc.numPages;\n if (this.pageSig() < 1) this.pageSig.set(1);\n if (this.pageSig() > pages) this.pageSig.set(pages);\n await this.render();\n }\n }\n\n onPointerDown(evt: PointerEvent, containerEl: HTMLElement) {\n // Pinch-to-zoom (two pointers)\n if (evt.pointerType === 'touch') {\n this.activePointers.set(evt.pointerId, { x: evt.clientX, y: evt.clientY, type: evt.pointerType });\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerType === 'touch') this.activePointers.set(e.pointerId, { x: e.clientX, y: e.clientY, type: e.pointerType });\n const touches = Array.from(this.activePointers.entries()).map(([id, p]) => ({ pointerId: id, clientX: p.x, clientY: p.y }))\n .slice(0, 2);\n if (touches.length === 2) {\n const [a, b] = touches;\n const dist = Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n if (!this.pinchState) {\n this.pinchState = { id1: a.pointerId, id2: b.pointerId, startDist: Math.max(1, dist), startZoom: this.zoomSig() };\n const rect = containerEl.getBoundingClientRect();\n this.lastZoomClient = { x: ((a.clientX + b.clientX) / 2) - rect.left, y: ((a.clientY + b.clientY) / 2) - rect.top };\n }\n const scale = dist / Math.max(1, this.pinchState.startDist);\n const adjusted = 1 + (scale - 1) * this.PINCH_SENSITIVITY;\n const desiredAdj = this.clampZoom(this.pinchState.startZoom * adjusted);\n this.previewZoom(containerEl, desiredAdj);\n e.preventDefault();\n return;\n }\n // When pinch ends (not exactly two touches), commit render if we were previewing\n if (this.pinchState) {\n const final = this.zoomSig();\n this.commitPreviewZoom(containerEl, final);\n this.pinchState = null;\n this.lastZoomClient = null;\n }\n };\n const onPointerEnd = (e: PointerEvent) => {\n this.activePointers.delete(e.pointerId);\n const touches = Array.from(this.activePointers.values());\n if (touches.length !== 2 && this.pinchState) {\n const final = this.zoomSig();\n this.commitPreviewZoom(containerEl, final);\n this.pinchState = null;\n this.lastZoomClient = null;\n }\n cleanup();\n };\n const cleanup = () => {\n containerEl.removeEventListener('pointermove', onPointerMove);\n containerEl.removeEventListener('pointerup', onPointerEnd);\n containerEl.removeEventListener('pointercancel', onPointerEnd);\n this.activePointers.clear();\n };\n containerEl.addEventListener('pointermove', onPointerMove);\n containerEl.addEventListener('pointerup', onPointerEnd);\n containerEl.addEventListener('pointercancel', onPointerEnd);\n return;\n }\n\n // Mouse pan when canPan\n if (!this.canPan()) return;\n this.isPanning.set(true);\n const startX = evt.clientX;\n const startY = evt.clientY;\n const startLeft = containerEl.scrollLeft;\n const startTop = containerEl.scrollTop;\n containerEl.style.scrollBehavior = 'auto';\n containerEl.setPointerCapture?.(evt.pointerId);\n const move = (e: PointerEvent) => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n containerEl.scrollLeft = startLeft - dx;\n containerEl.scrollTop = startTop - dy;\n e.preventDefault();\n };\n const end = (e: PointerEvent) => {\n this.isPanning.set(false);\n containerEl.releasePointerCapture?.(evt.pointerId);\n containerEl.removeEventListener('pointermove', move);\n containerEl.removeEventListener('pointerup', end);\n containerEl.removeEventListener('pointercancel', end);\n containerEl.style.scrollBehavior = 'smooth';\n };\n containerEl.addEventListener('pointermove', move);\n containerEl.addEventListener('pointerup', end);\n containerEl.addEventListener('pointercancel', end);\n }\n\n private getActiveTouches(containerEl: HTMLElement): PointerEvent[] {\n // We capture pointer events only on this element; maintain list by querying PointerEvent.getCoalescedEvents not available broadly.\n // Instead, rely on touches reported in native events; browsers will deliver move events for all active pointers targeting the element.\n // Here we cannot query directly; so we return an empty array and use move handler state. For simplicity, we derive from event stream only.\n // This helper remains for future extension; current logic passes actual events to compute pinch.\n return [] as any;\n }\n\n onWheel(evt: WheelEvent, containerEl: HTMLElement) {\n const isCtrlZoom = evt.ctrlKey || evt.metaKey;\n if (!isCtrlZoom) return;\n evt.preventDefault();\n const rect = containerEl.getBoundingClientRect();\n // Record gesture point relative to container\n this.lastZoomClient = { x: evt.clientX - rect.left, y: evt.clientY - rect.top };\n if (this.wheelRaf) cancelAnimationFrame(this.wheelRaf);\n if (this.wheelCommitTimer) clearTimeout(this.wheelCommitTimer);\n const delta = -evt.deltaY;\n const step = delta > 0 ? this.WHEEL_STEP : -this.WHEEL_STEP;\n const desired = this.clampZoom(this.zoomSig() + step);\n this.previewZoom(containerEl, desired);\n this.wheelRaf = requestAnimationFrame(() => {\n this.wheelCommitTimer = setTimeout(() => {\n this.commitPreviewZoom(containerEl, this.zoomSig());\n this.lastZoomClient = null;\n }, this.gestureAnimationMs + 20);\n });\n }\n\n private previewZoom(container: HTMLElement, newZoom: number) {\n const oldZoom = this.zoomSig();\n if (Math.abs(newZoom - oldZoom) < 0.0001) return;\n const ratio = newZoom / oldZoom;\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n const origin = this.getZoomAnimTarget(container);\n target.style.willChange = 'transform';\n target.style.transformOrigin = `${Math.max(0, origin.originX)}px ${Math.max(0, origin.originY)}px`;\n target.style.transition = `transform ${this.gestureAnimationMs}ms cubic-bezier(0.2,0,0,1)`;\n target.style.transform = `scale(${ratio})`;\n this.zoomSig.set(newZoom);\n this.previewActive = true;\n }\n\n private async commitPreviewZoom(container: HTMLElement, expectedZoom: number) {\n // Clear transform and re-render once; cancel any in-flight render tasks\n const target = this.continuous ? (container.querySelector('.pdf-content') as HTMLElement || container) : (container.querySelector('canvas') as HTMLElement || container);\n target.style.transform = '';\n target.style.willChange = '';\n target.style.transition = '';\n const anchor = this.captureScrollAnchor(container) || undefined;\n if (this.previewActive) {\n await this.safeReRenderWithCancellation(anchor);\n this.previewActive = false;\n }\n }\n\n private async safeReRenderWithCancellation(anchor?: { page: number; ratio: number }) {\n // If a render is in progress, queue once with the most recent anchor\n if (this.renderLockCount > 0) {\n this.reRenderQueued = true;\n if (anchor) this.pendingAnchor = anchor;\n return;\n }\n try {\n this.renderLockCount++;\n if (this.continuous) {\n await this.renderAllPages(anchor);\n } else {\n await this.render();\n }\n } finally {\n this.renderLockCount = Math.max(0, this.renderLockCount - 1);\n if (this.renderLockCount === 0 && this.reRenderQueued) {\n const nextAnchor = this.pendingAnchor;\n this.reRenderQueued = false;\n this.pendingAnchor = undefined;\n await this.safeReRenderWithCancellation(nextAnchor);\n }\n }\n }\n\n private captureScrollAnchor(container: HTMLElement, client?: { x: number; y: number } | null): { page: number; ratio: number } | null {\n try {\n const pages = Array.from(container.querySelectorAll<HTMLElement>('.pdf-page'));\n const centerY = container.scrollTop + container.clientHeight / 2;\n if (pages.length > 0) {\n let pageEl = pages.find(el => (el.offsetTop <= centerY && (el.offsetTop + el.offsetHeight) >= centerY))\n || pages.find(el => (el.offsetTop + el.offsetHeight) > (container.scrollTop + 1))\n || pages[0];\n const page = parseInt(pageEl.getAttribute('data-page') || '1', 10);\n const height = Math.max(1, pageEl.offsetHeight);\n const ratio = Math.max(0, Math.min(1, (centerY - pageEl.offsetTop) / height));\n return { page, ratio };\n }\n // Fallback: single-canvas mode\n const canvas = container.querySelector('canvas');\n if (!canvas) return null;\n const height = Math.max(1, (canvas as HTMLElement).offsetHeight);\n const ratio = Math.max(0, Math.min(1, (centerY - (canvas as HTMLElement).offsetTop) / height));\n return { page: 1, ratio };\n } catch {\n return null;\n }\n }\n\n private restoreScrollAnchor(container: HTMLElement, anchor: { page: number; ratio: number }): void {\n try {\n let el = container.querySelector<HTMLElement>(`[data-page=\"${anchor.page}\"]`);\n if (!el) el = container.querySelector<HTMLElement>('canvas');\n if (!el) return;\n const prevBehavior = container.style.scrollBehavior;\n container.style.scrollBehavior = 'auto';\n const height = Math.max(1, el.offsetHeight);\n const desired = el.offsetTop + anchor.ratio * height - container.clientHeight / 2;\n const maxScroll = Math.max(0, container.scrollHeight - container.clientHeight);\n container.scrollTop = Math.max(0, Math.min(maxScroll, desired));\n container.style.scrollBehavior = prevBehavior;\n } catch {}\n }\n\n async download() {\n const filename = this.deriveFilename();\n const link = document.createElement('a');\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && (navigator as any).maxTouchPoints > 1);\n let popup: Window | null = null;\n if (isIOS) {\n // Open a tab synchronously to stay within user gesture\n try { popup = window.open('', '_blank', 'noopener,noreferrer'); } catch { popup = null; }\n }\n\n const blob = await this.createBlobFromSrc();\n if (blob) {\n const url = URL.createObjectURL(blob);\n if (isIOS) {\n if (popup) {\n try { popup.location.href = url; } catch { /* ignore */ }\n // Revoke later to allow the view to load fully\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n } else {\n const a = document.createElement('a');\n a.href = url;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 30000);\n }\n } else {\n link.href = url;\n link.download = filename;\n link.rel = 'noopener';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n }\n return;\n }\n\n // Fallback: cross-origin without CORS\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (!href) return;\n if (isIOS) {\n if (popup) {\n try { popup.location.href = href; } catch { /* ignore */ }\n } else {\n const a = document.createElement('a');\n a.href = href;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n } else {\n link.href = href;\n link.target = '_blank';\n link.rel = 'noopener';\n link.download = filename; // browsers may ignore for cross-origin\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n }\n\n async print() {\n // Robust, plugin-free printing by rendering pages to images\n const ok = await this.printViaImages();\n if (ok) return;\n // Fallbacks\n const blob = await this.createBlobFromSrc();\n if (blob) {\n const url = URL.createObjectURL(blob);\n const win = window.open('', '_blank', 'noopener,noreferrer');\n if (win) {\n win.document.write('<!doctype html><html><head><title>Print</title><meta charset=\"utf-8\"><style>html,body{height:100%;margin:0}@page{size:auto;margin:0} iframe{border:0;width:100%;height:100%}</style></head><body><iframe src=\"' + url + '\"></iframe></body></html>');\n win.document.close();\n setTimeout(() => { try { win.focus(); win.print(); } catch {} }, 800);\n win.onafterprint = () => { try { win.close(); } catch {} URL.revokeObjectURL(url); };\n } else {\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed'; iframe.style.right = '0'; iframe.style.bottom = '0';\n iframe.style.width = '0'; iframe.style.height = '0'; iframe.style.border = '0';\n iframe.src = url; document.body.appendChild(iframe);\n iframe.onload = () => { try { setTimeout(() => iframe.contentWindow?.print(), 800); } catch {} setTimeout(() => { URL.revokeObjectURL(url); iframe.remove(); }, 3000); };\n }\n return;\n }\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (href) window.open(href, '_blank');\n }\n\n private async printViaImages(): Promise<boolean> {\n try {\n let doc = this.doc;\n if (!doc) {\n doc = await this.loadDocumentWithFallbacks(this.src);\n }\n if (!doc) return false;\n const win = window.open('', '_blank', 'noopener,noreferrer');\n if (!win) return false;\n win.document.write('<!doctype html><html><head><meta charset=\"utf-8\"><title>Print</title><style>@page{size:auto;margin:0} html,body{margin:0;padding:0} .page{page-break-after:always;}</style></head><body></body></html>');\n win.document.close();\n\n for (let i = 1; i <= doc.numPages; i++) {\n const page = await doc.getPage(i);\n const vp = page.getViewport({ scale: this.PRINT_SCALE });\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(vp.width);\n canvas.height = Math.floor(vp.height);\n const ctx = canvas.getContext('2d')!;\n await page.render({ canvas, canvasContext: ctx, viewport: vp }).promise;\n const img = win.document.createElement('img');\n img.className = 'page';\n img.style.width = '100%';\n img.style.display = 'block';\n img.src = canvas.toDataURL('image/png');\n win.document.body.appendChild(img);\n }\n setTimeout(() => { try { win.focus(); win.print(); } catch {} }, 300);\n win.onafterprint = () => { try { win.close(); } catch {} };\n setTimeout(() => { try { win.close(); } catch {} }, 60000);\n return true;\n } catch {\n return false;\n }\n }\n\n private async createBlobFromSrc(): Promise<Blob | null> {\n if (!this.src) return null;\n if (this.src instanceof Blob) return this.src;\n if (this.src instanceof Uint8Array) {\n const ab = new ArrayBuffer(this.src.byteLength);\n new Uint8Array(ab).set(this.src);\n return new Blob([ab], { type: 'application/pdf' });\n }\n const href = typeof this.src === 'string' ? this.src : (this.src instanceof URL ? this.src.toString() : '');\n if (!href || typeof fetch === 'undefined') return null;\n try {\n const res = await fetch(href, {\n mode: 'cors',\n headers: this.httpHeaders,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) return null;\n const blob = await res.blob();\n return blob.type ? blob : new Blob([await res.arrayBuffer()], { type: 'application/pdf' });\n } catch {\n return null;\n }\n }\n\n private deriveFilename(): string {\n if (typeof this.src === 'string') {\n try { const u = new URL(this.src, window.location.origin); return this.basename(u.pathname) || 'document.pdf'; } catch { return 'document.pdf'; }\n }\n if (this.src instanceof URL) {\n return this.basename(this.src.pathname) || 'document.pdf';\n }\n return 'document.pdf';\n }\n\n private basename(path: string): string {\n const last = path.split('/').filter(Boolean).pop() || '';\n return last.endsWith('.pdf') ? last : (last ? last + '.pdf' : 'document.pdf');\n }\n}\n","import { APP_INITIALIZER, InjectionToken, Provider, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport type GenusPdfWorkerConfig = {\n /** Try ESM module worker first (best); falls back to workerSrc if creation fails. */\n tryModuleWorker?: boolean;\n /** Optional absolute URL for worker file. If omitted, package-shipped worker is used. */\n workerSrc?: string;\n /** If true, preloads pdf.js worker handler in-package for fake-worker fallback. */\n inlineWorkerFallback?: boolean;\n};\n\nexport const GENUS_PDF_WORKER_CONFIG = new InjectionToken<GenusPdfWorkerConfig>('GENUS_PDF_WORKER_CONFIG');\n\nfunction resolveBundledWorkerUrl(): string | null {\n try {\n return new URL('../workers/pdf.worker.min.mjs', import.meta.url).toString();\n } catch {\n return null;\n }\n}\n\nasync function setupInlineWorkerFallback(): Promise<void> {\n const g = globalThis as any;\n if (g?.pdfjsWorker?.WorkerMessageHandler) return;\n try {\n // @ts-ignore pdfjs-dist worker entry does not ship declaration files.\n const workerModule: any = await import('pdfjs-dist/build/pdf.worker.min.mjs');\n if (workerModule?.WorkerMessageHandler) {\n g.pdfjsWorker = { ...(g.pdfjsWorker || {}), WorkerMessageHandler: workerModule.WorkerMessageHandler };\n }\n } catch {}\n}\n\nfunction initPdfWorkerFactory(cfg: GenusPdfWorkerConfig, platformId: object) {\n return async () => {\n if (!isPlatformBrowser(platformId)) return;\n\n const defaults: Required<Pick<GenusPdfWorkerConfig, 'tryModuleWorker' | 'inlineWorkerFallback'>> = {\n tryModuleWorker: true,\n inlineWorkerFallback: true,\n };\n const merged = { ...defaults, ...cfg };\n\n const globalOptions = (pdfjsLib as any).GlobalWorkerOptions;\n globalOptions.workerPort = null;\n if (merged.inlineWorkerFallback) {\n await setupInlineWorkerFallback();\n }\n if (typeof merged.workerSrc === 'string' && merged.workerSrc.length > 0) {\n globalOptions.workerSrc = merged.workerSrc;\n return;\n }\n const bundledWorkerUrl = resolveBundledWorkerUrl();\n if (!merged.tryModuleWorker) {\n globalOptions.workerSrc = bundledWorkerUrl || '/assets/pdf.worker.min.js';\n return;\n }\n globalOptions.workerSrc = bundledWorkerUrl || '/assets/pdf.worker.min.js';\n };\n}\n\nexport function provideGenusPdfViewer(cfg: GenusPdfWorkerConfig = {}): Provider[] {\n return [\n { provide: GENUS_PDF_WORKER_CONFIG, useValue: cfg },\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: initPdfWorkerFactory,\n deps: [GENUS_PDF_WORKER_CONFIG, PLATFORM_ID],\n },\n ];\n}\n","/*\n * Public API Surface of genus-pdf-viewer\n */\n\nexport * from './lib/genus-pdf-viewer';\nexport { GenusPdfViewerComponent } from './lib/genus-pdf-viewer';\nexport * from './lib/pdfjs-worker.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAmFa,uBAAuB,CAAA;AAC1B,IAAA,OAAO,wBAAwB,GAAyB,IAAI;AACnD,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAExC,IAAA,GAAG;IACH,IAAI,GAAG,CAAC;IACR,IAAI,GAAG,GAAG;IACV,OAAO,GAAG,CAAC;IACX,OAAO,GAAG,IAAI;IACd,GAAG,GAAmC,OAAO;IAC7C,gBAAgB,GAAG,IAAI;IACvB,UAAU,GAAG,IAAI;IACjB,WAAW,GAAG,IAAI;IAClB,aAAa,GAAG,IAAI;IACpB,eAAe,GAAG,GAAG;IACrB,kBAAkB,GAAG,GAAG;IACxB,aAAa,GAAG,KAAK;IACrB,mBAAmB,GAAG,IAAI;IAC1B,eAAe,GAAG,KAAK;AACvB,IAAA,WAAW;AAEoB,IAAA,MAAM;AACD,IAAA,WAAW;AACjB,IAAA,KAAK;AAE5C,IAAA,GAAG;AACK,IAAA,WAAW;AAEnB,IAAA,OAAO,GAAG,MAAM,CAAC,CAAC,mDAAC;AACnB,IAAA,OAAO,GAAG,MAAM,CAAC,CAAC,mDAAC;AACnB,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACzB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AACvB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AACnC,IAAA,iBAAiB,GAAG,MAAM,CAAyB,IAAI,6DAAC;IACvC,WAAW,GAAG,CAAC;IACxB,SAAS,GAAG,CAAQ;IACpB,eAAe,GAAG,CAAC;IACnB,gBAAgB,GAAG,KAAK;AACxB,IAAA,iBAAiB,GAAG,IAAI,GAAG,EAAO;IAClC,QAAQ,GAAG,CAAQ;IACnB,UAAU,GAA8E,IAAI;AAC5F,IAAA,cAAc,GAAG,IAAI,GAAG,EAAkD;IAC1E,aAAa,GAAG,CAAC;IACjB,aAAa,GAAG,KAAK;IACrB,cAAc,GAAG,KAAK;AACtB,IAAA,aAAa;IACb,cAAc,GAAoC,IAAI;IAC7C,UAAU,GAAG,IAAI;IACjB,iBAAiB,GAAG,GAAG;IAChC,gBAAgB,GAAG,CAAQ;IAC3B,aAAa,GAAY,IAAI;AAGrC,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;;YAEV,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa;gBAAE;YACpD,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,WAAW,CAAC,OAAsB,EAAA;QACtC,IAAI,OAAO,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhD,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;QAEpF,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,IAAI,CAAC,YAAY,EAAE;AAEzB,YAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ;AAC/B,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;AAAE,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK;AAAE,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACnD,gBAAA,MAAM,IAAI,CAAC,MAAM,EAAE;YACrB;YACA;QACF;QAEA,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa;AAC3C,gBAAA,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,SAAS;AACvF,gBAAA,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YACnC;iBAAO;AACL,gBAAA,MAAM,IAAI,CAAC,MAAM,EAAE;YACrB;YACA;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB;IACF;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI;AAAE,YAAA,MAAM,IAAI,CAAC,MAAM,EAAE;QAAE;AAAE,QAAA,OAAO,CAAC,EAAE,EAAC;IAC1C;AAEQ,IAAA,MAAM,YAAY,GAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI;AAAE,gBAAA,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAAE;YAAE,MAAM,EAAC;AACzC,YAAA,IAAI,CAAC,GAAG,GAAG,SAAS;QACtB;AACA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;AACzD,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE;oBACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC9C;YACF;QACF;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,GAAG,GAAG,SAAS;AACpB,YAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE;gBACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC9C;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;IAEQ,MAAM,yBAAyB,CAAC,GAAqC,EAAA;AAC3E,QAAA,MAAM,IAAI,CAAC,0BAA0B,EAAE;AACvC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACtD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE;AACtC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC;gBACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;AAC1D,gBAAA,IAAI,GAAG;AAAE,oBAAA,OAAO,GAAG;YACrB;QACF;aAAO,IAAI,OAAO,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC;AAC5D,YAAA,IAAI,GAAG;AAAE,gBAAA,OAAO,GAAG;QACrB;QAEA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;AAE5B,QAAA,MAAM,UAAU,GAA2B;AACzC,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,YAAY,EAAE,IAAI;SACnB;AACD,QAAA,IAAI,gBAAgB,CAAC,MAAM,EAAE;AAC3B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC;gBACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC;AAC7D,gBAAA,IAAI,GAAG;AAAE,oBAAA,OAAO,GAAG;YACrB;AACA,YAAA,OAAO,SAAS;QAClB;QACA,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC;IACtD;AAEQ,IAAA,mBAAmB,CAAC,GAAqC,EAAA;AAC/D,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,OAAO;AACL,gBAAA,GAAG,EAAE,GAAG;gBACR,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,YAAY,EAAE,IAAI;aACnB;QACH;AACA,QAAA,IAAI,GAAG,YAAY,GAAG,EAAE;YACtB,OAAO;AACL,gBAAA,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,YAAY,EAAE,IAAI;aACnB;QACH;AACA,QAAA,IAAI,GAAG,YAAY,UAAU,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;AAC3C,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACb,OAAO;AACL,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,YAAY,EAAE,IAAI;aACnB;QACH;AACA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,MAAM,eAAe,CAAC,MAA8B,EAAE,SAAiB,EAAA;QAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAa,CAA2B;QAC1E,IAAI,KAAK,GAAyC,IAAI;AACtD,QAAA,IAAI;AACF,YAAA,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,gBAAA,OAAO,MAAM,IAAI,CAAC,OAAO;YAC3B;YACA,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,KAAI;AACtD,gBAAA,KAAK,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,SAAS,CAAC;AAC5E,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC3D;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;AACtB,YAAA,IAAI;AAAE,gBAAA,MAAM,IAAI,CAAC,OAAO,EAAE;YAAE;YAAE,MAAM,EAAC;AACrC,YAAA,OAAO,SAAS;QAClB;gBAAU;AACR,YAAA,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC;QAChC;IACF;IAEQ,yBAAyB,GAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;AAAE,YAAA,OAAO,KAAK;AACtD,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC;IAC3C;AAEQ,IAAA,MAAM,0BAA0B,GAAA;QACtC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE;QACnC,MAAM,CAAC,GAAG,UAAiB;AAC3B,QAAA,IAAI,CAAC,EAAE,WAAW,EAAE,oBAAoB;YAAE;AAC1C,QAAA,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,EAAE;AACrD,YAAA,uBAAuB,CAAC,wBAAwB,GAAG,CAAC,YAAW;AAC7D,gBAAA,IAAI;;AAEF,oBAAA,MAAM,YAAY,GAAQ,MAAM,OAAO,qCAAqC,CAAC;AAC7E,oBAAA,IAAI,YAAY,EAAE,oBAAoB,EAAE;AACtC,wBAAA,CAAC,CAAC,WAAW,GAAG,EAAE,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,oBAAoB,EAAE;oBACvG;gBACF;gBAAE,MAAM,EAAC;YACX,CAAC,GAAG;QACN;QACA,MAAM,uBAAuB,CAAC,wBAAwB;IACxD;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAC7E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,OAAO,GAAI,QAAgB,CAAC,mBAAmB,IAAI,EAAE;AAC3D,QAAA,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,EAAE;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,EAAE,IAAI,EAAE;QACpD,MAAM,OAAO,GAAG,2BAA2B;QAC3C,MAAM,QAAQ,GAAG,4BAA4B;QAC7C,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC;AAEQ,IAAA,cAAc,CAAC,SAAiB,EAAA;AACtC,QAAA,MAAM,OAAO,GAAI,QAAgB,CAAC,mBAAmB,IAAI,EAAE;AAC3D,QAAA,OAAO,CAAC,UAAU,GAAG,IAAI;AACzB,QAAA,OAAO,CAAC,SAAS,GAAG,SAAS;IAC/B;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE;AAC5D,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC5B,YAAA,OAAO,4FAA4F;QACrG;QACA,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAClF,YAAA,OAAO,2EAA2E;QACpF;AACA,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC9B,YAAA,OAAO,4CAA4C;QACrD;AACA,QAAA,OAAO,kEAAkE;IAC3E;IAEQ,uBAAuB,GAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAAE,YAAA,OAAO,KAAK;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;AAAE,YAAA,OAAO,KAAK;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;AACvB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;AAC/E,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,QAAA,OAAO,IAAI;IACb;IAEQ,0BAA0B,GAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;AACrE,QAAA,QACE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtB,YAAA,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;AACzB,YAAA,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;AACvB,YAAA,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC7B,YAAA,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AACjC,YAAA,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEnC;AAEQ,IAAA,cAAc,CAAC,GAAqC,EAAA;QAC1D,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,YAAA,IAAI;AACF,gBAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9C,gBAAA,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAAE,oBAAA,OAAO,IAAI;AAC9E,gBAAA,OAAO,GAAG,CAAC,QAAQ,EAAE;YACvB;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,IAAI;YACb;QACF;AACA,QAAA,IAAI,GAAG,YAAY,GAAG,EAAE;AACtB,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC9E,YAAA,OAAO,GAAG,CAAC,QAAQ,EAAE;QACvB;AACA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,gBAAgB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AAC3C,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,YAAY,GAAI,KAA+B,CAAC,OAAO;YAC7D,IAAI,OAAO,YAAY,KAAK,QAAQ;AAAE,gBAAA,OAAO,YAAY;AACzD,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAC9B;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,MAAM,CAAC,KAAK,CAAC;YACtB;QACF;AACA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;IAEQ,MAAM,UAAU,CAAC,GAAqC,EAAA;AAC5D,QAAA,IAAI,GAAG,YAAY,UAAU,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;AAC3C,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACb,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,YAAY,IAAI,EAAE;AACvB,YAAA,IAAI;gBACF,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAChD;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,IAAI;YACb;QACF;AACA,QAAA,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC3D,IAAI,OAAO,KAAK,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;AAC7C,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE;AAC5B,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,CAAC,WAAW;gBACzB,WAAW,EAAE,IAAI,CAAC,eAAe,GAAG,SAAS,GAAG,aAAa;AAC9D,aAAA,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI;YACxB,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAChD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,MAAM,MAAM,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AACf,QAAA,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,aAAa;AACpC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;YAC3B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;AAC/C,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa;AACzC,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE;AAEpC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACtD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,aAAc;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,SAAS;AAC5D,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM;QAE9E,IAAI,SAAS,GAAG,CAAC;AACjB,QAAA,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;YAAG,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK;AACrE,QAAA,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ;YAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC,MAAM;AACtE,QAAA,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM;YAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC;AAEhH,QAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO;AACzC,QAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,GAAG,KAAK,CAAC;AAC/C,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC;AACpG,QAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;AACtD,QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;AACxD,QAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;AAC/C,QAAA,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;QACjD,MAAM,SAAS,GAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE;QACvD,IAAI,GAAG,KAAK,CAAC;AAAE,YAAA,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC,MAAM,IAAI,CAAC,OAAO;AAClB,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE;AACpC,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;IACtD;IAEQ,MAAM,cAAc,CAAC,cAAgD,EAAA;QAC3E,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AACf,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa;AACzC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,aAAa;QACpC,MAAM,MAAM,GAAG,cAAc,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAClE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ;AAC/B,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB,EAAE;QAClD,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,IAAI,GAAG;QAClE,IAAI,cAAc,GAAG,KAAK;AAC1B,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAc,WAAW,CAAC,CAAC;AAC/E,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,KAAK,KAAK;QAChD,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI;YACF,IAAI,cAAc,EAAE;AAClB,gBAAA,OAAO,CAAC,SAAS,GAAG,EAAE;gBACtB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC/C,gBAAA,SAAS,CAAC,SAAS,GAAG,aAAa;AACnC,gBAAA,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;AAC9B,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,oBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;oBACnD,IAAI,SAAS,GAAG,CAAC;AACjB,oBAAA,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;wBAAE,SAAS,GAAG,CAAC,WAAW,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK;AAC7E,oBAAA,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM;wBAAG,SAAS,GAAG,CAAC,WAAW,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK;AAC7E,oBAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO;AACzC,oBAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO;oBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrF,IAAI,CAAC,KAAK,CAAC;AAAE,wBAAA,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK;AAC5D,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;oBAExD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,oBAAA,OAAO,CAAC,SAAS,GAAG,UAAU;oBAC9B,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5C,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;AACvD,oBAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;AACzD,oBAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,kBAAkB;oBAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAC/C,MAAM,GAAG,GAAG,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC;AACpG,oBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;AACtD,oBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;AACxD,oBAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;AAC/C,oBAAA,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;oBACjD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE;AAEpC,oBAAA,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;AAC3B,oBAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;oBAE9B,MAAM,SAAS,GAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE;oBACvD,IAAI,GAAG,KAAK,CAAC;AAAE,wBAAA,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBACnC,MAAM,IAAI,CAAC,OAAO;AAClB,oBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;wBAAE;gBACtC;YACF;iBAAO;gBACL,IAAI,SAAS,GAAG,OAAO,CAAC,aAAa,CAAc,cAAc,CAAC;gBAClE,IAAI,CAAC,SAAS,EAAE;AACd,oBAAA,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACzC,oBAAA,SAAS,CAAC,SAAS,GAAG,aAAa;AACnC,oBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAc,WAAW,CAAC,CAAC;oBAC5E,KAAK,MAAM,EAAE,IAAI,KAAK;AAAE,wBAAA,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;AACjD,oBAAA,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;gBAChC;AACA,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,oBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;oBACnD,IAAI,SAAS,GAAG,CAAC;AACjB,oBAAA,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;wBAAE,SAAS,GAAG,CAAC,WAAW,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK;AAC7E,oBAAA,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM;wBAAG,SAAS,GAAG,CAAC,WAAW,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK;AAC7E,oBAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO;AACzC,oBAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO;oBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrF,IAAI,CAAC,KAAK,CAAC;AAAE,wBAAA,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK;AAC5D,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;oBAExD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAsB;AACnE,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;AACvD,oBAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;oBACzD,MAAM,GAAG,GAAG,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC;AACpG,oBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;AACtD,oBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;AACxD,oBAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;AAC/C,oBAAA,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;oBACjD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE;oBACpC,MAAM,SAAS,GAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE;oBACvD,IAAI,GAAG,KAAK,CAAC;AAAE,wBAAA,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBACnC,MAAM,IAAI,CAAC,OAAO;AAClB,oBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;wBAAE;gBACtC;YACF;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;AAC/B,YAAA,IAAI,MAAM;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC;QACvD;gBAAU;AACR,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC9D;IACF;IAEA,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa;YACzC,MAAM,EAAE,GAAG,OAAO,EAAE,aAAa,CAAC,CAAA,YAAA,EAAe,CAAC,CAAA,EAAA,CAAI,CAAuB;AAC7E,YAAA,EAAE,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5D;aAAO;AACL,YAAA,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB;IACF;AACA,IAAA,MAAM,MAAM,CAAC,IAAI,GAAG,GAAG,EAAA,EAAK,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,IAAA,MAAM,OAAO,CAAC,IAAI,GAAG,GAAG,EAAA,EAAI,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAEtD,IAAA,SAAS,CAAC,CAAS,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D;AAEQ,IAAA,kBAAkB,CAAC,SAAuB,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS;YAAE;AACvC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,aAAa,CAAC,cAAc,CAAgB,IAAI,SAAS,KAAK,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAgB,IAAI,SAAS,CAAC;AACxK,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAC3B,YAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AAC5B,YAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;QAC9B;QAAE,MAAM,EAAC;AACT,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;IAC5B;IAEQ,MAAM,cAAc,CAAC,KAAa,EAAA;AACxC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM;YAAE;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa;;AAE/F,QAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;AAClC,QAAA,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,SAAS;AACvF,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,OAAO;QAE/B,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC7D,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAC5B,IAAI,CAAC,eAAe,EAAE;;AAEtB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,YAAA,IAAI;gBACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC;YAC/C;oBAAU;;AAER,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;AAC5D,gBAAA,MAAM,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;AAC/C,gBAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;YAC/B;QACF;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,YAAA,MAAM,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;QACjD;IACF;AAEQ,IAAA,MAAM,gBAAgB,CAAC,SAAsB,EAAE,KAAa,EAAA;QAClE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM;YAAE;AAClC,QAAA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AACtE,QAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,MAAK;AAClB,oBAAA,OAAO,EAAE;AACT,oBAAA,OAAO,EAAE;AACX,gBAAA,CAAC;gBACD,MAAM,OAAO,GAAG,MAAK;AACnB,oBAAA,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,KAAY,CAAC;AACzD,oBAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AAC5B,oBAAA,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAC3B,oBAAA,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE;AACjC,oBAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AAC9B,gBAAA,CAAC;AACD,gBAAA,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE;AAC5B,gBAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;gBACrC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA,EAAA,CAAI;AACpF,gBAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AAChC,gBAAA,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU;gBACnC,qBAAqB,CAAC,MAAK;AACzB,oBAAA,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,KAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAS,CAAC;oBAC7E,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,IAAI,CAAC,eAAe,CAAA,0BAAA,CAA4B;oBACvF,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,MAAA,EAAS,KAAK,GAAG;oBAC1C,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAC/C,gBAAA,CAAC,CAAC;YACJ;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE;YACX;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,iBAAiB,CAAC,SAAsB,EAAA;AAC9C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU;QACpC,IAAI,MAAM,GAAuB,IAAI;QACrC,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,GAAG,SAAS,CAAC,aAAa,CAAc,cAAc,CAAC;AAC7D,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,MAAM,GAAG,SAAS,CAAC;QAClC;aAAO;AACL,YAAA,MAAM,GAAG,SAAS,CAAC,aAAa,CAAc,QAAQ,CAAC;AACvD,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,MAAM,GAAG,SAAS,CAAC;QAClC;AACA,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU;AAClC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS;;AAEhC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;AAClC,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,KAAK,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC;AACrI,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,OAAO,KAAK,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC;AAClI,QAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IACrC;AAEA,IAAA,QAAQ,CAAC,GAAU,EAAA;AACjB,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,MAAqB;;QAE3C,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;AACxD,QAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,MAAK;YAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE;AACnC,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,WAAW,CAAC,CAAC;YAC9E,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE;YACnB,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC;AAChE,YAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,YAAA,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE;AACtB,gBAAA,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS;AACxB,gBAAA,MAAM,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,YAAY;gBACpC,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,MAAM,EAAE;AACvC,oBAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;oBAC3D,OAAO,GAAG,CAAC;oBACX;gBACF;YACF;AACA,YAAA,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3D,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,QAAQ,GAAA,EAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACxD,IAAA,MAAM,QAAQ,GAAA,EAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAExD,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM;IAC9C;AAEA,IAAA,MAAM,SAAS,GAAA;;QAEb,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AAChC,QAAA,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;IAClC;AAEA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,MAAM,IAAI,CAAC,YAAY,EAAE;AACzB,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ;AAC/B,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACnD,YAAA,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB;IACF;IAEA,aAAa,CAAC,GAAiB,EAAE,WAAwB,EAAA;;AAEvD,QAAA,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,EAAE;AAC/B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;AACjG,YAAA,MAAM,aAAa,GAAG,CAAC,CAAe,KAAI;AACxC,gBAAA,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO;AAAE,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACxH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvH,qBAAA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACd,gBAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,oBAAA,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO;oBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;AACrE,oBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,wBAAA,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;AACjH,wBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE;wBAChD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;oBACrH;AACA,oBAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;AAC3D,oBAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB;AACzD,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvE,oBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC;oBACzC,CAAC,CAAC,cAAc,EAAE;oBAClB;gBACF;;AAEA,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,oBAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC;AAC1C,oBAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;gBAC5B;AACF,YAAA,CAAC;AACD,YAAA,MAAM,YAAY,GAAG,CAAC,CAAe,KAAI;gBACvC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;AAC3C,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,oBAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC;AAC1C,oBAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;gBAC5B;AACA,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC;YACD,MAAM,OAAO,GAAG,MAAK;AACnB,gBAAA,WAAW,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC;AAC7D,gBAAA,WAAW,CAAC,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC;AAC1D,gBAAA,WAAW,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC;AAC9D,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC7B,YAAA,CAAC;AACD,YAAA,WAAW,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC;AAC1D,YAAA,WAAW,CAAC,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC;AACvD,YAAA,WAAW,CAAC,gBAAgB,CAAC,eAAe,EAAE,YAAY,CAAC;YAC3D;QACF;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO;AAC1B,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO;AAC1B,QAAA,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU;AACxC,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS;AACtC,QAAA,WAAW,CAAC,KAAK,CAAC,cAAc,GAAG,MAAM;QACzC,WAAW,CAAC,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,CAAC,CAAe,KAAI;AAC/B,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM;AAC7B,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM;AAC7B,YAAA,WAAW,CAAC,UAAU,GAAG,SAAS,GAAG,EAAE;AACvC,YAAA,WAAW,CAAC,SAAS,GAAG,QAAQ,GAAG,EAAE;YACrC,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC;AACD,QAAA,MAAM,GAAG,GAAG,CAAC,CAAe,KAAI;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,WAAW,CAAC,qBAAqB,GAAG,GAAG,CAAC,SAAS,CAAC;AAClD,YAAA,WAAW,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC;AACpD,YAAA,WAAW,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC;AACjD,YAAA,WAAW,CAAC,mBAAmB,CAAC,eAAe,EAAE,GAAG,CAAC;AACrD,YAAA,WAAW,CAAC,KAAK,CAAC,cAAc,GAAG,QAAQ;AAC7C,QAAA,CAAC;AACD,QAAA,WAAW,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC;AACjD,QAAA,WAAW,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC;AAC9C,QAAA,WAAW,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,CAAC;IACpD;AAEQ,IAAA,gBAAgB,CAAC,WAAwB,EAAA;;;;;AAK/C,QAAA,OAAO,EAAS;IAClB;IAEA,OAAO,CAAC,GAAe,EAAE,WAAwB,EAAA;QAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO;AAC7C,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,GAAG,CAAC,cAAc,EAAE;AACpB,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE;;QAEhD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;QAC/E,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACtD,IAAI,IAAI,CAAC,gBAAgB;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC9D,QAAA,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM;AACzB,QAAA,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU;AAC3D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC;AACtC,QAAA,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,MAAK;AACzC,YAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;gBACtC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACnD,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC5B,YAAA,CAAC,EAAE,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;AAClC,QAAA,CAAC,CAAC;IACJ;IAEQ,WAAW,CAAC,SAAsB,EAAE,OAAe,EAAA;AACzD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM;YAAE;AAC1C,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,OAAO;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,aAAa,CAAC,cAAc,CAAgB,IAAI,SAAS,KAAK,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAgB,IAAI,SAAS,CAAC;QACxK,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAChD,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACrC,QAAA,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA,EAAA,CAAI;QAClG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,IAAI,CAAC,kBAAkB,CAAA,0BAAA,CAA4B;QAC1F,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,MAAA,EAAS,KAAK,GAAG;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;IAC3B;AAEQ,IAAA,MAAM,iBAAiB,CAAC,SAAsB,EAAE,YAAoB,EAAA;;AAE1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,aAAa,CAAC,cAAc,CAAgB,IAAI,SAAS,KAAK,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAgB,IAAI,SAAS,CAAC;AACxK,QAAA,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAC3B,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AAC5B,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,SAAS;AAC/D,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,MAAM,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;AAC/C,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC5B;IACF;IAEQ,MAAM,4BAA4B,CAAC,MAAwC,EAAA;;AAEjF,QAAA,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,MAAM;AAAE,gBAAA,IAAI,CAAC,aAAa,GAAG,MAAM;YACvC;QACF;AACA,QAAA,IAAI;YACF,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YACnC;iBAAO;AACL,gBAAA,MAAM,IAAI,CAAC,MAAM,EAAE;YACrB;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;AACrD,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa;AACrC,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,gBAAA,MAAM,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC;YACrD;QACF;IACF;IAEQ,mBAAmB,CAAC,SAAsB,EAAE,MAAwC,EAAA;AAC1F,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,WAAW,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC;AAChE,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,gBAAA,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,KAAK,OAAO,CAAC;uBACjG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,KAAK,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;uBAC7E,KAAK,CAAC,CAAC,CAAC;AACb,gBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;AAClE,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;AAC7E,gBAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;YACxB;;YAEA,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;AAChD,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;AACxB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAG,MAAsB,CAAC,YAAY,CAAC;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,GAAI,MAAsB,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;AAC9F,YAAA,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE;QAC3B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,mBAAmB,CAAC,SAAsB,EAAE,MAAuC,EAAA;AACzF,QAAA,IAAI;AACF,YAAA,IAAI,EAAE,GAAG,SAAS,CAAC,aAAa,CAAc,CAAA,YAAA,EAAe,MAAM,CAAC,IAAI,CAAA,EAAA,CAAI,CAAC;AAC7E,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,EAAE,GAAG,SAAS,CAAC,aAAa,CAAc,QAAQ,CAAC;AAC5D,YAAA,IAAI,CAAC,EAAE;gBAAE;AACT,YAAA,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc;AACnD,YAAA,SAAS,CAAC,KAAK,CAAC,cAAc,GAAG,MAAM;AACvC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC;AAC3C,YAAA,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC;AACjF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;AAC9E,YAAA,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC/D,YAAA,SAAS,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY;QAC/C;QAAE,MAAM,EAAC;IACX;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QACxC,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,QAAQ,KAAK,UAAU,IAAK,SAAiB,CAAC,cAAc,GAAG,CAAC,CAAC;QAC1I,IAAI,KAAK,GAAkB,IAAI;QAC/B,IAAI,KAAK,EAAE;;AAET,YAAA,IAAI;gBAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,qBAAqB,CAAC;YAAE;AAAE,YAAA,MAAM;gBAAE,KAAK,GAAG,IAAI;YAAE;QAC1F;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE;QAC3C,IAAI,IAAI,EAAE;YACR,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;YACrC,IAAI,KAAK,EAAE;gBACT,IAAI,KAAK,EAAE;AACT,oBAAA,IAAI;AAAE,wBAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG;oBAAE;AAAE,oBAAA,MAAM,eAAe;;AAExD,oBAAA,UAAU,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;gBACnD;qBAAO;oBACL,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,oBAAA,CAAC,CAAC,IAAI,GAAG,GAAG;AACZ,oBAAA,CAAC,CAAC,MAAM,GAAG,QAAQ;AACnB,oBAAA,CAAC,CAAC,GAAG,GAAG,UAAU;AAClB,oBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC5B,CAAC,CAAC,KAAK,EAAE;oBACT,CAAC,CAAC,MAAM,EAAE;AACV,oBAAA,UAAU,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;gBACnD;YACF;iBAAO;AACL,gBAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,gBAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,gBAAA,IAAI,CAAC,GAAG,GAAG,UAAU;AACrB,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC3B,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBAC/B,IAAI,CAAC,KAAK,EAAE;gBACZ,IAAI,CAAC,MAAM,EAAE;AACb,gBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;YAC1B;YACA;QACF;;AAGA,QAAA,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3G,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,IAAI,KAAK,EAAE;YACT,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI;AAAE,oBAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI;gBAAE;AAAE,gBAAA,MAAM,eAAe;YAC3D;iBAAO;gBACL,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,gBAAA,CAAC,CAAC,IAAI,GAAG,IAAI;AACb,gBAAA,CAAC,CAAC,MAAM,GAAG,QAAQ;AACnB,gBAAA,CAAC,CAAC,GAAG,GAAG,UAAU;AAClB,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5B,CAAC,CAAC,KAAK,EAAE;gBACT,CAAC,CAAC,MAAM,EAAE;YACZ;QACF;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;AACtB,YAAA,IAAI,CAAC,GAAG,GAAG,UAAU;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC3B,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,MAAM,EAAE;QACf;IACF;AAEA,IAAA,MAAM,KAAK,GAAA;;AAET,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,IAAI,EAAE;YAAE;;AAER,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE;QAC3C,IAAI,IAAI,EAAE;YACR,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,qBAAqB,CAAC;YAC5D,IAAI,GAAG,EAAE;gBACP,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gNAAgN,GAAG,GAAG,GAAG,2BAA2B,CAAC;AACxQ,gBAAA,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE;AACpB,gBAAA,UAAU,CAAC,MAAK,EAAG,IAAI;oBAAE,GAAG,CAAC,KAAK,EAAE;oBAAE,GAAG,CAAC,KAAK,EAAE;gBAAE;gBAAE,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACrE,gBAAA,GAAG,CAAC,YAAY,GAAG,MAAK,EAAG,IAAI;oBAAE,GAAG,CAAC,KAAK,EAAE;gBAAE;AAAE,gBAAA,MAAM,EAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtF;iBAAO;gBACL,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,gBAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAAE,gBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;AAAE,gBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AACpF,gBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;AAAE,gBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AAAE,gBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AAC9E,gBAAA,MAAM,CAAC,GAAG,GAAG,GAAG;AAAE,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACnD,gBAAA,MAAM,CAAC,MAAM,GAAG,MAAK,EAAG,IAAI;AAAE,oBAAA,UAAU,CAAC,MAAM,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC;gBAAE;AAAE,gBAAA,MAAM,EAAC,CAAC,CAAC,UAAU,CAAC,MAAK,EAAG,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1K;YACA;QACF;AACA,QAAA,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3G,QAAA,IAAI,IAAI;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;IACvC;AAEQ,IAAA,MAAM,cAAc,GAAA;AAC1B,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG;YAClB,IAAI,CAAC,GAAG,EAAE;gBACR,GAAG,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;YACtD;AACA,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,KAAK;AACtB,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,qBAAqB,CAAC;AAC5D,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,KAAK;AACtB,YAAA,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,wMAAwM,CAAC;AAC5N,YAAA,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE;AAEpB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBACtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACjC,gBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAC/C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC;gBACnC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;gBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE;AACpC,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO;gBACvE,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,gBAAA,GAAG,CAAC,SAAS,GAAG,MAAM;AACtB,gBAAA,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxB,gBAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;gBAC3B,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;gBACvC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACpC;AACA,YAAA,UAAU,CAAC,MAAK,EAAG,IAAI;gBAAE,GAAG,CAAC,KAAK,EAAE;gBAAE,GAAG,CAAC,KAAK,EAAE;YAAE;YAAE,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACrE,YAAA,GAAG,CAAC,YAAY,GAAG,MAAK,EAAG,IAAI;gBAAE,GAAG,CAAC,KAAK,EAAE;YAAE;AAAE,YAAA,MAAM,EAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,UAAU,CAAC,MAAK,EAAG,IAAI;gBAAE,GAAG,CAAC,KAAK,EAAE;YAAE;YAAE,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEQ,IAAA,MAAM,iBAAiB,GAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AAC1B,QAAA,IAAI,IAAI,CAAC,GAAG,YAAY,IAAI;YAAE,OAAO,IAAI,CAAC,GAAG;AAC7C,QAAA,IAAI,IAAI,CAAC,GAAG,YAAY,UAAU,EAAE;YAClC,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAC/C,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAChC,YAAA,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QACpD;AACA,QAAA,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3G,QAAA,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE;AAC5B,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,CAAC,WAAW;gBACzB,WAAW,EAAE,IAAI,CAAC,eAAe,GAAG,SAAS,GAAG,aAAa;AAC9D,aAAA,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI;AACxB,YAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;YAC7B,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QAC5F;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI;AAAE,gBAAA,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,cAAc;YAAE;AAAE,YAAA,MAAM;AAAE,gBAAA,OAAO,cAAc;YAAE;QAClJ;AACA,QAAA,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,cAAc;QAC3D;AACA,QAAA,OAAO,cAAc;IACvB;AAEQ,IAAA,QAAQ,CAAC,IAAY,EAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,cAAc,CAAC;IAC/E;uGArhCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,GAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,olEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA9CS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA;;2FAqEX,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAxEnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,olEAAA,CAAA,EAAA;wDA2BQ,GAAG,EAAA,CAAA;sBAAX;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,GAAG,EAAA,CAAA;sBAAX;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,mBAAmB,EAAA,CAAA;sBAA3B;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEuC,MAAM,EAAA,CAAA;sBAA7C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBACO,WAAW,EAAA,CAAA;sBAAvD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBACJ,KAAK,EAAA,CAAA;sBAA3C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MC7F1B,uBAAuB,GAAG,IAAI,cAAc,CAAuB,yBAAyB;AAEzG,SAAS,uBAAuB,GAAA;AAC9B,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC7E;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEA,eAAe,yBAAyB,GAAA;IACtC,MAAM,CAAC,GAAG,UAAiB;AAC3B,IAAA,IAAI,CAAC,EAAE,WAAW,EAAE,oBAAoB;QAAE;AAC1C,IAAA,IAAI;;AAEF,QAAA,MAAM,YAAY,GAAQ,MAAM,OAAO,qCAAqC,CAAC;AAC7E,QAAA,IAAI,YAAY,EAAE,oBAAoB,EAAE;AACtC,YAAA,CAAC,CAAC,WAAW,GAAG,EAAE,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,oBAAoB,EAAE;QACvG;IACF;IAAE,MAAM,EAAC;AACX;AAEA,SAAS,oBAAoB,CAAC,GAAyB,EAAE,UAAkB,EAAA;IACzE,OAAO,YAAW;AAChB,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;YAAE;AAEpC,QAAA,MAAM,QAAQ,GAAqF;AACjG,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,oBAAoB,EAAE,IAAI;SAC3B;QACD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,EAAE;AAEtC,QAAA,MAAM,aAAa,GAAI,QAAgB,CAAC,mBAAmB;AAC3D,QAAA,aAAa,CAAC,UAAU,GAAG,IAAI;AAC/B,QAAA,IAAI,MAAM,CAAC,oBAAoB,EAAE;YAC/B,MAAM,yBAAyB,EAAE;QACnC;AACA,QAAA,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,YAAA,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;YAC1C;QACF;AACA,QAAA,MAAM,gBAAgB,GAAG,uBAAuB,EAAE;AAClD,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC3B,YAAA,aAAa,CAAC,SAAS,GAAG,gBAAgB,IAAI,2BAA2B;YACzE;QACF;AACA,QAAA,aAAa,CAAC,SAAS,GAAG,gBAAgB,IAAI,2BAA2B;AAC3E,IAAA,CAAC;AACH;AAEM,SAAU,qBAAqB,CAAC,GAAA,GAA4B,EAAE,EAAA;IAClE,OAAO;AACL,QAAA,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAAG,EAAE;AACnD,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,UAAU,EAAE,oBAAoB;AAChC,YAAA,IAAI,EAAE,CAAC,uBAAuB,EAAE,WAAW,CAAC;AAC7C,SAAA;KACF;AACH;;ACzEA;;AAEG;;ACFH;;AAEG;;;;"}
|
|
Binary file
|
package/index.d.ts
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { OnChanges, ElementRef, SimpleChanges, InjectionToken, Provider } from '@angular/core';
|
|
3
|
-
import { SafeResourceUrl } from '@angular/platform-browser';
|
|
4
|
-
import { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api';
|
|
5
|
-
|
|
6
|
-
declare class GenusPdfViewerComponent implements OnChanges {
|
|
7
|
-
private static inlineWorkerSetupPromise;
|
|
8
|
-
private readonly sanitizer;
|
|
9
|
-
src: string | URL | Uint8Array | Blob;
|
|
10
|
-
page: number;
|
|
11
|
-
zoom: number;
|
|
12
|
-
maxZoom: number;
|
|
13
|
-
minZoom: number;
|
|
14
|
-
fit: 'width' | 'height' | 'page' | 'none';
|
|
15
|
-
disableTextLayer: boolean;
|
|
16
|
-
continuous: boolean;
|
|
17
|
-
showToolbar: boolean;
|
|
18
|
-
zoomAnimation: boolean;
|
|
19
|
-
zoomAnimationMs: number;
|
|
20
|
-
gestureAnimationMs: number;
|
|
21
|
-
loadTimeoutMs: number;
|
|
22
|
-
allowIframeFallback: boolean;
|
|
23
|
-
withCredentials: boolean;
|
|
24
|
-
httpHeaders?: Record<string, string>;
|
|
25
|
-
canvas: ElementRef<HTMLCanvasElement>;
|
|
26
|
-
singleStage: ElementRef<HTMLDivElement>;
|
|
27
|
-
stage: ElementRef<HTMLDivElement>;
|
|
28
|
-
doc?: PDFDocumentProxy;
|
|
29
|
-
private currentPage?;
|
|
30
|
-
pageSig: _angular_core.WritableSignal<number>;
|
|
31
|
-
zoomSig: _angular_core.WritableSignal<number>;
|
|
32
|
-
isPanning: _angular_core.WritableSignal<boolean>;
|
|
33
|
-
canPan: _angular_core.WritableSignal<boolean>;
|
|
34
|
-
loading: _angular_core.WritableSignal<boolean>;
|
|
35
|
-
error: _angular_core.WritableSignal<string | null>;
|
|
36
|
-
iframeFallbackSrc: _angular_core.WritableSignal<SafeResourceUrl | null>;
|
|
37
|
-
private readonly PRINT_SCALE;
|
|
38
|
-
private scrollRaf;
|
|
39
|
-
private renderLockCount;
|
|
40
|
-
private zoomAnimInFlight;
|
|
41
|
-
private activeRenderTasks;
|
|
42
|
-
private wheelRaf;
|
|
43
|
-
private pinchState;
|
|
44
|
-
private activePointers;
|
|
45
|
-
private renderVersion;
|
|
46
|
-
private previewActive;
|
|
47
|
-
private reRenderQueued;
|
|
48
|
-
private pendingAnchor;
|
|
49
|
-
private lastZoomClient;
|
|
50
|
-
private readonly WHEEL_STEP;
|
|
51
|
-
private readonly PINCH_SENSITIVITY;
|
|
52
|
-
private wheelCommitTimer;
|
|
53
|
-
private lastLoadError;
|
|
54
|
-
constructor();
|
|
55
|
-
ngOnChanges(changes: SimpleChanges): Promise<void>;
|
|
56
|
-
safeRender(): Promise<void>;
|
|
57
|
-
private loadDocument;
|
|
58
|
-
private loadDocumentWithFallbacks;
|
|
59
|
-
private createPrimaryParams;
|
|
60
|
-
private tryLoadDocument;
|
|
61
|
-
private getEffectiveLoadTimeoutMs;
|
|
62
|
-
private ensureInlineWorkerFallback;
|
|
63
|
-
private resolveBundledWorkerSrc;
|
|
64
|
-
private getWorkerSrcCandidates;
|
|
65
|
-
private applyWorkerSrc;
|
|
66
|
-
private buildLoadErrorMessage;
|
|
67
|
-
private tryEnableIframeFallback;
|
|
68
|
-
private isLikelyNetworkOrCorsError;
|
|
69
|
-
private toFallbackHref;
|
|
70
|
-
private extractErrorText;
|
|
71
|
-
private toPdfBytes;
|
|
72
|
-
render(): Promise<void>;
|
|
73
|
-
private renderAllPages;
|
|
74
|
-
goTo(page: number): Promise<void>;
|
|
75
|
-
zoomIn(step?: number): Promise<void>;
|
|
76
|
-
zoomOut(step?: number): Promise<void>;
|
|
77
|
-
private clampZoom;
|
|
78
|
-
private cancelPreviewIfAny;
|
|
79
|
-
private applyZoomDelta;
|
|
80
|
-
private runZoomAnimation;
|
|
81
|
-
private getZoomAnimTarget;
|
|
82
|
-
onScroll(evt: Event): void;
|
|
83
|
-
nextPage(): Promise<void>;
|
|
84
|
-
prevPage(): Promise<void>;
|
|
85
|
-
pageCount(): number;
|
|
86
|
-
isZoomed(): boolean;
|
|
87
|
-
resetZoom(): Promise<void>;
|
|
88
|
-
retryLoad(): Promise<void>;
|
|
89
|
-
onPointerDown(evt: PointerEvent, containerEl: HTMLElement): void;
|
|
90
|
-
private getActiveTouches;
|
|
91
|
-
onWheel(evt: WheelEvent, containerEl: HTMLElement): void;
|
|
92
|
-
private previewZoom;
|
|
93
|
-
private commitPreviewZoom;
|
|
94
|
-
private safeReRenderWithCancellation;
|
|
95
|
-
private captureScrollAnchor;
|
|
96
|
-
private restoreScrollAnchor;
|
|
97
|
-
download(): Promise<void>;
|
|
98
|
-
print(): Promise<void>;
|
|
99
|
-
private printViaImages;
|
|
100
|
-
private createBlobFromSrc;
|
|
101
|
-
private deriveFilename;
|
|
102
|
-
private basename;
|
|
103
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<GenusPdfViewerComponent, never>;
|
|
104
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<GenusPdfViewerComponent, "genus-pdf-viewer", never, { "src": { "alias": "src"; "required": false; }; "page": { "alias": "page"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "fit": { "alias": "fit"; "required": false; }; "disableTextLayer": { "alias": "disableTextLayer"; "required": false; }; "continuous": { "alias": "continuous"; "required": false; }; "showToolbar": { "alias": "showToolbar"; "required": false; }; "zoomAnimation": { "alias": "zoomAnimation"; "required": false; }; "zoomAnimationMs": { "alias": "zoomAnimationMs"; "required": false; }; "gestureAnimationMs": { "alias": "gestureAnimationMs"; "required": false; }; "loadTimeoutMs": { "alias": "loadTimeoutMs"; "required": false; }; "allowIframeFallback": { "alias": "allowIframeFallback"; "required": false; }; "withCredentials": { "alias": "withCredentials"; "required": false; }; "httpHeaders": { "alias": "httpHeaders"; "required": false; }; }, {}, never, ["[toolbar]"], true, never>;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
type GenusPdfWorkerConfig = {
|
|
108
|
-
/** Try ESM module worker first (best); falls back to workerSrc if creation fails. */
|
|
109
|
-
tryModuleWorker?: boolean;
|
|
110
|
-
/** Optional absolute URL for worker file. If omitted, package-shipped worker is used. */
|
|
111
|
-
workerSrc?: string;
|
|
112
|
-
/** If true, preloads pdf.js worker handler in-package for fake-worker fallback. */
|
|
113
|
-
inlineWorkerFallback?: boolean;
|
|
114
|
-
};
|
|
115
|
-
declare const GENUS_PDF_WORKER_CONFIG: InjectionToken<GenusPdfWorkerConfig>;
|
|
116
|
-
declare function provideGenusPdfViewer(cfg?: GenusPdfWorkerConfig): Provider[];
|
|
117
|
-
|
|
118
|
-
export { GENUS_PDF_WORKER_CONFIG, GenusPdfViewerComponent, provideGenusPdfViewer };
|
|
119
|
-
export type { GenusPdfWorkerConfig };
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
|
|
3
|
-
"schematics": {
|
|
4
|
-
"ng-add": {
|
|
5
|
-
"description": "Add genus-pdf-viewer provider and worker asset",
|
|
6
|
-
"factory": "./ng-add/index#ngAdd",
|
|
7
|
-
"schema": "./ng-add/schema.json"
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
const fs = require('node:fs');
|
|
2
|
-
const path = require('node:path');
|
|
3
|
-
const { SchematicsException } = require('@angular-devkit/schematics');
|
|
4
|
-
|
|
5
|
-
const PROVIDER_CALL = 'provideGenusPdfViewer()';
|
|
6
|
-
|
|
7
|
-
function toPosix(filePath) {
|
|
8
|
-
return filePath.replace(/\\/g, '/');
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function readWorkspace(tree) {
|
|
12
|
-
const workspacePath = '/angular.json';
|
|
13
|
-
if (!tree.exists(workspacePath)) {
|
|
14
|
-
throw new SchematicsException('angular.json not found in workspace root');
|
|
15
|
-
}
|
|
16
|
-
const raw = tree.read(workspacePath);
|
|
17
|
-
if (!raw) {
|
|
18
|
-
throw new SchematicsException('Unable to read angular.json');
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
return JSON.parse(raw.toString('utf-8'));
|
|
22
|
-
} catch {
|
|
23
|
-
throw new SchematicsException('Invalid angular.json');
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function resolveProjectName(workspace, requestedProject) {
|
|
28
|
-
if (requestedProject) return requestedProject;
|
|
29
|
-
if (workspace.defaultProject) return workspace.defaultProject;
|
|
30
|
-
const projectNames = Object.keys(workspace.projects || {});
|
|
31
|
-
const appProject = projectNames.find((name) => workspace.projects[name]?.projectType === 'application');
|
|
32
|
-
return appProject || projectNames[0];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function resolveAssetsDir(project) {
|
|
36
|
-
const assets = project?.architect?.build?.options?.assets;
|
|
37
|
-
if (Array.isArray(assets)) {
|
|
38
|
-
for (const asset of assets) {
|
|
39
|
-
if (typeof asset === 'string') {
|
|
40
|
-
const normalized = toPosix(asset);
|
|
41
|
-
if (normalized.endsWith('/assets')) return normalized;
|
|
42
|
-
} else if (asset && typeof asset.input === 'string') {
|
|
43
|
-
const input = toPosix(asset.input).replace(/\/$/, '');
|
|
44
|
-
if (input.endsWith('/assets')) return input;
|
|
45
|
-
return `${input}/assets`;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (typeof project?.sourceRoot === 'string') {
|
|
50
|
-
return `${toPosix(project.sourceRoot).replace(/\/$/, '')}/assets`;
|
|
51
|
-
}
|
|
52
|
-
if (typeof project?.root === 'string') {
|
|
53
|
-
return `${toPosix(project.root).replace(/\/$/, '')}/src/assets`;
|
|
54
|
-
}
|
|
55
|
-
return 'src/assets';
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function findAppConfigPath(tree, project) {
|
|
59
|
-
const sourceRoot = toPosix(project?.sourceRoot || '');
|
|
60
|
-
const candidates = [
|
|
61
|
-
`${sourceRoot}/app/app.config.ts`,
|
|
62
|
-
`${sourceRoot}/app.config.ts`,
|
|
63
|
-
];
|
|
64
|
-
return candidates.find((candidate) => candidate && tree.exists(candidate)) || null;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function detectImportPath(content, requestedImportPath) {
|
|
68
|
-
if (content.includes(`from '@genus/pdf-viewer'`) || content.includes(`from "@genus/pdf-viewer"`)) {
|
|
69
|
-
return '@genus/pdf-viewer';
|
|
70
|
-
}
|
|
71
|
-
if (content.includes(`from 'genus-pdf-viewer'`) || content.includes(`from "genus-pdf-viewer"`)) {
|
|
72
|
-
return 'genus-pdf-viewer';
|
|
73
|
-
}
|
|
74
|
-
return requestedImportPath || 'genus-pdf-viewer';
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function ensureImport(content, importPath) {
|
|
78
|
-
if (content.includes('provideGenusPdfViewer')) return content;
|
|
79
|
-
const importLine = `import { provideGenusPdfViewer } from '${importPath}';`;
|
|
80
|
-
const lines = content.split('\n');
|
|
81
|
-
let lastImportIndex = -1;
|
|
82
|
-
for (let i = 0; i < lines.length; i++) {
|
|
83
|
-
if (lines[i].trim().startsWith('import ')) {
|
|
84
|
-
lastImportIndex = i;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
lines.splice(lastImportIndex + 1, 0, importLine);
|
|
88
|
-
return lines.join('\n');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function ensureProvider(content) {
|
|
92
|
-
if (content.includes(PROVIDER_CALL)) return { content, changed: false };
|
|
93
|
-
if (!/providers\s*:\s*\[/.test(content)) return { content, changed: false };
|
|
94
|
-
return {
|
|
95
|
-
content: content.replace(/providers\s*:\s*\[/, (match) => `${match}\n ${PROVIDER_CALL},`),
|
|
96
|
-
changed: true,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function patchAppConfig(tree, appConfigPath, importPath, context) {
|
|
101
|
-
const raw = tree.read(appConfigPath);
|
|
102
|
-
if (!raw) return false;
|
|
103
|
-
let content = raw.toString('utf-8');
|
|
104
|
-
const detectedImportPath = detectImportPath(content, importPath);
|
|
105
|
-
content = ensureImport(content, detectedImportPath);
|
|
106
|
-
const result = ensureProvider(content);
|
|
107
|
-
if (!result.changed) {
|
|
108
|
-
if (!result.content.includes(PROVIDER_CALL)) {
|
|
109
|
-
context.logger.warn(`Could not inject ${PROVIDER_CALL} into ${appConfigPath}. Add it manually.`);
|
|
110
|
-
}
|
|
111
|
-
if (result.content !== raw.toString('utf-8')) {
|
|
112
|
-
tree.overwrite(appConfigPath, result.content);
|
|
113
|
-
}
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
tree.overwrite(appConfigPath, result.content);
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function copyWorkerFile(tree, targetDir, overwriteWorker, context) {
|
|
121
|
-
const sourcePath = path.join(process.cwd(), 'node_modules', 'pdfjs-dist', 'build', 'pdf.worker.min.mjs');
|
|
122
|
-
if (!fs.existsSync(sourcePath)) {
|
|
123
|
-
context.logger.warn('pdfjs worker not found in node_modules. Install dependencies and copy manually.');
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const contents = fs.readFileSync(sourcePath, 'utf-8');
|
|
127
|
-
const baseDir = targetDir.replace(/\/$/, '');
|
|
128
|
-
const targetPaths = [`${baseDir}/pdf.worker.min.mjs`, `${baseDir}/pdf.worker.min.js`];
|
|
129
|
-
for (const targetPath of targetPaths) {
|
|
130
|
-
if (tree.exists(targetPath)) {
|
|
131
|
-
if (overwriteWorker) {
|
|
132
|
-
tree.overwrite(targetPath, contents);
|
|
133
|
-
context.logger.info(`Updated ${targetPath}`);
|
|
134
|
-
} else {
|
|
135
|
-
context.logger.info(`Kept existing ${targetPath}`);
|
|
136
|
-
}
|
|
137
|
-
} else {
|
|
138
|
-
tree.create(targetPath, contents);
|
|
139
|
-
context.logger.info(`Created ${targetPath}`);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function ngAdd(options = {}) {
|
|
145
|
-
return (tree, context) => {
|
|
146
|
-
const workspace = readWorkspace(tree);
|
|
147
|
-
const projectName = resolveProjectName(workspace, options.project);
|
|
148
|
-
if (!projectName || !workspace.projects?.[projectName]) {
|
|
149
|
-
throw new SchematicsException('Could not resolve target Angular project');
|
|
150
|
-
}
|
|
151
|
-
const project = workspace.projects[projectName];
|
|
152
|
-
const appConfigPath = findAppConfigPath(tree, project);
|
|
153
|
-
if (appConfigPath) {
|
|
154
|
-
patchAppConfig(tree, appConfigPath, options.importPath, context);
|
|
155
|
-
} else {
|
|
156
|
-
context.logger.warn('app.config.ts not found. Add provideGenusPdfViewer() manually.');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (!options.skipWorkerCopy) {
|
|
160
|
-
const assetsDir = resolveAssetsDir(project);
|
|
161
|
-
copyWorkerFile(tree, assetsDir, options.overwriteWorker, context);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
context.logger.info('genus-pdf-viewer ng-add completed.');
|
|
165
|
-
return tree;
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
module.exports = {
|
|
170
|
-
ngAdd,
|
|
171
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/schema",
|
|
3
|
-
"$id": "GenusPdfViewerNgAddSchema",
|
|
4
|
-
"title": "Genus PDF Viewer ng-add",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"properties": {
|
|
7
|
-
"project": {
|
|
8
|
-
"type": "string",
|
|
9
|
-
"description": "Angular project to configure"
|
|
10
|
-
},
|
|
11
|
-
"importPath": {
|
|
12
|
-
"type": "string",
|
|
13
|
-
"description": "Import path used for provideGenusPdfViewer",
|
|
14
|
-
"default": "genus-pdf-viewer"
|
|
15
|
-
},
|
|
16
|
-
"skipWorkerCopy": {
|
|
17
|
-
"type": "boolean",
|
|
18
|
-
"description": "Skip copying pdf.worker.min.mjs into assets/public",
|
|
19
|
-
"default": false
|
|
20
|
-
},
|
|
21
|
-
"overwriteWorker": {
|
|
22
|
-
"type": "boolean",
|
|
23
|
-
"description": "Overwrite existing worker file",
|
|
24
|
-
"default": false
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|