le-text"> css-table.js d8e79ace03 index commit vor 2 Jahren css-text-align-last.js d8e79ace03 index commit vor 2 Jahren css-text-box-trim.js d8e79ace03 index commit vor 2 Jahren css-text-indent.js d8e79ace03 index commit vor 2 Jahren css-text-justify.js d8e79ace03 index commit vor 2 Jahren css-text-orientation.js d8e79ace03 index commit vor 2 Jahren css-text-spacing.js d8e79ace03 index commit vor 2 Jahren css-textshadow.js d8e79ace03 index commit vor 2 Jahren css-touch-action.js d8e79ace03 index commit vor 2 Jahren css-transitions.js d8e79ace03 index commit vor 2 Jahren css-unicode-bidi.js d8e79ace03 index commit vor 2 Jahren css-unset-value.js d8e79ace03 index commit vor 2 Jahren css-variables.js d8e79ace03 index commit vor 2 Jahren css-when-else.js d8e79ace03 index commit vor 2 Jahren css-widows-orphans.js d8e79ace03 index commit vor 2 Jahren css-width-stretch.js d8e79ace03 index commit vor 2 Jahren css-writing-mode.js d8e79ace03 index commit vor 2 Jahren css-zoom.js d8e79ace03 index commit vor 2 Jahren css3-attr.js d8e79ace03 index commit vor 2 Jahren css3-boxsizing.js d8e79ace03 index commit vor 2 Jahren css3-colors.js d8e79ace03 index commit vor 2 Jahren css3-cursors-grab.js d8e79ace03 index commit vor 2 Jahren css3-cursors-newer.js d8e79ace03 index commit vor 2 Jahren css3-cursors.js d8e79ace03 index commit vor 2 Jahren css3-tabsize.js d8e79ace03 index commit vor 2 Jahren currentcolor.js d8e79ace03 index commit vor 2 Jahren custom-elements.js d8e79ace03 index commit vor 2 Jahren custom-elementsv1.js d8e79ace03 index commit vor 2 Jahren customevent.js d8e79ace03 index commit vor 2 Jahren datalist.js d8e79ace03 index commit vor 2 Jahren dataset.js d8e79ace03 index commit vor 2 Jahren datauri.js d8e79ace03 index commit vor 2 Jahren date-tolocaledatestring.js d8e79ace03 index commit vor 2 Jahren declarative-shadow-dom.js d8e79ace03 index commit vor 2 Jahren decorators.js d8e79ace03 index commit vor 2 Jahren details.js d8e79ace03 index commit vor 2 Jahren deviceorientation.js d8e79ace03 index commit vor 2 Jahren devicepixelratio.js d8e79ace03 index commit vor 2 Jahren dialog.js d8e79ace03 index commit vor 2 Jahren dispatchevent.js d8e79ace03 index commit vor 2 Jahren dnssec.js d8e79ace03 index commit vor 2 Jahren do-not-track.js d8e79ace03 index commit vor 2 Jahren document-currentscript.js d8e79ace03 index commit vor 2 Jahren document-evaluate-xpath.js d8e79ace03 index commit vor 2 Jahren document-execcommand.js d8e79ace03 index commit vor 2 Jahren document-policy.js d8e79ace03 index commit vor 2 Jahren document-scrollingelement.js d8e79ace03 index commit vor 2 Jahren documenthead.js d8e79ace03 index commit vor 2 Jahren dom-manip-convenience.js d8e79ace03 index commit vor 2 Jahren dom-range.js d8e79ace03 index commit vor 2 Jahren domcontentloaded.js d8e79ace03 index commit vor 2 Jahren dommatrix.js d8e79ace03 index commit vor 2 Jahren download.js d8e79ace03 index commit vor 2 Jahren dragndrop.js d8e79ace03 index commit vor 2 Jahren element-closest.js d8e79ace03 index commit vor 2 Jahren element-from-point.js d8e79ace03 index commit vor 2 Jahren element-scroll-methods.js d8e79ace03 index commit vor 2 Jahren eme.js d8e79ace03 index commit vor 2 Jahren eot.js d8e79ace03 index commit vor 2 Jahren es5.js d8e79ace03 index commit vor 2 Jahren es6-class.js d8e79ace03 index commit vor 2 Jahren es6-generators.js d8e79ace03 index commit vor 2 Jahren es6-module-dynamic-import.js d8e79ace03 index commit vor 2 Jahren es6-module.js d8e79ace03 index commit vor 2 Jahren es6-number.js d8e79ace03 index commit vor 2 Jahren es6-string-includes.js d8e79ace03 index commit vor 2 Jahren es6.js d8e79ace03 index commit vor 2 Jahren eventsource.js d8e79ace03 index commit vor 2 Jahren extended-system-fonts.js d8e79ace03 index commit vor 2 Jahren feature-policy.js d8e79ace03 index commit vor 2 Jahren fetch.js d8e79ace03 index commit vor 2 Jahren fieldset-disabled.js d8e79ace03 index commit vor 2 Jahren fileapi.js d8e79ace03 index commit vor 2 Jahren filereader.js d8e79ace03 index commit vor 2 Jahren filereadersync.js d8e79ace03 index commit vor 2 Jahren filesystem.js d8e79ace03 index commit vor 2 Jahren flac.js d8e79ace03 index commit vor 2 Jahren flexbox-gap.js d8e79ace03 index commit vor 2 Jahren flexbox.js d8e79ace03 index commit vor 2 Jahren flow-root.js d8e79ace03 index commit vor 2 Jahren focusin-focusout-events.js d8e79ace03 index commit vor 2 Jahren font-family-system-ui.js d8e79ace03 index commit vor 2 Jahren font-feature.js d8e79ace03 index commit vor 2 Jahren font-kerning.js d8e79ace03 index commit vor 2 Jahren font-loading.js d8e79ace03 index commit vor 2 Jahren font-size-adjust.js d8e79ace03 index commit vor 2 Jahren font-smooth.js d8e79ace03 index commit vor 2 Jahren font-unicode-range.js d8e79ace03 index commit vor 2 Jahren font-variant-alternates.js d8e79ace03 index commit vor 2 Jahren font-variant-numeric.js d8e79ace03 index commit vor 2 Jahren fontface.js d8e79ace03 index commit vor 2 Jahren form-attribute.js d8e79ace03 index commit vor 2 Jahren form-submit-attributes.js d8e79ace03 index commit vor 2 Jahren form-validation.js d8e79ace03 index commit vor 2 Jahren forms.js d8e79ace03 index commit vor 2 Jahren fullscreen.js d8e79ace03 index commit vor 2 Jahren gamepad.js d8e79ace03 index commit vor 2 Jahren geolocation.js d8e79ace03 index commit vor 2 Jahren getboundingclientrect.js d8e79ace03 index commit vor 2 Jahren getcomputedstyle.js d8e79ace03 index commit vor 2 Jahren getelementsbyclassname.js d8e79ace03 index commit vor 2 Jahren getrandomvalues.js d8e79ace03 index commit vor 2 Jahren gyroscope.js d8e79ace03 index commit vor 2 Jahren hardwareconcurrency.js d8e79ace03 index commit vor 2 Jahren hashchange.js d8e79ace03 index commit vor 2 Jahren heif.js d8e79ace03 index commit vor 2 Jahren hevc.js d8e79ace03 index commit vor 2 Jahren hidden.js d8e79ace03 index commit vor 2 Jahren high-resolution-time.js d8e79ace03 index commit vor 2 Jahren history.js d8e79ace03 index commit vor 2 Jahren html-media-capture.js d8e79ace03 index commit vor 2 Jahren html5semantic.js d8e79ace03 index commit vor 2 Jahren http-live-streaming.js d8e79ace03 index commit vor 2 Jahren http2.js d8e79ace03 index commit vor 2 Jahren http3.js d8e79ace03 index commit vor 2 Jahren iframe-sandbox.js d8e79ace03 index commit vor 2 Jahren iframe-seamless.js d8e79ace03 index commit vor 2 Jahren iframe-srcdoc.js d8e79ace03 index commit vor 2 Jahren imagecapture.js d8e79ace03 index commit vor 2 Jahren ime.js d8e79ace03 index commit vor 2 Jahren img-naturalwidth-naturalheight.js d8e79ace03 index commit vor 2 Jahren import-maps.js d8e79ace03 index commit vor 2 Jahren imports.js d8e79ace03 index commit vor 2 Jahren indeterminate-checkbox.js d8e79ace03 index commit vor 2 Jahren indexeddb.js d8e79ace03 index commit vor 2 Jahren indexeddb2.js d8e79ace03 index commit vor 2 Jahren inline-block.js d8e79ace03 index commit vor 2 Jahren innertext.js d8e79ace03 index commit vor 2 Jahren input-autocomplete-onoff.js d8e79ace03 index commit vor 2 Jahren input-color.js d8e79ace03 index commit vor 2 Jahren input-datetime.js d8e79ace03 index commit vor 2 Jahren input-email-tel-url.js d8e79ace03 index commit vor 2 Jahren input-event.js d8e79ace03 index commit vor 2 Jahren input-file-accept.js d8e79ace03 index commit vor 2 Jahren input-file-directory.js d8e79ace03 index commit vor 2 Jahren input-file-multiple.js d8e79ace03 index commit vor 2 Jahren input-inputmode.js d8e79ace03 index commit vor 2 Jahren input-minlength.js d8e79ace03 index commit vor 2 Jahren input-number.js d8e79ace03 index commit vor 2 Jahren input-pattern.js d8e79ace03 index commit vor 2 Jahren input-placeholder.js d8e79ace03 index commit vor 2 Jahren input-range.js d8e79ace03 index commit vor 2 Jahren input-search.js d8e79ace03 index commit vor 2 Jahren input-selection.js d8e79ace03 index commit vor 2 Jahren insert-adjacent.js d8e79ace03 index commit vor 2 Jahren insertadjacenthtml.js d8e79ace03 index commit vor 2 Jahren internationalization.js d8e79ace03 index commit vor 2 Jahren intersectionobserver-v2.js d8e79ace03 index commit vor 2 Jahren intersectionobserver.js d8e79ace03 index commit vor 2 Jahren intl-pluralrules.js d8e79ace03 index commit vor 2 Jahren intrinsic-width.js d8e79ace03 index commit vor 2 Jahren jpeg2000.js d8e79ace03 index commit vor 2 Jahren jpegxl.js d8e79ace03 index commit vor 2 Jahren jpegxr.js d8e79ace03 index commit vor 2 Jahren js-regexp-lookbehind.js d8e79ace03 index commit vor 2 Jahren json.js d8e79ace03 index commit vor 2 Jahren justify-content-space-evenly.js d8e79ace03 index commit vor 2 Jahren kerning-pairs-ligatures.js d8e79ace03 index commit vor 2 Jahren keyboardevent-charcode.js d8e79ace03 index commit vor 2 Jahren keyboardevent-code.js d8e79ace03 index commit vor 2 Jahren keyboardevent-getmodifierstate.js d8e79ace03 index commit vor 2 Jahren keyboardevent-key.js d8e79ace03 index commit vor 2 Jahren keyboardevent-location.js d8e79ace03 index commit vor 2 Jahren keyboardevent-which.js d8e79ace03 index commit vor 2 Jahren lazyload.js d8e79ace03 index commit vor 2 Jahren let.js d8e79ace03 index commit vor 2 Jahren link-icon-png.js d8e79ace03 index commit vor 2 Jahren link-icon-svg.js d8e79ace03 index commit vor 2 Jahren link-rel-dns-prefetch.js d8e79ace03 index commit vor 2 Jahren link-rel-modulepreload.js d8e79ace03 index commit vor 2 Jahren link-rel-preconnect.js d8e79ace03 index commit vor 2 Jahren link-rel-prefetch.js d8e79ace03 index commit vor 2 Jahren link-rel-preload.js d8e79ace03 index commit vor 2 Jahren link-rel-prerender.js d8e79ace03 index commit vor 2 Jahren loading-lazy-attr.js d8e79ace03 index commit vor 2 Jahren localecompare.js d8e79ace03 index commit vor 2 Jahren magnetometer.js d8e79ace03 index commit vor 2 Jahren matchesselector.js d8e79ace03 index commit vor 2 Jahren matchmedia.js d8e79ace03 index commit vor 2 Jahren mathml.js d8e79ace03 index commit vor 2 Jahren maxlength.js d8e79ace03 index commit vor 2 Jahren mdn-css-unicode-bidi-isolate-override.js d8e79ace03 index commit vor 2 Jahren mdn-css-unicode-bidi-isolate.js d8e79ace03 index commit vor 2 Jahren mdn-css-unicode-bidi-plaintext.js d8e79ace03 index commit vor 2 Jahren mdn-text-decoration-color.js d8e79ace03 index commit vor 2 Jahren mdn-text-decoration-line.js d8e79ace03 index commit vor 2 Jahren mdn-text-decoration-shorthand.js d8e79ace03 index commit vor 2 Jahren mdn-text-decoration-style.js d8e79ace03 index commit vor 2 Jahren media-fragments.js d8e79ace03 index commit vor 2 Jahren mediacapture-fromelement.js d8e79ace03 index commit vor 2 Jahren mediarecorder.js d8e79ace03 index commit vor 2 Jahren mediasource.js d8e79ace03 index commit vor 2 Jahren menu.js d8e79ace03 index commit vor 2 Jahren meta-theme-color.js d8e79ace03 index commit vor 2 Jahren meter.js d8e79ace03 index commit vor 2 Jahren midi.js d8e79ace03 index commit vor 2 Jahren minmaxwh.js d8e79ace03 index commit vor 2 Jahren mp3.js d8e79ace03 index commit vor 2 Jahren mpeg-dash.js d8e79ace03 index commit vor 2 Jahren mpeg4.js d8e79ace03 index commit vor 2 Jahren multibackgrounds.js d8e79ace03 index commit vor 2 Jahren multicolumn.js d8e79ace03 index commit vor 2 Jahren mutation-events.js d8e79ace03 index commit vor 2 Jahren mutationobserver.js d8e79ace03 index commit vor 2 Jahren namevalue-storage.js d8e79ace03 index commit vor 2 Jahren native-filesystem-api.js d8e79ace03 index commit vor 2 Jahren nav-timing.js d8e79ace03 index commit vor 2 Jahren netinfo.js d8e79ace03 index commit vor 2 Jahren notifications.js d8e79ace03 index commit vor 2 Jahren object-entries.js d8e79ace03 index commit vor 2 Jahren object-fit.js d8e79ace03 index commit vor 2 Jahren object-observe.js d8e79ace03 index commit vor 2 Jahren object-values.js d8e79ace03 index commit vor 2 Jahren objectrtc.js d8e79ace03 index commit vor 2 Jahren offline-apps.js d8e79ace03 index commit vor 2 Jahren offscreencanvas.js d8e79ace03 index commit vor 2 Jahren ogg-vorbis.js d8e79ace03 index commit vor 2 Jahren ogv.js d8e79ace03 index commit vor 2 Jahren ol-reversed.js d8e79ace03 index commit vor 2 Jahren once-event-listener.js d8e79ace03 index commit vor 2 Jahren online-status.js d8e79ace03 index commit vor 2 Jahren opus.js d8e79ace03 index commit vor 2 Jahren orientation-sensor.js d8e79ace03 index commit vor 2 Jahren outline.js d8e79ace03 index commit vor 2 Jahren pad-start-end.js d8e79ace03 index commit vor 2 Jahren page-transition-events.js d8e79ace03 index commit vor 2 Jahren pagevisibility.js d8e79ace03 index commit vor 2 Jahren passive-event-listener.js d8e79ace03 index commit vor 2 Jahren passwordrules.js d8e79ace03 index commit vor 2 Jahren path2d.js d8e79ace03 index commit vor 2 Jahren payment-request.js d8e79ace03 index commit vor 2 Jahren pdf-viewer.js d8e79ace03 index commit vor 2 Jahren permissions-api.js d8e79ace03 index commit vor 2 Jahren permissions-policy.js d8e79ace03 index commit vor 2 Jahren picture-in-picture.js d8e79ace03 index commit vor 2 Jahren picture.js d8e79ace03 index commit vor 2 Jahren ping.js d8e79ace03 index commit vor 2 Jahren png-alpha.js d8e79ace03 index commit vor 2 Jahren pointer-events.js d8e79ace03 index commit vor 2 Jahren pointer.js d8e79ace03 index commit vor 2 Jahren pointerlock.js d8e79ace03 index commit vor 2 Jahren portals.js d8e79ace03 index commit vor 2 Jahren prefers-color-scheme.js d8e79ace03 index commit vor 2 Jahren prefers-reduced-motion.js d8e79ace03 index commit vor 2 Jahren progress.js d8e79ace03 index commit vor 2 Jahren promise-finally.js d8e79ace03 index commit vor 2 Jahren promises.js d8e79ace03 index commit vor 2 Jahren proximity.js d8e79ace03 index commit vor 2 Jahren proxy.js d8e79ace03 index commit vor 2 Jahren publickeypinning.js d8e79ace03 index commit vor 2 Jahren push-api.js d8e79ace03 index commit vor 2 Jahren queryselector.js d8e79ace03 index commit vor 2 Jahren readonly-attr.js d8e79ace03 index commit vor 2 Jahren referrer-policy.js d8e79ace03 index commit vor 2 Jahren registerprotocolhandler.js d8e79ace03 index commit vor 2 Jahren rel-noopener.js d8e79ace03 index commit vor 2 Jahren rel-noreferrer.js d8e79ace03 index commit vor 2 Jahren rellist.js d8e79ace03 index commit vor 2 Jahren rem.js d8e79ace03 index commit vor 2 Jahren requestanimationframe.js d8e79ace03 index commit vor 2 Jahren requestidlecallback.js d8e79ace03 index commit vor 2 Jahren resizeobserver.js d8e79ace03 index commit vor 2 Jahren resource-timing.js d8e79ace03 index commit vor 2 Jahren rest-parameters.js d8e79ace03 index commit vor 2 Jahren rtcpeerconnection.js d8e79ace03 index commit vor 2 Jahren ruby.js d8e79ace03 index commit vor 2 Jahren run-in.js d8e79ace03 index commit vor 2 Jahren same-site-cookie-attribute.js d8e79ace03 index commit vor 2 Jahren screen-orientation.js d8e79ace03 index commit vor 2 Jahren script-async.js d8e79ace03 index commit vor 2 Jahren script-defer.js d8e79ace03 index commit vor 2 Jahren scrollintoview.js d8e79ace03 index commit vor 2 Jahren scrollintoviewifneeded.js d8e79ace03 index commit vor 2 Jahren sdch.js d8e79ace03 index commit vor 2 Jahren selection-api.js d8e79ace03 index commit vor 2 Jahren server-timing.js d8e79ace03 index commit vor 2 Jahren serviceworkers.js d8e79ace03 index commit vor 2 Jahren setimmediate.js d8e79ace03 index commit vor 2 Jahren shadowdom.js d8e79ace03 index commit vor 2 Jahren shadowdomv1.js d8e79ace03 index commit vor 2 Jahren sharedarraybuffer.js d8e79ace03 index commit vor 2 Jahren sharedworkers.js d8e79ace03 index commit vor 2 Jahren sni.js d8e79ace03 index commit vor 2 Jahren spdy.js d8e79ace03 index commit vor 2 Jahren speech-recognition.js d8e79ace03 index commit vor 2 Jahren speech-synthesis.js d8e79ace03 index commit vor 2 Jahren spellcheck-attribute.js d8e79ace03 index commit vor 2 Jahren sql-storage.js d8e79ace03 index commit vor 2 Jahren srcset.js d8e79ace03 index commit vor 2 Jahren stream.js d8e79ace03 index commit vor 2 Jahren streams.js d8e79ace03 index commit vor 2 Jahren stricttransportsecurity.js d8e79ace03 index commit vor 2 Jahren style-scoped.js d8e79ace03 index commit vor 2 Jahren subresource-bundling.js d8e79ace03 index commit vor 2 Jahren subresource-integrity.js d8e79ace03 index commit vor 2 Jahren svg-css.js d8e79ace03 index commit vor 2 Jahren svg-filters.js d8e79ace03 index commit vor 2 Jahren svg-fonts.js d8e79ace03 index commit vor 2 Jahren svg-fragment.js d8e79ace03 index commit vor 2 Jahren svg-html.js d8e79ace03 index commit vor 2 Jahren svg-html5.js d8e79ace03 index commit vor 2 Jahren svg-img.js d8e79ace03 index commit vor 2 Jahren svg-smil.js d8e79ace03 index commit vor 2 Jahren svg.js d8e79ace03 index commit vor 2 Jahren sxg.js d8e79ace03 index commit vor 2 Jahren tabindex-attr.js d8e79ace03 index commit vor 2 Jahren template-literals.js d8e79ace03 index commit vor 2 Jahren template.js d8e79ace03 index commit vor 2 Jahren temporal.js d8e79ace03 index commit vor 2 Jahren testfeat.js d8e79ace03 index commit vor 2 Jahren text-decoration.js d8e79ace03 index commit vor 2 Jahren text-emphasis.js d8e79ace03 index commit vor 2 Jahren text-overflow.js d8e79ace03 index commit vor 2 Jahren text-size-adjust.js d8e79ace03 index commit vor 2 Jahren text-stroke.js d8e79ace03 index commit vor 2 Jahren textcontent.js d8e79ace03 index commit vor 2 Jahren textencoder.js d8e79ace03 index commit vor 2 Jahren tls1-1.js d8e79ace03 index commit vor 2 Jahren tls1-2.js d8e79ace03 index commit vor 2 Jahren tls1-3.js d8e79ace03 index commit vor 2 Jahren touch.js d8e79ace03 index commit vor 2 Jahren transforms2d.js d8e79ace03 index commit vor 2 Jahren transforms3d.js d8e79ace03 index commit vor 2 Jahren trusted-types.js d8e79ace03 index commit vor 2 Jahren ttf.js d8e79ace03 index commit vor 2 Jahren typedarrays.js d8e79ace03 index commit vor 2 Jahren u2f.js d8e79ace03 index commit vor 2 Jahren unhandledrejection.js d8e79ace03 index commit vor 2 Jahren upgradeinsecurerequests.js d8e79ace03 index commit vor 2 Jahren url-scroll-to-text-fragment.js d8e79ace03 index commit vor 2 Jahren url.js d8e79ace03 index commit vor 2 Jahren urlsearchparams.js d8e79ace03 index commit vor 2 Jahren use-strict.js d8e79ace03 index commit vor 2 Jahren user-select-none.js d8e79ace03 index commit vor 2 Jahren user-timing.js d8e79ace03 index commit vor 2 Jahren variable-fonts.js d8e79ace03 index commit vor 2 Jahren vector-effect.js d8e79ace03 index commit vor 2 Jahren vibration.js d8e79ace03 index commit vor 2 Jahren video.js d8e79ace03 index commit vor 2 Jahren videotracks.js d8e79ace03 index commit vor 2 Jahren viewport-unit-variants.js d8e79ace03 index commit vor 2 Jahren viewport-units.js d8e79ace03 index commit vor 2 Jahren wai-aria.js d8e79ace03 index commit vor 2 Jahren wake-lock.js d8e79ace03 index commit vor 2 Jahren wasm.js d8e79ace03 index commit vor 2 Jahren wav.js d8e79ace03 index commit vor 2 Jahren wbr-element.js d8e79ace03 index commit vor 2 Jahren web-animation.js d8e79ace03 index commit vor 2 Jahren web-app-manifest.js d8e79ace03 index commit vor 2 Jahren web-bluetooth.js d8e79ace03 index commit vor 2 Jahren web-serial.js d8e79ace03 index commit vor 2 Jahren web-share.js d8e79ace03 index commit vor 2 Jahren webauthn.js d8e79ace03 index commit vor 2 Jahren webcodecs.js d8e79ace03 index commit vor 2 Jahren webgl.js d8e79ace03 index commit vor 2 Jahren webgl2.js d8e79ace03 index commit vor 2 Jahren webgpu.js d8e79ace03 index commit vor 2 Jahren webhid.js d8e79ace03 index commit vor 2 Jahren webkit-user-drag.js d8e79ace03 index commit vor 2 Jahren webm.js d8e79ace03 index commit vor 2 Jahren webnfc.js d8e79ace03 index commit vor 2 Jahren webp.js d8e79ace03 index commit vor 2 Jahren websockets.js d8e79ace03 index commit vor 2 Jahren webtransport.js d8e79ace03 index commit vor 2 Jahren webusb.js d8e79ace03 index commit vor 2 Jahren webvr.js d8e79ace03 index commit vor 2 Jahren webvtt.js d8e79ace03 index commit vor 2 Jahren webworkers.js d8e79ace03 index commit vor 2 Jahren webxr.js d8e79ace03 index commit vor 2 Jahren will-change.js d8e79ace03 index commit vor 2 Jahren woff.js d8e79ace03 index commit vor 2 Jahren woff2.js d8e79ace03 index commit vor 2 Jahren word-break.js d8e79ace03 index commit vor 2 Jahren wordwrap.js d8e79ace03 index commit vor 2 Jahren x-doc-messaging.js d8e79ace03 index commit vor 2 Jahren x-frame-options.js d8e79ace03 index commit vor 2 Jahren xhr2.js d8e79ace03 index commit vor 2 Jahren xhtml.js d8e79ace03 index commit vor 2 Jahren xhtmlsmil.js d8e79ace03 index commit vor 2 Jahren xml-serializer.js d8e79ace03 index commit vor 2 Jahren tum/whitesports - Gogs: Simplico Git Service

