billy-herrington-utils 1.4.5 → 1.4.7
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/dist/billy-herrington-utils.es.js +248 -42
- package/dist/billy-herrington-utils.es.js.map +1 -1
- package/dist/billy-herrington-utils.umd.js +248 -42
- package/dist/billy-herrington-utils.umd.js.map +1 -1
- package/dist/index.d.ts +33 -5
- package/package.json +1 -1
- package/src/index.ts +7 -0
- package/src/userscripts/infinite-scroll/index.ts +6 -6
- package/src/userscripts/jabroni-outfit-wrap/index.ts +4 -2
- package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts +11 -0
- package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyTrash.ts +2 -2
|
@@ -331,13 +331,13 @@ function objectToFormData(object) {
|
|
|
331
331
|
class InfiniteScroller {
|
|
332
332
|
constructor({
|
|
333
333
|
enabled = true,
|
|
334
|
-
delay =
|
|
334
|
+
delay = 300,
|
|
335
335
|
writeHistory = false,
|
|
336
336
|
paginationOffset,
|
|
337
337
|
paginationLast,
|
|
338
338
|
paginationElement,
|
|
339
339
|
paginationUrlGenerator,
|
|
340
|
-
|
|
340
|
+
parseData,
|
|
341
341
|
alternativeGenerator,
|
|
342
342
|
intersectionObservable
|
|
343
343
|
}) {
|
|
@@ -347,7 +347,7 @@ class InfiniteScroller {
|
|
|
347
347
|
__publicField(this, "paginationOffset");
|
|
348
348
|
__publicField(this, "paginationLast");
|
|
349
349
|
__publicField(this, "writeHistory");
|
|
350
|
-
__publicField(this, "
|
|
350
|
+
__publicField(this, "parseData");
|
|
351
351
|
__publicField(this, "onScrollCBs", []);
|
|
352
352
|
__publicField(this, "generatorConsumer", async () => {
|
|
353
353
|
if (!this.enabled) return false;
|
|
@@ -356,7 +356,7 @@ class InfiniteScroller {
|
|
|
356
356
|
const nextPageHTML = await fetchHtml(url);
|
|
357
357
|
const prevScrollPos = document.documentElement.scrollTop;
|
|
358
358
|
this.paginationOffset = offset;
|
|
359
|
-
this.
|
|
359
|
+
this.parseData(nextPageHTML);
|
|
360
360
|
this._onScroll();
|
|
361
361
|
window.scrollTo(0, prevScrollPos);
|
|
362
362
|
if (this.writeHistory) {
|
|
@@ -370,7 +370,7 @@ class InfiniteScroller {
|
|
|
370
370
|
this.writeHistory = writeHistory;
|
|
371
371
|
this.paginationOffset = paginationOffset;
|
|
372
372
|
this.paginationLast = paginationLast;
|
|
373
|
-
this.
|
|
373
|
+
this.parseData = parseData;
|
|
374
374
|
this.paginationGenerator = alternativeGenerator?.() ?? InfiniteScroller.createPaginationGenerator(
|
|
375
375
|
paginationOffset,
|
|
376
376
|
paginationLast,
|
|
@@ -396,12 +396,13 @@ class InfiniteScroller {
|
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
-
function createInfiniteScroller(store,
|
|
399
|
+
function createInfiniteScroller(store, parseData, rules) {
|
|
400
400
|
const enabled = store.state.infiniteScrollEnabled;
|
|
401
401
|
const iscroller = new InfiniteScroller({
|
|
402
402
|
enabled,
|
|
403
|
-
|
|
404
|
-
...rules
|
|
403
|
+
parseData,
|
|
404
|
+
...rules,
|
|
405
|
+
...rules.paginationStrategy
|
|
405
406
|
}).onScroll(({ paginationLast, paginationOffset }) => {
|
|
406
407
|
store.localState.pagIndexLast = paginationLast;
|
|
407
408
|
store.localState.pagIndexCur = paginationOffset;
|
|
@@ -411,6 +412,240 @@ function createInfiniteScroller(store, handleHtmlCallback, rules) {
|
|
|
411
412
|
});
|
|
412
413
|
return iscroller;
|
|
413
414
|
}
|
|
415
|
+
function getPaginationLinks(doc = document, url = location.href, pathnameSelector = /\/(page\/)?\d+\/?$/) {
|
|
416
|
+
const currentUrl = parseURL(url);
|
|
417
|
+
currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, "/");
|
|
418
|
+
const pageLinks = Array.from(
|
|
419
|
+
doc.querySelectorAll("a[href]") || [],
|
|
420
|
+
(a) => a.href
|
|
421
|
+
).filter((h) => {
|
|
422
|
+
try {
|
|
423
|
+
const linkUrl = new URL(h.replace(/#$/, ""), doc.baseURI || currentUrl.origin);
|
|
424
|
+
return linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname);
|
|
425
|
+
} catch {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
return pageLinks;
|
|
430
|
+
}
|
|
431
|
+
function parseURL(s) {
|
|
432
|
+
if (typeof s === "string") return new URL(s);
|
|
433
|
+
return new URL(s.href);
|
|
434
|
+
}
|
|
435
|
+
class PaginationStrategy {
|
|
436
|
+
constructor(options) {
|
|
437
|
+
__publicField(this, "doc", document);
|
|
438
|
+
__publicField(this, "url");
|
|
439
|
+
__publicField(this, "paginationSelector", ".pagination");
|
|
440
|
+
__publicField(this, "fixPaginationLast");
|
|
441
|
+
__publicField(this, "offsetMin", 1);
|
|
442
|
+
if (options) {
|
|
443
|
+
Object.entries(options).forEach(([k, v]) => {
|
|
444
|
+
Object.assign(this, { [k]: v });
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
this.url = parseURL(options?.url || this.doc.URL);
|
|
448
|
+
}
|
|
449
|
+
getPaginationElement() {
|
|
450
|
+
return this.doc.querySelector(this.paginationSelector) || this.doc;
|
|
451
|
+
}
|
|
452
|
+
getPaginationOffset() {
|
|
453
|
+
return this.offsetMin;
|
|
454
|
+
}
|
|
455
|
+
getPaginationLast() {
|
|
456
|
+
return this.offsetMin;
|
|
457
|
+
}
|
|
458
|
+
getPaginationUrlGenerator() {
|
|
459
|
+
return (_) => this.url.href;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
function formatTimeToHHMMSS(timeString) {
|
|
463
|
+
const regex = /(?:(\d+)\s*h\s*)?(?:(\d+)\s*mi?n?\s*)?(?:(\d+)\s*sec)?/;
|
|
464
|
+
const match = timeString.match(regex);
|
|
465
|
+
const h = parseInt(match?.[1] || "0");
|
|
466
|
+
const m = parseInt(match?.[2] || "0");
|
|
467
|
+
const s = parseInt(match?.[3] || "0");
|
|
468
|
+
const pad = (num) => String(num).padStart(2, "0");
|
|
469
|
+
return `${pad(h)}:${pad(m)}:${pad(s)}`;
|
|
470
|
+
}
|
|
471
|
+
function timeToSeconds(t) {
|
|
472
|
+
const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;
|
|
473
|
+
return (r?.match(/\d+/gm) || [0]).reverse().map((s, i) => parseInt(s) * 60 ** i).reduce((a, b) => a + b);
|
|
474
|
+
}
|
|
475
|
+
function parseIntegerOr(n, or) {
|
|
476
|
+
return ((num) => Number.isNaN(num) ? or : num)(parseInt(n));
|
|
477
|
+
}
|
|
478
|
+
function parseDataParams(str) {
|
|
479
|
+
const paramsStr = decodeURI(str.trim()).split(";");
|
|
480
|
+
return paramsStr.reduce((acc, s) => {
|
|
481
|
+
const parsed = s.match(/([\+\w]+):([\w\-\ ]+)?/);
|
|
482
|
+
if (parsed) {
|
|
483
|
+
const [, key, value] = parsed;
|
|
484
|
+
if (value) {
|
|
485
|
+
key.split("+").forEach((p) => {
|
|
486
|
+
acc[p] = value;
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return acc;
|
|
491
|
+
}, {});
|
|
492
|
+
}
|
|
493
|
+
function parseCSSUrl(s) {
|
|
494
|
+
return s.replace(/url\("|\"\).*/g, "");
|
|
495
|
+
}
|
|
496
|
+
class PaginationStrategyDataParams extends PaginationStrategy {
|
|
497
|
+
getPaginationLast() {
|
|
498
|
+
const links = this.getPaginationElement()?.querySelectorAll("[data-parameters *= from]");
|
|
499
|
+
const pages = Array.from(links || [], (l) => {
|
|
500
|
+
const p = l.getAttribute("data-parameters");
|
|
501
|
+
const v = p?.match(/from\w*:(\d+)/)?.[1] || this.offsetMin.toString();
|
|
502
|
+
return parseInt(v);
|
|
503
|
+
});
|
|
504
|
+
const lastPage = Math.max(...pages, this.offsetMin);
|
|
505
|
+
if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);
|
|
506
|
+
return lastPage;
|
|
507
|
+
}
|
|
508
|
+
getPaginationOffset() {
|
|
509
|
+
const link = this.getPaginationElement()?.querySelector(
|
|
510
|
+
".prev[data-parameters *= from], .prev [data-parameters *= from]"
|
|
511
|
+
);
|
|
512
|
+
if (!link) return this.offsetMin;
|
|
513
|
+
const p = link.getAttribute("data-parameters");
|
|
514
|
+
const v = p?.match(/from\w*:(\d+)/)?.[1] || this.offsetMin.toString();
|
|
515
|
+
return parseInt(v);
|
|
516
|
+
}
|
|
517
|
+
getPaginationUrlGenerator() {
|
|
518
|
+
const url = new URL(this.url.href);
|
|
519
|
+
const parametersElement = this.getPaginationElement()?.querySelector(
|
|
520
|
+
"a[data-block-id][data-parameters]"
|
|
521
|
+
);
|
|
522
|
+
const block_id = parametersElement?.getAttribute("data-block-id") || "";
|
|
523
|
+
const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
|
|
524
|
+
const attrs = {
|
|
525
|
+
mode: "async",
|
|
526
|
+
function: "get_block",
|
|
527
|
+
block_id,
|
|
528
|
+
...parameters
|
|
529
|
+
};
|
|
530
|
+
Object.keys(attrs).forEach((k) => {
|
|
531
|
+
url.searchParams.set(k, attrs[k]);
|
|
532
|
+
});
|
|
533
|
+
const paginationUrlGenerator = (n) => {
|
|
534
|
+
Object.keys(attrs).forEach((k) => {
|
|
535
|
+
k.includes("from") && url.searchParams.set(k, n.toString());
|
|
536
|
+
});
|
|
537
|
+
url.searchParams.set("_", Date.now().toString());
|
|
538
|
+
return url.href;
|
|
539
|
+
};
|
|
540
|
+
return paginationUrlGenerator;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
class PaginationStrategyPathnameParams extends PaginationStrategy {
|
|
544
|
+
constructor() {
|
|
545
|
+
super(...arguments);
|
|
546
|
+
__publicField(this, "pathnameSelector", /\/(\d+)\/?$/);
|
|
547
|
+
__publicField(this, "extractPage", (a) => {
|
|
548
|
+
const href = typeof a === "string" ? a : a.href;
|
|
549
|
+
const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);
|
|
550
|
+
return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
getPaginationLast() {
|
|
554
|
+
const links = getPaginationLinks(
|
|
555
|
+
this.getPaginationElement(),
|
|
556
|
+
this.url.href,
|
|
557
|
+
this.pathnameSelector
|
|
558
|
+
);
|
|
559
|
+
const pages = Array.from(links, this.extractPage);
|
|
560
|
+
const lastPage = Math.max(...pages, this.offsetMin);
|
|
561
|
+
if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);
|
|
562
|
+
return lastPage;
|
|
563
|
+
}
|
|
564
|
+
getPaginationOffset() {
|
|
565
|
+
return this.extractPage(this.url.href);
|
|
566
|
+
}
|
|
567
|
+
getPaginationUrlGenerator(url_ = this.url) {
|
|
568
|
+
const url = new URL(url_.href);
|
|
569
|
+
const pathnameSelectorPlaceholder = this.pathnameSelector.toString().replace(/[/|\\|$|?|(|)]+/g, "/");
|
|
570
|
+
if (!this.pathnameSelector.test(url.pathname)) {
|
|
571
|
+
url.pathname = url.pathname.concat(pathnameSelectorPlaceholder.replace(/d\+/, this.offsetMin.toString())).replace(/\/{2,}/g, "/");
|
|
572
|
+
}
|
|
573
|
+
const paginationUrlGenerator = (offset) => {
|
|
574
|
+
url.pathname = url.pathname.replace(
|
|
575
|
+
this.pathnameSelector,
|
|
576
|
+
pathnameSelectorPlaceholder.replace(/d\+/, offset.toString())
|
|
577
|
+
);
|
|
578
|
+
return url.href;
|
|
579
|
+
};
|
|
580
|
+
return paginationUrlGenerator;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
class PaginationStrategySearchParams extends PaginationStrategy {
|
|
584
|
+
constructor() {
|
|
585
|
+
super(...arguments);
|
|
586
|
+
__publicField(this, "searchParamSelector", "page");
|
|
587
|
+
}
|
|
588
|
+
getPaginationElement() {
|
|
589
|
+
return this.doc.querySelector(this.paginationSelector) || this.doc;
|
|
590
|
+
}
|
|
591
|
+
extractPage(a) {
|
|
592
|
+
const href = typeof a === "string" ? a : a.href;
|
|
593
|
+
const p = new URL(href).searchParams.get(this.searchParamSelector);
|
|
594
|
+
return parseInt(p) || this.offsetMin;
|
|
595
|
+
}
|
|
596
|
+
getPaginationLast() {
|
|
597
|
+
const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter(
|
|
598
|
+
(h) => /(page|p)=\d+/.test(h)
|
|
599
|
+
);
|
|
600
|
+
const pages = links.map(this.extractPage);
|
|
601
|
+
const lastPage = Math.max(...pages, this.offsetMin);
|
|
602
|
+
if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);
|
|
603
|
+
return lastPage;
|
|
604
|
+
}
|
|
605
|
+
getPaginationOffset() {
|
|
606
|
+
if (this.doc === document) {
|
|
607
|
+
return this.extractPage(this.url);
|
|
608
|
+
}
|
|
609
|
+
const link = this.getPaginationElement().querySelector(
|
|
610
|
+
`a.active[href *= "${this.searchParamSelector}="]`
|
|
611
|
+
);
|
|
612
|
+
return this.extractPage(link);
|
|
613
|
+
}
|
|
614
|
+
getPaginationUrlGenerator() {
|
|
615
|
+
const url = new URL(this.url.href);
|
|
616
|
+
const paginationUrlGenerator = (offset) => {
|
|
617
|
+
url.searchParams.set(this.searchParamSelector, offset.toString());
|
|
618
|
+
return url.href;
|
|
619
|
+
};
|
|
620
|
+
return paginationUrlGenerator;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
function getPaginationStrategy(options) {
|
|
624
|
+
const { doc = document, url = location.href } = options;
|
|
625
|
+
const pageLinks = getPaginationLinks(doc, url);
|
|
626
|
+
console.log({ pageLinks });
|
|
627
|
+
const getStrategy = () => {
|
|
628
|
+
if (pageLinks.some((h) => /(page|p)=\d+/.test(h))) {
|
|
629
|
+
const l = pageLinks.filter((h) => /(page|p)=\d+/.test(h));
|
|
630
|
+
console.log("PaginationStrategySearchParams", l);
|
|
631
|
+
return PaginationStrategySearchParams;
|
|
632
|
+
}
|
|
633
|
+
if (pageLinks.some((h) => /\/(page\/)?\d+\/?$/.test(h))) {
|
|
634
|
+
const l = pageLinks.filter((h) => /\/(page\/)?\d+\/?$/.test(h));
|
|
635
|
+
console.log("PaginationStrategyPathnameParams", l);
|
|
636
|
+
return PaginationStrategyPathnameParams;
|
|
637
|
+
}
|
|
638
|
+
const type5Links = Array.from(document.querySelectorAll("[data-parameters *= from]"));
|
|
639
|
+
if (type5Links.length > 0) {
|
|
640
|
+
console.log("PaginationStrategyDataParams", type5Links);
|
|
641
|
+
return PaginationStrategyDataParams;
|
|
642
|
+
}
|
|
643
|
+
console.error("Found No Strategy");
|
|
644
|
+
return PaginationStrategy;
|
|
645
|
+
};
|
|
646
|
+
const paginationStrategy = new (getStrategy())(options);
|
|
647
|
+
return paginationStrategy;
|
|
648
|
+
}
|
|
414
649
|
function chunks(arr, n) {
|
|
415
650
|
return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));
|
|
416
651
|
}
|
|
@@ -513,40 +748,6 @@ class Tick {
|
|
|
513
748
|
function circularShift(n, c = 6, s = 1) {
|
|
514
749
|
return (n + s) % c || c;
|
|
515
750
|
}
|
|
516
|
-
function formatTimeToHHMMSS(timeString) {
|
|
517
|
-
const regex = /(?:(\d+)\s*h\s*)?(?:(\d+)\s*mi?n?\s*)?(?:(\d+)\s*sec)?/;
|
|
518
|
-
const match = timeString.match(regex);
|
|
519
|
-
const h = parseInt(match?.[1] || "0");
|
|
520
|
-
const m = parseInt(match?.[2] || "0");
|
|
521
|
-
const s = parseInt(match?.[3] || "0");
|
|
522
|
-
const pad = (num) => String(num).padStart(2, "0");
|
|
523
|
-
return `${pad(h)}:${pad(m)}:${pad(s)}`;
|
|
524
|
-
}
|
|
525
|
-
function timeToSeconds(t) {
|
|
526
|
-
const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;
|
|
527
|
-
return (r?.match(/\d+/gm) || [0]).reverse().map((s, i) => parseInt(s) * 60 ** i).reduce((a, b) => a + b);
|
|
528
|
-
}
|
|
529
|
-
function parseIntegerOr(n, or) {
|
|
530
|
-
return ((num) => Number.isNaN(num) ? or : num)(parseInt(n));
|
|
531
|
-
}
|
|
532
|
-
function parseDataParams(str) {
|
|
533
|
-
const paramsStr = decodeURI(str.trim()).split(";");
|
|
534
|
-
return paramsStr.reduce((acc, s) => {
|
|
535
|
-
const parsed = s.match(/([\+\w]+):([\w\-\ ]+)?/);
|
|
536
|
-
if (parsed) {
|
|
537
|
-
const [, key, value] = parsed;
|
|
538
|
-
if (value) {
|
|
539
|
-
key.split("+").forEach((p) => {
|
|
540
|
-
acc[p] = value;
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
return acc;
|
|
545
|
-
}, {});
|
|
546
|
-
}
|
|
547
|
-
function parseCSSUrl(s) {
|
|
548
|
-
return s.replace(/url\("|\"\).*/g, "");
|
|
549
|
-
}
|
|
550
751
|
export {
|
|
551
752
|
AsyncPool,
|
|
552
753
|
DataManager,
|
|
@@ -554,6 +755,10 @@ export {
|
|
|
554
755
|
LazyImgLoader,
|
|
555
756
|
MOBILE_UA,
|
|
556
757
|
Observer,
|
|
758
|
+
PaginationStrategy,
|
|
759
|
+
PaginationStrategyDataParams,
|
|
760
|
+
PaginationStrategyPathnameParams,
|
|
761
|
+
PaginationStrategySearchParams,
|
|
557
762
|
Tick,
|
|
558
763
|
chunks,
|
|
559
764
|
circularShift,
|
|
@@ -567,6 +772,7 @@ export {
|
|
|
567
772
|
fetchWith,
|
|
568
773
|
findNextSibling,
|
|
569
774
|
getAllUniqueParents,
|
|
775
|
+
getPaginationStrategy,
|
|
570
776
|
isMob,
|
|
571
777
|
listenEvents,
|
|
572
778
|
objectToFormData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts","../src/utils/parsers/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n handleHtmlCallback: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private handleHtmlCallback: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 350,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n handleHtmlCallback,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.handleHtmlCallback = handleHtmlCallback;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.handleHtmlCallback(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n handleHtmlCallback: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n const iscroller = new InfiniteScroller({\n enabled,\n handleHtmlCallback,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n"],"names":["target","s","observer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n ...rules,\n ...rules.paginationStrategy,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":";;;AAAO,MAAM,SAAS;AAAA,EAEpB,YAAoB,UAAoC;AADjD;AACa,SAAA,WAAA;AAClB,SAAK,WAAW,IAAI,qBAAqB,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,EAAA;AAAA,EAG7E,QAAQ,QAAiB;AAClB,SAAA,SAAS,QAAQ,MAAM;AAAA,EAAA;AAAA,EAG9B,SAAS,QAAiB,cAAsB;AACzC,SAAA,SAAS,UAAU,MAAM;AAC9B,eAAW,MAAM,KAAK,SAAS,QAAQ,MAAM,GAAG,YAAY;AAAA,EAAA;AAAA,EAG9D,mBAAmB,SAA8C;AAC/D,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,gBAAgB;AACnB,aAAA,SAAS,MAAM,MAAM;AAAA,MAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAGF,OAAO,aACL,QACA,UACA,cACA;AACA,UAAM,YAAY,IAAI,SAAS,OAAOA,YAAoB;AAClD,YAAA,YAAY,MAAM,SAAS;AACjC,UAAI,UAAW,WAAU,SAASA,SAAQ,YAAY;AAAA,IAAA,CACvD;AACD,cAAU,QAAQ,MAAM;AACjB,WAAA;AAAA,EAAA;AAEX;AAEO,MAAM,cAAc;AAAA,EAIzB,YAAY,gBAA8C;AAHnD;AACC,yCAAgB;AAiBxB,oCAAW,CAAC,WAA6B;AAClC,WAAA,gBAAgB,SAAS,UAAU,MAAM;AAC9C,aAAO,MAAM,OAAO,aAAa,KAAK,aAAa;AAC5C,aAAA,gBAAgB,KAAK,aAAa;AAAA,IAC3C;AAlBE,SAAK,kBAAkB,IAAI,SAAS,CAAC,WAAoB;AACnD,UAAA,eAAe,MAAM,GAAG;AAC1B,aAAK,SAAS,MAA0B;AAAA,MAAA;AAAA,IAC1C,CACD;AAAA,EAAA;AAAA,EAGH,OAAO,SAAkB,KAAuB,QAAgB;AAC1D,QAAA,CAAC,OAAO,CAAC,OAAQ;AACjB,QAAA,aAAa,KAAK,eAAe,MAAM;AAC3C,QAAI,MAAM;AACL,SAAA,gBAAgB,QAAQ,GAAG;AAAA,EAAA;AAQpC;AC7DO,SAAS,cAAc,GAA0B;AACtD,SAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAAC,OAAKA,GAAE,OAAO,YAAY,CAAC,EAAE,OAAO,OAAK,CAAC;AACpE;AAEO,SAAS,YAAY,GAAW;AACrC,SAAO,GAAG,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,OAAO,YAAiB,KAAA;AAChF;ACkBA,MAAM,WAAW;AAAA,EAGf,YACU,OACA,OACR;AALK;AAkBP,wCAAe,MAAsB;AACnC,aAAO,CAAC,MAAmB;AACzB,cAAM,WAAW,CAAC,KAAK,MAAM,UAAU,EAAE,OAAsB;AACxD,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,gBAAgB;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,aAAO,CAAC,MAAmB;AACzB,cAAM,YAAY,KAAK,MAAM,UAAU,EAAE,OAAsB;AACxD,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,oCAAW,MAAsB;AAC/B,aAAO,CAAC,MAAmB;AACzB,cAAM,OAAO,KAAK,MAAM,KAAK,EAAE,OAAsB;AAC9C,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,0CAAiB,MAAsB;AACrC,aAAO,CAAC,MAAmB;AACnB,cAAA,aACH,EAAE,WAAsB,KAAK,MAAM,sBACnC,EAAE,WAAsB,KAAK,MAAM;AAC/B,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,kBAAkB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,YAAM,OAAO,YAAY,iBAAiB,KAAK,MAAM,kBAAkB;AACvE,aAAO,CAAC,MAAmB;AACnB,cAAA,cAAc,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,KAAe,CAAC;AAC3D,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,YAAM,OAAO,YAAY,iBAAiB,KAAK,MAAM,kBAAkB;AACvE,aAAO,CAAC,MAAmB;AACnB,cAAA,iBAAiB,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,KAAe,CAAC;AAC/D,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AA7EU,SAAA,QAAA;AACA,SAAA,QAAA;AAER,SAAK,QAAQ;AAEP,UAAA,UAAU,OAAO,oBAAoB,IAAI;AAC/C,SAAK,UAAU,QAAQ,OAAO,CAAC,KAA8C,MAAM;AAC7E,UAAA,KAAK,KAAK,OAAO;AACf,YAAA,CAAC,IAAI,KAAK,CAAqB;AACnC,oBAAY,WAAW,EAAE,cAAc,MAAM,CAAC,CAAC,gCAAgC;AAAA,MAAA;AAE1E,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,EAAA;AAkET;AAYO,MAAM,YAAY;AAAA,EAOvB,YAAY,OAAe,OAAwB;AAN3C;AACA;AACA;AACA;AACD;AA8BP,wCAAe,CAAC,SAAqC,SAAS,MAAY;AAClE,YAAA,iBAAiB,OAAO,KAAK,OAAO,EACvC,OAAO,CAAC,MAAM,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,EAChD,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,GAAG;AAE/B,UAAA,eAAe,WAAW,EAAG;AAEjC,YAAM,UAA0B,CAAC;AACjC,UAAI,iBAAiB;AACrB,iBAAW,KAAK,KAAK,KAAK,OAAA,GAAU;AAC9B,YAAA,EAAE,iBAAiB,QAAQ;AAC7B,qBAAW,KAAK,gBAAgB;AAC9B,kBAAM,EAAE,KAAK,cAAc,EAAE,CAAgB;AACrC,oBAAA,KAAK,MAAO,EAAE,QAAwB,UAAU,OAAO,KAAK,SAAS,CAAC;AAAA,UAAA;AAAA,QAChF;AAAA,MACF;AAGF,4BAAsB,MAAM;AAClB,gBAAA,QAAQ,CAAC,WAAW;AACnB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,CACF;AAAA,IACH;AAEA,qCAAY,CAAC,WAA0B;AACrC,YAAM,UAAU,OAAO;AAAA,QACrB,CAAC;AAAA,QACD,GAAG,OAAO,KAAK,KAAK,WAAW,EAAE,IAAI,CAAC,OAAO;AAAA,UAC3C,CAAC,CAAC,GAAG,KAAK,MAAM,CAA0B;AAAA,QAAA,EAC1C;AAAA,MACJ;AACK,WAAA,aAAa,SAAS,MAAM;AAAA,IACnC;AAEA,qCAAY,CACV,MACA,WACA,mBAAmB,OACnB,eAAe,SACN;AACT,YAAM,SAAS,KAAK,MAAM,UAAU,IAAI;AAClC,YAAA,cAAc,KAAK,KAAK;AAE9B,iBAAW,gBAAgB,QAAQ;AACjC,cAAM,MAAM,KAAK,MAAM,YAAY,YAAY;AAC/C,YAAI,CAAC,OAAO,KAAK,KAAK,IAAI,GAAG,GAAG;AAC1B,cAAA,+BAA+B,OAAO;AAC1C;AAAA,QAAA;AAGF,cAAM,OAAO,KAAK,MAAM,aAAa,YAAY;AAC5C,aAAA,KAAK,IAAI,KAAK,EAAE,SAAS,cAAc,GAAG,MAAM;AAErD,YAAI,cAAc;AAChB,gBAAM,EAAE,KAAK,WAAW,KAAK,MAAM,gBAAgB,YAAY;AAC/D,eAAK,cAAc,OAAO,cAAc,KAAyB,MAAM;AAAA,QAAA;AAGnE,cAAA,SAAS,aAAa,KAAK,MAAM;AACvC,YAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO,YAAY,YAAY;AAAA,MAAA;AAGrE,WAAK,UAAU,WAAW;AAAA,IAC5B;AA3FE,SAAK,QAAQ;AACb,SAAK,QAAQ;AACR,SAAA,2BAAW,IAAI;AACpB,SAAK,gBAAgB,IAAI;AAAA,MACvB,CAAC,WAAoB,CAAC,KAAK,WAAW,MAAqB;AAAA,IAC7D;AACA,SAAK,cAAc,IAAI,WAAW,OAAO,KAAK,EAAE;AAEhD,UAAM,UAAU,CAAC,QAAS,WAAmB,YAAY,EAAE,OAAO,OAAO;AACjE,YAAA,QAAQ,CAAC,MAAW;AAC1B,aAAO,OAAO,GAAG;AAAA,QACf,aAAa,MAAM,KAAK,KAAK,MAAM;AAAA,QACnC,gBAAgB,MAAM,KAAK,KAAK,UAAU;AAAA,MAAA,CAC3C;AAAA,IAAA,CACF;AAAA,EAAA;AAAA,EAGH,OAAO,iBAAiB,KAAuB;AAC7C,UAAM,aAAa,CAAC,MAAc,UAAU,CAAC;AACvC,UAAA,OAAO,IAAI,QAAQ,YAAY,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;AACrD,WAAA,cAAc,IAAI,EAAE,IAAI,CAAC,SAAiB,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,EAAA;AAAA,EAGxE,WAAW,IAA0B;AAC5B,WAAA,GAAG,UAAU,SAAS,UAAU;AAAA,EAAA;AAAA,EAqEzC,KAAK,UAAkB;AACjB,QAAA,KAAK,KAAK,OAAO,EAAG;AAElB,UAAA,SAAS,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AACzD,aACI,KAAK,KAAK,IAAI,CAAC,EAAkB,QAAQ,IACzC,KAAK,KAAK,IAAI,CAAC,EAAkB,QAAQ;AAAA,IAAA,CAE9C;AAEK,UAAA,YAAc,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,EAAkB,QAC1D;AAEI,WAAA,QAAQ,CAAC,MAAM;AACpB,YAAM,IAAK,KAAK,KAAK,IAAI,CAAC,EAAkB;AAC5C,gBAAU,OAAO,CAAC;AAAA,IAAA,CACnB;AAAA,EAAA;AAEL;AC7OO,SAAS,SAAS,MAA2B;AAClD,QAAM,SAAS,IAAI,YAAY,gBAAgB,MAAM,WAAW,EAAE;AAClE,SAAO,OAAO,SAAS,SAAS,IAAI,SAAS,OAAO;AACtD;AAEgB,SAAA,eAAe,QAA+B,QAA+B;AAChF,aAAA,QAAQ,OAAO,YAAY;AACpC,SAAK,aAAa,OAAO,aAAa,KAAK,UAAU,KAAK,SAAS;AAAA,EAAA;AAEvE;AAEgB,SAAA,kBAAkB,GAA0B,SAAiB;AACrE,QAAA,gBAAgB,SAAS,cAAc,OAAO;AACpD,iBAAe,eAAe,CAAC;AAC/B,gBAAc,YAAY,EAAE;AAC1B,IAAA,YAAY,aAAa,eAAe,CAAC;AACpC,SAAA;AACT;AAEO,SAAS,oBAAoB,UAAwD;AAC1F,SAAO,MAAM,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,MAAM;AAC7C,QAAI,EAAE,iBAAiB,CAAC,IAAI,SAAS,EAAE,aAA4B,GAAG;AAAM,UAAA,KAAK,EAAE,aAAa;AAAA,IAAA;AACzF,WAAA;AAAA,EACT,GAAG,EAAkC;AACvC;AAEO,SAAS,gBAAgB,IAA2B;AACrD,MAAA,GAAG,mBAAoB,QAAO,GAAG;AACrC,MAAI,GAAG,cAAsB,QAAA,gBAAgB,GAAG,aAAa;AACtD,SAAA;AACT;AAEgB,SAAA,qBAAqB,QAA+B,UAAkB,UAAuC;AAC3H,QAAM,WAAW,IAAI,iBAAiB,CAAC,eAAe;AAC9C,UAAA,KAAK,OAAO,cAAc,QAAQ;AACxC,QAAI,IAAI;AACN,eAAS,WAAW;AACpB,eAAS,EAAE;AAAA,IAAA;AAAA,EACb,CACD;AACQ,WAAA,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,MAAM;AACpE;AAEgB,SAAA,0BAA0B,SACxC,UAAqE;AACjE,MAAA,QAAQ,QAAQ,SAAS;AAC7B,QAAM,WAAW,IAAI,iBAAiB,CAAC,cAAcC,cAAa;AAChE,eAAW,YAAY,cAAc;AAC/B,UAAA,SAAS,SAAS,aAAa;AAC7B,YAAA,UAAU,QAAQ,SAAS,QAAQ;AACrC,kBAAQ,QAAQ,SAAS;AACzB,mBAASA,WAAU,KAAK;AAAA,QAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CACD;AACD,WAAS,QAAQ,SAAS,EAAE,WAAW,MAAM;AAC/C;AAEO,SAAS,4BACd,SACA,UACA,WAAW,KACX,QAAQ,UACR,UAAmC,EAAE,WAAW,MAAM,SAAS,MAAM,YAAY,QACjF;AACI,MAAA;AACA,MAAA;AACJ,MAAI,SAAS;AACb,QAAM,WAAW,IAAI,iBAAiB,CAAC,eAAe,cAAc;AAC9D,QAAA,WAAW,YAAY,SAAS,GAAG;AACrC,eAAS,WAAW;AACpB;AAAA,IAAA;AAEF;AACM,UAAA,MAAM,KAAK,IAAI;AACjB,QAAA,oBAAoB,MAAM,mBAAmB,UAAU;AACzD,iBAAW,aAAa,OAAO;AAAA,IAAA;AAEvB,cAAA,WAAW,UAAU,QAAQ;AACpB,uBAAA;AAAA,EAAA,CACpB;AACQ,WAAA,QAAQ,SAAS,OAAO;AAC1B,SAAA;AACT;AAEgB,SAAA,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,MAAM;AAAE,KAAK;AACzF,QAAA,MAAM,SAAS,QAAQ,MAAM;AAE/B,MAAA,QAAQ,OAAiB,UAAA,cAAc,QAAQ,MAAM,GAAG,OAAO,GAAG;AAClE,MAAA,QAAQ,MAAgB,UAAA,cAAc,QAAQ,KAAK,GAAG,MAAM,GAAG;AAE/D,MAAA,iBAAiB,SAAS,CAAC,MAAM;AACnC,MAAE,eAAe;AAEb,QAAA,QAAQ,SAAU,SAAQ,SAAS;AAEvC,yBAAqB,SAAS,MAAM,SAAS,CAAC,UAAmB;AAC/D,aAAO,SAAS,OAAO,MAAM,aAAa,KAAK;AAAA,IAAA,CAChD;AAAA,EAAA,CACF;AACH;AAEO,SAAS,iBAAiB,OAAyB;AACxD,QAAM,gBAAgB,KAAK;AAC3B,QAAM,KAAK;AACX,QAAM,OAAO;AACf;ACzGO,MAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAEM,SAAA,UACd,KACA,UAAmC,EAAE,MAAM,OAAO,QAAQ,SAC1D;AACA,QAAM,UAAU,CAAC;AACjB,MAAI,QAAQ,OAAe,QAAA,OAAO,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,cAAc,UAAU,CAAC,GAAG;AAChG,SAAO,MAAM,KAAK,OAAO,EACtB,KAAK,CAAC,MAAM,EAAE,KAAA,CAAM,EACpB,KAAK,CAAC,MAAO,QAAQ,OAAO,SAAS,CAAC,IAAI,CAAE;AACjD;AAEa,MAAA,YAAY,CAAC,QAAgB,UAAU,KAAK,EAAE,MAAM,KAAM,CAAA;AAEhE,MAAM,YAAY,CAAC,QAAgB,UAAU,GAAG;AAEhD,SAAS,iBAAiB,QAA6D;AACtF,QAAA,WAAW,IAAI,SAAS;AAC9B,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,SAAS,OAAO,GAAG,CAAW,CAAC;AACnE,SAAA;AACT;ACJO,MAAM,iBAAiB;AAAA,EAS5B,YAAY;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACoB;AAnBf;AACA;AACA;AACA;AACA;AACA;AACC;AAiCA,uCAA2D,CAAC;AAcpE,6CAAoB,YAAY;AAC1B,UAAA,CAAC,KAAK,QAAgB,QAAA;AAC1B,YAAM,EAAE,OAAO,EAAE,KAAK,OAAO,IAAI,IAAI,SAAS,MAAM,KAAK,oBAAoB,KAAK;AAClF,UAAI,CAAC,MAAM;AACH,cAAA,eAAe,MAAM,UAAU,GAAG;AAClC,cAAA,gBAAgB,SAAS,gBAAgB;AAC/C,aAAK,mBAAmB;AACxB,aAAK,UAAU,YAAY;AAC3B,aAAK,UAAU;AACR,eAAA,SAAS,GAAG,aAAa;AAChC,YAAI,KAAK,cAAc;AACrB,kBAAQ,aAAa,IAAI,IAAI,GAAG;AAAA,QAAA;AAAA,MAClC;AAEF,aAAO,CAAC;AAAA,IACV;AAhDE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AACtB,SAAK,YAAY;AAEZ,SAAA,sBACH,uBAAuB,KACvB,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,UAAM,aAAa,0BAA0B;AAC7C,aAAS,aAAa,YAAY,KAAK,mBAAmB,KAAK,KAAK;AAAA,EAAA;AAAA,EAK/D,SAAS,UAAgD,WAAW,OAAO;AAC5E,QAAA,mBAAmB,IAAI;AACtB,SAAA,YAAY,KAAK,QAAQ;AACvB,WAAA;AAAA,EAAA;AAAA,EAGD,YAAY;AACb,SAAA,YAAY,QAAQ,CAAC,OAAO;AAC/B,SAAG,IAAI;AAAA,IAAA,CACR;AAAA,EAAA;AAAA,EAoBH,QAAQ,0BACN,aACA,YACA,aACiB;AACjB,aAAS,SAAS,cAAc,GAAG,UAAU,YAAY,UAAU;AAC3D,YAAA,MAAM,YAAY,MAAM;AACxB,YAAA,EAAE,KAAK,OAAO;AAAA,IAAA;AAAA,EACtB;AAEJ;ACtFgB,SAAA,uBACd,OACA,WACA,OACA;AACM,QAAA,UAAU,MAAM,MAAM;AAEtB,QAAA,YAAY,IAAI,iBAAiB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG,MAAM;AAAA,EACV,CAAA,EAAE,SAAS,CAAC,EAAE,gBAAgB,uBAAuB;AACpD,UAAM,WAAW,eAAe;AAChC,UAAM,WAAW,cAAc;AAAA,KAC9B,IAAI;AAEP,QAAM,UAAU,MAAM;AACV,cAAA,UAAU,MAAM,MAAM;AAAA,EAAA,CACjC;AAEM,SAAA;AACT;ACxCO,SAAS,mBACd,MAA8B,UAC9B,MAA+B,SAAS,MACxC,mBAAmB,sBACT;AACJ,QAAA,aAAa,SAAS,GAAG;AAC/B,aAAW,WAAW,WAAW,SAAS,QAAQ,kBAAkB,GAAG;AACvE,QAAM,YAAY,MAAM;AAAA,IACrB,IAAI,iBAAiB,SAAS,KAAuC,CAAC;AAAA,IACvE,CAAC,MAAM,EAAE;AAAA,EAAA,EACT,OAAO,CAAC,MAAM;AACV,QAAA;AACI,YAAA,UAAU,IAAI,IAAI,EAAE,QAAQ,MAAM,EAAE,GAAG,IAAI,WAAW,WAAW,MAAM;AAE3E,aAAA,QAAQ,WAAW,WAAW,UAAU,QAAQ,SAAS,WAAW,WAAW,QAAQ;AAAA,IAAA,QAEnF;AACC,aAAA;AAAA,IAAA;AAAA,EACT,CACD;AACM,SAAA;AACT;AAEO,SAAS,SAAS,GAAqD;AAC5E,MAAI,OAAO,MAAM,SAAiB,QAAA,IAAI,IAAI,CAAC;AACpC,SAAA,IAAI,IAAI,EAAE,IAAI;AACvB;ACdO,MAAM,mBAAmB;AAAA,EAO9B,YAAY,SAA+B;AANpC,+BAAM;AACN;AACA,8CAAqB;AACrB;AACA,qCAAY;AAGjB,QAAI,SAAS;AACJ,aAAA,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AAC1C,eAAO,OAAO,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG;AAAA,MAAA,CAC/B;AAAA,IAAA;AAGH,SAAK,MAAM,SAAS,SAAS,OAAO,KAAK,IAAI,GAAG;AAAA,EAAA;AAAA,EAGlD,uBAAuB;AACrB,WAAQ,KAAK,IAAI,cAAc,KAAK,kBAAkB,KAAK,KAAK;AAAA,EAAA;AAAA,EAGlE,sBAAsB;AACpB,WAAO,KAAK;AAAA,EAAA;AAAA,EAEd,oBAAoB;AAClB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,4BAA4B;AACnB,WAAA,CAAC,MAAc,KAAK,IAAI;AAAA,EAAA;AAEnC;AC3CO,SAAS,mBAAmB,YAA4B;AAC7D,QAAM,QAAgB;AAChB,QAAA,QAAiC,WAAW,MAAM,KAAK;AAC7D,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AAC5C,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AAC5C,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AACtC,QAAA,MAAM,CAAC,QAAwB,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG;AACzD,SAAA,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACtC;AAGO,SAAS,cAAc,GAAmB;AAC/C,QAAM,IAAI,cAAc,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI;AAClD,UAAA,GAAG,MAAM,OAAO,KAAK,CAAC,CAAC,GAC5B,QAAA,EACA,IAAI,CAAC,GAAG,MAAM,SAAS,CAAW,IAAI,MAAM,CAAC,EAC7C,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3B;AAEgB,SAAA,eAAe,GAAoB,IAAoB;AAC7D,UAAA,CAAA,QAAO,OAAO,MAAM,GAAG,IAAI,KAAK,KAAK,SAAS,CAAW,CAAC;AACpE;AAGO,SAAS,gBAAgB,KAAqC;AACnE,QAAM,YAAY,UAAU,IAAI,MAAM,EAAE,MAAM,GAAG;AACjD,SAAO,UAAU,OAAO,CAAC,KAAK,MAAM;AAC5B,UAAA,SAAS,EAAE,MAAM,wBAAwB;AAC/C,QAAI,QAAQ;AACV,YAAM,CAAG,EAAA,KAAK,KAAK,IAAI;AACvB,UAAI,OAAO;AACT,YAAI,MAAM,GAAG,EAAE,QAAQ,CAAK,MAAA;AAAE,cAAI,CAAC,IAAI;AAAA,QAAA,CAAQ;AAAA,MAAA;AAAA,IACjD;AAEK,WAAA;AAAA,EACT,GAAG,EAA4B;AACjC;AAEO,SAAS,YAAY,GAAW;AAC9B,SAAA,EAAE,QAAQ,kBAAkB,EAAE;AACvC;ACrCO,MAAM,qCAAqC,mBAAmB;AAAA,EACnE,oBAAoB;AAClB,UAAM,QAAQ,KAAK,qBAAqB,GAAG,iBAAiB,2BAA2B;AACvF,UAAM,QAAQ,MAAM,KAAK,SAAS,CAAA,GAAI,CAAC,MAAM;AACrC,YAAA,IAAI,EAAE,aAAa,iBAAiB;AACpC,YAAA,IAAI,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK,KAAK,UAAU,SAAS;AACpE,aAAO,SAAS,CAAC;AAAA,IAAA,CAClB;AACD,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AACd,UAAA,OAAO,KAAK,qBAAA,GAAwB;AAAA,MACxC;AAAA,IACF;AACI,QAAA,CAAC,KAAM,QAAO,KAAK;AACjB,UAAA,IAAI,KAAK,aAAa,iBAAiB;AACvC,UAAA,IAAI,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK,KAAK,UAAU,SAAS;AACpE,WAAO,SAAS,CAAC;AAAA,EAAA;AAAA,EAGnB,4BAA4B;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3B,UAAA,oBAAoB,KAAK,qBAAA,GAAwB;AAAA,MACrD;AAAA,IACF;AACA,UAAM,WAAW,mBAAmB,aAAa,eAAe,KAAK;AACrE,UAAM,aAAa,gBAAgB,mBAAmB,aAAa,iBAAiB,KAAK,EAAE;AAE3F,UAAM,QAAgC;AAAA,MACpC,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM;AAChC,UAAI,aAAa,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,IAAA,CACjC;AAEK,UAAA,yBAAyB,CAAC,MAAc;AAC5C,aAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM;AAC9B,UAAA,SAAS,MAAM,KAAK,IAAI,aAAa,IAAI,GAAG,EAAE,UAAU;AAAA,MAAA,CAC3D;AACD,UAAI,aAAa,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU;AAC/C,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;AChDO,MAAM,yCAAyC,mBAAmB;AAAA,EAAlE;AAAA;AACE,4CAAmB;AAE1B,uCAAc,CAAC,MAAqD;AAClE,YAAM,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACrC,YAAA,EAAE,SAAS,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,WAAW,KAAK,IAAI,MAAM;AAC/D,aAAA,SAAS,SAAS,MAAM,KAAK,gBAAgB,GAAG,SAAS,KAAK,UAAU,SAAA,CAAU;AAAA,IAC3F;AAAA;AAAA,EAEA,oBAAoB;AAClB,UAAM,QAAQ;AAAA,MACZ,KAAK,qBAAqB;AAAA,MAC1B,KAAK,IAAI;AAAA,MACT,KAAK;AAAA,IACP;AACA,UAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,WAAW;AAChD,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AACpB,WAAO,KAAK,YAAY,KAAK,IAAI,IAAI;AAAA,EAAA;AAAA,EAGvC,0BAA0B,OAAY,KAAK,KAAK;AAC9C,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI;AAE7B,UAAM,8BAA8B,KAAK,iBACtC,WACA,QAAQ,oBAAoB,GAAG;AAElC,QAAI,CAAC,KAAK,iBAAiB,KAAK,IAAI,QAAQ,GAAG;AAC7C,UAAI,WAAW,IAAI,SAChB,OAAO,4BAA4B,QAAQ,OAAO,KAAK,UAAU,SAAU,CAAA,CAAC,EAC5E,QAAQ,WAAW,GAAG;AAAA,IAAA;AAGrB,UAAA,yBAAyB,CAAC,WAAmB;AAC7C,UAAA,WAAW,IAAI,SAAS;AAAA,QAC1B,KAAK;AAAA,QACL,4BAA4B,QAAQ,OAAO,OAAO,SAAU,CAAA;AAAA,MAC9D;AACA,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;ACrDO,MAAM,uCAAuC,mBAAmB;AAAA,EAAhE;AAAA;AACE,+CAAsB;AAAA;AAAA,EAE7B,uBAAuB;AACrB,WAAQ,KAAK,IAAI,cAAc,KAAK,kBAAkB,KAAK,KAAK;AAAA,EAAA;AAAA,EAGlE,YAAY,GAAwD;AAClE,UAAM,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACrC,UAAA,IAAI,IAAI,IAAI,IAAI,EAAE,aAAa,IAAI,KAAK,mBAAmB;AAC1D,WAAA,SAAS,CAAC,KAAK,KAAK;AAAA,EAAA;AAAA,EAG7B,oBAAoB;AACZ,UAAA,QAAQ,mBAAmB,KAAK,wBAAwB,KAAK,IAAI,IAAI,EAAE;AAAA,MAAO,CAAC,MACnF,eAAe,KAAK,CAAC;AAAA,IACvB;AACA,UAAM,QAAQ,MAAM,IAAI,KAAK,WAAW;AACxC,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AAChB,QAAA,KAAK,QAAQ,UAAU;AAClB,aAAA,KAAK,YAAY,KAAK,GAAG;AAAA,IAAA;AAE5B,UAAA,OAAO,KAAK,qBAAA,EAAuB;AAAA,MACvC,qBAAqB,KAAK,mBAAmB;AAAA,IAC/C;AACO,WAAA,KAAK,YAAY,IAAI;AAAA,EAAA;AAAA,EAG9B,4BAA4B;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3B,UAAA,yBAAyB,CAAC,WAAmB;AACjD,UAAI,aAAa,IAAI,KAAK,qBAAqB,OAAO,UAAU;AAChE,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;ACrCO,SAAS,sBAAsB,SAA8B;AAClE,QAAM,EAAE,MAAM,UAAU,MAAM,SAAS,SAAS;AAC1C,QAAA,YAAY,mBAAmB,KAAK,GAAG;AAErC,UAAA,IAAI,EAAE,WAAW;AAEzB,QAAM,cAAc,MAAiC;AAC/C,QAAA,UAAU,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC,GAAG;AAC3C,YAAA,IAAI,UAAU,OAAO,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC;AAChD,cAAA,IAAI,kCAAkC,CAAC;AACxC,aAAA;AAAA,IAAA;AAGL,QAAA,UAAU,KAAK,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC,GAAG;AACjD,YAAA,IAAI,UAAU,OAAO,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC;AACtD,cAAA,IAAI,oCAAoC,CAAC;AAC1C,aAAA;AAAA,IAAA;AAGT,UAAM,aAAa,MAAM,KAAK,SAAS,iBAAiB,2BAA2B,CAAC;AAChF,QAAA,WAAW,SAAS,GAAG;AACjB,cAAA,IAAI,gCAAgC,UAAU;AAC/C,aAAA;AAAA,IAAA;AAGT,YAAQ,MAAM,mBAAmB;AAC1B,WAAA;AAAA,EACT;AAEA,QAAM,qBAAqB,KAAK,YAAY,GAAG,OAAO;AAE/C,SAAA;AACT;ACzCgB,SAAA,OAAU,KAAe,GAA4B;AAC5D,SAAA,MAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC,EAAA,GAAK,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;AAChG;AAEO,SAAS,MAAM,MAAc,UAAkB,GAAG,OAAe,GAAa;AAC5E,SAAA,MAAM,KAAK,EAAE,QAAQ,KAAA,GAAQ,CAAC,GAAG,UAAU,UAAU,QAAQ,IAAI;AAC1E;ACLA,eAAsB,sBAAsB,UAAyC;AACnF,QAAM,MAAM,CAAC;AACb,mBAAiB,KAAK,UAAU;AAC1B,QAAA,KAAK,MAAM,GAAG;AAAA,EAAA;AAEb,SAAA;AACT;AAEO,SAAS,KAAK,cAAsB;AACzC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AACnE;AAOO,MAAM,UAAU;AAAA,EAWrB,YAAoB,MAAM,GAAW,OAA6B,CAAA,GAAI;AAV9D,+BAAM;AACN;AACA;AAQY,SAAA,MAAA;AAAiB,SAAA,OAAA;AACnC,SAAK,WAAW,IAAI,QAAQ,CAAC,YAAY;AACvC,WAAK,WAAW;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EATH,aAAoB,eAAe,MAAM,GAAG,OAAqD,CAAA,GAAI;AAC7F,UAAA,QAAQ,IAAI,UAAU,GAAG;AAC/B,SAAK,QAAQ,CAAA,MAAK,MAAM,KAAK,CAAC,CAAC;AAC/B,WAAO,MAAM,IAAI;AAAA,EAAA;AAAA,EASX,qBAAqB,IAAI,GAAsC;AACrE,QAAI,IAAI,KAAK,KAAK,KAAK,WAAW,EAAU,QAAA;AACtC,UAAA,IAAI,KAAK,KAAK,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9C,QAAI,KAAK,GAAG;AACV,YAAM,MAAM,KAAK,KAAK,CAAC,EAAE;AACpB,WAAA,KAAK,OAAO,GAAG,CAAC;AACd,aAAA;AAAA,IAAA;AAEF,WAAA,KAAK,qBAAqB,IAAI,CAAC;AAAA,EAAA;AAAA,EAGxC,MAAc,UAAU;AACjB,SAAA;AACC,UAAA,IAAI,KAAK,qBAAqB;AACpC,UAAM,IAAI;AACL,SAAA;AACL,SAAK,SAAS;AAAA,EAAA;AAAA,EAGR,WAAW;AACb,QAAA,CAAC,KAAK,KAAK,QAAQ;AACrB,WAAK,WAAW,IAAI;AACpB;AAAA,IAAA;AAEE,QAAA,KAAK,MAAM,KAAK,KAAK;AACvB,WAAK,QAAQ;AACb,WAAK,SAAS;AAAA,IAAA;AAAA,EAChB;AAAA,EAGF,MAAa,MAAM;AACjB,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EAAA;AAAA,EAGP,KAAK,GAA0C;AAC/C,SAAA,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAA,CAAG;AAAA,EAAA;AAEhD;ACzEO,SAAS,QAAQ;AACf,SAAA,kBAAkB,KAAK,UAAU,SAAS;AACnD;ACFgB,SAAA,aAAa,KAA4B,QAAuB,UAAoC;AAClH,aAAW,KAAK,QAAQ;AAClB,QAAA,iBAAiB,GAAG,UAAU,IAAI;AAAA,EAAA;AAE1C;AAEO,MAAM,KAAK;AAAA,EAIhB,YAAoB,OAAuB,iBAA0B,MAAM;AAHnE;AACA;AAEY,SAAA,QAAA;AAAuB,SAAA,iBAAA;AAAA,EAAA;AAAA,EAEpC,MAAM,UAAsB,eAAkC;AACnE,SAAK,KAAK;AACV,SAAK,gBAAgB;AACjB,QAAA,KAAK,eAAyB,UAAA;AAClC,SAAK,OAAO,OAAO,YAAY,UAAU,KAAK,KAAK;AAAA,EAAA;AAAA,EAG9C,OAAa;AACd,QAAA,KAAK,SAAS,QAAW;AAC3B,oBAAc,KAAK,IAAI;AACvB,WAAK,OAAO;AAAA,IAAA;AAEd,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AAAA,IAAA;AAAA,EACvB;AAEJ;AC7BO,SAAS,cAAc,GAAW,IAAI,GAAG,IAAI,GAAW;AACrD,UAAA,IAAI,KAAK,KAAK;AACxB;"}
|