Нет описания

SubscribersLastEngagement.php 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php declare(strict_types=1);
  2. namespace MailPoet\Cron\Workers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\StatisticsClickEntity;
  5. use MailPoet\Entities\StatisticsOpenEntity;
  6. use MailPoet\Entities\SubscriberEntity;
  7. use MailPoet\Models\ScheduledTask;
  8. use MailPoet\Util\DBCollationChecker;
  9. use MailPoet\WooCommerce\Helper as WooCommerceHelper;
  10. use MailPoetVendor\Doctrine\ORM\EntityManager;
  11. class SubscribersLastEngagement extends SimpleWorker {
  12. const AUTOMATIC_SCHEDULING = false;
  13. const SUPPORT_MULTIPLE_INSTANCES = false;
  14. const BATCH_SIZE = 2000;
  15. const TASK_TYPE = 'subscribers_last_engagement';
  16. /** @var EntityManager */
  17. private $entityManager;
  18. /** @var DBCollationChecker */
  19. private $dbCollationChecker;
  20. /** @var WooCommerceHelper */
  21. private $wooCommereHelper;
  22. /** @var null|string */
  23. private $emailCollationCorrection;
  24. public function __construct(
  25. EntityManager $entityManager,
  26. DBCollationChecker $dbCollationChecker,
  27. WooCommerceHelper $wooCommereHelper
  28. ) {
  29. parent::__construct();
  30. $this->entityManager = $entityManager;
  31. $this->dbCollationChecker = $dbCollationChecker;
  32. $this->wooCommereHelper = $wooCommereHelper;
  33. }
  34. public function processTaskStrategy(ScheduledTask $task, $timer): bool {
  35. $meta = $task->getMeta();
  36. $minId = $meta['nextId'] ?? 1;
  37. $highestId = $this->getHighestSubscriberId();
  38. while ($minId <= $highestId) {
  39. $maxId = $minId + self::BATCH_SIZE;
  40. $this->processBatch($minId, $maxId);
  41. $task->meta = ['nextId' => $maxId];
  42. $task->save();
  43. $this->cronHelper->enforceExecutionLimit($timer); // Throws exception and interrupts process if over execution limit
  44. $minId = $maxId;
  45. }
  46. return true;
  47. }
  48. private function processBatch(int $minSubscriberId, int $maxSubscriberId): void {
  49. global $wpdb;
  50. $statisticsClicksTable = $this->entityManager->getClassMetadata(StatisticsClickEntity::class)->getTableName();
  51. $statisticsOpensTable = $this->entityManager->getClassMetadata(StatisticsOpenEntity::class)->getTableName();
  52. $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
  53. $postsTable = $wpdb->posts;
  54. $postsmetaTable = $wpdb->postmeta;
  55. if (is_null($this->emailCollationCorrection)) {
  56. $this->emailCollationCorrection = $this->dbCollationChecker->getCollateIfNeeded(
  57. $subscribersTable,
  58. 'email',
  59. $postsmetaTable,
  60. 'meta_value'
  61. );
  62. }
  63. $emailCollate = $this->emailCollationCorrection;
  64. $query = "
  65. UPDATE $subscribersTable as mps
  66. LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
  67. LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
  68. SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0)), 0)
  69. WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
  70. ";
  71. // Use more complex query that takes into the account also subscriber's latest WooCommerce order
  72. if ($this->wooCommereHelper->isWooCommerceActive()) {
  73. $query = "
  74. UPDATE $subscribersTable as mps
  75. LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
  76. LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
  77. LEFT JOIN (SELECT MAX(post_id) AS post_id, meta_value as email FROM $postsmetaTable WHERE meta_key = '_billing_email' GROUP BY email) AS newestOrderIds ON newestOrderIds.email $emailCollate = mps.email
  78. LEFT JOIN (SELECT ID, post_date FROM $postsTable WHERE post_type = 'shop_order') AS shopOrders ON newestOrderIds.post_id = shopOrders.ID
  79. SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, '0'), COALESCE(mpsc.created_at, '0'), COALESCE(shopOrders.post_date, '0')), '0')
  80. WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
  81. ";
  82. }
  83. $this->entityManager->getConnection()->executeStatement($query);
  84. }
  85. private function getHighestSubscriberId(): int {
  86. $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
  87. $result = $this->entityManager->getConnection()->executeQuery("SELECT MAX(id) FROM $subscribersTable LIMIT 1;")->fetchNumeric();
  88. return is_array($result) && isset($result[0]) ? (int)$result[0] : 0;
  89. }
  90. }